From e51d890aae04b4ef241b988668870aac5528c1e5 Mon Sep 17 00:00:00 2001 From: buddy <0buddy.ne@gmail.com> Date: Sun, 17 Mar 2024 03:40:57 +0200 Subject: [PATCH 001/132] 3 columns instead of 4 --- app/components/CategoriesNav/menu.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/CategoriesNav/menu.css b/app/components/CategoriesNav/menu.css index 88450033..a83b25fc 100644 --- a/app/components/CategoriesNav/menu.css +++ b/app/components/CategoriesNav/menu.css @@ -24,7 +24,7 @@ } .categories-results > .categoryTitle { flex: 1; - flex-basis: 16vw; + flex-basis: 21vw; } @media (max-width: 640px) { .categoriesGroup { From 53f13c12113b132e4a9fa094c545d001ef4e0c22 Mon Sep 17 00:00:00 2001 From: buddy <0buddy.ne@gmail.com> Date: Sun, 17 Mar 2024 03:53:34 +0200 Subject: [PATCH 002/132] feedback form not showing --- .../Article/FeedbackForm/feedbackForm.css | 2 +- app/components/Article/FeedbackForm/index.tsx | 13 +++++++++++-- app/components/Article/index.tsx | 3 ++- app/newRoot.css | 3 +++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/components/Article/FeedbackForm/feedbackForm.css b/app/components/Article/FeedbackForm/feedbackForm.css index 7e730da2..fd393778 100644 --- a/app/components/Article/FeedbackForm/feedbackForm.css +++ b/app/components/Article/FeedbackForm/feedbackForm.css @@ -52,7 +52,7 @@ .composite-button > .feedback-form { position: absolute; left: 90px; - top: -342px; + top: -350px; display: none; } .composite-button > .feedback-form.show { diff --git a/app/components/Article/FeedbackForm/index.tsx b/app/components/Article/FeedbackForm/index.tsx index 81199374..a5aedc1c 100644 --- a/app/components/Article/FeedbackForm/index.tsx +++ b/app/components/Article/FeedbackForm/index.tsx @@ -23,6 +23,10 @@ export interface FeedbackFormProps { * Has Options */ hasOptions?: boolean + /** + * onSubmit + */ + onSubmit?: () => void } const FeedbackForm = ({ pageid, @@ -30,6 +34,7 @@ const FeedbackForm = ({ onBlur, onFocus, hasOptions = true, + onSubmit, }: FeedbackFormProps) => { // to be implemented. const [selected, setSelected] = React.useState() @@ -47,7 +52,7 @@ const FeedbackForm = ({ option: 'typos', }, ] - const [enabledSubmit, setEnabledSubmit] = React.useState(false) + const [enabledSubmit, setEnabledSubmit] = React.useState(!hasOptions) const selectFeedback = (option: string) => { setSelected(option) @@ -73,7 +78,11 @@ const FeedbackForm = ({ [onBlur] ) - const handleSubmit = () => {} + const handleSubmit = () => { + if (onSubmit) { + onSubmit() + } + } return (
diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 8157ae5c..389d9a92 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -52,7 +52,7 @@ const ArticleFooter = (question: Question) => {
Was this page helpful? - + { onBlur={() => setIsFormFocused(false)} onFocus={() => setIsFormFocused(true)} hasOptions={false} + onSubmit={() => setShowFeedbackForm(false)} /> diff --git a/app/newRoot.css b/app/newRoot.css index 3261bbb3..d44c84e3 100644 --- a/app/newRoot.css +++ b/app/newRoot.css @@ -536,3 +536,6 @@ button { .margin-top-40 { margin-top: var(--spacing-40); } +.relative { + position: relative; +} From 380a14e282c59d18db7554f60fafdedbda99a25d Mon Sep 17 00:00:00 2001 From: Daniel O'Connell Date: Sat, 23 Mar 2024 21:51:45 +0100 Subject: [PATCH 003/132] Initial chatbot integration --- .../{Widget/Stampy.tsx => Chatbot/Widgit.tsx} | 2 +- app/components/Chatbot/index.tsx | 239 ++++++++++++++++ .../{Widget/stampy.css => Chatbot/widgit.css} | 5 - app/hooks/useChat.ts | 263 ++++++++++++++++++ app/routes/chat.tsx | 21 ++ stories/WidgetStampy.stories.tsx | 2 +- 6 files changed, 525 insertions(+), 7 deletions(-) rename app/components/{Widget/Stampy.tsx => Chatbot/Widgit.tsx} (98%) create mode 100644 app/components/Chatbot/index.tsx rename app/components/{Widget/stampy.css => Chatbot/widgit.css} (77%) create mode 100644 app/hooks/useChat.ts create mode 100644 app/routes/chat.tsx diff --git a/app/components/Widget/Stampy.tsx b/app/components/Chatbot/Widgit.tsx similarity index 98% rename from app/components/Widget/Stampy.tsx rename to app/components/Chatbot/Widgit.tsx index f5d216c0..1c71e10f 100644 --- a/app/components/Widget/Stampy.tsx +++ b/app/components/Chatbot/Widgit.tsx @@ -3,7 +3,7 @@ import {Link} from '@remix-run/react' import StampyIcon from '~/components/icons-generated/Stampy' import SendIcon from '~/components/icons-generated/PlaneSend' import Button from '~/components/Button' -import './stampy.css' +import './widgit.css' export const WidgetStampy = () => { const [question, setQuestion] = useState('') diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx new file mode 100644 index 00000000..b3267174 --- /dev/null +++ b/app/components/Chatbot/index.tsx @@ -0,0 +1,239 @@ +import {useState} from 'react' +import {Link} from '@remix-run/react' +import PersonIcon from '~/components/icons-generated/Person' +import StampyIcon from '~/components/icons-generated/Stampy' +import SendIcon from '~/components/icons-generated/PlaneSend' +import Button from '~/components/Button' +import {queryLLM, Entry, AssistantEntry, Followup} from '~/hooks/useChat' +import './widgit.css' + +export const WidgetStampy = () => { + const [question, setQuestion] = useState('') + const questions = [ + 'Why couldn’t we just turn the AI off?', + 'How would the AI even get out in the world?', + 'Do people seriously worry about existential risk from AI?', + ] + + const stampyUrl = (question: string) => `https://chat.aisafety.info/?question=${question.trim()}` + return ( +
+
+

Questions?

+

Ask Stampy, our chatbot, any question about AI safety

+
+ +
+ +
+
Try asking me...
+ {questions.map((question, i) => ( +
+ +
+ ))} +
+
+ +
+ setQuestion(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter' && question.trim()) { + window.location = stampyUrl(question) as any + } + }} + /> + + + +
+
+ ) +} + +type QuestionInputProps = { + initial?: string + onChange?: (val: string) => void + onAsk?: (val: string) => void +} +const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { + const [question, setQuestion] = useState(initial || '') + + const handleChange = (val: string) => { + setQuestion(val) + onChange && onChange(val) + } + + return ( +
+ handleChange(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter' && question.trim() && onAsk) { + onAsk(question) + } + }} + /> + onAsk && onAsk(question)} /> +
+ ) +} + +type FollowupsProps = { + title?: string + followups?: Followup[] +} +const Followups = ({title, followups}: FollowupsProps) => ( + <> + {title &&
{title}
} + + {followups?.map(({text, action}, i) => ( +
+ +
+ ))} + +) + +const SplashScreen = ({ + questions, + onQuestion, +}: { + questions?: string[] + onQuestion: (v: string) => void +}) => ( + <> + +
+

Hi there, I'm Stampy.

+

I can answer your questions about AI safety

+
+ ({text, action: () => onQuestion(text)}))} + /> + +) + +const UserQuery = ({content}: Entry) => ( +
+
+ You +
+
{content}
+
+) + +const ChatbotReply = ({content, phase}: AssistantEntry) => { + const PhaseState = () => { + switch (phase) { + case 'started': + return

Loading: Sending query...

+ case 'semantic': + return

Loading: Performing semantic search...

+ case 'history': + return

Loading: Processing history...

+ case 'context': + return

Loading: Creating context...

+ case 'prompt': + return

Loading: Creating prompt...

+ case 'llm': + return

Loading: Waiting for LLM...

+ case 'streaming': + case 'followups': + default: + return null + } + } + + return ( +
+
+ Stampy +
+ +
{content}
+ {phase === 'followups' ?

Checking for followups...

: undefined} +
+ ) +} + +const ChatEntry = (props: Entry) => { + switch (props.role) { + case 'user': + return + case 'assistant': + return + } +} + +export const Chatbot = ({question, questions}: {question?: string; questions?: string[]}) => { + const [followups, setFollowups] = useState() + + const [sessionId] = useState('asd') + const [history, setHistory] = useState([] as Entry[]) + const [controller, setController] = useState(() => new AbortController()) + + const showFollowup = (pageid: string) => { + // Fetch and display the given article + console.log(pageid) + } + + const abortSearch = () => controller.abort() + console.log(abortSearch) // to stop the linter from complaining + + const onQuestion = async (question: string) => { + const message = {content: question, role: 'user'} as Entry + const controller = new AbortController() + setController(controller) + + setFollowups(undefined) + setHistory((current) => [...current, message, {role: 'assistant'} as AssistantEntry]) + const updateReply = (reply: Entry) => + setHistory((current) => [...current.slice(0, current.length - 2), message, reply]) + + const {followups, result} = await queryLLM( + [...history, message], + updateReply, + sessionId, + controller + ) + updateReply(result) + setFollowups( + followups?.map(({text, pageid}: Followup) => ({ + text, + action: () => pageid && showFollowup(pageid), + })) + ) + } + + return ( +
+ {history.length === 0 ? ( + + ) : undefined} + {history.map((item, i) => ( + + ))} + {followups ? ( + + ) : undefined} + +
+ ) +} + +export default Chatbot diff --git a/app/components/Widget/stampy.css b/app/components/Chatbot/widgit.css similarity index 77% rename from app/components/Widget/stampy.css rename to app/components/Chatbot/widgit.css index f65a058c..88e9d374 100644 --- a/app/components/Widget/stampy.css +++ b/app/components/Chatbot/widgit.css @@ -11,14 +11,9 @@ } .widget-ask input { - display: inline-flex; height: 56px; padding: var(--spacing-8) var(--spacing-24); } -.widget-ask svg { - position: absolute; - transform: translate(-52px, 4px); -} @media (max-width: 640px) { .button { diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts new file mode 100644 index 00000000..234a2090 --- /dev/null +++ b/app/hooks/useChat.ts @@ -0,0 +1,263 @@ +export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' + +export type Citation = { + title: string + authors: string[] + date: string + url: string + index: number + text: string +} + +export type Entry = UserEntry | AssistantEntry | ErrorMessage | StampyMessage +export type ChatPhase = + | 'started' + | 'semantic' + | 'history' + | 'context' + | 'prompt' + | 'llm' + | 'streaming' + | 'followups' + +export type UserEntry = { + role: 'user' + content: string + deleted?: boolean +} + +export type AssistantEntry = { + role: 'assistant' + content: string + citations?: Citation[] + citationsMap?: Map + deleted?: boolean + phase?: ChatPhase +} + +export type ErrorMessage = { + role: 'error' + content: string + deleted?: boolean +} + +export type StampyMessage = { + role: 'stampy' + content: string + url: string + deleted?: boolean +} + +export type Followup = {text: string; pageid?: string; action: string | (() => void)} +export type SearchResult = { + followups?: Followup[] + result: Entry +} + +export type Mode = 'rookie' | 'concise' | 'default' | 'discord' + +const DATA_HEADER = 'data: ' +const EVENT_END_HEADER = 'event: close' + +export type EntryRole = 'error' | 'stampy' | 'assistant' | 'user' | 'deleted' +export type HistoryEntry = { + role: EntryRole + content: string +} + +export const formatCitations: (text: string) => string = (text) => { + // ---------------------- normalize citation form ---------------------- + // the general plan here is just to add parsing cases until we can respond + // well to almost everything the LLM emits. We won't ever reach five nines, + // but the domain is one where occasionally failing isn't catastrophic. + + // transform all things that look like [a, b, c] into [a][b][c] + let response = text.replace( + /\[((?:[a-z]+,\s*)*[a-z]+)\]/g, // identify groups of this form + + (block: string) => + block + .split(',') + .map((x) => x.trim()) + .join('][') + ) + + // transform all things that look like [(a), (b), (c)] into [(a)][(b)][(c)] + response = response.replace( + /\[((?:\([a-z]+\),\s*)*\([a-z]+\))\]/g, // identify groups of this form + + (block: string) => + block + .split(',') + .map((x) => x.trim()) + .join('][') + ) + + // transform all things that look like [(a)] into [a] + response = response.replace(/\[\(([a-z]+)\)\]/g, (_match: string, x: string) => `[${x}]`) + + // transform all things that look like [ a ] into [a] + response = response.replace(/\[\s*([a-z]+)\s*\]/g, (_match: string, x: string) => `[${x}]`) + return response +} + +export const findCitations: (text: string, citations: Citation[]) => Map = ( + text, + citations +) => { + // figure out what citations are in the response, and map them appropriately + const cite_map = new Map() + + // scan a regex for [x] over the response. If x isn't in the map, add it. + // (note: we're actually doing this twice - once on parsing, once on render. + // if that looks like a problem, we could swap from strings to custom ropes). + const regex = /\[([a-z]+)\]/g + let match + while ((match = regex.exec(text)) !== null) { + const letter = match[1] + if (!letter || cite_map.has(letter!)) continue + + const citation = citations[letter.charCodeAt(0) - 'a'.charCodeAt(0)] + if (!citation) continue + + cite_map.set(letter!, citation) + } + return cite_map +} + +const ignoreAbort = (error: Error) => { + if (error.name !== 'AbortError') { + throw error + } +} + +export async function* iterateData(res: Response) { + const reader = res.body!.getReader() + let message = '' + + while (true) { + const {done, value} = await reader.read() + + if (done) return + + const chunk = new TextDecoder('utf-8').decode(value) + for (const line of chunk.split('\n')) { + // Most times, it seems that a single read() call will be one SSE "message", + // but I'll do the proper aggregation spec thing in case that's not always true. + + if (line.startsWith(EVENT_END_HEADER)) { + return + } else if (line.startsWith(DATA_HEADER)) { + message += line.slice(DATA_HEADER.length) + // Fixes #43 + } else if (line !== '') { + message += line + } else if (message !== '') { + yield JSON.parse(message) + message = '' + } + } + } +} + +const makeEntry = () => + ({ + role: 'assistant', + content: '', + citations: [], + citationsMap: new Map(), + }) as AssistantEntry + +export const extractAnswer = async ( + res: Response, + setCurrent: (e: AssistantEntry) => void +): Promise => { + const formatResponse = (result: AssistantEntry, data: Entry) => { + const content = formatCitations((result?.content || '') + data.content) + return { + content, + role: 'assistant', + citations: result?.citations || [], + citationsMap: findCitations(content, result?.citations || []), + } as AssistantEntry + } + + let result: AssistantEntry = makeEntry() + let followups: Followup[] = [] + for await (const data of iterateData(res)) { + switch (data.state) { + case 'loading': + setCurrent({phase: data.phase, ...result}) + break + + case 'citations': + result = { + ...result, + citations: data?.citations || result?.citations || [], + } + setCurrent({phase: data.phase, ...result}) + break + + case 'streaming': + // incrementally build up the response + result = formatResponse(result, data) + setCurrent({phase: 'streaming', ...result}) + break + + case 'followups': + // add any potential followup questions + followups = data.followups.map((value: any) => value as Followup) + break + case 'done': + break + case 'error': + throw data.error + } + } + return {result, followups} +} + +const fetchLLM = async ( + sessionId: string | undefined, + history: HistoryEntry[], + controller: AbortController +): Promise => + fetch(CHATBOT_URL, { + signal: controller.signal, + method: 'POST', + cache: 'no-cache', + keepalive: true, + headers: { + 'Content-Type': 'application/json', + Accept: 'text/event-stream', + }, + body: JSON.stringify({sessionId, history, settings: {mode: 'default'}}), + }).catch(ignoreAbort) + +export const queryLLM = async ( + history: HistoryEntry[], + setCurrent: (e: AssistantEntry) => void, + sessionId: string | undefined, + controller: AbortController +): Promise => { + setCurrent({...makeEntry(), phase: 'started'}) + // do SSE on a POST request. + const res = await fetchLLM(sessionId, history, controller) + + if (!res) { + return {result: {role: 'error', content: 'No response from server'}} + } else if (!res.ok) { + return {result: {role: 'error', content: 'POST Error: ' + res.status}} + } + + try { + return await extractAnswer(res, setCurrent) + } catch (e) { + if ((e as Error)?.name === 'AbortError') { + return {result: {role: 'error', content: 'aborted'}} + } + return { + result: {role: 'error', content: e ? e.toString() : 'unknown error'}, + } + } +} diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx new file mode 100644 index 00000000..23d17520 --- /dev/null +++ b/app/routes/chat.tsx @@ -0,0 +1,21 @@ +import {ShouldRevalidateFunction} from '@remix-run/react' +import Page from '~/components/Page' +import Chatbot from '~/components/Chatbot' + +export const shouldRevalidate: ShouldRevalidateFunction = () => false + +export default function App() { + return ( + +
+ +
+
+ ) +} diff --git a/stories/WidgetStampy.stories.tsx b/stories/WidgetStampy.stories.tsx index b81cca51..673c1e38 100644 --- a/stories/WidgetStampy.stories.tsx +++ b/stories/WidgetStampy.stories.tsx @@ -1,5 +1,5 @@ import type {Meta, StoryObj} from '@storybook/react' -import {WidgetStampy} from '../app/components/Widget/Stampy' +import {WidgetStampy} from '../app/components/Chatbot/Widgit' const meta = { title: 'Components/WidgetStampy', From 369e397ff172c6d2ab4ff148c3d39a3ec3064f82 Mon Sep 17 00:00:00 2001 From: buddy <0buddy.ne@gmail.com> Date: Thu, 28 Mar 2024 08:49:06 +0200 Subject: [PATCH 004/132] minor styling ChatBot --- app/components/Chatbot/index.tsx | 4 ++-- app/components/Chatbot/widgit.css | 16 ++++++++++++++++ app/components/Nav/index.tsx | 7 +++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index b3267174..24f32dc8 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -75,7 +75,7 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => {
handleChange(e.target.value)} @@ -221,7 +221,7 @@ export const Chatbot = ({question, questions}: {question?: string; questions?: s } return ( -
+
{history.length === 0 ? ( ) : undefined} diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 88e9d374..098b06e0 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -20,3 +20,19 @@ width: 100%; } } +.height-70{ + height: 70vh; + overflow-x: hidden; + } +.widget-ask{ + position: sticky; + bottom: 0; +} +.pointer{ + position: absolute; + right: 0; + margin: 4px; + } +.right-icon{ + padding-right: var(--spacing-56); +} \ No newline at end of file diff --git a/app/components/Nav/index.tsx b/app/components/Nav/index.tsx index 0d9bab72..f30b9ecb 100644 --- a/app/components/Nav/index.tsx +++ b/app/components/Nav/index.tsx @@ -2,6 +2,7 @@ import {Link} from '@remix-run/react' import {MenuItem} from '~/components/Menu' import OpenBookIcon from '~/components/icons-generated/OpenBook' import AISafetyIcon from '~/components/icons-generated/Aisafety' +import BotIcon from '~/components/icons-generated/Bot' import ArticlesDropdown from '~/components/ArticlesDropdown' import type {TOCItem} from '~/routes/questions.toc' import type {Tag} from '~/server-utils/stampy' @@ -28,6 +29,12 @@ export const Nav = ({toc, categories}: NavProps) => { id="showArticles" /> + } + text="Stampy chatbot" + />
  • From 4e99e44714cbc31f79a0e289515ff6622f05f814 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell Date: Mon, 8 Apr 2024 23:50:38 +0200 Subject: [PATCH 005/132] human answers --- app/components/Chatbot/ChatEntry.tsx | 175 +++++++++++++++++++++++++ app/components/Chatbot/chat_entry.css | 53 ++++++++ app/components/Chatbot/index.tsx | 129 ++++++++---------- app/hooks/useChat.ts | 14 +- app/hooks/useGlossary.ts | 8 ++ app/{newRoot.css => root.css} | 1 + app/root.tsx | 2 +- app/routes/questions.$questionId.$.tsx | 2 + 8 files changed, 306 insertions(+), 78 deletions(-) create mode 100644 app/components/Chatbot/ChatEntry.tsx create mode 100644 app/components/Chatbot/chat_entry.css rename app/{newRoot.css => root.css} (99%) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx new file mode 100644 index 00000000..1cfc9499 --- /dev/null +++ b/app/components/Chatbot/ChatEntry.tsx @@ -0,0 +1,175 @@ +import {ComponentType} from 'react' +import {Link} from '@remix-run/react' +import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' +import BotIcon from '~/components/icons-generated/Bot' +import PersonIcon from '~/components/icons-generated/Person' +import StampyIcon from '~/components/icons-generated/Stampy' +import Contents from '~/components/Article/Contents' +import useGlossary from '~/hooks/useGlossary' +import './chat_entry.css' +import type {Entry, AssistantEntry, StampyEntry, Citation} from '~/hooks/useChat' + +const hints = { + bot: 'bla bla bla something bot', + human: 'bla bla bla by humans', +} + +const AnswerInfo = ({answerType}: {answerType?: 'human' | 'bot'}) => { + if (!answerType) return null + return ( + + {answerType === 'human' ? : } + + {answerType === 'human' ? 'Human-written' : 'Bot-generated'} response + + +
    {hints[answerType]}
    +
    + ) +} + +type TitleProps = { + title: string + Icon: ComponentType + answerType?: 'human' | 'bot' +} +const Title = ({title, Icon, answerType}: TitleProps) => ( +
    + + {title} + +
    +) + +const UserQuery = ({content}: Entry) => ( +
    + + <div>{content}</div> + </div> +) + +// FIXME: this id should be unique across the page - I doubt it will be now +const ReferenceLink = ({id, reference}: {id: string; reference: string}) => ( + <Link id={`#${id}-ref`} to={`#${id}`} className="reference-link"> + {reference} + </Link> +) + +const Reference = ({id, title, authors, source, url, reference}: Citation) => { + const referenceSources = { + arxiv: 'Scientific paper', + blogs: 'Blogpost', + eaforum: 'EAForum', + alignmentforum: 'AlignmentForum', + lesswrong: 'LessWrong', + arbital: 'Arbital', + distill: 'Distill', + 'aisafety.info': 'AISafety.info', + } + + const Authors = ({authors}: {authors?: string[]}) => { + if (!authors || !authors.length || authors.length === 0) return null + return ( + <span className="authors"> + {authors.slice(0, 3).join(', ')} + {authors.length <= 3 ? '' : ' et. al.'} + </span> + ) + } + + return ( + <div key={id} id={`#${id}`} className="reference padding-bottom-32"> + <div className="reference-num small">{reference}</div> + <div> + <div className="title">{title}</div> + <div> + <Authors authors={authors} /> + <span>{' · '}</span> + <Link className="source-link" to={url}> + {referenceSources[source as keyof typeof referenceSources] || new URL(url).host} + </Link> + </div> + </div> + </div> + ) +} + +const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { + const citations = [] as Citation[] + citationsMap?.forEach((v) => { + citations.push(v) + }) + + const references = citations.map(({reference}) => reference).join('') + const referencesRegex = new RegExp(`(\\[[${references}]\\])`) + + const PhaseState = () => { + switch (phase) { + case 'started': + return <p>Loading: Sending query...</p> + case 'semantic': + return <p>Loading: Performing semantic search...</p> + case 'history': + return <p>Loading: Processing history...</p> + case 'context': + return <p>Loading: Creating context...</p> + case 'prompt': + return <p>Loading: Creating prompt...</p> + case 'llm': + return <p>Loading: Waiting for LLM...</p> + case 'streaming': + case 'followups': + default: + return null + } + } + + return ( + <div> + <Title title="Stampy" Icon={StampyIcon} answerType="bot" /> + <PhaseState /> + <div> + {content?.split(referencesRegex).map((chunk, i) => { + if (chunk.match(referencesRegex)) { + const ref = citationsMap?.get(chunk[1]) + return <ReferenceLink key={i} id={ref?.id || chunk[i]} reference={chunk[1]} /> + } else { + return <span key={i}>{chunk}</span> + } + })} + </div> + {citations?.map(Reference)} + {phase === 'followups' ? <p>Checking for followups...</p> : undefined} + </div> + ) +} + +const StampyArticle = ({pageid, content}: StampyEntry) => { + const glossary = useGlossary() + + return ( + <div> + <Title title="Stampy" Icon={StampyIcon} answerType="human" /> + <article className="stampy"> + <Contents pageid={pageid || ''} html={content || 'Loading...'} glossary={glossary || {}} /> + </article> + </div> + ) +} + +const ChatEntry = (props: Entry) => { + const roles = { + user: UserQuery, + stampy: StampyArticle, + assistant: ChatbotReply, + } as {[k: string]: ComponentType<Entry>} + const Role = roles[props.role] as ComponentType<Entry> + if (!Role) return null + return ( + <div className="chat-entry padding-bottom-40"> + <Role {...props} /> + </div> + ) +} + +export default ChatEntry diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css new file mode 100644 index 00000000..605ba382 --- /dev/null +++ b/app/components/Chatbot/chat_entry.css @@ -0,0 +1,53 @@ +article.stampy { + background: var(--colors-light-grey); + padding: var(--spacing-40); + border-radius: var(--spacing-6); + max-width: unset; + margin: var(--spacing-16); + margin-left: var(--spacing-56); +} + +.chat-entry .title { + display: flex; + gap: var(--spacing-16); +} + +.chat-entry .info { + display: flex; + gap: var(--spacing-6); + align-items: center; +} + +.chat-entry .hint-contents { + position: absolute; + transform: translateY(var(--spacing-24)); + visibility: hidden; +} + +.chat-entry .hint:hover + .hint-contents { + visibility: visible; + background: red; +} + +.chat-entry .reference-link { + background: red; + width: var(--spacing-16); + height: var(--spacing-16); + display: inline-block; +} + +.reference { + display: flex; + gap: var(--spacing-16); +} +.reference .reference-num { + width: var(--spacing-32); + height: var(--spacing-32); + background: red; + border-radius: 6px; + text-align: center; +} + +.reference .source-link { + color: var(--colors-teal-500); +} diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index b3267174..8dd8292d 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -1,11 +1,13 @@ -import {useState} from 'react' -import {Link} from '@remix-run/react' -import PersonIcon from '~/components/icons-generated/Person' +import {useEffect, useState} from 'react' +import {Link, useFetcher} from '@remix-run/react' import StampyIcon from '~/components/icons-generated/Stampy' import SendIcon from '~/components/icons-generated/PlaneSend' import Button from '~/components/Button' -import {queryLLM, Entry, AssistantEntry, Followup} from '~/hooks/useChat' +import {queryLLM, Entry, AssistantEntry, StampyEntry, Followup} from '~/hooks/useChat' +import ChatEntry from './ChatEntry' import './widgit.css' +import {questionUrl} from '~/routesMapper' +import {Question} from '~/server-utils/stampy' export const WidgetStampy = () => { const [question, setQuestion] = useState('') @@ -93,14 +95,15 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { type FollowupsProps = { title?: string followups?: Followup[] + onSelect: (followup: Followup) => void } -const Followups = ({title, followups}: FollowupsProps) => ( +const Followups = ({title, followups, onSelect}: FollowupsProps) => ( <> {title && <div className="padding-bottom-24">{title}</div>} - {followups?.map(({text, action}, i) => ( + {followups?.map(({text, pageid}, i) => ( <div key={i} className="padding-bottom-16"> - <Button className="secondary-alt" action={action}> + <Button className="secondary-alt" action={() => onSelect({text, pageid})}> {text} </Button> </div> @@ -123,77 +126,58 @@ const SplashScreen = ({ </div> <Followups title="Popular questions" - followups={questions?.map((text: string) => ({text, action: () => onQuestion(text)}))} + followups={questions?.map((text: string) => ({text}))} + onSelect={({text}: Followup) => onQuestion(text)} /> </> ) -const UserQuery = ({content}: Entry) => ( - <div> - <div> - <PersonIcon /> <span className="default-bold">You</span> - </div> - <div> {content} </div> - </div> -) - -const ChatbotReply = ({content, phase}: AssistantEntry) => { - const PhaseState = () => { - switch (phase) { - case 'started': - return <p>Loading: Sending query...</p> - case 'semantic': - return <p>Loading: Performing semantic search...</p> - case 'history': - return <p>Loading: Processing history...</p> - case 'context': - return <p>Loading: Creating context...</p> - case 'prompt': - return <p>Loading: Creating prompt...</p> - case 'llm': - return <p>Loading: Waiting for LLM...</p> - case 'streaming': - case 'followups': - default: - return null - } - } - - return ( - <div> - <div> - <StampyIcon /> <span className="default-bold">Stampy</span> - </div> - <PhaseState /> - <div>{content}</div> - {phase === 'followups' ? <p>Checking for followups...</p> : undefined} - </div> - ) -} - -const ChatEntry = (props: Entry) => { - switch (props.role) { - case 'user': - return <UserQuery {...props} /> - case 'assistant': - return <ChatbotReply {...props} /> - } -} - export const Chatbot = ({question, questions}: {question?: string; questions?: string[]}) => { const [followups, setFollowups] = useState<Followup[]>() const [sessionId] = useState('asd') const [history, setHistory] = useState([] as Entry[]) const [controller, setController] = useState(() => new AbortController()) - - const showFollowup = (pageid: string) => { - // Fetch and display the given article - console.log(pageid) + const fetcher = useFetcher({key: 'followup-fetcher'}) + + useEffect(() => { + if (!fetcher.data || fetcher.state !== 'idle') return + + const question = (fetcher.data as any)?.question?.data as Question + if (!question || !question.pageid) return + + setHistory((history) => + history.map((item, i) => { + // Ignore non human written entries + if ((item as StampyEntry).pageid !== question.pageid) return item + // this is the current entry, so update it + if (i === history.length - 1) { + setFollowups( + question.relatedQuestions?.slice(0, 3).map(({title, pageid}) => ({text: title, pageid})) + ) + return {...item, content: question.text || ''} + } + // this is a previous human written article that didn't load properly - don't + // update the text as that could cause things to jump around - the user has + // already moved on, anyway + if (!item.content) return {...item, content: '...'} + // Any fully loaded previous human articles should just be returned + return item + }) + ) + }, [fetcher.data, fetcher.state]) + + const showFollowup = async ({text, pageid}: Followup) => { + if (pageid) fetcher.load(questionUrl({pageid})) + setHistory((prev) => [ + ...prev, + {role: 'user', content: text}, + {pageid, role: 'stampy'} as StampyEntry, + ]) + setFollowups(undefined) } - const abortSearch = () => controller.abort() - console.log(abortSearch) // to stop the linter from complaining + const abortSearch = () => controller.abort() // eslint-disable-line @typescript-eslint/no-unused-vars const onQuestion = async (question: string) => { const message = {content: question, role: 'user'} as Entry @@ -212,12 +196,7 @@ export const Chatbot = ({question, questions}: {question?: string; questions?: s controller ) updateReply(result) - setFollowups( - followups?.map(({text, pageid}: Followup) => ({ - text, - action: () => pageid && showFollowup(pageid), - })) - ) + setFollowups(followups) } return ( @@ -229,7 +208,11 @@ export const Chatbot = ({question, questions}: {question?: string; questions?: s <ChatEntry key={`chat-entry-${i}`} {...item} /> ))} {followups ? ( - <Followups title="continue the conversation" followups={followups} /> + <Followups + title="continue the conversation" + followups={followups} + onSelect={showFollowup} + /> ) : undefined} <QuestionInput initial={question} onAsk={onQuestion} /> </div> diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index 234a2090..c99f54ec 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -5,11 +5,14 @@ export type Citation = { authors: string[] date: string url: string + source: string index: number text: string + reference: string + id?: string } -export type Entry = UserEntry | AssistantEntry | ErrorMessage | StampyMessage +export type Entry = UserEntry | AssistantEntry | ErrorMessage | StampyEntry export type ChatPhase = | 'started' | 'semantic' @@ -41,14 +44,17 @@ export type ErrorMessage = { deleted?: boolean } -export type StampyMessage = { +export type StampyEntry = { role: 'stampy' + pageid: string content: string - url: string deleted?: boolean } -export type Followup = {text: string; pageid?: string; action: string | (() => void)} +export type Followup = { + text: string + pageid?: string +} export type SearchResult = { followups?: Followup[] result: Entry diff --git a/app/hooks/useGlossary.ts b/app/hooks/useGlossary.ts index e69de29b..e35d4b8c 100644 --- a/app/hooks/useGlossary.ts +++ b/app/hooks/useGlossary.ts @@ -0,0 +1,8 @@ +import {useGlossary as useCachedGlossary} from '~/hooks/useCachedObjects' + +const useGlossary = () => { + const {items} = useCachedGlossary() + return items +} + +export default useGlossary diff --git a/app/newRoot.css b/app/root.css similarity index 99% rename from app/newRoot.css rename to app/root.css index d55d4540..cd8548f8 100644 --- a/app/newRoot.css +++ b/app/root.css @@ -12,6 +12,7 @@ --colors-cool-grey-300: #c7cdd5; --colors-cool-grey-200: #dfe3e9; --colors-cool-grey-100: #f9fafc; + --colors-light-grey: #f9fafc; --colors-white: #ffffff; --colors-teal-900: #115652; diff --git a/app/root.tsx b/app/root.tsx index b1bca492..53cf2118 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -12,7 +12,7 @@ import { } from '@remix-run/react' import type {MetaFunction, LinksFunction, LoaderFunction} from '@remix-run/cloudflare' import {cssBundleHref} from '@remix-run/css-bundle' -import newStyles from '~/newRoot.css' +import newStyles from '~/root.css' import Error from '~/components/Error' import Page from '~/components/Page' import {CachedObjectsProvider} from '~/hooks/useCachedObjects' diff --git a/app/routes/questions.$questionId.$.tsx b/app/routes/questions.$questionId.$.tsx index b2af8c04..a3862bf7 100644 --- a/app/routes/questions.$questionId.$.tsx +++ b/app/routes/questions.$questionId.$.tsx @@ -30,8 +30,10 @@ export const loader = async ({request, params}: LoaderFunctionArgs) => { const tagsPromise = loadTags(request) .then(({data}) => data) .catch(raise500) + return defer({question: dataPromise, tags: tagsPromise}) } catch (error: unknown) { + console.log(error) const msg = `No question found with ID ${questionId}. Please go to <a href="https://discord.com/invite/Bt8PaRTDQC">Discord</a> and report where you found this link.` throw new Response(msg, {status: 404}) } From 3307060d163bd8e50de5be7faa20a21703d36361 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 23 Apr 2024 16:29:55 +0200 Subject: [PATCH 006/132] better glossary parsing --- app/server-utils/stampy.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/server-utils/stampy.ts b/app/server-utils/stampy.ts index 60289201..cb1a6295 100644 --- a/app/server-utils/stampy.ts +++ b/app/server-utils/stampy.ts @@ -339,7 +339,13 @@ export const loadGlossary = withCache('loadGlossary', async () => { rows .map(({values}) => { const pageid = extractText(values['UI ID']) - const phrases = [values.phrase, ...values.aliases.split('\n')] + const phrases = [ + values.phrase, + ...values.aliases + .split(/[,\n]/) + .map((v) => v.trim()) + .filter(Boolean), + ] const item = { pageid, term: extractText(values.phrase), From 88ded6ffa22caacfe5d5464399b6a2852f0c20b3 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Mon, 29 Apr 2024 22:41:05 +0200 Subject: [PATCH 007/132] use human answers when available --- app/components/Chatbot/ChatEntry.tsx | 74 ++++++++++++++++-------- app/components/Chatbot/Widgit.tsx | 57 ------------------- app/components/Chatbot/chat_entry.css | 81 +++++++++++++++++++++++++-- app/components/Chatbot/index.tsx | 76 ++++++++++++++++++++----- app/components/Page.tsx | 10 +++- app/components/search.tsx | 17 +----- app/hooks/useChat.ts | 31 +++++----- app/hooks/useSearch.tsx | 71 ++++++++++++++++++----- app/routes/_index.tsx | 3 +- app/routes/chat.tsx | 10 +++- stories/WidgetStampy.stories.tsx | 2 +- 11 files changed, 285 insertions(+), 147 deletions(-) delete mode 100644 app/components/Chatbot/Widgit.tsx diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 1cfc9499..c28a2d9d 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -1,5 +1,6 @@ import {ComponentType} from 'react' import {Link} from '@remix-run/react' +import MarkdownIt from 'markdown-it' import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' import BotIcon from '~/components/icons-generated/Bot' import PersonIcon from '~/components/icons-generated/Person' @@ -7,15 +8,17 @@ import StampyIcon from '~/components/icons-generated/Stampy' import Contents from '~/components/Article/Contents' import useGlossary from '~/hooks/useGlossary' import './chat_entry.css' -import type {Entry, AssistantEntry, StampyEntry, Citation} from '~/hooks/useChat' +import type {Entry, AssistantEntry, StampyEntry, Citation, ErrorMessage} from '~/hooks/useChat' +const MAX_REFERENCES = 10 const hints = { bot: 'bla bla bla something bot', human: 'bla bla bla by humans', + error: null, } -const AnswerInfo = ({answerType}: {answerType?: 'human' | 'bot'}) => { - if (!answerType) return null +const AnswerInfo = ({answerType}: {answerType?: 'human' | 'bot' | 'error'}) => { + if (!answerType || !hints[answerType]) return null return ( <span className="info"> {answerType === 'human' ? <PersonIcon /> : <BotIcon />} @@ -31,7 +34,7 @@ const AnswerInfo = ({answerType}: {answerType?: 'human' | 'bot'}) => { type TitleProps = { title: string Icon: ComponentType - answerType?: 'human' | 'bot' + answerType?: 'human' | 'bot' | 'error' } const Title = ({title, Icon, answerType}: TitleProps) => ( <div className="flex-container title"> @@ -48,14 +51,29 @@ const UserQuery = ({content}: Entry) => ( </div> ) -// FIXME: this id should be unique across the page - I doubt it will be now -const ReferenceLink = ({id, reference}: {id: string; reference: string}) => ( - <Link id={`#${id}-ref`} to={`#${id}`} className="reference-link"> - {reference} - </Link> -) +const md = new MarkdownIt({html: true}) +const ReferenceLink = ({id, index, text}: Citation) => { + if (!index || index > MAX_REFERENCES) return '' -const Reference = ({id, title, authors, source, url, reference}: Citation) => { + const parsed = text?.match(/^###.*?###\s+"""(.*?)"""$/ms) + return ( + <> + <Link id={`${id}-ref`} to={`#${id}`} className={`reference-link ref-${index}`}> + <span>{index}</span> + </Link> + {parsed && ( + <div + className="reference-contents rounded" + dangerouslySetInnerHTML={{ + __html: md.render(parsed[1]), + }} + /> + )} + </> + ) +} + +const Reference = ({id, title, authors, source, url, index}: Citation) => { const referenceSources = { arxiv: 'Scientific paper', blogs: 'Blogpost', @@ -65,6 +83,7 @@ const Reference = ({id, title, authors, source, url, reference}: Citation) => { arbital: 'Arbital', distill: 'Distill', 'aisafety.info': 'AISafety.info', + youtube: 'YouTube', } const Authors = ({authors}: {authors?: string[]}) => { @@ -78,8 +97,8 @@ const Reference = ({id, title, authors, source, url, reference}: Citation) => { } return ( - <div key={id} id={`#${id}`} className="reference padding-bottom-32"> - <div className="reference-num small">{reference}</div> + <div key={id} id={id} className="reference padding-bottom-32"> + <div className={`reference-num small ref-${index}`}>{index}</div> <div> <div className="title">{title}</div> <div> @@ -99,9 +118,7 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { citationsMap?.forEach((v) => { citations.push(v) }) - - const references = citations.map(({reference}) => reference).join('') - const referencesRegex = new RegExp(`(\\[[${references}]\\])`) + citations.sort((a, b) => a.index - b.index) const PhaseState = () => { switch (phase) { @@ -128,17 +145,20 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { <div> <Title title="Stampy" Icon={StampyIcon} answerType="bot" /> <PhaseState /> - <div> - {content?.split(referencesRegex).map((chunk, i) => { - if (chunk.match(referencesRegex)) { - const ref = citationsMap?.get(chunk[1]) - return <ReferenceLink key={i} id={ref?.id || chunk[i]} reference={chunk[1]} /> + <div className="padding-bottom-24"> + {content?.split(/(\[\d+\])|(\n)/).map((chunk, i) => { + if (chunk?.match(/(\[\d+\])/)) { + const refId = chunk.slice(1, chunk.length - 1) + const ref = citationsMap?.get(refId) + return ref && <ReferenceLink key={i} {...ref} /> + } else if (chunk === '\n') { + return <br key={i} /> } else { return <span key={i}>{chunk}</span> } })} </div> - {citations?.map(Reference)} + {citations?.slice(0, MAX_REFERENCES).map(Reference)} {phase === 'followups' ? <p>Checking for followups...</p> : undefined} </div> ) @@ -157,11 +177,21 @@ const StampyArticle = ({pageid, content}: StampyEntry) => { ) } +const ErrorReply = ({content}: ErrorMessage) => { + return ( + <div> + <Title title="Error" Icon={StampyIcon} answerType="error" /> + <div>{content}</div> + </div> + ) +} + const ChatEntry = (props: Entry) => { const roles = { user: UserQuery, stampy: StampyArticle, assistant: ChatbotReply, + error: ErrorReply, } as {[k: string]: ComponentType<Entry>} const Role = roles[props.role] as ComponentType<Entry> if (!Role) return null diff --git a/app/components/Chatbot/Widgit.tsx b/app/components/Chatbot/Widgit.tsx deleted file mode 100644 index 1c71e10f..00000000 --- a/app/components/Chatbot/Widgit.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import {useState} from 'react' -import {Link} from '@remix-run/react' -import StampyIcon from '~/components/icons-generated/Stampy' -import SendIcon from '~/components/icons-generated/PlaneSend' -import Button from '~/components/Button' -import './widgit.css' - -export const WidgetStampy = () => { - const [question, setQuestion] = useState('') - const questions = [ - 'Why couldn’t we just turn the AI off?', - 'How would the AI even get out in the world?', - 'Do people seriously worry about existential risk from AI?', - ] - - const stampyUrl = (question: string) => `https://chat.aisafety.info/?question=${question.trim()}` - return ( - <div className="centered col-9 padding-bottom-128"> - <div className="col-6 padding-bottom-56"> - <h2 className="teal-500">Questions?</h2> - <h2>Ask Stampy, our chatbot, any question about AI safety</h2> - </div> - - <div className="sample-messages-container padding-bottom-24"> - <StampyIcon /> - <div className="sample-messages rounded"> - <div className="padding-bottom-24">Try asking me...</div> - {questions.map((question, i) => ( - <div key={i} className="padding-bottom-16"> - <Button className="secondary-alt" action={stampyUrl(question)}> - {question} - </Button> - </div> - ))} - </div> - </div> - - <div className="widget-ask"> - <input - type="text" - className="full-width bordered secondary" - placeholder="Ask Stampy a question..." - value={question} - onChange={(e) => setQuestion(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter' && question.trim()) { - window.location = stampyUrl(question) as any - } - }} - /> - <Link to={stampyUrl(question)}> - <SendIcon /> - </Link> - </div> - </div> - ) -} diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 605ba382..4d40fbe1 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -30,10 +30,66 @@ article.stampy { } .chat-entry .reference-link { - background: red; - width: var(--spacing-16); - height: var(--spacing-16); + font-size: smaller; + vertical-align: super; + padding: 2px 4px; + margin-left: 2px; + border-radius: var(--border-radius); +} +.chat-entry .reference-link span { + min-width: 10px; display: inline-block; + text-align: center; +} + +.ref-1 { + background: rgb(211, 255, 253); + color: rgb(24, 185, 71); +} + +.ref-2 { + background: rgb(255, 221, 244); + color: rgb(251, 0, 158); +} + +.ref-3 { + background: rgb(217, 253, 254); + color: rgb(23, 184, 197); +} + +.ref-4 { + background: rgb(254, 230, 202); + color: rgb(230, 107, 9); +} + +.ref-5 { + background: rgb(244, 223, 255); + color: rgb(164, 3, 254); +} + +.ref-6 { + background: rgb(231, 255, 178); + color: rgb(99, 159, 4); +} + +.ref-7 { + background: rgb(231, 232, 255); + color: rgb(77, 75, 254); +} + +.ref-8 { + background: rgb(255, 254, 156); + color: rgb(144, 140, 5); +} + +.ref-9 { + background: rgb(254, 226, 226); + color: rgb(200, 0, 5); +} + +.ref-10 { + background: rgb(214, 240, 255); + color: rgb(18, 144, 254); } .reference { @@ -43,7 +99,6 @@ article.stampy { .reference .reference-num { width: var(--spacing-32); height: var(--spacing-32); - background: red; border-radius: 6px; text-align: center; } @@ -51,3 +106,21 @@ article.stampy { .reference .source-link { color: var(--colors-teal-500); } + +.reference-contents { + visibility: hidden; + transition: visibility 0.2s; + max-width: 600px; + word-wrap: break-word; + background-color: var(--colors-cool-grey-300); + padding: var(--spacing-16) var(--spacing-24); + position: absolute; + transform: translateX(50%); + text-decoration: unset; +} + +.reference-contents:hover, +.reference-link:hover + .reference-contents { + visibility: visible; + transition-delay: 0s; +} diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 8dd8292d..68682070 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -1,4 +1,4 @@ -import {useEffect, useState} from 'react' +import {useEffect, useRef, useState} from 'react' import {Link, useFetcher} from '@remix-run/react' import StampyIcon from '~/components/icons-generated/Stampy' import SendIcon from '~/components/icons-generated/PlaneSend' @@ -8,16 +8,17 @@ import ChatEntry from './ChatEntry' import './widgit.css' import {questionUrl} from '~/routesMapper' import {Question} from '~/server-utils/stampy' +import {useSearch} from '~/hooks/useSearch' export const WidgetStampy = () => { const [question, setQuestion] = useState('') const questions = [ - 'Why couldn’t we just turn the AI off?', + 'What is AI Safety?', 'How would the AI even get out in the world?', 'Do people seriously worry about existential risk from AI?', ] - const stampyUrl = (question: string) => `https://chat.aisafety.info/?question=${question.trim()}` + const stampyUrl = (question: string) => `/chat/?question=${question.trim()}` return ( <div className="centered col-9 padding-bottom-128"> <div className="col-6 padding-bottom-56"> @@ -68,6 +69,11 @@ type QuestionInputProps = { const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') + const handleAsk = (val: string) => { + onAsk && onAsk(val) + setQuestion('') + } + const handleChange = (val: string) => { setQuestion(val) onChange && onChange(val) @@ -83,11 +89,11 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter' && question.trim() && onAsk) { - onAsk(question) + handleAsk(question) } }} /> - <SendIcon className="pointer" onClick={() => onAsk && onAsk(question)} /> + <SendIcon className="pointer" onClick={() => handleAsk(question)} /> </div> ) } @@ -135,10 +141,12 @@ const SplashScreen = ({ export const Chatbot = ({question, questions}: {question?: string; questions?: string[]}) => { const [followups, setFollowups] = useState<Followup[]>() + // FIXME: Generate session id const [sessionId] = useState('asd') const [history, setHistory] = useState([] as Entry[]) const [controller, setController] = useState(() => new AbortController()) const fetcher = useFetcher({key: 'followup-fetcher'}) + const {search, resultsForRef, waitForResults} = useSearch(1) useEffect(() => { if (!fetcher.data || fetcher.state !== 'idle') return @@ -177,28 +185,68 @@ export const Chatbot = ({question, questions}: {question?: string; questions?: s setFollowups(undefined) } - const abortSearch = () => controller.abort() // eslint-disable-line @typescript-eslint/no-unused-vars - const onQuestion = async (question: string) => { + // Cancel any previous queries + controller.abort() + const newController = new AbortController() + setController(newController) + + // Add a new history entry, replacing the previous one if it was canceled const message = {content: question, role: 'user'} as Entry - const controller = new AbortController() - setController(controller) + setHistory((current) => { + const last = current[current.length - 1] + if ( + (last?.role === 'assistant' && ['streaming', 'followups'].includes(last?.phase || '')) || + (last?.role === 'stampy' && last?.content) || + ['error'].includes(last?.role) + ) { + return [...current, message, {role: 'assistant'} as AssistantEntry] + } else if (last?.role === 'user' && last?.content === question) { + return [...current.slice(0, current.length - 1), {role: 'assistant'} as AssistantEntry] + } + return [ + ...current.slice(0, current.length - 2), + message, + {role: 'assistant'} as AssistantEntry, + ] + }) setFollowups(undefined) - setHistory((current) => [...current, message, {role: 'assistant'} as AssistantEntry]) const updateReply = (reply: Entry) => setHistory((current) => [...current.slice(0, current.length - 2), message, reply]) + search(question) + const [humanWritten] = await waitForResults(100, 1000) + if (newController.signal.aborted) { + return + } + + if (humanWritten && humanWritten.score > 0.85 && question === resultsForRef.current) { + fetcher.load(questionUrl({pageid: humanWritten.pageid})) + updateReply({pageid: humanWritten.pageid, role: 'stampy'} as StampyEntry) + return + } + const {followups, result} = await queryLLM( [...history, message], updateReply, sessionId, - controller + newController ) - updateReply(result) - setFollowups(followups) + if (!newController.signal.aborted) { + updateReply(result) + setFollowups(followups) + } } + const fetchFlag = useRef(false) + useEffect(() => { + if (question && !fetchFlag.current) { + fetchFlag.current = true + onQuestion(question) + } + }) + return ( <div className="centered col-9 padding-bottom-128"> {history.length === 0 ? ( @@ -214,7 +262,7 @@ export const Chatbot = ({question, questions}: {question?: string; questions?: s onSelect={showFollowup} /> ) : undefined} - <QuestionInput initial={question} onAsk={onQuestion} /> + <QuestionInput onAsk={onQuestion} /> </div> ) } diff --git a/app/components/Page.tsx b/app/components/Page.tsx index 72e10598..dba38cce 100644 --- a/app/components/Page.tsx +++ b/app/components/Page.tsx @@ -7,7 +7,13 @@ import MobileNav from '~/components/Nav/Mobile' import {useTags} from '~/hooks/useCachedObjects' import useToC from '~/hooks/useToC' import useIsMobile from '~/hooks/isMobile' -const Page = ({children, modal}: {children: ReactNode; modal?: boolean}) => { + +type PageProps = { + children: ReactNode + modal?: boolean + noFooter?: boolean +} +const Page = ({children, modal, noFooter}: PageProps) => { const {toc} = useToC() const {items: tags} = useTags() const {embed} = useOutletContext<Context>() || {} @@ -22,7 +28,7 @@ const Page = ({children, modal}: {children: ReactNode; modal?: boolean}) => { ))} {children} - {!embed && !modal && <Footer />} + {!embed && !modal && !noFooter && <Footer />} </> ) } diff --git a/app/components/search.tsx b/app/components/search.tsx index 42ace05d..dcb42afe 100644 --- a/app/components/search.tsx +++ b/app/components/search.tsx @@ -1,10 +1,8 @@ import {useState, useEffect, useRef} from 'react' import debounce from 'lodash/debounce' import {useSearch} from '~/hooks/useSearch' -import {Question} from '~/server-utils/stampy' import {SearchInput} from './SearchInput/Input' import {SearchResults} from './SearchResults/Dropdown' -import {fetchAllQuestionsOnSite} from '~/routes/questions.allQuestionsOnSite' import {questionUrl} from '~/routesMapper' type Props = { @@ -13,24 +11,11 @@ type Props = { removeQueryFromUrl?: () => void } -const empty: [] = [] - export default function Search({queryFromUrl, limitFromUrl, removeQueryFromUrl}: Props) { const [showResults, setShowResults] = useState(!!queryFromUrl) const searchInputRef = useRef('') - const onSiteAnswersRef = useRef<Question[]>(empty) - useEffect(() => { - // not needed for initial screen => lazy load on client - fetchAllQuestionsOnSite().then(({data, backgroundPromiseIfReloaded}) => { - onSiteAnswersRef.current = data - backgroundPromiseIfReloaded.then((x) => { - if (x) onSiteAnswersRef.current = x.data - }) - }) - }, []) - - const {search, isPendingSearch, results} = useSearch(onSiteAnswersRef, limitFromUrl) + const {search, isPendingSearch, results} = useSearch(limitFromUrl) const searchFn = (rawValue: string) => { const value = rawValue.trim() diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index c99f54ec..a8563ad6 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -1,4 +1,5 @@ -export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' +// export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' +export const CHATBOT_URL = 'http://127.0.0.1:3001/chat' export type Citation = { title: string @@ -77,9 +78,9 @@ export const formatCitations: (text: string) => string = (text) => { // well to almost everything the LLM emits. We won't ever reach five nines, // but the domain is one where occasionally failing isn't catastrophic. - // transform all things that look like [a, b, c] into [a][b][c] + // transform all things that look like [1, 2, 3] into [1][2][3] let response = text.replace( - /\[((?:[a-z]+,\s*)*[a-z]+)\]/g, // identify groups of this form + /\[((?:\d+,\s*)*\d+)\]/g, // identify groups of this form (block: string) => block @@ -88,9 +89,9 @@ export const formatCitations: (text: string) => string = (text) => { .join('][') ) - // transform all things that look like [(a), (b), (c)] into [(a)][(b)][(c)] + // transform all things that look like [(1), (2), (3)] into [(1)][(2)][(3)] response = response.replace( - /\[((?:\([a-z]+\),\s*)*\([a-z]+\))\]/g, // identify groups of this form + /\[((?:\(\d+\),\s*)*\(\d+\))\]/g, // identify groups of this form (block: string) => block @@ -99,11 +100,11 @@ export const formatCitations: (text: string) => string = (text) => { .join('][') ) - // transform all things that look like [(a)] into [a] - response = response.replace(/\[\(([a-z]+)\)\]/g, (_match: string, x: string) => `[${x}]`) + // transform all things that look like [(3)] into [3] + response = response.replace(/\[\((\d+)\)\]/g, (_match: string, x: string) => `[${x}]`) - // transform all things that look like [ a ] into [a] - response = response.replace(/\[\s*([a-z]+)\s*\]/g, (_match: string, x: string) => `[${x}]`) + // transform all things that look like [ 12 ] into [12] + response = response.replace(/\[\s*(\d+)\s*\]/g, (_match: string, x: string) => `[${x}]`) return response } @@ -113,20 +114,22 @@ export const findCitations: (text: string, citations: Citation[]) => Map<string, ) => { // figure out what citations are in the response, and map them appropriately const cite_map = new Map<string, Citation>() + let index = 1 // scan a regex for [x] over the response. If x isn't in the map, add it. // (note: we're actually doing this twice - once on parsing, once on render. // if that looks like a problem, we could swap from strings to custom ropes). - const regex = /\[([a-z]+)\]/g + const regex = /\[(\d+)\]/g let match while ((match = regex.exec(text)) !== null) { - const letter = match[1] - if (!letter || cite_map.has(letter!)) continue + const ref = match[1] + if (!ref || cite_map.has(ref!)) continue - const citation = citations[letter.charCodeAt(0) - 'a'.charCodeAt(0)] + const citation = citations[parseInt(ref, 10)] if (!citation) continue - cite_map.set(letter!, citation) + cite_map.set(ref!, {...citation, index}) + index++ } return cite_map } diff --git a/app/hooks/useSearch.tsx b/app/hooks/useSearch.tsx index d109b626..63c82a33 100644 --- a/app/hooks/useSearch.tsx +++ b/app/hooks/useSearch.tsx @@ -1,4 +1,5 @@ -import {useState, useEffect, useRef, MutableRefObject} from 'react' +import {useState, useEffect, useRef} from 'react' +import {fetchAllQuestionsOnSite} from '~/routes/questions.allQuestionsOnSite' import {Question} from '~/server-utils/stampy' const NUM_RESULTS = 8 @@ -21,6 +22,23 @@ export type WorkerMessage = userQuery?: string } +const waitForCondition = async (conditionFn: () => boolean, interval = 100, timeout = 5000) => { + const startTime = Date.now() + + async function loop() { + // If the condition is met, resolve. + if (conditionFn()) return true + + // If the timeout has elapsed, reject. + if (Date.now() - startTime > timeout) throw new Error('Timeout waiting for condition') + + // Wait for the specified interval, then try again. + await new Promise((resolve) => setTimeout(resolve, interval)) + return loop() + } + return loop() +} + /** * Sort function for the highest score on top */ @@ -112,16 +130,26 @@ const normalize = (question: string) => * use baseline search over the list of questions already loaded on the site. * Searches containing only one or two words will also use the baseline search */ -export const useSearch = ( - onSiteQuestions: MutableRefObject<Question[]>, - numResults = NUM_RESULTS -) => { +export const useSearch = (numResults = NUM_RESULTS) => { const tfWorkerRef = useRef<Worker>() const runningQueryRef = useRef<string>() // detect current query in search function from previous render => ref const timeoutRef = useRef<ReturnType<typeof setTimeout>>() // cancel previous timeout => ref - const [isPendingSearch, setIsPendingSearch] = useState(false) // re-render loading indicator => state + const isPendingSearch = useRef(false) + const resultsRef = useRef<SearchResult[]>([]) + const resultsForRef = useRef<string>() const [results, setResults] = useState([] as SearchResult[]) + const onSiteAnswersRef = useRef<Question[]>([]) + useEffect(() => { + // not needed for initial screen => lazy load on client + fetchAllQuestionsOnSite().then(({data, backgroundPromiseIfReloaded}) => { + onSiteAnswersRef.current = data + backgroundPromiseIfReloaded.then((x) => { + if (x) onSiteAnswersRef.current = x.data + }) + }) + }, []) + useEffect(() => { const makeWorker = async () => { const worker = new Worker('/tfWorker.js') @@ -130,8 +158,12 @@ export const useSearch = ( tfWorkerRef.current = worker } else if (data.userQuery == runningQueryRef.current) { runningQueryRef.current = undefined - if (data.searchResults) setResults(data.searchResults) - setIsPendingSearch(false) + if (data.searchResults) { + resultsRef.current = data.searchResults + resultsForRef.current = data.userQuery + setResults(data.searchResults) + } + isPendingSearch.current = false } }) } @@ -148,7 +180,7 @@ export const useSearch = ( } const search = (userQuery: string) => { - setIsPendingSearch(true) + isPendingSearch.current = true const wordCount = userQuery.split(' ').length if (wordCount > 2) { if (runningQueryRef.current || !tfWorkerRef.current) { @@ -158,22 +190,35 @@ export const useSearch = ( runningQueryRef.current = userQuery tfWorkerRef.current.postMessage({userQuery, numResults}) } else { - if (runningQueryRef.current || onSiteQuestions.current.length == 0) { + if (runningQueryRef.current || onSiteAnswersRef.current.length == 0) { searchLater(userQuery) return } runningQueryRef.current = userQuery - baselineSearch(userQuery, onSiteQuestions.current, numResults).then((searchResults) => { + baselineSearch(userQuery, onSiteAnswersRef.current, numResults).then((searchResults) => { runningQueryRef.current = undefined + resultsRef.current = searchResults + resultsForRef.current = userQuery + isPendingSearch.current = false setResults(searchResults) - setIsPendingSearch(false) }) } } + const waitForResults = async (interval?: number, timeout?: number) => { + try { + await waitForCondition(() => !isPendingSearch.current, interval, timeout) + } catch (e) { + console.info('Timeout') + } + return resultsRef.current + } + return { search, results, - isPendingSearch, + resultsForRef, + isPendingSearch: isPendingSearch.current, + waitForResults, } } diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index 36293711..a32183f5 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -7,6 +7,7 @@ import Grid from '~/components/Grid' import Page from '~/components/Page' import {getStateEntries} from '~/hooks/stateModifiers' import {questionUrl} from '~/routesMapper' +import {WidgetStampy} from '~/components/Chatbot' export const loader = async ({request}: Parameters<LoaderFunction>[0]) => { const url = new URL(request.url) @@ -38,7 +39,7 @@ export default function App() { <ContentBoxThird /> <div className="desktop-only padding-bottom-56" /> - {/* <WidgetStampy /> */} + <WidgetStampy /> <h3 className="grey large-bold padding-bottom-32">Advanced sections</h3> <Grid gridBoxes={advanced} /> diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 23d17520..1adef68e 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -1,16 +1,20 @@ -import {ShouldRevalidateFunction} from '@remix-run/react' +import {ShouldRevalidateFunction, useSearchParams} from '@remix-run/react' import Page from '~/components/Page' import Chatbot from '~/components/Chatbot' export const shouldRevalidate: ShouldRevalidateFunction = () => false export default function App() { + const [params] = useSearchParams() + const question = params.get('question') || undefined + return ( - <Page> + <Page noFooter> <div className="page-body"> <Chatbot + question={question} questions={[ - 'Why couldn’t we just turn the AI off?', + 'What is AI Safety?', 'How would the AI even get out in the world?', 'Do people seriously worry about existential risk from AI?', ]} diff --git a/stories/WidgetStampy.stories.tsx b/stories/WidgetStampy.stories.tsx index 673c1e38..75731d73 100644 --- a/stories/WidgetStampy.stories.tsx +++ b/stories/WidgetStampy.stories.tsx @@ -1,5 +1,5 @@ import type {Meta, StoryObj} from '@storybook/react' -import {WidgetStampy} from '../app/components/Chatbot/Widgit' +import {WidgetStampy} from '../app/components/Chatbot' const meta = { title: 'Components/WidgetStampy', From 38ee3e548cfe505ac41b27cf1e8dea5394d84296 Mon Sep 17 00:00:00 2001 From: buddy <0buddy.ne@gmail.com> Date: Tue, 30 Apr 2024 05:37:46 +0300 Subject: [PATCH 008/132] tickets: #591 #590 --- app/components/Chatbot/index.tsx | 13 ++++++++-- app/components/Chatbot/widgit.css | 42 +++++++++++++++++++------------ 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 29b2f6a2..7b7e0566 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -68,10 +68,11 @@ type QuestionInputProps = { } const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') - + const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') const handleAsk = (val: string) => { onAsk && onAsk(val) setQuestion('') + setPlaceholder('Message Stampy') } const handleChange = (val: string) => { @@ -84,7 +85,7 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { <input type="text" className="full-width bordered secondary right-icon" - placeholder="Ask Stampy a question..." + placeholder={placeholder} value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { @@ -263,6 +264,14 @@ export const Chatbot = ({question, questions}: {question?: string; questions?: s /> ) : undefined} <QuestionInput onAsk={onQuestion} /> + + <div className={'warning-floating'}> + <p className={'xs'}> + <span className={'red xs-bold'}>Caution! </span> + This is an early prototype. Don’t automatically trust what it says, and make sure to + follow its sources. + </p> + </div> </div> ) } diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 098b06e0..53acc061 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -20,19 +20,29 @@ width: 100%; } } -.height-70{ - height: 70vh; - overflow-x: hidden; - } -.widget-ask{ - position: sticky; - bottom: 0; -} -.pointer{ - position: absolute; - right: 0; - margin: 4px; - } -.right-icon{ - padding-right: var(--spacing-56); -} \ No newline at end of file +.height-70 { + height: 70vh; + overflow-x: hidden; +} +.widget-ask { + position: sticky; + bottom: 0; +} +.pointer { + position: absolute; + right: 0; + margin: 4px; +} +.right-icon { + padding-right: var(--spacing-56); +} +.warning-floating { + position: fixed; + right: 7vw; + z-index: 100; + bottom: 5vw; + width: 11vw; +} +.red { + color: #d40000; +} From 686213f9625233da43d704354c128c4d91c4fca7 Mon Sep 17 00:00:00 2001 From: buddy <0buddy.ne@gmail.com> Date: Tue, 30 Apr 2024 15:44:00 +0300 Subject: [PATCH 009/132] weird lint error --- package.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index a4d94267..d10c6631 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "dependencies": { "@remix-run/cloudflare": "^2.6.0", "@remix-run/cloudflare-workers": "^2.6.0", - "@remix-run/react": "^2.6.0", "@remix-run/css-bundle": "^1.19.3", + "@remix-run/react": "^2.6.0", "copy-to-clipboard": "^3.3.3", "isbot": "^4", "lodash": "^4.17.21", @@ -21,6 +21,15 @@ "devDependencies": { "@cloudflare/workers-types": "^4.20240129.0", "@remix-run/dev": "^2.6.0", + "@storybook/addon-designs": "^7.0.9", + "@storybook/addon-essentials": "^7.6.8", + "@storybook/addon-interactions": "^7.6.8", + "@storybook/addon-links": "^7.6.8", + "@storybook/addon-onboarding": "^1.0.10", + "@storybook/blocks": "^7.6.8", + "@storybook/react": "^7.6.8", + "@storybook/react-vite": "^7.6.8", + "@storybook/test": "^7.6.8", "@svgr/cli": "^8.1.0", "@types/jest": "^29.5.12", "@types/lodash": "^4.14.202", @@ -30,35 +39,26 @@ "@types/react-dom": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", + "@vitejs/plugin-react": "^4.2.1", + "chromatic": "^10.2.2", "cross-env": "^7.0.3", "eslint": "^8.56.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "eslint-plugin-storybook": "^0.6.15", + "eslint-plugin-unused-imports": "^3.1.0", "jest": "^29.7.0", "jest-environment-miniflare": "^2.14.2", "npm-run-all": "^4.1.5", "prettier": "^3.2.5", "rimraf": "^5.0.5", + "storybook": "^7.6.8", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", "typescript": "^5.3.3", - "wrangler": "^3.24.0", - "@storybook/addon-designs": "^7.0.9", - "@storybook/addon-essentials": "^7.6.8", - "@storybook/addon-interactions": "^7.6.8", - "@storybook/addon-links": "^7.6.8", - "@storybook/addon-onboarding": "^1.0.10", - "@storybook/blocks": "^7.6.8", - "@storybook/react": "^7.6.8", - "@storybook/react-vite": "^7.6.8", - "@storybook/test": "^7.6.8", - "@vitejs/plugin-react": "^4.2.1", - "chromatic": "^10.2.2", - "eslint-plugin-react-refresh": "^0.4.5", - "eslint-plugin-storybook": "^0.6.15", - "storybook": "^7.6.8", "vite": "^5.0.8", - "eslint-plugin-unused-imports": "^3.0.0" + "wrangler": "^3.24.0" }, "engines": { "node": ">=18" @@ -84,4 +84,4 @@ "storybook": "storybook dev -p 6006" }, "main": "build/index.js" -} \ No newline at end of file +} From 50aadbaa5dd359bd7a09e076ad8b7d16cf4a00e0 Mon Sep 17 00:00:00 2001 From: buddy <0buddy.ne@gmail.com> Date: Tue, 30 Apr 2024 15:45:23 +0300 Subject: [PATCH 010/132] weird lint error --- package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7957a467..a64d0412 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", "eslint-plugin-storybook": "^0.6.15", - "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-unused-imports": "^3.1.0", "jest": "^29.7.0", "jest-environment-miniflare": "^2.14.2", "npm-run-all": "^4.1.5", @@ -11921,9 +11921,9 @@ } }, "node_modules/eslint-plugin-unused-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", - "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", + "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", "dev": true, "dependencies": { "eslint-rule-composer": "^0.3.0" @@ -11932,8 +11932,8 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0", - "eslint": "^8.0.0" + "@typescript-eslint/eslint-plugin": "6 - 7", + "eslint": "8" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -31765,9 +31765,9 @@ } }, "eslint-plugin-unused-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", - "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", + "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", "dev": true, "requires": { "eslint-rule-composer": "^0.3.0" From 7a925532a75cc91f99a1ef1bca63a2e547c892b0 Mon Sep 17 00:00:00 2001 From: buddy <0buddy.ne@gmail.com> Date: Tue, 30 Apr 2024 15:49:41 +0300 Subject: [PATCH 011/132] weird lint error --- app/components/Nav/index.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/components/Nav/index.tsx b/app/components/Nav/index.tsx index f30b9ecb..2ce3efa5 100644 --- a/app/components/Nav/index.tsx +++ b/app/components/Nav/index.tsx @@ -30,10 +30,10 @@ export const Nav = ({toc, categories}: NavProps) => { /> <ArticlesDropdown toc={toc} categories={categories || []} /> <MenuItem - primary={true} - link="https://chat.aisafety.info" - icon={<BotIcon />} - text="Stampy chatbot" + primary={true} + link="https://chat.aisafety.info" + icon={<BotIcon />} + text="Stampy chatbot" /> <li className="top-menu-item"> <div className="top-menu-divider"></div> From 08e02dc5049be48a7ff0ef551eea4fc76aa24b84 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 30 Apr 2024 15:13:39 +0200 Subject: [PATCH 012/132] Chat settings --- app/components/Chatbot/ChatEntry.tsx | 13 ++++++--- app/components/Chatbot/index.tsx | 12 ++++++--- app/components/Chatbot/widgit.css | 13 +++++++++ app/hooks/useChat.ts | 23 ++++++++++++---- app/root.css | 4 +++ app/routes/chat.tsx | 40 +++++++++++++++++++++++++++- 6 files changed, 93 insertions(+), 12 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index c28a2d9d..bebefc51 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -3,6 +3,7 @@ import {Link} from '@remix-run/react' import MarkdownIt from 'markdown-it' import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' import BotIcon from '~/components/icons-generated/Bot' +import LinkIcon from '~/components/icons-generated/Link' import PersonIcon from '~/components/icons-generated/Person' import StampyIcon from '~/components/icons-generated/Stampy' import Contents from '~/components/Article/Contents' @@ -104,8 +105,9 @@ const Reference = ({id, title, authors, source, url, index}: Citation) => { <div> <Authors authors={authors} /> <span>{' · '}</span> - <Link className="source-link" to={url}> - {referenceSources[source as keyof typeof referenceSources] || new URL(url).host} + <Link className="source-link" to={url} target="_blank" rel="noopener noreferrer"> + {referenceSources[source as keyof typeof referenceSources] || new URL(url).host}{' '} + <LinkIcon width="16" height="16" /> </Link> </div> </div> @@ -158,7 +160,12 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { } })} </div> - {citations?.slice(0, MAX_REFERENCES).map(Reference)} + {citations && citations.length > 0 && ( + <> + <hr /> + <div className="padding-top-32">{citations?.slice(0, MAX_REFERENCES).map(Reference)}</div> + </> + )} {phase === 'followups' ? <p>Checking for followups...</p> : undefined} </div> ) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 68682070..9412a470 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -3,7 +3,7 @@ import {Link, useFetcher} from '@remix-run/react' import StampyIcon from '~/components/icons-generated/Stampy' import SendIcon from '~/components/icons-generated/PlaneSend' import Button from '~/components/Button' -import {queryLLM, Entry, AssistantEntry, StampyEntry, Followup} from '~/hooks/useChat' +import {queryLLM, Entry, AssistantEntry, StampyEntry, Followup, ChatSettings} from '~/hooks/useChat' import ChatEntry from './ChatEntry' import './widgit.css' import {questionUrl} from '~/routesMapper' @@ -138,7 +138,12 @@ const SplashScreen = ({ </> ) -export const Chatbot = ({question, questions}: {question?: string; questions?: string[]}) => { +type ChatbotProps = { + question?: string + questions?: string[] + settings?: ChatSettings +} +export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const [followups, setFollowups] = useState<Followup[]>() // FIXME: Generate session id @@ -231,7 +236,8 @@ export const Chatbot = ({question, questions}: {question?: string; questions?: s [...history, message], updateReply, sessionId, - newController + newController, + settings ) if (!newController.signal.aborted) { updateReply(result) diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 1aaea416..a54b8512 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -20,3 +20,16 @@ width: 100%; } } + +.settings-container { + position: absolute; + bottom: var(--spacing-16); + left: var(--spacing-16); +} + +.settings { + padding: var(--spacing-32); + margin-bottom: var(--spacing-24); + flex-direction: column; + gap: var(--spacing-24); +} diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index a8563ad6..d4d6c946 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -61,7 +61,18 @@ export type SearchResult = { result: Entry } -export type Mode = 'rookie' | 'concise' | 'default' | 'discord' +type Model = + | 'gpt-3.5-turbo' + | 'gpt-4' + | 'gpt-4-turbo-preview' + | 'claude-3-opus-20240229' + | 'claude-3-sonnet-20240229' + | 'claude-3-haiku-20240307' +export type Mode = 'rookie' | 'concise' | 'default' +export type ChatSettings = { + mode?: Mode + completions?: Model +} const DATA_HEADER = 'data: ' const EVENT_END_HEADER = 'event: close' @@ -229,7 +240,8 @@ export const extractAnswer = async ( const fetchLLM = async ( sessionId: string | undefined, history: HistoryEntry[], - controller: AbortController + controller: AbortController, + settings?: ChatSettings ): Promise<Response | void> => fetch(CHATBOT_URL, { signal: controller.signal, @@ -240,18 +252,19 @@ const fetchLLM = async ( 'Content-Type': 'application/json', Accept: 'text/event-stream', }, - body: JSON.stringify({sessionId, history, settings: {mode: 'default'}}), + body: JSON.stringify({sessionId, history, settings}), }).catch(ignoreAbort) export const queryLLM = async ( history: HistoryEntry[], setCurrent: (e: AssistantEntry) => void, sessionId: string | undefined, - controller: AbortController + controller: AbortController, + settings?: ChatSettings ): Promise<SearchResult> => { setCurrent({...makeEntry(), phase: 'started'}) // do SSE on a POST request. - const res = await fetchLLM(sessionId, history, controller) + const res = await fetchLLM(sessionId, history, controller, settings) if (!res) { return {result: {role: 'error', content: 'No response from server'}} diff --git a/app/root.css b/app/root.css index bce98dcc..0de35ba7 100644 --- a/app/root.css +++ b/app/root.css @@ -392,6 +392,10 @@ svg { cursor: pointer; } +.full-height { + height: 100%; +} + /* for troubleshooting */ .pink { diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 1adef68e..265c39cc 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -1,16 +1,37 @@ +import {useState} from 'react' import {ShouldRevalidateFunction, useSearchParams} from '@remix-run/react' +import SettingsIcon from '~/components/icons-generated/Settings' import Page from '~/components/Page' import Chatbot from '~/components/Chatbot' +import {ChatSettings, Mode} from '~/hooks/useChat' +import Button from '~/components/Button' export const shouldRevalidate: ShouldRevalidateFunction = () => false export default function App() { const [params] = useSearchParams() + const [showSettings, setShowSettings] = useState(false) + const [chatSettings, setChatSettings] = useState({mode: 'default'} as ChatSettings) const question = params.get('question') || undefined + const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( + <Button + className={chatSettings.mode === mode ? 'primary-alt' : ''} + action={() => setChatSettings({...chatSettings, mode})} + > + {name} + </Button> + ) + + const stopBubbling = (e: any) => { + e.preventDefault() + e.stopPropagation() + e.nativeEvent.stopImmediatePropagation() + } + return ( <Page noFooter> - <div className="page-body"> + <div className="page-body full-height" onClick={stopBubbling}> <Chatbot question={question} questions={[ @@ -18,7 +39,24 @@ export default function App() { 'How would the AI even get out in the world?', 'Do people seriously worry about existential risk from AI?', ]} + settings={chatSettings} /> + <div className="settings-container" onClick={stopBubbling}> + {showSettings && ( + <div className="settings bordered flex-container"> + <div>Answer detail</div> + <ModeButton mode="default" name="Default" /> + <ModeButton mode="rookie" name="Detailed" /> + <ModeButton mode="concise" name="Concise" /> + </div> + )} + <SettingsIcon + width="32" + height="32" + className="pointer" + onClick={() => setShowSettings((current) => !current)} + /> + </div> </div> </Page> ) From 97ab76b622d683e3f06f5e85b4a526efcd2fd187 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 30 Apr 2024 18:25:32 +0200 Subject: [PATCH 013/132] various fixes --- app/components/Article/index.tsx | 4 +- app/hooks/useCachedObjects.tsx | 20 ++++++++-- app/routes/questions.$questionId.$.tsx | 55 +++++++++++++++----------- app/server-utils/parsing-utils.ts | 2 +- stories/ArticlesKeepGoing.stories.tsx | 7 +++- 5 files changed, 57 insertions(+), 31 deletions(-) diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index b7639701..55a87627 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -49,7 +49,7 @@ const ArticleFooter = (question: Question) => { <Button className="secondary" action={question.answerEditLink || ''} - tooltip="Edit article" + tooltip="Suggest changes in Google Docs" props={{target: '_blank', rel: 'noopener noreferrer'}} > <EditIcon className="no-fill" /> @@ -107,7 +107,7 @@ const ArticleActions = ({answerEditLink}: Question) => { <Button className="secondary" action={answerEditLink || ''} - tooltip="Edit article" + tooltip="Suggest changes in Google Docs" props={{target: '_blank', rel: 'noopener noreferrer'}} > <EditIcon className="no-fill" /> diff --git a/app/hooks/useCachedObjects.tsx b/app/hooks/useCachedObjects.tsx index 353a97f5..4e849685 100644 --- a/app/hooks/useCachedObjects.tsx +++ b/app/hooks/useCachedObjects.tsx @@ -1,11 +1,12 @@ import {useEffect, useState, createContext, useContext, ReactElement} from 'react' -import type {Tag, Glossary} from '~/server-utils/stampy' +import type {Tag, Glossary, Question} from '~/server-utils/stampy' import {fetchTags} from '~/routes/categories.all' import {fetchTOC, TOCItem} from '~/routes/questions.toc' import {fetchGlossary} from '~/routes/questions.glossary' +import {fetchAllQuestionsOnSite} from '~/routes/questions.allQuestionsOnSite' -type ServerObject = Tag[] | TOCItem[] | Glossary -type APICall = () => Promise<Tag[] | TOCItem[] | Glossary> +type ServerObject = Tag[] | TOCItem[] | Glossary | Question[] +type APICall = () => Promise<ServerObject> type useObjectsType<T extends ServerObject> = { items?: T } @@ -25,23 +26,26 @@ export const useItemsFuncs = <T extends ServerObject>(apiFetcher: APICall): useO } type useCachedObjectsType = { + onSiteQuestions: useObjectsType<Question[]> glossary: useObjectsType<Glossary> tags: useObjectsType<Tag[]> toc: useObjectsType<TOCItem[]> } export const CachedObjectsContext = createContext<useCachedObjectsType | null>(null) +const getOnSiteQuestions = async () => (await fetchAllQuestionsOnSite()).data const getGlossary = async () => (await fetchGlossary()).data const getTags = async () => (await fetchTags()).tags const getToC = async () => (await fetchTOC()).data export const CachedObjectsProvider = ({children}: {children: ReactElement}) => { + const onSiteQuestions = useItemsFuncs<Question[]>(getOnSiteQuestions) const glossary = useItemsFuncs<Glossary>(getGlossary) const tags = useItemsFuncs<Tag[]>(getTags) const toc = useItemsFuncs<TOCItem[]>(getToC) return ( - <CachedObjectsContext.Provider value={{tags, glossary, toc}}> + <CachedObjectsContext.Provider value={{tags, glossary, toc, onSiteQuestions}}> {children} </CachedObjectsContext.Provider> ) @@ -55,6 +59,14 @@ export const useCachedObjects = () => { return context } +export const useOnSiteQuestions = () => { + const context = useContext(CachedObjectsContext) + if (!context) { + throw new Error('useOnSiteQuestions must be used within a CachedObjectsProvider') + } + return context.onSiteQuestions +} + export const useTags = () => { const context = useContext(CachedObjectsContext) if (!context) { diff --git a/app/routes/questions.$questionId.$.tsx b/app/routes/questions.$questionId.$.tsx index 57ea659f..f497fab5 100644 --- a/app/routes/questions.$questionId.$.tsx +++ b/app/routes/questions.$questionId.$.tsx @@ -9,11 +9,12 @@ import Error from '~/components/Error' import XIcon from '~/components/icons-generated/X' import ChevronRight from '~/components/icons-generated/ChevronRight' import {ArticlesNav} from '~/components/ArticlesNav/ArticleNav' -import {fetchGlossary} from '~/routes/questions.glossary' -import {loadQuestionDetail, loadTags} from '~/server-utils/stampy' +import {QuestionStatus, loadQuestionDetail} from '~/server-utils/stampy' import useToC from '~/hooks/useToC' -import type {Question, Glossary, Tag} from '~/server-utils/stampy' +import useGlossary from '~/hooks/useGlossary' +import type {Question, Tag} from '~/server-utils/stampy' import {reloadInBackgroundIfNeeded} from '~/server-utils/kv-cache' +import {useOnSiteQuestions, useTags} from '~/hooks/useCachedObjects' export const LINK_WITHOUT_DETAILS_CLS = 'link-without-details' @@ -27,11 +28,7 @@ export const loader = async ({request, params}: LoaderFunctionArgs) => { try { const dataPromise = loadQuestionDetail(request, questionId).catch(raise500) - const tagsPromise = loadTags(request) - .then(({data}) => data) - .catch(raise500) - - return defer({question: dataPromise, tags: tagsPromise}) + return defer({question: dataPromise}) } catch (error: unknown) { console.log(error) const msg = `No question found with ID ${questionId}. Please go to <a href="https://discord.com/invite/Bt8PaRTDQC">Discord</a> and report where you found this link.` @@ -46,8 +43,8 @@ const dummyQuestion = (title: string | undefined) => tags: [], }) as any as Question -const updateTags = (question: Question, tags: Tag[]) => { - const mappedTags = tags.reduce((acc, t) => ({...acc, [t.name]: t}), {}) +const updateTags = (question: Question, tags?: Tag[]) => { + const mappedTags = tags?.reduce((acc, t) => ({...acc, [t.name]: t}), {}) || {} return { ...question, tags: question.tags @@ -57,24 +54,32 @@ const updateTags = (question: Question, tags: Tag[]) => { } } +const updateRelated = (question: Question, allQuestions?: Question[]) => { + const live = + allQuestions + ?.filter(({status}) => status === QuestionStatus.LIVE_ON_SITE) + .map(({pageid}) => pageid) || [] + return { + ...question, + relatedQuestions: question.relatedQuestions.filter(({pageid}) => live.includes(pageid)), + } +} + +const updateFields = (question: Question, tags?: Tag[], allQuestions?: Question[]) => + updateTags(updateRelated(question, allQuestions), tags) + export default function RenderArticle() { const location = useLocation() - const [glossary, setGlossary] = useState<Glossary>({} as Glossary) const [showNav, setShowNav] = useState(false) // Used on mobile const params = useParams() + const {items: onSiteQuestions} = useOnSiteQuestions() + const {items: tags} = useTags() + const glossary = useGlossary() const pageid = params.questionId ?? '😱' - const {question, tags} = useLoaderData<typeof loader>() + const {question} = useLoaderData<typeof loader>() const {toc, findSection, getArticle, getPath} = useToC() const section = findSection(location?.state?.section || pageid) - useEffect(() => { - const getGlossary = async () => { - const {data} = await fetchGlossary() - setGlossary(data) - } - getGlossary() - }, [setGlossary]) - useEffect(() => { setShowNav(false) }, [location.key]) @@ -134,8 +139,8 @@ export default function RenderArticle() { /> } > - <Await resolve={Promise.all([question, tags])}> - {([resolvedQuestion, resolvedTags]) => { + <Await resolve={question}> + {(resolvedQuestion) => { if (resolvedQuestion instanceof Response || !('data' in resolvedQuestion)) { return <Error error={resolvedQuestion} /> } else if (!resolvedQuestion.data.pageid) { @@ -145,7 +150,11 @@ export default function RenderArticle() { } else { return ( <Article - question={updateTags(resolvedQuestion.data as Question, resolvedTags as Tag[])} + question={updateFields( + resolvedQuestion.data as Question, + tags, + onSiteQuestions + )} glossary={glossary} className={showNav ? 'desktop-only' : ''} /> diff --git a/app/server-utils/parsing-utils.ts b/app/server-utils/parsing-utils.ts index 1cb8b3df..c1d03b84 100644 --- a/app/server-utils/parsing-utils.ts +++ b/app/server-utils/parsing-utils.ts @@ -94,5 +94,5 @@ export const allLinksOnNewTab = (html: string): string => { // Open external links on new tab by using target="_blank", // pros&cons were extensively discussed in https://github.com/StampyAI/stampy-ui/issues/222 // internal links look like <a href="/?state=1234">, so all absolute http links are treated as external - return html.replace(/(<a href="[^"]+")/g, `$1 target="_blank" rel="noreferrer"`) + return html.replace(/(<a href="[^#].*?")/g, `$1 target="_blank" rel="noreferrer"`) } diff --git a/stories/ArticlesKeepGoing.stories.tsx b/stories/ArticlesKeepGoing.stories.tsx index 08f1abe3..4f0c375b 100644 --- a/stories/ArticlesKeepGoing.stories.tsx +++ b/stories/ArticlesKeepGoing.stories.tsx @@ -123,7 +123,12 @@ const relatedQuestions = [ const withMockedToC = (StoryFn: any) => { return ( <CachedObjectsContext.Provider - value={{toc: {items: toc}, glossary: {items: undefined}, tags: {items: undefined}}} + value={{ + toc: {items: toc}, + glossary: {items: undefined}, + tags: {items: undefined}, + onSiteQuestions: {items: undefined}, + }} > <StoryFn /> </CachedObjectsContext.Provider> From eb60ebe2c30bfa528700ac51bee0b7fa3c228fca Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 30 Apr 2024 23:37:47 +0200 Subject: [PATCH 014/132] hide chat settings --- app/routes/chat.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 265c39cc..c69aee2a 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -31,7 +31,7 @@ export default function App() { return ( <Page noFooter> - <div className="page-body full-height" onClick={stopBubbling}> + <div className="page-body full-height" onClick={() => setShowSettings(false)}> <Chatbot question={question} questions={[ From 171028781f67b51ed1286a0aac71a90be09bdb0e Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Tue, 30 Apr 2024 20:33:13 -0400 Subject: [PATCH 015/132] CSS changes for settings --- app/components/Button/button.css | 8 +++++++- app/components/Chatbot/widgit.css | 9 +++++---- app/routes/chat.tsx | 6 +++--- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 9625c09f..b2d30543 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -33,9 +33,15 @@ color: var(--colors-teal-800, #146560); } +.primary-selected { + background: var(--colors-white, #ffffff); + color: var(--colors-teal-500, #1d9089); + border: 1px solid var(--colors-cool-grey-200, #dfe3e9); +} + .secondary { color: var(--colors-cool-grey-600, #788492) !important; - border: 1px solid var(--colors-cool-grey-200, #dfe3e9); + border: 1px solid var(--colors-teal-500, #1D9089); background: var(--colors-white, #fff); } diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index a54b8512..fa6b8cd9 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -23,13 +23,14 @@ .settings-container { position: absolute; - bottom: var(--spacing-16); - left: var(--spacing-16); + bottom: var(--spacing-32); + left: var(--spacing-32); } .settings { padding: var(--spacing-32); - margin-bottom: var(--spacing-24); + margin-bottom: var(--spacing-8); flex-direction: column; - gap: var(--spacing-24); + gap: var(--spacing-16); + width: 384px } diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index c69aee2a..45d4318b 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -16,7 +16,7 @@ export default function App() { const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( <Button - className={chatSettings.mode === mode ? 'primary-alt' : ''} + className={chatSettings.mode === mode ? 'primary-selected' : ''} action={() => setChatSettings({...chatSettings, mode})} > {name} @@ -51,8 +51,8 @@ export default function App() { </div> )} <SettingsIcon - width="32" - height="32" + width="24" + height="24" className="pointer" onClick={() => setShowSettings((current) => !current)} /> From fbe06043b457974249731a217a938e6e6f1030ca Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 1 May 2024 11:40:01 +0200 Subject: [PATCH 016/132] lint fix --- app/components/Button/button.css | 2 +- app/components/Chatbot/widgit.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index b2d30543..b9b8693f 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -41,7 +41,7 @@ .secondary { color: var(--colors-cool-grey-600, #788492) !important; - border: 1px solid var(--colors-teal-500, #1D9089); + border: 1px solid var(--colors-teal-500, #1d9089); background: var(--colors-white, #fff); } diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index fa6b8cd9..117cf214 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -32,5 +32,5 @@ margin-bottom: var(--spacing-8); flex-direction: column; gap: var(--spacing-16); - width: 384px + width: 384px; } From 36ff70c4e218234d9d8bf2546271fa1fb18693ea Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 1 May 2024 15:27:57 +0200 Subject: [PATCH 017/132] switch to gtp3 --- app/routes/chat.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 45d4318b..337f27db 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -11,7 +11,7 @@ export const shouldRevalidate: ShouldRevalidateFunction = () => false export default function App() { const [params] = useSearchParams() const [showSettings, setShowSettings] = useState(false) - const [chatSettings, setChatSettings] = useState({mode: 'default'} as ChatSettings) + const [chatSettings, setChatSettings] = useState({mode: 'default', completions: 'gpt-3.5-turbo'} as ChatSettings) const question = params.get('question') || undefined const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( From 8ab9fee9dd4c2dd40fce9305f720b74ede6c3b0e Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Wed, 1 May 2024 14:18:03 -0400 Subject: [PATCH 018/132] CSS --- app/components/Button/button.css | 19 ++++++++++++------- app/components/Chatbot/index.tsx | 4 ++-- app/components/Chatbot/widgit.css | 4 ++-- app/root.css | 3 +-- app/routes/chat.tsx | 7 +++++-- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index b2d30543..67dd63a4 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -10,6 +10,11 @@ border-radius: var(--border-radius); box-sizing: border-box; + font-size: 16px; + font-weight: 300; + line-height: 170%; /* 27.2px */ + letter-spacing: -0.16px; + background: var(--colors-white, #ffffff); border: 1px solid var(--colors-cool-grey-200, #dfe3e9); } @@ -33,15 +38,9 @@ color: var(--colors-teal-800, #146560); } -.primary-selected { - background: var(--colors-white, #ffffff); - color: var(--colors-teal-500, #1d9089); - border: 1px solid var(--colors-cool-grey-200, #dfe3e9); -} - .secondary { color: var(--colors-cool-grey-600, #788492) !important; - border: 1px solid var(--colors-teal-500, #1D9089); + border: 1px solid var(--colors-cool-grey-200, #dfe3e9); background: var(--colors-white, #fff); } @@ -49,6 +48,12 @@ border: 1px solid var(--colors-teal-200, #a6d9d7) !important; } +.secondary-selected { + background: var(--colors-white, #ffffff); + color: var(--colors-teal-500, #1d9089); + border: 1px solid var(--colors-teal-500, #1d9089); +} + .secondary-alt { color: var(--colors-teal-500, #1d9089); border: 1px solid var(--colors-cool-grey-200, #dfe3e9); diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 9412a470..06c8d20f 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -254,7 +254,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { }) return ( - <div className="centered col-9 padding-bottom-128"> + <div className="centered col-10 padding-bottom-128"> {history.length === 0 ? ( <SplashScreen questions={questions} onQuestion={onQuestion} /> ) : undefined} @@ -263,7 +263,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { ))} {followups ? ( <Followups - title="continue the conversation" + title="Continue the conversation" followups={followups} onSelect={showFollowup} /> diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index fa6b8cd9..2071a918 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -22,7 +22,7 @@ } .settings-container { - position: absolute; + position: fixed; bottom: var(--spacing-32); left: var(--spacing-32); } @@ -32,5 +32,5 @@ margin-bottom: var(--spacing-8); flex-direction: column; gap: var(--spacing-16); - width: 384px + width: 384px; } diff --git a/app/root.css b/app/root.css index 0de35ba7..57cc51b5 100644 --- a/app/root.css +++ b/app/root.css @@ -29,9 +29,8 @@ --colors-green-500: #40c075; /* spacing */ - --border-radius: 6px; + --border-radius: 4px; --spacing-4: 4px; - --spacing-6: 6px; --spacing-8: 8px; --spacing-12: 12px; --spacing-16: 16px; diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 45d4318b..696a067f 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -11,12 +11,15 @@ export const shouldRevalidate: ShouldRevalidateFunction = () => false export default function App() { const [params] = useSearchParams() const [showSettings, setShowSettings] = useState(false) - const [chatSettings, setChatSettings] = useState({mode: 'default'} as ChatSettings) + const [chatSettings, setChatSettings] = useState({ + mode: 'default', + completions: 'gpt-3.5-turbo', + } as ChatSettings) const question = params.get('question') || undefined const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( <Button - className={chatSettings.mode === mode ? 'primary-selected' : ''} + className={chatSettings.mode === mode ? 'secondary-selected' : ''} action={() => setChatSettings({...chatSettings, mode})} > {name} From 8ab9774d08547ae787da106152118e140d875fbc Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 1 May 2024 21:14:07 +0200 Subject: [PATCH 019/132] fix lint --- app/routes/chat.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index b7193a17..696a067f 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -11,7 +11,10 @@ export const shouldRevalidate: ShouldRevalidateFunction = () => false export default function App() { const [params] = useSearchParams() const [showSettings, setShowSettings] = useState(false) - const [chatSettings, setChatSettings] = useState({mode: 'default', completions: 'gpt-3.5-turbo'} as ChatSettings) + const [chatSettings, setChatSettings] = useState({ + mode: 'default', + completions: 'gpt-3.5-turbo', + } as ChatSettings) const question = params.get('question') || undefined const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( From 2f217b0c449ca749fdcb9a2e38d6174e552dc1e6 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 1 May 2024 21:54:22 +0200 Subject: [PATCH 020/132] css fixes --- app/components/Chatbot/widgit.css | 9 --------- app/root.css | 9 +++++---- app/routes/chat.tsx | 9 ++++++--- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 78c4d720..13e37bce 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -21,19 +21,10 @@ } } -.height-70 { - height: 70vh; - overflow-x: hidden; -} .widget-ask { position: sticky; bottom: 0; } -.pointer { - position: absolute; - right: 0; - margin: 4px; -} .right-icon { padding-right: var(--spacing-56); } diff --git a/app/root.css b/app/root.css index 57cc51b5..5f95175b 100644 --- a/app/root.css +++ b/app/root.css @@ -328,6 +328,11 @@ h2 { width: 100%; } +.full-height { + height: fit-content; + min-height: 100%; +} + /* other tags */ a { @@ -391,10 +396,6 @@ svg { cursor: pointer; } -.full-height { - height: 100%; -} - /* for troubleshooting */ .pink { diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 696a067f..725738b1 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -44,9 +44,9 @@ export default function App() { ]} settings={chatSettings} /> - <div className="settings-container" onClick={stopBubbling}> + <div className="settings-container"> {showSettings && ( - <div className="settings bordered flex-container"> + <div className="settings bordered flex-container" onClick={stopBubbling}> <div>Answer detail</div> <ModeButton mode="default" name="Default" /> <ModeButton mode="rookie" name="Detailed" /> @@ -57,7 +57,10 @@ export default function App() { width="24" height="24" className="pointer" - onClick={() => setShowSettings((current) => !current)} + onClick={(e) => { + stopBubbling(e) + setShowSettings((current) => !current) + }} /> </div> </div> From b5a73e901539226f953d4ff0482d02a580a71fde Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Thu, 2 May 2024 15:25:42 +0200 Subject: [PATCH 021/132] use proper endpoint --- app/hooks/useChat.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index d4d6c946..b2836e44 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -1,5 +1,4 @@ -// export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' -export const CHATBOT_URL = 'http://127.0.0.1:3001/chat' +export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' export type Citation = { title: string From 2eb462df849b2dc594aa729bf923b465eb75d965 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 1 May 2024 16:37:21 +0200 Subject: [PATCH 022/132] feedback buttons --- app/components/Article/Feedback.tsx | 70 +++++++++++++ app/components/Article/article.css | 4 + app/components/Article/index.tsx | 54 +--------- app/components/Chatbot/ChatEntry.tsx | 139 ++++++++++++++++---------- app/components/Chatbot/chat_entry.css | 10 +- app/components/Chatbot/index.tsx | 2 +- app/hooks/useChat.ts | 1 + app/routes/questions.actions.tsx | 6 +- 8 files changed, 178 insertions(+), 108 deletions(-) create mode 100644 app/components/Article/Feedback.tsx diff --git a/app/components/Article/Feedback.tsx b/app/components/Article/Feedback.tsx new file mode 100644 index 00000000..0b336f29 --- /dev/null +++ b/app/components/Article/Feedback.tsx @@ -0,0 +1,70 @@ +import React, {useState} from 'react' +import {CompositeButton} from '~/components/Button' +import {Action, ActionType} from '~/routes/questions.actions' +import './article.css' +import FeedbackForm from '~/components/Article/FeedbackForm' + +type FeedbackProps = { + pageid: string + showForm?: boolean + labels?: boolean + upHint?: string + downHint?: string +} +const Feedback = ({pageid, showForm, labels, upHint, downHint}: FeedbackProps) => { + const [showFeedback, setShowFeedback] = useState(false) + const [showFeedbackForm, setShowFeedbackForm] = useState(false) + const [isFormFocused, setIsFormFocused] = useState(false) + + React.useEffect(() => { + // Hide the form after 10 seconds if the user hasn't interacted with it + const timeoutId = setInterval(() => { + if (!isFormFocused) { + setShowFeedbackForm(false) + } + }, 10000) + + // Clear the timeout to prevent it from running if the component unmounts + return () => clearInterval(timeoutId) + }, [showFeedbackForm, isFormFocused]) + + React.useEffect(() => { + const timeout = setInterval(() => setShowFeedback(false), 6000) + return () => clearInterval(timeout) + }, [showFeedback]) + + return ( + <CompositeButton className="flex-container relative feedback"> + <Action + pageid={pageid} + showText={!!labels} + actionType={ActionType.HELPFUL} + hint={upHint} + onSuccess={() => setShowFeedback(true)} + /> + <Action + pageid={pageid} + showText={!!labels} + hint={downHint} + actionType={ActionType.UNHELPFUL} + onClick={() => setShowFeedbackForm(!!showForm)} + /> + <div className={['action-feedback-text', showFeedback ? 'show' : ''].join(' ')}> + Thanks for your feedback! + </div> + <FeedbackForm + pageid={pageid} + className={['feedback-form', showFeedbackForm ? 'show' : ''].join(' ')} + onClose={() => { + setShowFeedback(true) + setShowFeedbackForm(false) + }} + onBlur={() => setIsFormFocused(false)} + onFocus={() => setIsFormFocused(true)} + hasOptions={false} + /> + </CompositeButton> + ) +} + +export default Feedback diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 10d06fd4..f8b06d4c 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -175,6 +175,10 @@ article a.see-more.visible:after { content: 'See less'; } +.feedback { + width: fit-content; +} + @media only screen and (max-width: 780px) { article { max-width: 100%; diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 55a87627..08dd1fdc 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -1,22 +1,18 @@ -import React, {useState} from 'react' +import {useState} from 'react' import {Link} from '@remix-run/react' import KeepGoing from '~/components/Article/KeepGoing' import CopyIcon from '~/components/icons-generated/Copy' import EditIcon from '~/components/icons-generated/Pencil' import Button, {CompositeButton} from '~/components/Button' -import {Action, ActionType} from '~/routes/questions.actions' import type {Glossary, Question} from '~/server-utils/stampy' import {tagUrl} from '~/routesMapper' import Contents from './Contents' +import Feedback from './Feedback' import './article.css' -import FeedbackForm from '~/components/Article/FeedbackForm' const isLoading = ({text}: Question) => !text || text === 'Loading...' const ArticleFooter = (question: Question) => { - const [showFeedback, setShowFeedback] = useState(false) - const [showFeedbackForm, setShowFeedbackForm] = useState(false) - const [isFormFocused, setIsFormFocused] = useState(false) const date = question.updatedAt && new Date(question.updatedAt).toLocaleDateString('en-GB', { @@ -24,23 +20,6 @@ const ArticleFooter = (question: Question) => { month: 'short', }) - React.useEffect(() => { - // Hide the form after 10 seconds if the user hasn't interacted with it - const timeoutId = setInterval(() => { - if (!isFormFocused) { - setShowFeedbackForm(false) - } - }, 10000) - - // Clear the timeout to prevent it from running if the component unmounts - return () => clearInterval(timeoutId) - }, [showFeedbackForm, isFormFocused]) - - React.useEffect(() => { - const timeout = setInterval(() => setShowFeedback(false), 6000) - return () => clearInterval(timeout) - }, [showFeedback]) - return ( !isLoading(question) && ( <div className="footer-comtainer padding-bottom-40"> @@ -57,34 +36,7 @@ const ArticleFooter = (question: Question) => { </div> <span>Was this page helpful?</span> - <CompositeButton className="flex-container relative"> - <Action - pageid={question.pageid} - showText={true} - actionType={ActionType.HELPFUL} - onSuccess={() => setShowFeedback(true)} - /> - <Action - pageid={question.pageid} - showText={true} - actionType={ActionType.UNHELPFUL} - onClick={() => setShowFeedbackForm(true)} - /> - <div className={['action-feedback-text', showFeedback ? 'show' : ''].join(' ')}> - Thanks for your feedback! - </div> - <FeedbackForm - pageid={question.pageid} - className={['feedback-form', showFeedbackForm ? 'show' : ''].join(' ')} - onClose={() => { - setShowFeedback(true) - setShowFeedbackForm(false) - }} - onBlur={() => setIsFormFocused(false)} - onFocus={() => setIsFormFocused(true)} - hasOptions={false} - /> - </CompositeButton> + <Feedback pageid={question.pageid} labels /> </div> ) ) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index bebefc51..5020a42a 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -10,16 +10,18 @@ import Contents from '~/components/Article/Contents' import useGlossary from '~/hooks/useGlossary' import './chat_entry.css' import type {Entry, AssistantEntry, StampyEntry, Citation, ErrorMessage} from '~/hooks/useChat' +import Feedback from '../Article/Feedback' const MAX_REFERENCES = 10 -const hints = { - bot: 'bla bla bla something bot', - human: 'bla bla bla by humans', - error: null, -} -const AnswerInfo = ({answerType}: {answerType?: 'human' | 'bot' | 'error'}) => { - if (!answerType || !hints[answerType]) return null +const AnswerInfo = ({ + answerType, + hint, +}: { + hint?: string + answerType?: 'human' | 'bot' | 'error' +}) => { + if (!answerType || !hint) return null return ( <span className="info"> {answerType === 'human' ? <PersonIcon /> : <BotIcon />} @@ -27,7 +29,7 @@ const AnswerInfo = ({answerType}: {answerType?: 'human' | 'bot' | 'error'}) => { {answerType === 'human' ? 'Human-written' : 'Bot-generated'} response </span> <QuestionMarkIcon className="hint" /> - <div className="hint-contents">{hints[answerType]}</div> + <div className="hint-contents rounded">{hint}</div> </span> ) } @@ -36,12 +38,13 @@ type TitleProps = { title: string Icon: ComponentType answerType?: 'human' | 'bot' | 'error' + hint?: string } -const Title = ({title, Icon, answerType}: TitleProps) => ( +const Title = ({title, Icon, answerType, hint}: TitleProps) => ( <div className="flex-container title"> <Icon /> <span className="default-bold flex-double">{title}</span> - <AnswerInfo answerType={answerType} /> + <AnswerInfo answerType={answerType} hint={hint} /> </div> ) @@ -52,29 +55,13 @@ const UserQuery = ({content}: Entry) => ( </div> ) -const md = new MarkdownIt({html: true}) -const ReferenceLink = ({id, index, text}: Citation) => { - if (!index || index > MAX_REFERENCES) return '' - - const parsed = text?.match(/^###.*?###\s+"""(.*?)"""$/ms) - return ( - <> - <Link id={`${id}-ref`} to={`#${id}`} className={`reference-link ref-${index}`}> - <span>{index}</span> - </Link> - {parsed && ( - <div - className="reference-contents rounded" - dangerouslySetInnerHTML={{ - __html: md.render(parsed[1]), - }} - /> - )} - </> - ) -} - -const Reference = ({id, title, authors, source, url, index}: Citation) => { +const ReferenceSummary = ({ + title, + authors, + source, + url, + titleClass, +}: Citation & {titleClass?: string}) => { const referenceSources = { arxiv: 'Scientific paper', blogs: 'Blogpost', @@ -98,23 +85,60 @@ const Reference = ({id, title, authors, source, url, index}: Citation) => { } return ( - <div key={id} id={id} className="reference padding-bottom-32"> - <div className={`reference-num small ref-${index}`}>{index}</div> + <div> + <div className={`title ${titleClass}`}>{title}</div> <div> - <div className="title">{title}</div> - <div> - <Authors authors={authors} /> - <span>{' · '}</span> - <Link className="source-link" to={url} target="_blank" rel="noopener noreferrer"> - {referenceSources[source as keyof typeof referenceSources] || new URL(url).host}{' '} - <LinkIcon width="16" height="16" /> - </Link> - </div> + <Authors authors={authors} /> + <span>{' · '}</span> + <Link className="source-link teal-500" to={url} target="_blank" rel="noopener noreferrer"> + {referenceSources[source as keyof typeof referenceSources] || new URL(url).host}{' '} + <LinkIcon width="16" height="16" /> + </Link> </div> </div> ) } +const md = new MarkdownIt({html: true}) +const ReferencePopup = (citation: Citation) => { + const parsed = citation.text?.match(/^###.*?###\s+"""(.*?)"""$/ms) + if (!parsed) return undefined + return ( + <div className="reference-contents rounded"> + <ReferenceSummary {...citation} titleClass="large-bold" /> + <div className="grey padding-bottom-16 padding-top-24">Referenced excerpt</div> + <div + dangerouslySetInnerHTML={{ + __html: md.render(parsed[1]), + }} + /> + </div> + ) +} + +const ReferenceLink = (citation: Citation) => { + const {id, index} = citation + if (!index || index > MAX_REFERENCES) return '' + + return ( + <> + <Link id={`${id}-ref`} to={`#${id}`} className={`reference-link ref-${index}`}> + <span>{index}</span> + </Link> + <ReferencePopup {...citation} /> + </> + ) +} + +const Reference = (citation: Citation) => { + return ( + <div key={citation.id} id={citation.id} className="reference padding-bottom-32"> + <div className={`reference-num small ref-${citation.index}`}>{citation.index}</div> + <ReferenceSummary {...citation} /> + </div> + ) +} + const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { const citations = [] as Citation[] citationsMap?.forEach((v) => { @@ -145,7 +169,7 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { return ( <div> - <Title title="Stampy" Icon={StampyIcon} answerType="bot" /> + <Title title="Stampy" Icon={StampyIcon} answerType="bot" hint="Generated by an AI model" /> <PhaseState /> <div className="padding-bottom-24"> {content?.split(/(\[\d+\])|(\n)/).map((chunk, i) => { @@ -171,24 +195,37 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { ) } -const StampyArticle = ({pageid, content}: StampyEntry) => { +const StampyArticle = ({pageid, content, title}: StampyEntry) => { const glossary = useGlossary() + const hint = `This response is pulled from our article "${title}" which was written by members of AISafety.info` return ( <div> - <Title title="Stampy" Icon={StampyIcon} answerType="human" /> - <article className="stampy"> - <Contents pageid={pageid || ''} html={content || 'Loading...'} glossary={glossary || {}} /> - </article> + <Title title="Stampy" Icon={StampyIcon} answerType="human" hint={hint} /> + <div className="answer"> + <article className="stampy"> + <Contents + pageid={pageid || ''} + html={content || 'Loading...'} + glossary={glossary || {}} + /> + </article> + <Feedback + pageid={pageid} + upHint="This response was helpful" + downHint="This response was unhelpful" + /> + </div> </div> ) } const ErrorReply = ({content}: ErrorMessage) => { + console.error(content) return ( <div> <Title title="Error" Icon={StampyIcon} answerType="error" /> - <div>{content}</div> + <div>Sorry, something has gone wrong. Please ask your question again!</div> </div> ) } diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 4d40fbe1..de86300b 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -24,9 +24,12 @@ article.stampy { visibility: hidden; } +.chat-entry .hint-contents:hover, .chat-entry .hint:hover + .hint-contents { visibility: visible; - background: red; + background: var(--colors-cool-grey-800); + color: white; + padding: var(--spacing-16); } .chat-entry .reference-link { @@ -112,8 +115,9 @@ article.stampy { transition: visibility 0.2s; max-width: 600px; word-wrap: break-word; - background-color: var(--colors-cool-grey-300); - padding: var(--spacing-16) var(--spacing-24); + background-color: white; + border: 1px solid var(--colors-cool-grey-200, #dfe3e9); + padding: var(--spacing-24) var(--spacing-32); position: absolute; transform: translateX(50%); text-decoration: unset; diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 168e93b3..cee0ded3 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -169,7 +169,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { setFollowups( question.relatedQuestions?.slice(0, 3).map(({title, pageid}) => ({text: title, pageid})) ) - return {...item, content: question.text || ''} + return {...item, title: question.title, content: question.text || ''} } // this is a previous human written article that didn't load properly - don't // update the text as that could cause things to jump around - the user has diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index b2836e44..b30dc452 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -49,6 +49,7 @@ export type StampyEntry = { pageid: string content: string deleted?: boolean + title?: string } export type Followup = { diff --git a/app/routes/questions.actions.tsx b/app/routes/questions.actions.tsx index d28b0068..b08f5a92 100644 --- a/app/routes/questions.actions.tsx +++ b/app/routes/questions.actions.tsx @@ -90,6 +90,7 @@ type Props = { pageid: string actionType: ActionType showText?: boolean + hint?: string children?: ReactNode | ReactNode[] [k: string]: unknown onSuccess?: () => void @@ -99,6 +100,7 @@ export const Action = ({ pageid, actionType, showText = true, + hint, children, onSuccess, onClick, @@ -162,7 +164,7 @@ export const Action = ({ replace action="/questions/actions" method="post" - title={title} + title={hint || title} onClick={handleAction} {...props} > @@ -175,7 +177,7 @@ export const Action = ({ <Icon /> <p className={[actionTaken ? 'teal-500' : 'grey', 'small'].join(' ')}> {' '} - {showText && title} + {showText && (hint || title)} </p> </Button> </Form> From c65bf707d6b78e41c43510b0496205f5b5b7dc94 Mon Sep 17 00:00:00 2001 From: buddy-web3 <0buddy.ne@gmail.com> Date: Thu, 2 May 2024 20:22:48 +0300 Subject: [PATCH 023/132] pool questions when less than 3 generated by bot --- app/components/Chatbot/index.tsx | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 168e93b3..f89f691b 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -10,6 +10,22 @@ import {questionUrl} from '~/routesMapper' import {Question} from '~/server-utils/stampy' import {useSearch} from '~/hooks/useSearch' +// to be replaced with actual pool questions +const poolQuestions = [ + { + title: 'What is AI Safety? - from pool', + pageid: '1b', + }, + { + title: 'How would the AI even get out in the world? -- from pool', + pageid: '2b', + }, + { + title: 'Do people seriously worry about existential risk from AI? --- from pool', + pageid: '3b', + }, +] + export const WidgetStampy = () => { const [question, setQuestion] = useState('') const questions = [ @@ -166,6 +182,12 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { if ((item as StampyEntry).pageid !== question.pageid) return item // this is the current entry, so update it if (i === history.length - 1) { + // check proper insertion of pool questions + // question.relatedQuestions - question.relatedQuestions.slice(0,2); + if (question.relatedQuestions.length <= 2) { + question.relatedQuestions.push(...poolQuestions) + } + console.log('related questions:: ', question.relatedQuestions) setFollowups( question.relatedQuestions?.slice(0, 3).map(({title, pageid}) => ({text: title, pageid})) ) From ef44a89bca5cd914e2ae0c49101ee369053ff5a7 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Thu, 2 May 2024 17:04:04 -0400 Subject: [PATCH 024/132] new input component, CSS --- app/assets/icons/link-out.svg | 4 + app/assets/icons/stampy.svg | 4 +- app/components/Button/button.css | 110 ++++++++++++++++++--- app/components/Chatbot/ChatEntry.tsx | 2 +- app/components/Chatbot/chat_entry.css | 40 ++++---- app/components/Chatbot/index.tsx | 38 ++++--- app/components/Chatbot/widgit.css | 26 ++++- app/components/Input/index.tsx | 33 +++++++ app/components/Input/input.css | 48 +++++++++ app/components/icons-generated/LinkOut.tsx | 14 +++ app/components/icons-generated/Stampy.tsx | 4 +- app/components/icons-generated/index.ts | 1 + app/hooks/useChat.ts | 3 +- app/root.css | 48 +++++++++ 14 files changed, 319 insertions(+), 56 deletions(-) create mode 100644 app/assets/icons/link-out.svg create mode 100644 app/components/Input/index.tsx create mode 100644 app/components/Input/input.css create mode 100644 app/components/icons-generated/LinkOut.tsx diff --git a/app/assets/icons/link-out.svg b/app/assets/icons/link-out.svg new file mode 100644 index 00000000..1d790672 --- /dev/null +++ b/app/assets/icons/link-out.svg @@ -0,0 +1,4 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M9.63636 2C9.33512 2 9.09091 2.24421 9.09091 2.54545C9.09091 2.8467 9.33512 3.09091 9.63636 3.09091H12.1378L7.61439 7.61431C7.40137 7.82732 7.40137 8.17268 7.61439 8.38569C7.8274 8.59871 8.17276 8.59871 8.38578 8.38569L12.9091 3.86238V6.36364C12.9091 6.66488 13.1533 6.90909 13.4545 6.90909C13.7558 6.90909 14 6.66488 14 6.36364V2.54545C14 2.24421 13.7558 2 13.4545 2H9.63636Z" fill="#1D9089"/> +<path d="M12.3636 8C12.6649 8 12.9091 8.24421 12.9091 8.54545V13.4545C12.9091 13.7558 12.6649 14 12.3636 14H2.54545C2.24421 14 2 13.7558 2 13.4545V3.63636C2 3.33512 2.24421 3.09091 2.54545 3.09091H7.45455C7.75579 3.09091 8 3.33512 8 3.63636C8 3.93761 7.75579 4.18182 7.45455 4.18182H3.09091V12.9091H11.8182V8.54545C11.8182 8.24421 12.0624 8 12.3636 8Z" fill="#1D9089"/> +</svg> diff --git a/app/assets/icons/stampy.svg b/app/assets/icons/stampy.svg index 6aa06153..260b18c5 100644 --- a/app/assets/icons/stampy.svg +++ b/app/assets/icons/stampy.svg @@ -1,4 +1,4 @@ -<svg width="40" height="35" viewBox="0 0 40 35" fill="none" xmlns="http://www.w3.org/2000/svg"> +<svg width="80" height="69" viewBox="0 0 80 69" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0_2209_1647)"> <path opacity="0.5" d="M38.6239 31.104C37.5999 31.104 36.7679 30.272 36.7679 29.248C36.7679 28.224 37.5999 27.392 38.6239 27.392C38.6879 27.392 38.7519 27.392 38.8479 27.392V25.12C38.7839 25.12 38.7199 25.12 38.6239 25.12C37.5999 25.12 36.7679 24.288 36.7679 23.264C36.7679 22.24 37.5999 21.408 38.6239 21.408C38.6879 21.408 38.7519 21.408 38.8479 21.408V19.136C38.7839 19.136 38.7199 19.136 38.6239 19.136C37.5999 19.136 36.7679 18.304 36.7679 17.28C36.7679 16.256 37.5999 15.424 38.6239 15.424C38.6879 15.424 38.7519 15.424 38.8479 15.424V13.152C38.2399 13.216 37.6319 12.992 37.2159 12.512C36.5439 11.712 36.6399 10.56 37.4399 9.88798C37.8559 9.53598 38.3679 9.40798 38.8479 9.47198V7.19998C38.7839 7.19998 38.7199 7.19998 38.6239 7.19998C37.5999 7.19998 36.7679 6.36798 36.7679 5.34398C36.7679 4.31998 37.5999 3.48798 38.6239 3.48798C38.6879 3.48798 38.7519 3.48798 38.8479 3.48798V0.703979H36.6399C36.6399 1.72798 35.8079 2.55998 34.7839 2.55998C33.7599 2.55998 32.9279 1.72798 32.9279 0.703979H30.5279C30.5279 1.72798 29.6959 2.55998 28.6719 2.55998C27.6479 2.55998 26.8159 1.72798 26.8159 0.703979H24.4159C24.4159 1.72798 23.5839 2.55998 22.5599 2.55998C21.5359 2.55998 20.7039 1.72798 20.7039 0.703979H18.3039C18.3039 1.72798 17.4719 2.55998 16.4479 2.55998C15.4239 2.55998 14.5919 1.72798 14.5919 0.703979H12.1919C12.1919 1.72798 11.3599 2.55998 10.3359 2.55998C9.31191 2.55998 8.47991 1.72798 8.47991 0.703979H6.07991C6.07991 1.72798 5.24791 2.55998 4.22391 2.55998C3.19991 2.55998 2.36791 1.72798 2.36791 0.703979H0.159912V3.48798C1.18391 3.48798 2.01591 4.31998 2.01591 5.34398C2.01591 6.36798 1.18391 7.19998 0.159912 7.19998V9.43998C0.703912 9.43998 1.21591 9.66398 1.59991 10.112C2.27191 10.912 2.17591 12.064 1.37591 12.736C1.02391 13.024 0.607912 13.184 0.159912 13.184V15.424C1.18391 15.424 2.01591 16.256 2.01591 17.28C2.01591 18.304 1.18391 19.136 0.159912 19.136V21.376C1.18391 21.376 2.01591 22.208 2.01591 23.232C2.01591 24.256 1.18391 25.088 0.159912 25.088V27.328C1.18391 27.328 2.01591 28.16 2.01591 29.184C2.01591 30.208 1.18391 31.04 0.159912 31.04V33.824H2.36791C2.36791 32.8 3.19991 31.968 4.22391 31.968C5.24791 31.968 6.07991 32.8 6.07991 33.824H8.47991C8.47991 32.8 9.31191 31.968 10.3359 31.968C11.3599 31.968 12.1919 32.8 12.1919 33.824H14.5919C14.5919 32.8 15.4239 31.968 16.4479 31.968C17.4719 31.968 18.3039 32.8 18.3039 33.824H20.7039C20.7039 32.8 21.5359 31.968 22.5599 31.968C23.5839 31.968 24.4159 32.8 24.4159 33.824H26.8159C26.8159 32.8 27.6479 31.968 28.6719 31.968C29.6959 31.968 30.5279 32.8 30.5279 33.824H32.9279C32.9279 32.8 33.7599 31.968 34.7839 31.968C35.8079 31.968 36.6399 32.8 36.6399 33.824H38.8479V31.04C38.7519 31.104 38.6879 31.104 38.6239 31.104Z" fill="#ECA680"/> <path d="M39.904 34.4H36.64V33.856C36.64 33.12 36.032 32.512 35.296 32.512C34.56 32.512 33.952 33.12 33.952 33.856V34.4H30.496V33.856C30.496 33.12 29.888 32.512 29.152 32.512C28.416 32.512 27.808 33.12 27.808 33.856V34.4H24.352V33.856C24.352 33.12 23.744 32.512 23.008 32.512C22.272 32.512 21.664 33.12 21.664 33.856V34.4H18.272V33.856C18.272 33.12 17.664 32.512 16.928 32.512C16.192 32.512 15.584 33.12 15.584 33.856V34.4H12.128V33.856C12.128 33.12 11.52 32.512 10.784 32.512C10.048 32.512 9.43996 33.12 9.43996 33.856V34.4H6.01596V33.856C6.01596 33.12 5.40796 32.512 4.67196 32.512C3.93596 32.512 3.32797 33.12 3.32797 33.856V34.4H0.0639648V30.56H0.607964C1.34396 30.56 1.95196 29.952 1.95196 29.216C1.95196 28.48 1.34396 27.872 0.607964 27.872H0.0639648V24.576H0.607964C1.34396 24.576 1.95196 23.968 1.95196 23.232C1.95196 22.496 1.34396 21.888 0.607964 21.888H0.0639648V18.592H0.607964C1.34396 18.592 1.95196 17.984 1.95196 17.248C1.95196 16.512 1.34396 15.904 0.607964 15.904H0.0639648V12.64H0.607964C0.927964 12.64 1.21596 12.544 1.47196 12.32C1.75996 12.096 1.91996 11.776 1.95196 11.424C1.98396 11.072 1.88796 10.72 1.63196 10.464C1.37596 10.176 0.991964 9.98399 0.607964 9.98399H0.0639648V6.65599H0.607964C1.34396 6.65599 1.95196 6.04799 1.95196 5.31199C1.95196 4.57599 1.34396 3.96799 0.607964 3.96799H0.0639648V0.127991H3.32797V0.67199C3.32797 1.40799 3.93596 2.01599 4.67196 2.01599C5.40796 2.01599 6.01596 1.40799 6.01596 0.67199V0.127991H9.47196V0.67199C9.47196 1.40799 10.08 2.01599 10.816 2.01599C11.552 2.01599 12.16 1.40799 12.16 0.67199V0.127991H15.616V0.67199C15.616 1.40799 16.224 2.01599 16.96 2.01599C17.696 2.01599 18.304 1.40799 18.304 0.67199V0.127991H21.76V0.67199C21.76 1.40799 22.368 2.01599 23.104 2.01599C23.84 2.01599 24.448 1.40799 24.448 0.67199V0.127991H27.84V0.67199C27.84 1.40799 28.448 2.01599 29.184 2.01599C29.92 2.01599 30.528 1.40799 30.528 0.67199V0.127991H33.984V0.67199C33.984 1.40799 34.592 2.01599 35.328 2.01599C36.064 2.01599 36.672 1.40799 36.672 0.67199V0.127991H39.936V4.06399L39.328 3.99999C39.264 3.99999 39.232 3.99999 39.168 3.99999C38.432 3.99999 37.824 4.60799 37.824 5.34399C37.824 6.07999 38.432 6.68799 39.168 6.68799C39.2 6.68799 39.264 6.68799 39.328 6.68799L39.936 6.62399V10.08L39.328 10.016C38.944 9.98399 38.592 10.08 38.304 10.304C38.016 10.528 37.856 10.848 37.824 11.2C37.792 11.552 37.888 11.904 38.144 12.16C38.432 12.512 38.88 12.672 39.328 12.64L39.936 12.576V16.032L39.328 15.968C39.264 15.968 39.232 15.968 39.168 15.968C38.432 15.968 37.824 16.576 37.824 17.312C37.824 18.048 38.432 18.656 39.168 18.656C39.2 18.656 39.264 18.656 39.328 18.656L39.936 18.592V22.048L39.328 21.984C39.264 21.984 39.232 21.984 39.168 21.984C38.432 21.984 37.824 22.592 37.824 23.328C37.824 24.064 38.432 24.672 39.168 24.672C39.2 24.672 39.264 24.672 39.328 24.672L39.936 24.608V28.064L39.328 28C39.264 28 39.232 28 39.168 28C38.432 28 37.824 28.608 37.824 29.344C37.824 30.08 38.432 30.688 39.168 30.688C39.2 30.688 39.264 30.688 39.328 30.688L39.936 30.624V34.4H39.904ZM37.632 33.344H38.816V31.616C37.632 31.456 36.736 30.464 36.736 29.248C36.736 28.032 37.632 27.008 38.816 26.88V25.664C37.632 25.504 36.736 24.512 36.736 23.296C36.736 22.08 37.632 21.056 38.816 20.928V19.712C37.632 19.552 36.736 18.56 36.736 17.344C36.736 16.128 37.632 15.104 38.816 14.976V13.76C38.24 13.696 37.696 13.376 37.312 12.928C36.896 12.448 36.704 11.808 36.768 11.168C36.832 10.528 37.12 9.95199 37.6 9.53599C37.952 9.24799 38.368 9.05599 38.816 8.99199V7.77599C37.632 7.61599 36.736 6.62399 36.736 5.40799C36.736 4.19199 37.632 3.16799 38.816 3.03999V1.31199H37.632C37.376 2.36799 36.416 3.16799 35.296 3.16799C34.144 3.16799 33.184 2.36799 32.96 1.31199H31.52C31.264 2.36799 30.304 3.16799 29.184 3.16799C28.032 3.16799 27.072 2.36799 26.848 1.31199H25.408C25.152 2.36799 24.192 3.16799 23.072 3.16799C21.92 3.16799 20.96 2.36799 20.736 1.31199H19.296C19.04 2.36799 18.08 3.16799 16.96 3.16799C15.808 3.16799 14.848 2.36799 14.624 1.31199H13.184C12.928 2.36799 11.968 3.16799 10.848 3.16799C9.69596 3.16799 8.73596 2.36799 8.51196 1.31199H7.07196C6.81596 2.36799 5.85596 3.16799 4.73596 3.16799C3.58396 3.16799 2.62396 2.36799 2.39996 1.31199H1.21596V3.07199C2.27196 3.32799 3.07196 4.28799 3.07196 5.40799C3.07196 6.55999 2.27196 7.51999 1.21596 7.74399V9.02399C1.72796 9.15199 2.17597 9.40799 2.52797 9.82399C2.94396 10.304 3.13596 10.944 3.07196 11.584C3.00796 12.224 2.71996 12.8 2.23996 13.216C1.95196 13.472 1.59996 13.632 1.21596 13.728V15.008C2.27196 15.264 3.07196 16.224 3.07196 17.344C3.07196 18.464 2.27196 19.456 1.21596 19.68V20.96C2.27196 21.216 3.07196 22.176 3.07196 23.296C3.07196 24.416 2.27196 25.408 1.21596 25.632V26.912C2.27196 27.168 3.07196 28.128 3.07196 29.248C3.07196 30.368 2.27196 31.36 1.21596 31.584V33.344H2.39996C2.65596 32.288 3.61596 31.488 4.73596 31.488C5.88796 31.488 6.84796 32.288 7.07196 33.344H8.51196C8.76796 32.288 9.72796 31.488 10.848 31.488C12 31.488 12.96 32.288 13.184 33.344H14.624C14.88 32.288 15.84 31.488 16.96 31.488C18.112 31.488 19.072 32.288 19.296 33.344H20.736C20.992 32.288 21.952 31.488 23.072 31.488C24.224 31.488 25.184 32.288 25.408 33.344H26.848C27.104 32.288 28.064 31.488 29.184 31.488C30.336 31.488 31.296 32.288 31.52 33.344H32.96C33.216 32.288 34.176 31.488 35.296 31.488C36.448 31.456 37.408 32.256 37.632 33.344Z" fill="#ECA680"/> @@ -15,7 +15,7 @@ </g> <defs> <clipPath id="clip0_2209_1647"> -<rect width="40" height="34.56" fill="white"/> +<rect width="80" height="69" fill="white"/> </clipPath> </defs> </svg> diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 67dd63a4..b7ef695f 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -10,54 +10,140 @@ border-radius: var(--border-radius); box-sizing: border-box; + background: var(--colors-white, #ffffff); + border: 1px solid var(--colors-cool-grey-200, #dfe3e9); + font-size: 16px; + font-style: normal; font-weight: 300; line-height: 170%; /* 27.2px */ letter-spacing: -0.16px; - - background: var(--colors-white, #ffffff); - border: 1px solid var(--colors-cool-grey-200, #dfe3e9); } +/* style */ + .primary { background: var(--colors-teal-500, #1d9089); font-weight: 500; color: var(--colors-white, #ffffff); -} -.primary:hover { - background: var(--colors-teal-700, #17736e); + font-size: 16px; + font-weight: 300; + line-height: 170%; /* 27.2px */ + letter-spacing: -0.16px; } .primary-alt { background: var(--colors-white, #ffffff); color: var(--colors-teal-500, #1d9089); -} -.primary-alt:hover { - color: var(--colors-teal-800, #146560); + font-size: 16px; + font-weight: 300; + line-height: 170%; /* 27.2px */ + letter-spacing: -0.16px; } .secondary { color: var(--colors-cool-grey-600, #788492) !important; border: 1px solid var(--colors-cool-grey-200, #dfe3e9); background: var(--colors-white, #fff); -} -.secondary:hover { - border: 1px solid var(--colors-teal-200, #a6d9d7) !important; + font-size: 16px; + font-weight: 300; + line-height: 170%; /* 27.2px */ + letter-spacing: -0.16px; } .secondary-selected { background: var(--colors-white, #ffffff); color: var(--colors-teal-500, #1d9089); border: 1px solid var(--colors-teal-500, #1d9089); + + font-size: 16px; + font-weight: 300; + line-height: 170%; /* 27.2px */ + letter-spacing: -0.16px; } .secondary-alt { color: var(--colors-teal-500, #1d9089); border: 1px solid var(--colors-cool-grey-200, #dfe3e9); background: var(--colors-white, #fff); + + font-size: 16px; + font-weight: 300; + line-height: 170%; /* 27.2px */ + letter-spacing: -0.16px; +} + +/* large */ + +.primary-large { + background: var(--colors-teal-500, #1d9089); + font-weight: 500; + color: var(--colors-white, #ffffff); + + font-size: 18px; + font-weight: 300; + line-height: 170%; /* 30.6px */ + letter-spacing: -0.18px; +} + +.primary-alt-large { + background: var(--colors-white, #ffffff); + color: var(--colors-teal-500, #1d9089); + + font-size: 18px; + font-weight: 300; + line-height: 170%; /* 30.6px */ + letter-spacing: -0.18px; +} + +.secondary-large { + color: var(--colors-cool-grey-600, #788492) !important; + border: 1px solid var(--colors-cool-grey-200, #dfe3e9); + background: var(--colors-white, #fff); + + font-size: 18px; + font-weight: 300; + line-height: 170%; /* 30.6px */ + letter-spacing: -0.18px; +} + +.secondary-selected-large { + background: var(--colors-white, #ffffff); + color: var(--colors-teal-500, #1d9089); + border: 1px solid var(--colors-teal-500, #1d9089); + + font-size: 18px; + font-weight: 300; + line-height: 170%; /* 30.6px */ + letter-spacing: -0.18px; +} + +.secondary-alt-large { + color: var(--colors-teal-500, #1d9089); + border: 1px solid var(--colors-cool-grey-200, #dfe3e9); + background: var(--colors-white, #fff); + + font-size: 18px; + font-weight: 300; + line-height: 170%; /* 30.6px */ + letter-spacing: -0.18px; +} + +/* state */ + +.primary:hover { + background: var(--colors-teal-700, #17736e); +} + +.primary-alt:hover { + color: var(--colors-teal-800, #146560); +} + +.secondary:hover { + border: 1px solid var(--colors-teal-200, #a6d9d7) !important; } .secondary-alt:hover { diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index bebefc51..930c3d2b 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -3,7 +3,7 @@ import {Link} from '@remix-run/react' import MarkdownIt from 'markdown-it' import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' import BotIcon from '~/components/icons-generated/Bot' -import LinkIcon from '~/components/icons-generated/Link' +import LinkIcon from '~/components/icons-generated/LinkOut' import PersonIcon from '~/components/icons-generated/Person' import StampyIcon from '~/components/icons-generated/Stampy' import Contents from '~/components/Article/Contents' diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 4d40fbe1..8aa9ac8a 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -43,53 +43,53 @@ article.stampy { } .ref-1 { - background: rgb(211, 255, 253); - color: rgb(24, 185, 71); + background: #dbffed; + color: #00c159; } .ref-2 { - background: rgb(255, 221, 244); - color: rgb(251, 0, 158); + background: #ffe5f6; + color: #ff16ae; } .ref-3 { - background: rgb(217, 253, 254); - color: rgb(23, 184, 197); + background: #e0fdff; + color: #00c3d0; } .ref-4 { - background: rgb(254, 230, 202); - color: rgb(230, 107, 9); + background: #ffebd4; + color: #ed8000; } .ref-5 { - background: rgb(244, 223, 255); - color: rgb(164, 3, 254); + background: #f6e7ff; + color: #b53aff; } .ref-6 { - background: rgb(231, 255, 178); - color: rgb(99, 159, 4); + background: #ebffbf; + color: #74ac00; } .ref-7 { - background: rgb(231, 232, 255); - color: rgb(77, 75, 254); + background: #ecedff; + color: #6068ff; } .ref-8 { - background: rgb(255, 254, 156); - color: rgb(144, 140, 5); + background: #fffcac; + color: #a19b00; } .ref-9 { - background: rgb(254, 226, 226); - color: rgb(200, 0, 5); + background: #ffe8e8; + color: #d50000; } .ref-10 { - background: rgb(214, 240, 255); - color: rgb(18, 144, 254); + background: #def3ff; + color: #00a4ff; } .reference { diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 06c8d20f..2e56000f 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -9,6 +9,7 @@ import './widgit.css' import {questionUrl} from '~/routesMapper' import {Question} from '~/server-utils/stampy' import {useSearch} from '~/hooks/useSearch' +import Input from '~/components/Input' export const WidgetStampy = () => { const [question, setQuestion] = useState('') @@ -32,7 +33,7 @@ export const WidgetStampy = () => { <div className="padding-bottom-24">Try asking me...</div> {questions.map((question, i) => ( <div key={i} className="padding-bottom-16"> - <Button className="secondary-alt" action={stampyUrl(question)}> + <Button className="secondary-alt-large" action={stampyUrl(question)}> {question} </Button> </div> @@ -68,7 +69,11 @@ type QuestionInputProps = { } const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') +<<<<<<< Updated upstream +======= + const [, setPlaceholder] = useState('Ask Stampy a question...') +>>>>>>> Stashed changes const handleAsk = (val: string) => { onAsk && onAsk(val) setQuestion('') @@ -81,10 +86,16 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { return ( <div className="widget-ask flex-container"> +<<<<<<< Updated upstream <input type="text" className="full-width bordered secondary" placeholder="Ask Stampy a question..." +======= + <Input + placeHolder="Ask Stampy a question..." + className="large col-10" +>>>>>>> Stashed changes value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { @@ -102,10 +113,11 @@ type FollowupsProps = { title?: string followups?: Followup[] onSelect: (followup: Followup) => void + className?: string } -const Followups = ({title, followups, onSelect}: FollowupsProps) => ( +const Followups = ({title, followups, onSelect, className}: FollowupsProps) => ( <> - {title && <div className="padding-bottom-24">{title}</div>} + {title && <div className={'padding-bottom-24 color-grey ' + (className || '')}>{title}</div>} {followups?.map(({text, pageid}, i) => ( <div key={i} className="padding-bottom-16"> @@ -125,16 +137,18 @@ const SplashScreen = ({ onQuestion: (v: string) => void }) => ( <> - <StampyIcon /> - <div className="col-6 padding-bottom-56"> - <h2 className="teal-500">Hi there, I'm Stampy.</h2> - <h2>I can answer your questions about AI safety</h2> + <div className="padding-top-40"> + <StampyIcon /> + <div className="col-6 padding-bottom-40 padding-top-40"> + <h2 className="teal-500">Hi there, I'm Stampy.</h2> + <h2>I can answer your questions about AI Safety</h2> + </div> + <Followups + title="Popular questions" + followups={questions?.map((text: string) => ({text}))} + onSelect={({text}: Followup) => onQuestion(text)} + /> </div> - <Followups - title="Popular questions" - followups={questions?.map((text: string) => ({text}))} - onSelect={({text}: Followup) => onQuestion(text)} - /> </> ) diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 2071a918..6e6ff71a 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -10,17 +10,33 @@ background: var(--colors-cool-grey-100); } -.widget-ask input { - height: 56px; - padding: var(--spacing-8) var(--spacing-24); -} - @media (max-width: 780px) { .button { width: 100%; } } +<<<<<<< Updated upstream +======= +.widget-ask { + position: sticky; + bottom: 0; +} +.right-icon { + padding-right: var(--spacing-56); +} +.warning-floating { + position: fixed; + right: 4.44vw; + z-index: 100; + bottom: 4.44vw; + width: 10.13vw; +} +.red { + color: #d40000; +} + +>>>>>>> Stashed changes .settings-container { position: fixed; bottom: var(--spacing-32); diff --git a/app/components/Input/index.tsx b/app/components/Input/index.tsx new file mode 100644 index 00000000..069d3dd3 --- /dev/null +++ b/app/components/Input/index.tsx @@ -0,0 +1,33 @@ +import './input.css' + +type InputProps = { + className?: string + disabled?: boolean + placeHolder?: string + value?: string + onChange?: (e: any) => void + onKeyDown?: (e: any) => void +} +const Input = ({ + className, + disabled = false, + placeHolder, + value, + onChange, + onKeyDown, +}: InputProps) => { + const classes = ['input', className].filter((i) => i).join(' ') + + return ( + <input + className={classes} + disabled={disabled} + placeholder={placeHolder} + value={value} + onChange={onChange} + onKeyDown={onKeyDown} + /> + ) +} + +export default Input diff --git a/app/components/Input/input.css b/app/components/Input/input.css new file mode 100644 index 00000000..dbf4c2b8 --- /dev/null +++ b/app/components/Input/input.css @@ -0,0 +1,48 @@ +/* I define the first class, which in the component is set up to add to every component, as the default values */ +/* You could use this class and nothing else and it will still show up correctly */ +/* the class has the same title as the component */ + +.input { + border-radius: var(--border-radius); + border: 1px solid var(--colors-cool-grey-200, #dfe3e9); + background: var(--colors-white, #fff); + box-shadow: 0px 16px 40px 0px rgba(175, 183, 194, 0.2); + color: var(--colors-cool-grey-900, #1b2b3e); + padding: var(--spacing-8) 0 var(--spacing-8) var(--spacing-12); + height: var(--spacing-48); + font-size: 16px; + font-weight: 300; + line-height: 170%; /* 27.2px */ + letter-spacing: -0.16px; + transition: border 0.2s; +} + +/* I then define all properties from Figma as titles (e.g. 'size' and 'state' for input) */ +/* and all possible values as unique classes within those properties (except for 'default') */ +/* I have to make sure to do .input.large so that this doesn't get in the way of other components */ + +/* size */ + +.input.large { + height: var(--spacing-56); + font-size: 18px; + letter-spacing: -0.18px; +} + +/* states */ + +.input:hover { + border: 1px solid var(--colors-teal-200, #a6d9d7); +} + +.input:focus { + border: 1px solid var(--colors-teal-500, #1d9089) !important; + outline: none; + color: var(--colors-cool-grey-900, #1b2b3e); +} + +.input:disabled, +.input[disabled] { + opacity: 0.6; + cursor: inherit; +} diff --git a/app/components/icons-generated/LinkOut.tsx b/app/components/icons-generated/LinkOut.tsx new file mode 100644 index 00000000..85b746b9 --- /dev/null +++ b/app/components/icons-generated/LinkOut.tsx @@ -0,0 +1,14 @@ +import type {SVGProps} from 'react' +const SvgLinkOut = (props: SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width={16} height={16} fill="none" {...props}> + <path + fill="#1D9089" + d="M9.636 2a.545.545 0 0 0 0 1.09h2.502L7.614 7.615a.545.545 0 1 0 .772.772l4.523-4.524v2.502a.545.545 0 1 0 1.091 0V2.545A.545.545 0 0 0 13.454 2z" + /> + <path + fill="#1D9089" + d="M12.364 8c.3 0 .545.244.545.545v4.91a.545.545 0 0 1-.545.545H2.545A.545.545 0 0 1 2 13.454V3.637c0-.3.244-.545.545-.545h4.91a.545.545 0 0 1 0 1.09H3.09v8.728h8.727V8.545c0-.3.244-.545.546-.545" + /> + </svg> +) +export default SvgLinkOut diff --git a/app/components/icons-generated/Stampy.tsx b/app/components/icons-generated/Stampy.tsx index 48dc30f0..bf3a1720 100644 --- a/app/components/icons-generated/Stampy.tsx +++ b/app/components/icons-generated/Stampy.tsx @@ -1,6 +1,6 @@ import type {SVGProps} from 'react' const SvgStampy = (props: SVGProps<SVGSVGElement>) => ( - <svg xmlns="http://www.w3.org/2000/svg" width={40} height={35} fill="none" {...props}> + <svg xmlns="http://www.w3.org/2000/svg" width={80} height={69} fill="none" {...props}> <g clipPath="url(#stampy_svg__a)"> <path fill="#ECA680" @@ -31,7 +31,7 @@ const SvgStampy = (props: SVGProps<SVGSVGElement>) => ( </g> <defs> <clipPath id="stampy_svg__a"> - <path fill="#fff" d="M0 0h40v34.56H0z" /> + <path fill="#fff" d="M0 0h80v69H0z" /> </clipPath> </defs> </svg> diff --git a/app/components/icons-generated/index.ts b/app/components/icons-generated/index.ts index 6ad14434..7854bc06 100644 --- a/app/components/icons-generated/index.ts +++ b/app/components/icons-generated/index.ts @@ -28,6 +28,7 @@ export {default as GroupTopEcplise} from './GroupTopEcplise' export {default as Hide} from './Hide' export {default as IntroMobile} from './IntroMobile' export {default as Like} from './Like' +export {default as LinkOut} from './LinkOut' export {default as Link} from './Link' export {default as ListLarge} from './ListLarge' export {default as MagnifyingGlass} from './MagnifyingGlass' diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index d4d6c946..b2836e44 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -1,5 +1,4 @@ -// export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' -export const CHATBOT_URL = 'http://127.0.0.1:3001/chat' +export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' export type Citation = { title: string diff --git a/app/root.css b/app/root.css index 57cc51b5..8c6b1066 100644 --- a/app/root.css +++ b/app/root.css @@ -290,6 +290,54 @@ h2 { /* width classes. please turn the grid on in figma and then define widths based on how many columns there are! */ /* note I may change these to vars later */ +.col-1 { + width: clamp(0, 3.07vw, 53px); +} + +.col-2 { + width: clamp(0, 8.54vw, 171px); +} + +.col-3 { + width: clamp(0, 15vw, 288px); +} + +.col-4 { + width: clamp(0, 21.46vw, 405px); +} + +.col-5 { + width: clamp(0, 27.99vw, 523px); +} + +.col-6 { + width: clamp(0, 34.44vw, 640px); +} + +.col-7 { + width: clamp(0, 40.9vw, 757px); +} + +.col-8 { + width: clamp(0, 47.43vw, 875px); +} + +.col-9 { + width: clamp(0, 53.89vw, 992px); +} + +.col-10 { + width: clamp(0, 60.35vw, 1109px); +} + +.col-11 { + width: clamp(0, 66.88vw, 1227px); +} + +.col-12 { + width: clamp(0, 73.33vw, 1344px); +} + .fcol-2 { flex: 2; } From 36a5481cdec117e3a6862382bb26853f895c7a67 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Thu, 2 May 2024 17:21:56 -0400 Subject: [PATCH 025/132] new input component, CSS --- app/components/Chatbot/index.tsx | 12 ------------ app/components/Chatbot/widgit.css | 4 +--- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 2e56000f..7c5fc697 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -69,11 +69,6 @@ type QuestionInputProps = { } const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') -<<<<<<< Updated upstream - -======= - const [, setPlaceholder] = useState('Ask Stampy a question...') ->>>>>>> Stashed changes const handleAsk = (val: string) => { onAsk && onAsk(val) setQuestion('') @@ -86,16 +81,9 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { return ( <div className="widget-ask flex-container"> -<<<<<<< Updated upstream - <input - type="text" - className="full-width bordered secondary" - placeholder="Ask Stampy a question..." -======= <Input placeHolder="Ask Stampy a question..." className="large col-10" ->>>>>>> Stashed changes value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 6e6ff71a..47107ae9 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -16,8 +16,6 @@ } } -<<<<<<< Updated upstream -======= .widget-ask { position: sticky; bottom: 0; @@ -32,11 +30,11 @@ bottom: 4.44vw; width: 10.13vw; } + .red { color: #d40000; } ->>>>>>> Stashed changes .settings-container { position: fixed; bottom: var(--spacing-32); From ed8d2eff8a22a60b1bc0147588ae1c26432bb746 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Thu, 2 May 2024 23:51:33 +0200 Subject: [PATCH 026/132] feedback form --- app/components/Article/Feedback.tsx | 70 ------------- app/components/Article/FeedbackForm/index.tsx | 99 ------------------- app/components/Article/article.css | 4 - app/components/Article/index.tsx | 2 +- app/components/Chatbot/ChatEntry.tsx | 25 ++++- app/components/Chatbot/index.tsx | 3 +- app/components/Feedback/Form.tsx | 67 +++++++++++++ .../feedback.css} | 30 ++---- app/components/Feedback/index.tsx | 61 ++++++++++++ app/hooks/useChat.ts | 2 + app/hooks/useOnOutsideClick.ts | 25 +++++ app/root.css | 9 ++ stories/FeedbackForm.stories.tsx | 2 +- 13 files changed, 199 insertions(+), 200 deletions(-) delete mode 100644 app/components/Article/Feedback.tsx delete mode 100644 app/components/Article/FeedbackForm/index.tsx create mode 100644 app/components/Feedback/Form.tsx rename app/components/{Article/FeedbackForm/feedbackForm.css => Feedback/feedback.css} (70%) create mode 100644 app/components/Feedback/index.tsx create mode 100644 app/hooks/useOnOutsideClick.ts diff --git a/app/components/Article/Feedback.tsx b/app/components/Article/Feedback.tsx deleted file mode 100644 index 0b336f29..00000000 --- a/app/components/Article/Feedback.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React, {useState} from 'react' -import {CompositeButton} from '~/components/Button' -import {Action, ActionType} from '~/routes/questions.actions' -import './article.css' -import FeedbackForm from '~/components/Article/FeedbackForm' - -type FeedbackProps = { - pageid: string - showForm?: boolean - labels?: boolean - upHint?: string - downHint?: string -} -const Feedback = ({pageid, showForm, labels, upHint, downHint}: FeedbackProps) => { - const [showFeedback, setShowFeedback] = useState(false) - const [showFeedbackForm, setShowFeedbackForm] = useState(false) - const [isFormFocused, setIsFormFocused] = useState(false) - - React.useEffect(() => { - // Hide the form after 10 seconds if the user hasn't interacted with it - const timeoutId = setInterval(() => { - if (!isFormFocused) { - setShowFeedbackForm(false) - } - }, 10000) - - // Clear the timeout to prevent it from running if the component unmounts - return () => clearInterval(timeoutId) - }, [showFeedbackForm, isFormFocused]) - - React.useEffect(() => { - const timeout = setInterval(() => setShowFeedback(false), 6000) - return () => clearInterval(timeout) - }, [showFeedback]) - - return ( - <CompositeButton className="flex-container relative feedback"> - <Action - pageid={pageid} - showText={!!labels} - actionType={ActionType.HELPFUL} - hint={upHint} - onSuccess={() => setShowFeedback(true)} - /> - <Action - pageid={pageid} - showText={!!labels} - hint={downHint} - actionType={ActionType.UNHELPFUL} - onClick={() => setShowFeedbackForm(!!showForm)} - /> - <div className={['action-feedback-text', showFeedback ? 'show' : ''].join(' ')}> - Thanks for your feedback! - </div> - <FeedbackForm - pageid={pageid} - className={['feedback-form', showFeedbackForm ? 'show' : ''].join(' ')} - onClose={() => { - setShowFeedback(true) - setShowFeedbackForm(false) - }} - onBlur={() => setIsFormFocused(false)} - onFocus={() => setIsFormFocused(true)} - hasOptions={false} - /> - </CompositeButton> - ) -} - -export default Feedback diff --git a/app/components/Article/FeedbackForm/index.tsx b/app/components/Article/FeedbackForm/index.tsx deleted file mode 100644 index 50e08416..00000000 --- a/app/components/Article/FeedbackForm/index.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import React, {ChangeEvent} from 'react' -import Button from '~/components/Button' -import './feedbackForm.css' - -export interface FeedbackFormProps { - pageid: string - className?: string - onClose?: () => void - onBlur?: () => void - onFocus?: () => void - hasOptions?: boolean -} -const FeedbackForm = ({ - pageid, - className = 'feedback-form', - onClose, - onBlur, - onFocus, - hasOptions = true, -}: FeedbackFormProps) => { - // to be implemented. - const [selected, setSelected] = React.useState<string>() - const options = [ - { - text: 'Making things up', - option: 'making_things_up', - }, - { - text: 'Being mean', - option: 'being_mean', - }, - { - text: 'Typos', - option: 'typos', - }, - ] - const [enabledSubmit, setEnabledSubmit] = React.useState(!hasOptions) - const selectFeedback = (option: string) => { - setSelected(option) - - if (onFocus) { - onFocus() - } - setEnabledSubmit(true) - } - const handleBlur = React.useCallback( - (e: ChangeEvent<HTMLElement>) => { - const currentTarget = e.currentTarget - - // Give browser time to focus the next element - requestAnimationFrame(() => { - // Check if the new focused element is a child of the original container - if (!currentTarget.contains(document.activeElement)) { - if (onBlur) { - onBlur() - } - } - }) - }, - [onBlur] - ) - - const handleSubmit = () => { - onClose && onClose() - } - - return ( - <div key={pageid} className={className} onBlur={handleBlur} onFocus={onFocus}> - <div className={'fcol-5 feedback-container bordered'}> - <span className={'black small'}>What was the problem?</span> - {hasOptions - ? options.map((option, index) => ( - <Button - key={index} - className={[ - option.text == selected ? 'secondary-alt selected' : 'secondary', - 'select-option', - ].join(' ')} - action={() => selectFeedback(option.text)} - > - <div>{option.text}</div> - </Button> - )) - : null} - - <textarea - name={'feedback-text'} - className={['feedback-text bordered', !hasOptions ? 'no-options' : ''].join(' ')} - placeholder={'Leave a comment (optional)'} - ></textarea> - <Button className="primary full-width" action={handleSubmit} disabled={!enabledSubmit}> - <p>Submit feedback</p> - </Button> - </div> - </div> - ) -} - -export default FeedbackForm diff --git a/app/components/Article/article.css b/app/components/Article/article.css index f8b06d4c..10d06fd4 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -175,10 +175,6 @@ article a.see-more.visible:after { content: 'See less'; } -.feedback { - width: fit-content; -} - @media only screen and (max-width: 780px) { article { max-width: 100%; diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 08dd1fdc..905f51d7 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -4,10 +4,10 @@ import KeepGoing from '~/components/Article/KeepGoing' import CopyIcon from '~/components/icons-generated/Copy' import EditIcon from '~/components/icons-generated/Pencil' import Button, {CompositeButton} from '~/components/Button' +import Feedback from '~/components/Feedback' import type {Glossary, Question} from '~/server-utils/stampy' import {tagUrl} from '~/routesMapper' import Contents from './Contents' -import Feedback from './Feedback' import './article.css' const isLoading = ({text}: Question) => !text || text === 'Loading...' diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 5020a42a..d7fbad29 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -7,10 +7,10 @@ import LinkIcon from '~/components/icons-generated/Link' import PersonIcon from '~/components/icons-generated/Person' import StampyIcon from '~/components/icons-generated/Stampy' import Contents from '~/components/Article/Contents' +import Feedback from '~/components/Feedback' import useGlossary from '~/hooks/useGlossary' import './chat_entry.css' import type {Entry, AssistantEntry, StampyEntry, Citation, ErrorMessage} from '~/hooks/useChat' -import Feedback from '../Article/Feedback' const MAX_REFERENCES = 10 @@ -190,6 +190,21 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { <div className="padding-top-32">{citations?.slice(0, MAX_REFERENCES).map(Reference)}</div> </> )} + {['followups', 'done'].includes(phase || '') ? ( + <Feedback + showForm + pageid="chatbot" + upHint="This response was helpful" + downHint="This response was unhelpful" + options={[ + 'Making things up', + 'Wrong subject', + 'Confusing', + 'Issues with sources', + 'Other', + ]} + /> + ) : undefined} {phase === 'followups' ? <p>Checking for followups...</p> : undefined} </div> ) @@ -211,9 +226,17 @@ const StampyArticle = ({pageid, content, title}: StampyEntry) => { /> </article> <Feedback + showForm pageid={pageid} upHint="This response was helpful" downHint="This response was unhelpful" + options={[ + 'Making things up', + 'Wrong subject', + 'Confusing', + 'Issues with sources', + 'Other', + ]} /> </div> </div> diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index cee0ded3..c8db850e 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -202,7 +202,8 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { setHistory((current) => { const last = current[current.length - 1] if ( - (last?.role === 'assistant' && ['streaming', 'followups'].includes(last?.phase || '')) || + (last?.role === 'assistant' && + ['streaming', 'followups', 'done'].includes(last?.phase || '')) || (last?.role === 'stampy' && last?.content) || ['error'].includes(last?.role) ) { diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx new file mode 100644 index 00000000..c2054599 --- /dev/null +++ b/app/components/Feedback/Form.tsx @@ -0,0 +1,67 @@ +import {useEffect, useState} from 'react' +import Button from '~/components/Button' +import useOutsideOnClick from '~/hooks/useOnOutsideClick' +import './feedback.css' + +export type FeedbackFormProps = { + onClose?: () => void + options?: string[] +} +const FeedbackForm = ({onClose, options}: FeedbackFormProps) => { + const [selected, setSelected] = useState<string>() + const [enabledSubmit, setEnabledSubmit] = useState(!options) + const [numClicks, setNumClicks] = useState(0) + const clickCheckerRef = useOutsideOnClick(onClose) + + useEffect(() => { + // Hide the form after 10 seconds if the user hasn't interacted with it + const timeoutId = setInterval(() => { + onClose && onClose() + }, 10000) + + // Clear the timeout to prevent it from running if the component unmounts + return () => clearInterval(timeoutId) + }, [numClicks, onClose]) + + const selectFeedback = (option: string) => { + setSelected(option) + setEnabledSubmit(true) + } + + const handleSubmit = () => { + onClose && onClose() + } + + return ( + <div + ref={clickCheckerRef} + onClick={() => setNumClicks((current) => current + 1)} + className="fcol-5 feedback-form bordered" + > + <span className="black small">What was the problem?</span> + {options?.map((option) => ( + <Button + key={option} + className={[ + option == selected ? 'secondary-alt selected' : 'secondary', + 'select-option', + ].join(' ')} + action={() => selectFeedback(option)} + > + {option} + </Button> + ))} + + <textarea + name="feedback-text" + className={['feedback-text bordered', !options ? 'no-options' : ''].join(' ')} + placeholder="Leave a comment (optional)" + /> + <Button className="primary full-width" action={handleSubmit} disabled={!enabledSubmit}> + <p>Submit feedback</p> + </Button> + </div> + ) +} + +export default FeedbackForm diff --git a/app/components/Article/FeedbackForm/feedbackForm.css b/app/components/Feedback/feedback.css similarity index 70% rename from app/components/Article/FeedbackForm/feedbackForm.css rename to app/components/Feedback/feedback.css index 1b8a356a..67068bd9 100644 --- a/app/components/Article/FeedbackForm/feedbackForm.css +++ b/app/components/Feedback/feedback.css @@ -1,4 +1,10 @@ -.feedback-container { +.feedback .composite-button { + width: fit-content; +} + +.feedback-form { + position: relative; + z-index: 2; max-width: 384px; padding: var(--spacing-32); } @@ -13,12 +19,6 @@ border: 1px solid var(--colors-teal-500); } -.feedback-form { - position: relative; - color: var(--colors-cool-grey-600); - z-index: 2; -} - .feedback-text { width: calc(100% - var(--spacing-24)); max-width: calc(100% - var(--spacing-24)); @@ -35,24 +35,8 @@ opacity: 1; } -.tooltip:hover::after { - display: block; -} - -.action-feedback-text { - display: none; - position: absolute; - transform: translate(-1vw, var(--spacing-56)); -} -.action-feedback-text.show { - display: block; -} .composite-button > .feedback-form { position: absolute; - display: none; transform: translate(-9vw, var(--spacing-56)); margin: var(--spacing-24); } -.composite-button > .feedback-form.show { - display: block; -} diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx new file mode 100644 index 00000000..885f3974 --- /dev/null +++ b/app/components/Feedback/index.tsx @@ -0,0 +1,61 @@ +import {useEffect, useState} from 'react' +import {CompositeButton} from '~/components/Button' +import {Action, ActionType} from '~/routes/questions.actions' +import './feedback.css' +import FeedbackForm from './Form' + +type FeedbackProps = { + pageid: string + showForm?: boolean + labels?: boolean + upHint?: string + downHint?: string + options?: string[] +} +const Feedback = ({pageid, showForm, labels, upHint, downHint, options}: FeedbackProps) => { + const [showFeedback, setShowFeedback] = useState(false) + const [showFeedbackForm, setShowFeedbackForm] = useState(false) + + useEffect(() => { + const timeout = setInterval(() => setShowFeedback(false), 6000) + return () => clearInterval(timeout) + }, [showFeedback]) + + return ( + <div className="feedback relative"> + <CompositeButton className="flex-container"> + <Action + pageid={pageid} + showText={!!labels} + actionType={ActionType.HELPFUL} + hint={upHint} + onClick={() => setShowFeedback(true)} + /> + <Action + pageid={pageid} + showText={!!labels} + hint={downHint} + actionType={ActionType.UNHELPFUL} + onClick={() => { + setShowFeedback(!showForm) + setShowFeedbackForm(!!showForm) + }} + /> + </CompositeButton> + + {showFeedback && <div className="thanks">Thanks for your feedback!</div>} + + {showFeedbackForm && ( + <FeedbackForm + onClose={() => { + setShowFeedback(true) + setShowFeedbackForm(false) + }} + options={options} + /> + )} + </div> + ) +} + +export default Feedback diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index b30dc452..009bd398 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -22,6 +22,7 @@ export type ChatPhase = | 'llm' | 'streaming' | 'followups' + | 'done' export type UserEntry = { role: 'user' @@ -229,6 +230,7 @@ export const extractAnswer = async ( followups = data.followups.map((value: any) => value as Followup) break case 'done': + result = {...result, phase: 'done'} break case 'error': throw data.error diff --git a/app/hooks/useOnOutsideClick.ts b/app/hooks/useOnOutsideClick.ts new file mode 100644 index 00000000..ba545179 --- /dev/null +++ b/app/hooks/useOnOutsideClick.ts @@ -0,0 +1,25 @@ +import {useEffect, useRef} from 'react' + +const useOutsideOnClick = (onClick?: () => void) => { + const ref = useRef<HTMLDivElement>(null) + + useEffect(() => { + if (!onClick) return + + const handleClickOutside = (e: MouseEvent) => { + if (ref.current && !(ref.current as any)?.contains(e.target)) { + onClick() + } + } + + document.addEventListener('mousedown', handleClickOutside) + + return () => { + document.removeEventListener('mousedown', handleClickOutside) + } + }, [ref, onClick]) + + return ref +} + +export default useOutsideOnClick diff --git a/app/root.css b/app/root.css index 5f95175b..d35ea368 100644 --- a/app/root.css +++ b/app/root.css @@ -396,6 +396,15 @@ svg { cursor: pointer; } +.hidden { + visibility: hidden; + transition: visibility 0.2s; +} +.shown { + visibility: visible; + transition-delay: 0s; +} + /* for troubleshooting */ .pink { diff --git a/stories/FeedbackForm.stories.tsx b/stories/FeedbackForm.stories.tsx index feba8c94..bb7b41e2 100644 --- a/stories/FeedbackForm.stories.tsx +++ b/stories/FeedbackForm.stories.tsx @@ -1,5 +1,5 @@ import type {Meta, StoryObj} from '@storybook/react' -import FeedbackForm from '../app/components/Article/FeedbackForm' +import FeedbackForm from '../app/components/Feedback' const meta = { title: 'Components/Article/FeedbackForm', component: FeedbackForm, From ba022925e3ab42e92478e78b3d55dfe9546ad6ee Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Thu, 2 May 2024 18:19:15 -0400 Subject: [PATCH 027/132] a couple old CSS changes --- app/root.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/root.css b/app/root.css index 5f95175b..0b04cf4f 100644 --- a/app/root.css +++ b/app/root.css @@ -405,7 +405,7 @@ svg { /* defines the standard left and right margins */ .page-body { - padding: 0 var(--spacing-104); + padding: 0px 13.333vw; } /* all other classes */ @@ -465,6 +465,7 @@ svg { h1 { font-size: 38px; font-weight: 500; + font-weight: 500; line-height: 130%; /* 49.4px */ letter-spacing: -0.57px; } @@ -472,6 +473,7 @@ svg { h2 { font-size: 26px; font-weight: 500; + font-weight: 500; line-height: 145%; /* 37.7px */ letter-spacing: -0.52px; } @@ -481,6 +483,7 @@ svg { .large { font-size: 18px; font-weight: 300; + font-weight: 300; line-height: 170%; /* 30.6px */ letter-spacing: -0.18px; } @@ -488,6 +491,7 @@ svg { .large-reading { font-size: 18px; font-weight: 300; + font-weight: 300; line-height: 190%; /* 34.2px */ letter-spacing: -0.18px; } @@ -495,6 +499,7 @@ svg { .large-bold { font-size: 18px; font-weight: 500; + font-weight: 500; line-height: 170%; /* 30.6px */ letter-spacing: -0.18px; } From eb5af5c65ad8d2e4e65900fe4bd3d16d6948e530 Mon Sep 17 00:00:00 2001 From: buddy-web3 <0buddy.ne@gmail.com> Date: Fri, 3 May 2024 01:49:01 +0300 Subject: [PATCH 028/132] proper page ids --- app/components/Chatbot/index.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index f89f691b..0ba9f352 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -14,15 +14,15 @@ import {useSearch} from '~/hooks/useSearch' const poolQuestions = [ { title: 'What is AI Safety? - from pool', - pageid: '1b', + pageid: '5633', }, { title: 'How would the AI even get out in the world? -- from pool', - pageid: '2b', + pageid: '7638', }, { title: 'Do people seriously worry about existential risk from AI? --- from pool', - pageid: '3b', + pageid: '7639', }, ] @@ -187,7 +187,6 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { if (question.relatedQuestions.length <= 2) { question.relatedQuestions.push(...poolQuestions) } - console.log('related questions:: ', question.relatedQuestions) setFollowups( question.relatedQuestions?.slice(0, 3).map(({title, pageid}) => ({text: title, pageid})) ) From 8fff3dcc297354d3b7189c588dd740f1e8cb7253 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Thu, 2 May 2024 21:14:46 -0400 Subject: [PATCH 029/132] general CSS changes for chatbot --- app/assets/icons/bot-small.svg | 9 ++ app/assets/icons/personincircle.svg | 5 ++ app/components/Chatbot/ChatEntry.tsx | 25 +++--- app/components/Chatbot/chat_entry.css | 10 ++- app/components/Chatbot/index.tsx | 18 ++-- app/components/icons-generated/BotSmall.tsx | 19 +++++ .../icons-generated/PersonInCircle.tsx | 13 +++ app/components/icons-generated/index.ts | 2 + app/root.css | 82 +++++++++++++------ app/routes/chat.tsx | 2 +- 10 files changed, 139 insertions(+), 46 deletions(-) create mode 100644 app/assets/icons/bot-small.svg create mode 100644 app/assets/icons/personincircle.svg create mode 100644 app/components/icons-generated/BotSmall.tsx create mode 100644 app/components/icons-generated/PersonInCircle.tsx diff --git a/app/assets/icons/bot-small.svg b/app/assets/icons/bot-small.svg new file mode 100644 index 00000000..20ee38de --- /dev/null +++ b/app/assets/icons/bot-small.svg @@ -0,0 +1,9 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M2 4.5C1.72386 4.5 1.5 4.72386 1.5 5V13C1.5 13.2761 1.72386 13.5 2 13.5H14C14.2761 13.5 14.5 13.2761 14.5 13V5C14.5 4.72386 14.2761 4.5 14 4.5H2Z" stroke="#788492" stroke-linecap="square" stroke-linejoin="round"/> +<line x1="5.5" y1="7.5" x2="5.5" y2="8.5" stroke="#788492" stroke-linecap="round"/> +<line x1="10.5" y1="7.5" x2="10.5" y2="8.5" stroke="#788492" stroke-linecap="round"/> +<path d="M5.14645 4.35355L5.5 4.70711L6.20711 4L5.85355 3.64645L5.14645 4.35355ZM4.35355 2.14645C4.15829 1.95118 3.84171 1.95118 3.64645 2.14645C3.45118 2.34171 3.45118 2.65829 3.64645 2.85355L4.35355 2.14645ZM5.85355 3.64645L4.35355 2.14645L3.64645 2.85355L5.14645 4.35355L5.85355 3.64645Z" fill="#788492"/> +<path d="M10.8536 4.35355L10.5 4.70711L9.79289 4L10.1464 3.64645L10.8536 4.35355ZM11.6464 2.14645C11.8417 1.95118 12.1583 1.95118 12.3536 2.14645C12.5488 2.34171 12.5488 2.65829 12.3536 2.85355L11.6464 2.14645ZM10.1464 3.64645L11.6464 2.14645L12.3536 2.85355L10.8536 4.35355L10.1464 3.64645Z" fill="#788492"/> +<circle cx="12" cy="2.5" r="1" fill="#788492"/> +<circle cx="4" cy="2.5" r="1" fill="#788492"/> +</svg> diff --git a/app/assets/icons/personincircle.svg b/app/assets/icons/personincircle.svg new file mode 100644 index 00000000..567c3068 --- /dev/null +++ b/app/assets/icons/personincircle.svg @@ -0,0 +1,5 @@ +<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"> +<circle cx="20" cy="20" r="20" fill="#EDFAF9"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M23 16C23 17.6569 21.6569 19 20 19C18.3431 19 17 17.6569 17 16C17 14.3431 18.3431 13 20 13C21.6569 13 23 14.3431 23 16ZM22 16C22 17.1046 21.1046 18 20 18C18.8954 18 18 17.1046 18 16C18 14.8954 18.8954 14 20 14C21.1046 14 22 14.8954 22 16Z" fill="#1D9089"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M25 27C25.5523 27 26 26.5523 26 26C26 22.6863 23.3137 20 20 20C16.6863 20 14 22.6863 14 26C14 26.5523 14.4477 27 15 27H25ZM20 21C17.581 21 15.5633 22.7178 15.1 25C15.0344 25.3231 15 25.6575 15 26H25C25 25.6575 24.9656 25.3231 24.9 25C24.4367 22.7178 22.419 21 20 21Z" fill="#1D9089"/> +</svg> diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index bebefc51..36cea789 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -2,15 +2,18 @@ import {ComponentType} from 'react' import {Link} from '@remix-run/react' import MarkdownIt from 'markdown-it' import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' -import BotIcon from '~/components/icons-generated/Bot' -import LinkIcon from '~/components/icons-generated/Link' -import PersonIcon from '~/components/icons-generated/Person' -import StampyIcon from '~/components/icons-generated/Stampy' import Contents from '~/components/Article/Contents' import useGlossary from '~/hooks/useGlossary' import './chat_entry.css' import type {Entry, AssistantEntry, StampyEntry, Citation, ErrorMessage} from '~/hooks/useChat' +// icons +import IconBotSmall from '~/components/icons-generated/BotSmall' +import LinkIcon from '~/components/icons-generated/Link' +import PersonIcon from '~/components/icons-generated/Person' +import StampyIcon from '~/components/icons-generated/Stampy' +import PersonInCircleIcon from '~/components/icons-generated/PersonInCircle' + const MAX_REFERENCES = 10 const hints = { bot: 'bla bla bla something bot', @@ -22,7 +25,7 @@ const AnswerInfo = ({answerType}: {answerType?: 'human' | 'bot' | 'error'}) => { if (!answerType || !hints[answerType]) return null return ( <span className="info"> - {answerType === 'human' ? <PersonIcon /> : <BotIcon />} + {answerType === 'human' ? <PersonIcon /> : <IconBotSmall />} <span className="small grey"> {answerType === 'human' ? 'Human-written' : 'Bot-generated'} response </span> @@ -38,7 +41,7 @@ type TitleProps = { answerType?: 'human' | 'bot' | 'error' } const Title = ({title, Icon, answerType}: TitleProps) => ( - <div className="flex-container title"> + <div className="flex-container title padding-bottom-16"> <Icon /> <span className="default-bold flex-double">{title}</span> <AnswerInfo answerType={answerType} /> @@ -47,8 +50,8 @@ const Title = ({title, Icon, answerType}: TitleProps) => ( const UserQuery = ({content}: Entry) => ( <div> - <Title title="You" Icon={PersonIcon} /> - <div>{content}</div> + <Title title="You" Icon={PersonInCircleIcon} /> + <div className="padding-left-56 large-reading">{content}</div> </div> ) @@ -99,7 +102,7 @@ const Reference = ({id, title, authors, source, url, index}: Citation) => { return ( <div key={id} id={id} className="reference padding-bottom-32"> - <div className={`reference-num small ref-${index}`}>{index}</div> + <div className={`reference-num small-bold ref-${index}`}>{index}</div> <div> <div className="title">{title}</div> <div> @@ -147,7 +150,7 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { <div> <Title title="Stampy" Icon={StampyIcon} answerType="bot" /> <PhaseState /> - <div className="padding-bottom-24"> + <div className="padding-bottom-56 padding-left-56 large-reading"> {content?.split(/(\[\d+\])|(\n)/).map((chunk, i) => { if (chunk?.match(/(\[\d+\])/)) { const refId = chunk.slice(1, chunk.length - 1) @@ -163,7 +166,7 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { {citations && citations.length > 0 && ( <> <hr /> - <div className="padding-top-32">{citations?.slice(0, MAX_REFERENCES).map(Reference)}</div> + <div className="padding-top-56">{citations?.slice(0, MAX_REFERENCES).map(Reference)}</div> </> )} {phase === 'followups' ? <p>Checking for followups...</p> : undefined} diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 4d40fbe1..fde66cef 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -10,11 +10,12 @@ article.stampy { .chat-entry .title { display: flex; gap: var(--spacing-16); + align-items: center; } .chat-entry .info { display: flex; - gap: var(--spacing-6); + gap: var(--spacing-8); align-items: center; } @@ -30,7 +31,9 @@ article.stampy { } .chat-entry .reference-link { - font-size: smaller; + font-size: 12px; + line-height: 12px; + font-weight: 500; vertical-align: super; padding: 2px 4px; margin-left: 2px; @@ -99,8 +102,9 @@ article.stampy { .reference .reference-num { width: var(--spacing-32); height: var(--spacing-32); - border-radius: 6px; + border-radius: var(--border-radius); text-align: center; + line-height: 32px; } .reference .source-link { diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 168e93b3..e2d89249 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -262,13 +262,17 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { {history.map((item, i) => ( <ChatEntry key={`chat-entry-${i}`} {...item} /> ))} - {followups ? ( - <Followups - title="Continue the conversation" - followups={followups} - onSelect={showFollowup} - /> - ) : undefined} + + <div className="padding-bottom-56"> + {followups ? ( + <Followups + title="Continue the conversation" + followups={followups} + onSelect={showFollowup} + /> + ) : undefined} + </div> + <QuestionInput onAsk={onQuestion} /> <div className={'warning-floating'}> diff --git a/app/components/icons-generated/BotSmall.tsx b/app/components/icons-generated/BotSmall.tsx new file mode 100644 index 00000000..913a1688 --- /dev/null +++ b/app/components/icons-generated/BotSmall.tsx @@ -0,0 +1,19 @@ +import type {SVGProps} from 'react' +const SvgBotSmall = (props: SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width={16} height={16} fill="none" {...props}> + <path + stroke="#788492" + strokeLinecap="square" + strokeLinejoin="round" + d="M2 4.5a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h12a.5.5 0 0 0 .5-.5V5a.5.5 0 0 0-.5-.5z" + /> + <path stroke="#788492" strokeLinecap="round" d="M5.5 7.5v1M10.5 7.5v1" /> + <path + fill="#788492" + d="m5.146 4.354.354.353L6.207 4l-.353-.354zm-.792-2.208a.5.5 0 1 0-.708.708zm1.5 1.5-1.5-1.5-.708.708 1.5 1.5zM10.854 4.354l-.354.353L9.793 4l.353-.354zm.792-2.208a.5.5 0 0 1 .708.708zm-1.5 1.5 1.5-1.5.708.708-1.5 1.5z" + /> + <circle cx={12} cy={2.5} r={1} fill="#788492" /> + <circle cx={4} cy={2.5} r={1} fill="#788492" /> + </svg> +) +export default SvgBotSmall diff --git a/app/components/icons-generated/PersonInCircle.tsx b/app/components/icons-generated/PersonInCircle.tsx new file mode 100644 index 00000000..bf8b9855 --- /dev/null +++ b/app/components/icons-generated/PersonInCircle.tsx @@ -0,0 +1,13 @@ +import type {SVGProps} from 'react' +const PersonInCircle = (props: SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width={40} height={40} fill="none" {...props}> + <circle cx={20} cy={20} r={20} fill="#EDFAF9" /> + <path + fill="#1D9089" + fillRule="evenodd" + d="M23 16a3 3 0 1 1-6 0 3 3 0 0 1 6 0m-1 0a2 2 0 1 1-4 0 2 2 0 0 1 4 0M25 27a1 1 0 0 0 1-1 6 6 0 0 0-12 0 1 1 0 0 0 1 1zm-5-6a5 5 0 0 0-5 5h10q0-.515-.1-1a5 5 0 0 0-4.9-4" + clipRule="evenodd" + /> + </svg> +) +export default PersonInCircle diff --git a/app/components/icons-generated/index.ts b/app/components/icons-generated/index.ts index 6ad14434..c75004bf 100644 --- a/app/components/icons-generated/index.ts +++ b/app/components/icons-generated/index.ts @@ -3,6 +3,7 @@ export {default as ArrowRight} from './ArrowRight' export {default as ArrowUpRight} from './ArrowUpRight' export {default as Arrow} from './Arrow' export {default as BookCircle} from './BookCircle' +export {default as BotSmall} from './BotSmall' export {default as Bot} from './Bot' export {default as BottomEclipse} from './BottomEclipse' export {default as BoxArrow} from './BoxArrow' @@ -38,6 +39,7 @@ export {default as Paper} from './Paper' export {default as Pencil} from './Pencil' export {default as People} from './People' export {default as Person} from './Person' +export {default as Personincircle} from './PersonInCircle' export {default as PlaneSend} from './PlaneSend' export {default as QuestionMark} from './QuestionMark' export {default as Search} from './Search' diff --git a/app/root.css b/app/root.css index 5f95175b..7f2cd3d0 100644 --- a/app/root.css +++ b/app/root.css @@ -192,99 +192,133 @@ h2 { } .padding-bottom-4 { - padding-bottom: var(--spacing-4); + padding-bottom: var(--spacing-4) !important; } .padding-bottom-8 { - padding-bottom: var(--spacing-8); + padding-bottom: var(--spacing-8) !important; } .padding-bottom-16 { - padding-bottom: var(--spacing-16); + padding-bottom: var(--spacing-16) !important; } .padding-bottom-24 { - padding-bottom: var(--spacing-24); + padding-bottom: var(--spacing-24) !important; } .padding-bottom-32 { - padding-bottom: var(--spacing-32); + padding-bottom: var(--spacing-32) !important; } .padding-bottom-40 { - padding-bottom: var(--spacing-40); + padding-bottom: var(--spacing-40) !important; } .padding-bottom-56 { - padding-bottom: var(--spacing-56); + padding-bottom: var(--spacing-56) !important; } .padding-bottom-80 { - padding-bottom: var(--spacing-80); + padding-bottom: var(--spacing-80) !important; } .padding-bottom-104 { - padding-bottom: var(--spacing-104); + padding-bottom: var(--spacing-104) !important; } .padding-bottom-128 { - padding-bottom: var(--spacing-128); + padding-bottom: var(--spacing-128) !important; } .padding-bottom-192 { - padding-bottom: var(--spacing-192); + padding-bottom: var(--spacing-192) !important; } .padding-bottom-288 { - padding-bottom: var(--spacing-288); + padding-bottom: var(--spacing-288) !important; } .padding-top-4 { - padding-top: var(--spacing-4); + padding-top: var(--spacing-4) !important; } .padding-top-8 { - padding-top: var(--spacing-8); + padding-top: var(--spacing-8) !important; } .padding-top-16 { - padding-top: var(--spacing-16); + padding-top: var(--spacing-16) !important; } .padding-top-24 { - padding-top: var(--spacing-24); + padding-top: var(--spacing-24) !important; } .padding-top-32 { - padding-top: var(--spacing-32); + padding-top: var(--spacing-32) !important; } .padding-top-40 { - padding-top: var(--spacing-40); + padding-top: var(--spacing-40) !important; } .padding-top-56 { - padding-top: var(--spacing-56); + padding-top: var(--spacing-56) !important; } .padding-top-80 { - padding-top: var(--spacing-80); + padding-top: var(--spacing-80) !important; } .padding-top-104 { - padding-top: var(--spacing-104); + padding-top: var(--spacing-104) !important; } .padding-top-128 { - padding-top: var(--spacing-128); + padding-top: var(--spacing-128) !important; } .padding-top-192 { - padding-top: var(--spacing-192); + padding-top: var(--spacing-192) !important; } .padding-top-288 { - padding-top: var(--spacing-288); + padding-top: var(--spacing-288) !important; +} + +/* padding left */ + +.padding-left-4 { + padding-left: var(--spacing-4) !important; +} + +.padding-left-8 { + padding-left: var(--spacing-8) !important; +} + +.padding-left-16 { + padding-left: var(--spacing-16) !important; +} + +.padding-left-24 { + padding-left: var(--spacing-24) !important; +} + +.padding-left-32 { + padding-left: var(--spacing-32) !important; +} + +.padding-left-40 { + padding-left: var(--spacing-40) !important; +} + +.padding-left-56 { + padding-left: var(--spacing-56) !important; +} + +.padding-left-80 { + padding-left: var(--spacing-80) !important; } /* width classes. please turn the grid on in figma and then define widths based on how many columns there are! */ diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 725738b1..01cdbba0 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -34,7 +34,7 @@ export default function App() { return ( <Page noFooter> - <div className="page-body full-height" onClick={() => setShowSettings(false)}> + <div className="page-body full-height padding-top-32" onClick={() => setShowSettings(false)}> <Chatbot question={question} questions={[ From 0f21664791ecdb330fd7f91de577c2d4276bd5da Mon Sep 17 00:00:00 2001 From: buddy-web3 <0buddy.ne@gmail.com> Date: Fri, 3 May 2024 13:01:32 +0300 Subject: [PATCH 030/132] 10 predefined poolQuestions, randomized --- app/components/Chatbot/index.tsx | 43 ++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 0ba9f352..35c77495 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -14,15 +14,43 @@ import {useSearch} from '~/hooks/useSearch' const poolQuestions = [ { title: 'What is AI Safety? - from pool', - pageid: '5633', + pageid: '8486', }, { title: 'How would the AI even get out in the world? -- from pool', pageid: '7638', }, { - title: 'Do people seriously worry about existential risk from AI? --- from pool', - pageid: '7639', + title: 'What is the AI alignment problem? -- from pool', + pageid: '8EL9', + }, + { + title: 'What are existential risks (x-risks)? -- from pool', + pageid: '89LL', + }, + { + title: "Isn't the real concern misuse? -- from pool", + pageid: '9B85', + }, + { + title: "Aren't there easy solutions to AI alignment? -- from pool", + pageid: '6172', + }, + { + title: 'Will we ever build superintelligence? -- from pool', + pageid: '7565', + }, + { + title: 'Will the first AGI be an LLM? -- from pool', + pageid: '85E2', + }, + { + title: 'Why not just raise AI like kids? -- from pool', + pageid: '93R9', + }, + { + title: 'Why is AI alignment a hard problem? -- from pool', + pageid: '8163', }, ] @@ -183,12 +211,11 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { // this is the current entry, so update it if (i === history.length - 1) { // check proper insertion of pool questions - // question.relatedQuestions - question.relatedQuestions.slice(0,2); - if (question.relatedQuestions.length <= 2) { - question.relatedQuestions.push(...poolQuestions) - } + // question.relatedQuestions = question.relatedQuestions.slice(0,2); setFollowups( - question.relatedQuestions?.slice(0, 3).map(({title, pageid}) => ({text: title, pageid})) + [...(question.relatedQuestions || []), ...poolQuestions.sort(() => Math.random() - 0.5)] + .slice(0, 3) + .map(({title, pageid}) => ({text: title, pageid})) ) return {...item, content: question.text || ''} } From 6fc2348efcdaf6e887df167f602218c38a6bf395 Mon Sep 17 00:00:00 2001 From: buddy-web3 <0buddy.ne@gmail.com> Date: Fri, 3 May 2024 14:25:34 +0300 Subject: [PATCH 031/132] lint --- app/components/Chatbot/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 35c77495..27a6ca84 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -112,7 +112,7 @@ type QuestionInputProps = { } const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') - const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') + const [_placeholder, setPlaceholder] = useState('Ask Stampy a question...') const handleAsk = (val: string) => { onAsk && onAsk(val) setQuestion('') @@ -129,7 +129,7 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { <input type="text" className="full-width bordered secondary right-icon" - placeholder={placeholder} + placeholder={_placeholder} value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { From e7219c03aedea26b9c4ef44c8574f1539227f044 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Fri, 3 May 2024 12:23:41 +0200 Subject: [PATCH 032/132] suggestions in chatbot --- app/components/Chatbot/index.tsx | 117 ++++++++++++++++-------------- app/components/Chatbot/widgit.css | 11 +++ app/hooks/useSearch.tsx | 40 ++++++---- app/root.css | 24 +++--- public/tfWorker.js | 3 +- 5 files changed, 113 insertions(+), 82 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index ba422499..02d8d9dc 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -1,5 +1,5 @@ import {useEffect, useRef, useState} from 'react' -import {Link, useFetcher} from '@remix-run/react' +import {useFetcher, useNavigate} from '@remix-run/react' import StampyIcon from '~/components/icons-generated/Stampy' import SendIcon from '~/components/icons-generated/PlaneSend' import Button from '~/components/Button' @@ -55,8 +55,59 @@ const poolQuestions = [ }, ] +const MIN_SIMILARITY = 0.85 + +type QuestionInputProps = { + initial?: string + onChange?: (val: string) => void + onAsk?: (val: string) => void +} +const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { + const [question, setQuestion] = useState(initial || '') + const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') + const {results, search, clear} = useSearch(1) + + const handleAsk = (val: string) => { + clear() + onAsk && onAsk(val) + setQuestion('') + setPlaceholder('Message Stampy') + } + + const handleChange = (val: string) => { + search(val, MIN_SIMILARITY) + setQuestion(val) + onChange && onChange(val) + } + + return ( + <div className="widget-ask col-10"> + {results.length > 0 ? ( + <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> + {results[0].title} + </Button> + ) : undefined} + <div className="flex-container"> + <Input + placeHolder={placeholder} + className="large full-width" + value={question} + onChange={(e) => handleChange(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter' && question.trim() && onAsk) { + handleAsk(question) + } + }} + /> + <SendIcon className="send pointer" onClick={() => handleAsk(question)} /> + </div> + </div> + ) +} + export const WidgetStampy = () => { const [question, setQuestion] = useState('') + const navigate = useNavigate() const questions = [ 'What is AI Safety?', 'How would the AI even get out in the world?', @@ -85,60 +136,16 @@ export const WidgetStampy = () => { </div> </div> - <div className="widget-ask"> - <input - type="text" - className="full-width bordered secondary" - placeholder="Ask Stampy a question..." - value={question} - onChange={(e) => setQuestion(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter' && question.trim()) { - window.location = stampyUrl(question) as any - } - }} - /> - <Link to={stampyUrl(question)}> - <SendIcon /> - </Link> - </div> - </div> - ) -} - -type QuestionInputProps = { - initial?: string - onChange?: (val: string) => void - onAsk?: (val: string) => void -} -const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { - const [question, setQuestion] = useState(initial || '') - const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') - const handleAsk = (val: string) => { - onAsk && onAsk(val) - setQuestion('') - setPlaceholder('Message Stampy') - } - - const handleChange = (val: string) => { - setQuestion(val) - onChange && onChange(val) - } - - return ( - <div className="widget-ask flex-container"> - <Input - placeHolder={placeholder} - className="large col-10" - value={question} - onChange={(e) => handleChange(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter' && question.trim() && onAsk) { - handleAsk(question) - } + <QuestionInput + initial={question} + onChange={setQuestion} + onAsk={(question) => { + navigate({ + pathname: '/chat/', + search: `?question=${question.trim()}`, + }) }} /> - <SendIcon className="pointer" onClick={() => handleAsk(question)} /> </div> ) } @@ -273,13 +280,13 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const updateReply = (reply: Entry) => setHistory((current) => [...current.slice(0, current.length - 2), message, reply]) - search(question) + search(question, MIN_SIMILARITY) const [humanWritten] = await waitForResults(100, 1000) if (newController.signal.aborted) { return } - if (humanWritten && humanWritten.score > 0.85 && question === resultsForRef.current) { + if (humanWritten && question === resultsForRef.current) { fetcher.load(questionUrl({pageid: humanWritten.pageid})) updateReply({pageid: humanWritten.pageid, role: 'stampy'} as StampyEntry) return diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 47107ae9..52931a66 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -48,3 +48,14 @@ gap: var(--spacing-16); width: 384px; } + +.widget-ask .suggestion { + border: 1px solid var(--colors-cool-grey-200, #dfe3e9); + justify-content: start; +} + +.widget-ask .send { + position: absolute; + right: 4px; + bottom: 4px; +} diff --git a/app/hooks/useSearch.tsx b/app/hooks/useSearch.tsx index 63c82a33..e3063154 100644 --- a/app/hooks/useSearch.tsx +++ b/app/hooks/useSearch.tsx @@ -54,6 +54,7 @@ const byScore = (a: SearchResult, b: SearchResult) => b.score - a.score export const baselineSearch = async ( searchQueryRaw: string, questions: Question[], + minSimilarity = 0, numResults = NUM_RESULTS ): Promise<SearchResult[]> => { if (!searchQueryRaw) { @@ -107,7 +108,7 @@ export const baselineSearch = async ( }) .sort(byScore) .slice(0, numResults) - .filter(({score}) => score > 0) + .filter(({score}) => score >= minSimilarity) } /** @@ -170,38 +171,40 @@ export const useSearch = (numResults = NUM_RESULTS) => { makeWorker() }, []) - const searchLater = (userQuery: string) => { + const searchLater = (userQuery: string, minSimilarity?: number) => { if (typeof window === 'undefined') return clearTimeout(timeoutRef.current) timeoutRef.current = setTimeout(() => { - search(userQuery) + search(userQuery, minSimilarity) }, 100) } - const search = (userQuery: string) => { + const search = (userQuery: string, minSimilarity?: number) => { isPendingSearch.current = true const wordCount = userQuery.split(' ').length if (wordCount > 2) { if (runningQueryRef.current || !tfWorkerRef.current) { - searchLater(userQuery) + searchLater(userQuery, minSimilarity) return } runningQueryRef.current = userQuery - tfWorkerRef.current.postMessage({userQuery, numResults}) + tfWorkerRef.current.postMessage({userQuery, numResults, minSimilarity}) } else { if (runningQueryRef.current || onSiteAnswersRef.current.length == 0) { - searchLater(userQuery) + searchLater(userQuery, minSimilarity) return } runningQueryRef.current = userQuery - baselineSearch(userQuery, onSiteAnswersRef.current, numResults).then((searchResults) => { - runningQueryRef.current = undefined - resultsRef.current = searchResults - resultsForRef.current = userQuery - isPendingSearch.current = false - setResults(searchResults) - }) + baselineSearch(userQuery, onSiteAnswersRef.current, minSimilarity, numResults).then( + (searchResults) => { + runningQueryRef.current = undefined + resultsRef.current = searchResults + resultsForRef.current = userQuery + isPendingSearch.current = false + setResults(searchResults) + } + ) } } @@ -214,8 +217,17 @@ export const useSearch = (numResults = NUM_RESULTS) => { return resultsRef.current } + const clear = () => { + runningQueryRef.current = undefined + isPendingSearch.current = false + resultsForRef.current = undefined + resultsRef.current = [] + setResults([]) + } + return { search, + clear, results, resultsForRef, isPendingSearch: isPendingSearch.current, diff --git a/app/root.css b/app/root.css index a6474740..94383271 100644 --- a/app/root.css +++ b/app/root.css @@ -325,51 +325,51 @@ h2 { /* note I may change these to vars later */ .col-1 { - width: clamp(0, 3.07vw, 53px); + width: clamp(0px, 3.07vw, 53px); } .col-2 { - width: clamp(0, 8.54vw, 171px); + width: clamp(0px, 8.54vw, 171px); } .col-3 { - width: clamp(0, 15vw, 288px); + width: clamp(0px, 15vw, 288px); } .col-4 { - width: clamp(0, 21.46vw, 405px); + width: clamp(0px, 21.46vw, 405px); } .col-5 { - width: clamp(0, 27.99vw, 523px); + width: clamp(0px, 27.99vw, 523px); } .col-6 { - width: clamp(0, 34.44vw, 640px); + width: clamp(0px, 34.44vw, 640px); } .col-7 { - width: clamp(0, 40.9vw, 757px); + width: clamp(0px, 40.9vw, 757px); } .col-8 { - width: clamp(0, 47.43vw, 875px); + width: clamp(0px, 47.43vw, 875px); } .col-9 { - width: clamp(0, 53.89vw, 992px); + width: clamp(0px, 53.89vw, 992px); } .col-10 { - width: clamp(0, 60.35vw, 1109px); + width: clamp(0px, 60.35vw, 1109px); } .col-11 { - width: clamp(0, 66.88vw, 1227px); + width: clamp(0px, 66.88vw, 1227px); } .col-12 { - width: clamp(0, 73.33vw, 1344px); + width: clamp(0px, 73.33vw, 1344px); } .fcol-2 { diff --git a/public/tfWorker.js b/public/tfWorker.js index abceda39..66a09ab1 100644 --- a/public/tfWorker.js +++ b/public/tfWorker.js @@ -34,7 +34,7 @@ self.onmessage = (e) => { } const maxAttempts = 10 -const runSemanticSearch = ({userQuery, numResults}, attempt = 1) => { +const runSemanticSearch = ({userQuery, numResults, minSimilarity}, attempt = 1) => { if (!userQuery || attempt >= maxAttempts) { return } @@ -66,6 +66,7 @@ const runSemanticSearch = ({userQuery, numResults}, attempt = 1) => { const seen = new Set() const searchResults = questionsScored .filter(({pageid}) => !seen.has(pageid) && seen.add(pageid)) + .filter(({score}) => score >= (minSimilarity || 0)) .slice(0, numResults) self.postMessage({searchResults, userQuery}) From 0cc1782e51197249dd5ebc6f9145d15bbf6040e1 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Fri, 3 May 2024 13:16:42 +0200 Subject: [PATCH 033/132] search fixes --- app/components/SearchInput/Input.tsx | 2 +- app/components/search.tsx | 88 ++++++++++------------------ app/routes/chat.tsx | 19 ++---- 3 files changed, 38 insertions(+), 71 deletions(-) diff --git a/app/components/SearchInput/Input.tsx b/app/components/SearchInput/Input.tsx index 63f22ecd..6da9db8d 100644 --- a/app/components/SearchInput/Input.tsx +++ b/app/components/SearchInput/Input.tsx @@ -43,7 +43,7 @@ export const SearchInput = ({onChange, expandable, placeholderText}: SearchInput }} value={search} /> - {search !== '' && <XIcon className="x-icon" onClick={clear} />} + {search !== '' && <XIcon className="x-icon pointer" onClick={clear} />} </div> </div> ) diff --git a/app/components/search.tsx b/app/components/search.tsx index dcb42afe..c3e3268e 100644 --- a/app/components/search.tsx +++ b/app/components/search.tsx @@ -1,80 +1,54 @@ -import {useState, useEffect, useRef} from 'react' +import {useState} from 'react' import debounce from 'lodash/debounce' import {useSearch} from '~/hooks/useSearch' import {SearchInput} from './SearchInput/Input' import {SearchResults} from './SearchResults/Dropdown' import {questionUrl} from '~/routesMapper' +import useOutsideOnClick from '~/hooks/useOnOutsideClick' type Props = { - queryFromUrl?: string limitFromUrl?: number - removeQueryFromUrl?: () => void } -export default function Search({queryFromUrl, limitFromUrl, removeQueryFromUrl}: Props) { - const [showResults, setShowResults] = useState(!!queryFromUrl) - const searchInputRef = useRef('') +export default function Search({limitFromUrl}: Props) { + const [showResults, setShowResults] = useState(false) + const [searchPhrase, setSearchPhrase] = useState('') - const {search, isPendingSearch, results} = useSearch(limitFromUrl) + const {search, isPendingSearch, results, clear} = useSearch(limitFromUrl) + const clickDetectorRef = useOutsideOnClick(() => setShowResults(false)) const searchFn = (rawValue: string) => { const value = rawValue.trim() - if (value === searchInputRef.current) return + if (value === searchPhrase) return + setSearchPhrase(value) - searchInputRef.current = value - - search(value) - logSearch(value) - } - - // run search if queryFromUrl is provided initially or if it pops from browser history after it was removed, - // update url if searchInput changes, - // and use current version of functions without affecting deps - const searchInput = searchInputRef.current - const searchFnRef = useRef(searchFn) - searchFnRef.current = searchFn - const removeQueryFromUrlRef = useRef(removeQueryFromUrl) - removeQueryFromUrlRef.current = removeQueryFromUrl - const queryFromUrlWasRemoved = useRef(false) - useEffect(() => { - if (queryFromUrl) { - if (!searchInput || queryFromUrlWasRemoved.current) { - searchFnRef.current(queryFromUrl) - queryFromUrlWasRemoved.current = false - const inputEl = document.querySelector('input[name="searchbar"]') as HTMLInputElement - inputEl.value = queryFromUrl - } else if (queryFromUrl !== searchInput) { - removeQueryFromUrlRef.current?.() - queryFromUrlWasRemoved.current = true - } + if (value) { + search(value) + logSearch(value) + } else { + clear() } - }, [queryFromUrl, searchInput]) + } const handleChange = debounce(searchFn, 100) - const handleBlur = () => { - setTimeout(() => setShowResults(false), 500) - } - return ( - <> - <div onFocus={() => setShowResults(true)} onBlur={handleBlur}> - <SearchInput expandable onChange={handleChange} /> - <div className={`search-loader ${isPendingSearch ? 'loader' : ''}`}> </div> - {isPendingSearch && results.length == 0 && ( - <div className="result-item-box no-questions">Searching for questions...</div> - )} - {searchInput && showResults && ( - <SearchResults - results={results.map((r) => ({ - title: r.title, - url: questionUrl(r), - description: '', // TODO: fetch descriptions 🤔 - }))} - /> - )} - </div> - </> + <div onFocus={() => setShowResults(true)} ref={clickDetectorRef}> + <SearchInput expandable onChange={handleChange} /> + <div className={`search-loader ${isPendingSearch ? 'loader' : ''}`}> </div> + {isPendingSearch && results.length == 0 && ( + <div className="result-item-box no-questions">Searching for questions...</div> + )} + {searchPhrase && showResults && ( + <SearchResults + results={results.map((r) => ({ + title: r.title, + url: questionUrl(r), + description: '', // TODO: fetch descriptions 🤔 + }))} + /> + )} + </div> ) } /** diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 01cdbba0..c44adf83 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -5,12 +5,14 @@ import Page from '~/components/Page' import Chatbot from '~/components/Chatbot' import {ChatSettings, Mode} from '~/hooks/useChat' import Button from '~/components/Button' +import useOutsideOnClick from '~/hooks/useOnOutsideClick' export const shouldRevalidate: ShouldRevalidateFunction = () => false export default function App() { const [params] = useSearchParams() const [showSettings, setShowSettings] = useState(false) + const clickDetectorRef = useOutsideOnClick(() => setShowSettings(false)) const [chatSettings, setChatSettings] = useState({ mode: 'default', completions: 'gpt-3.5-turbo', @@ -26,15 +28,9 @@ export default function App() { </Button> ) - const stopBubbling = (e: any) => { - e.preventDefault() - e.stopPropagation() - e.nativeEvent.stopImmediatePropagation() - } - return ( <Page noFooter> - <div className="page-body full-height padding-top-32" onClick={() => setShowSettings(false)}> + <div className="page-body full-height padding-top-32"> <Chatbot question={question} questions={[ @@ -44,9 +40,9 @@ export default function App() { ]} settings={chatSettings} /> - <div className="settings-container"> + <div className="settings-container" ref={clickDetectorRef}> {showSettings && ( - <div className="settings bordered flex-container" onClick={stopBubbling}> + <div className="settings bordered flex-container"> <div>Answer detail</div> <ModeButton mode="default" name="Default" /> <ModeButton mode="rookie" name="Detailed" /> @@ -57,10 +53,7 @@ export default function App() { width="24" height="24" className="pointer" - onClick={(e) => { - stopBubbling(e) - setShowSettings((current) => !current) - }} + onClick={() => setShowSettings((current) => !current)} /> </div> </div> From cacd43a3995625e78a048c9aeeab77faf4eb172a Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Fri, 3 May 2024 14:26:25 +0200 Subject: [PATCH 034/132] proper link to chat --- app/components/Nav/index.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/components/Nav/index.tsx b/app/components/Nav/index.tsx index 2ce3efa5..bf957a01 100644 --- a/app/components/Nav/index.tsx +++ b/app/components/Nav/index.tsx @@ -29,12 +29,7 @@ export const Nav = ({toc, categories}: NavProps) => { id="showArticles" /> <ArticlesDropdown toc={toc} categories={categories || []} /> - <MenuItem - primary={true} - link="https://chat.aisafety.info" - icon={<BotIcon />} - text="Stampy chatbot" - /> + <MenuItem primary={true} link="/chat/" icon={<BotIcon />} text="Stampy chatbot" /> <li className="top-menu-item"> <div className="top-menu-divider"></div> </li> From f5d79eab7a8fdee79f9cb13ae40176ba21f6ac43 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Fri, 3 May 2024 21:03:47 +0200 Subject: [PATCH 035/132] set 20 default followups --- app/components/Chatbot/index.tsx | 61 ++++++++++------------- app/components/SearchResults/Dropdown.tsx | 2 +- app/components/search.tsx | 2 +- app/routes/_index.tsx | 2 +- 4 files changed, 28 insertions(+), 39 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 12900acc..210fdb70 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -13,46 +13,35 @@ import Input from '~/components/Input' // to be replaced with actual pool questions const poolQuestions = [ + {title: 'Do people seriously worry about existential risk from AI?', pageid: '6953'}, + {title: 'Is AI safety about systems becoming malevolent or conscious?', pageid: '6194'}, + {title: 'When do experts think human-level AI will be created?', pageid: '5633'}, + {title: 'Why is AI alignment a hard problem?', pageid: '8163'}, { - title: 'What is AI Safety? - from pool', - pageid: '8486', + title: 'Why can’t we just “put the AI in a box” so that it can’t influence the outside world?', + pageid: '6176', }, { - title: 'How would the AI even get out in the world? -- from pool', - pageid: '7638', + title: 'What are the differences between AGI, transformative AI, and superintelligence?', + pageid: '5864', }, + {title: 'What are large language models?', pageid: '5864'}, + {title: "Why can't we just turn the AI off if it starts to misbehave?", pageid: '3119'}, + {title: 'What is instrumental convergence?', pageid: '897I'}, + {title: "What is Goodhart's law?", pageid: '8185'}, + {title: 'What is the orthogonality thesis?', pageid: '6568'}, + {title: 'How powerful would a superintelligence become?', pageid: '7755'}, + {title: 'Will AI be able to think faster than humans?', pageid: '8E41'}, + {title: "Isn't the real concern misuse?", pageid: '9B85'}, + {title: 'Are AIs conscious?', pageid: '8V5J'}, { - title: 'What is the AI alignment problem? -- from pool', - pageid: '8EL9', - }, - { - title: 'What are existential risks (x-risks)? -- from pool', - pageid: '89LL', - }, - { - title: "Isn't the real concern misuse? -- from pool", - pageid: '9B85', - }, - { - title: "Aren't there easy solutions to AI alignment? -- from pool", - pageid: '6172', - }, - { - title: 'Will we ever build superintelligence? -- from pool', - pageid: '7565', - }, - { - title: 'Will the first AGI be an LLM? -- from pool', - pageid: '85E2', - }, - { - title: 'Why not just raise AI like kids? -- from pool', - pageid: '93R9', - }, - { - title: 'Why is AI alignment a hard problem? -- from pool', - pageid: '8163', + title: + 'What are the differences between a singularity, an intelligence explosion, and a hard takeoff?', + pageid: '8IHO', }, + {title: 'What is an intelligence explosion?', pageid: '6306'}, + {title: 'How might AGI kill people?', pageid: '5943'}, + {title: 'What is a "warning shot"?', pageid: '7748'}, ] const MIN_SIMILARITY = 0.85 @@ -105,7 +94,7 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { ) } -export const WidgetStampy = () => { +export const WidgetStampy = ({className}: {className?: string}) => { const [question, setQuestion] = useState('') const navigate = useNavigate() const questions = [ @@ -116,7 +105,7 @@ export const WidgetStampy = () => { const stampyUrl = (question: string) => `/chat/?question=${question.trim()}` return ( - <div className="centered fcol-9 padding-bottom-128"> + <div className={`centered fcol-9 padding-bottom-128 ${className || ''}`}> <div className="fcol-6 padding-bottom-56"> <h2 className="teal-500">Questions?</h2> <h2>Ask Stampy, our chatbot, any question about AI safety</h2> diff --git a/app/components/SearchResults/Dropdown.tsx b/app/components/SearchResults/Dropdown.tsx index 83430124..2caac3cf 100644 --- a/app/components/SearchResults/Dropdown.tsx +++ b/app/components/SearchResults/Dropdown.tsx @@ -27,7 +27,7 @@ export const SearchResults = ({results}: {results: SearchResultsProps[]}) => { const noResults = results.length === 0 if (noResults) { return ( - <div className="container-search-results bordered col-5 container-search-results-mobile"> + <div className="full-width container-search-results bordered fcol-5 container-search-results-mobile"> <div className="search-result">No results found</div> </div> ) diff --git a/app/components/search.tsx b/app/components/search.tsx index c3e3268e..ca776976 100644 --- a/app/components/search.tsx +++ b/app/components/search.tsx @@ -39,7 +39,7 @@ export default function Search({limitFromUrl}: Props) { {isPendingSearch && results.length == 0 && ( <div className="result-item-box no-questions">Searching for questions...</div> )} - {searchPhrase && showResults && ( + {!isPendingSearch && searchPhrase && showResults && ( <SearchResults results={results.map((r) => ({ title: r.title, diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx index f2fd6887..83492dd2 100644 --- a/app/routes/_index.tsx +++ b/app/routes/_index.tsx @@ -45,7 +45,7 @@ export default function App() { <ContentBoxThird /> <div className="desktop-only padding-bottom-56" /> - <WidgetStampy /> + <WidgetStampy className="desktop-only" /> <h3 className="grey large-bold padding-bottom-32">Advanced sections</h3> <Grid gridBoxes={advanced} /> From 235ff71f961566b9db67ae1f73c2982432aca034 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Fri, 3 May 2024 21:19:04 +0200 Subject: [PATCH 036/132] set model via url param --- app/routes/chat.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index c44adf83..3b07e93b 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -1,4 +1,4 @@ -import {useState} from 'react' +import {useEffect, useState} from 'react' import {ShouldRevalidateFunction, useSearchParams} from '@remix-run/react' import SettingsIcon from '~/components/icons-generated/Settings' import Page from '~/components/Page' @@ -13,12 +13,16 @@ export default function App() { const [params] = useSearchParams() const [showSettings, setShowSettings] = useState(false) const clickDetectorRef = useOutsideOnClick(() => setShowSettings(false)) - const [chatSettings, setChatSettings] = useState({ - mode: 'default', - completions: 'gpt-3.5-turbo', - } as ChatSettings) + const [chatSettings, setChatSettings] = useState({mode: 'default'} as ChatSettings) const question = params.get('question') || undefined + useEffect(() => { + setChatSettings( + (settings) => + ({...settings, completions: params.get('model') || settings.completions}) as ChatSettings + ) + }, [params]) + const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( <Button className={chatSettings.mode === mode ? 'secondary-selected' : ''} From b68589bfbca54a5be8a58ac5400a7a700b75dba0 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Fri, 3 May 2024 22:44:59 +0200 Subject: [PATCH 037/132] Connect chat feedback --- .github/workflows/deploy-dev.yml | 1 + .github/workflows/deploy.yml | 1 + app/components/Chatbot/ChatEntry.tsx | 10 ++++-- app/components/Chatbot/index.tsx | 11 +++--- app/components/Feedback/Form.tsx | 8 +++-- app/components/Feedback/index.tsx | 31 +++++++++++++++- app/hooks/useChat.ts | 14 +++++--- app/routes/chat.log.ts | 54 ++++++++++++++++++++++++++++ remix.env.d.ts | 1 + wrangler.toml.template | 3 +- 10 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 app/routes/chat.log.ts diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index 54943c2a..271ea4b8 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -25,6 +25,7 @@ jobs: | sed s/{CODA_INCOMING_TOKEN}/${{ secrets.CODA_INCOMING_TOKEN }}/ \ | sed s/{CODA_WRITES_TOKEN}/${{ secrets.CODA_WRITES_TOKEN }}/ \ | sed s/{GOOGLE_ANALYTICS_ID}/${{ secrets.GOOGLE_ANALYTICS_ID }}/ \ + | sed s/{DISCORD_LOGGING_URL}/${{ secrets.DISCORD_LOGGING_URL }}/ \ > wrangler.toml npm ci npm run deploy diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index dfd10a8b..108ff512 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,6 +24,7 @@ jobs: | sed s/{CODA_INCOMING_TOKEN}/${{ secrets.CODA_INCOMING_TOKEN }}/ \ | sed s/{CODA_WRITES_TOKEN}/${{ secrets.CODA_WRITES_TOKEN }}/ \ | sed s/{GOOGLE_ANALYTICS_ID}/${{ secrets.GOOGLE_ANALYTICS_ID }}/ \ + | sed s/{DISCORD_LOGGING_URL}/${{ secrets.DISCORD_LOGGING_URL }}/ \ > wrangler.toml npm ci npm run deploy diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 1df99738..e284dcea 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -3,7 +3,7 @@ import {Link} from '@remix-run/react' import MarkdownIt from 'markdown-it' import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' import Contents from '~/components/Article/Contents' -import Feedback from '~/components/Feedback' +import Feedback, {logFeedback} from '~/components/Feedback' import useGlossary from '~/hooks/useGlossary' import './chat_entry.css' import type {Entry, AssistantEntry, StampyEntry, Citation, ErrorMessage} from '~/hooks/useChat' @@ -136,7 +136,7 @@ const Reference = (citation: Citation) => { ) } -const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { +const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) => { const citations = [] as Citation[] citationsMap?.forEach((v) => { citations.push(v) @@ -193,6 +193,9 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { pageid="chatbot" upHint="This response was helpful" downHint="This response was unhelpful" + onSubmit={async (message: string, option?: string) => + logFeedback({message, option, type: 'bot', question, answer: content, citations}) + } options={[ 'Making things up', 'Wrong subject', @@ -227,6 +230,9 @@ const StampyArticle = ({pageid, content, title}: StampyEntry) => { pageid={pageid} upHint="This response was helpful" downHint="This response was unhelpful" + onSubmit={async (message: string, option?: string) => + logFeedback({message, option, type: 'human', question: title, answer: content, pageid}) + } options={[ 'Making things up', 'Wrong subject', diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 210fdb70..2e0f7118 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -246,6 +246,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { // Add a new history entry, replacing the previous one if it was canceled const message = {content: question, role: 'user'} as Entry + const answer = {role: 'assistant', question} as AssistantEntry setHistory((current) => { const last = current[current.length - 1] if ( @@ -254,15 +255,11 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { (last?.role === 'stampy' && last?.content) || ['error'].includes(last?.role) ) { - return [...current, message, {role: 'assistant'} as AssistantEntry] + return [...current, message, answer] } else if (last?.role === 'user' && last?.content === question) { - return [...current.slice(0, current.length - 1), {role: 'assistant'} as AssistantEntry] + return [...current.slice(0, current.length - 1), answer] } - return [ - ...current.slice(0, current.length - 2), - message, - {role: 'assistant'} as AssistantEntry, - ] + return [...current.slice(0, current.length - 2), message, answer] }) setFollowups(undefined) diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index c2054599..c3febdcb 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -4,11 +4,13 @@ import useOutsideOnClick from '~/hooks/useOnOutsideClick' import './feedback.css' export type FeedbackFormProps = { + onSubmit?: (msg: string, option?: string) => Promise<any> onClose?: () => void options?: string[] } -const FeedbackForm = ({onClose, options}: FeedbackFormProps) => { +const FeedbackForm = ({onSubmit, onClose, options}: FeedbackFormProps) => { const [selected, setSelected] = useState<string>() + const [message, setMessage] = useState('') const [enabledSubmit, setEnabledSubmit] = useState(!options) const [numClicks, setNumClicks] = useState(0) const clickCheckerRef = useOutsideOnClick(onClose) @@ -28,7 +30,8 @@ const FeedbackForm = ({onClose, options}: FeedbackFormProps) => { setEnabledSubmit(true) } - const handleSubmit = () => { + const handleSubmit = async () => { + onSubmit && (await onSubmit(message, selected)) onClose && onClose() } @@ -56,6 +59,7 @@ const FeedbackForm = ({onClose, options}: FeedbackFormProps) => { name="feedback-text" className={['feedback-text bordered', !options ? 'no-options' : ''].join(' ')} placeholder="Leave a comment (optional)" + onChange={(e) => setMessage(e.target.value)} /> <Button className="primary full-width" action={handleSubmit} disabled={!enabledSubmit}> <p>Submit feedback</p> diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 885f3974..047384cb 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -3,6 +3,25 @@ import {CompositeButton} from '~/components/Button' import {Action, ActionType} from '~/routes/questions.actions' import './feedback.css' import FeedbackForm from './Form' +import type {Citation} from '~/hooks/useChat' + +type FeedbackType = { + option?: string + message?: string + question?: string + answer: string + pageid?: string + citations?: Citation[] + type: 'human' | 'bot' | 'error' +} +export const logFeedback = async (feedback: FeedbackType) => + fetch(`/chat/log`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(feedback), + }) type FeedbackProps = { pageid: string @@ -11,8 +30,17 @@ type FeedbackProps = { upHint?: string downHint?: string options?: string[] + onSubmit?: (message: string, option?: string) => Promise<any> } -const Feedback = ({pageid, showForm, labels, upHint, downHint, options}: FeedbackProps) => { +const Feedback = ({ + pageid, + showForm, + labels, + upHint, + downHint, + options, + onSubmit, +}: FeedbackProps) => { const [showFeedback, setShowFeedback] = useState(false) const [showFeedbackForm, setShowFeedbackForm] = useState(false) @@ -47,6 +75,7 @@ const Feedback = ({pageid, showForm, labels, upHint, downHint, options}: Feedbac {showFeedbackForm && ( <FeedbackForm + onSubmit={onSubmit} onClose={() => { setShowFeedback(true) setShowFeedbackForm(false) diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index 009bd398..69747950 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -32,6 +32,7 @@ export type UserEntry = { export type AssistantEntry = { role: 'assistant' + question?: string content: string citations?: Citation[] citationsMap?: Map<string, Citation> @@ -82,6 +83,7 @@ export type EntryRole = 'error' | 'stampy' | 'assistant' | 'user' | 'deleted' export type HistoryEntry = { role: EntryRole content: string + question?: string } export const formatCitations: (text: string) => string = (text) => { @@ -181,15 +183,17 @@ export async function* iterateData(res: Response) { } } -const makeEntry = () => +const makeEntry = (question?: string) => ({ role: 'assistant', + question, content: '', citations: [], citationsMap: new Map(), }) as AssistantEntry export const extractAnswer = async ( + question: string | undefined, res: Response, setCurrent: (e: AssistantEntry) => void ): Promise<SearchResult> => { @@ -197,13 +201,14 @@ export const extractAnswer = async ( const content = formatCitations((result?.content || '') + data.content) return { content, + question, role: 'assistant', citations: result?.citations || [], citationsMap: findCitations(content, result?.citations || []), } as AssistantEntry } - let result: AssistantEntry = makeEntry() + let result: AssistantEntry = makeEntry(question) let followups: Followup[] = [] for await (const data of iterateData(res)) { switch (data.state) { @@ -264,7 +269,8 @@ export const queryLLM = async ( controller: AbortController, settings?: ChatSettings ): Promise<SearchResult> => { - setCurrent({...makeEntry(), phase: 'started'}) + const question = history[history.length - 1]?.content + setCurrent({...makeEntry(question), phase: 'started'}) // do SSE on a POST request. const res = await fetchLLM(sessionId, history, controller, settings) @@ -275,7 +281,7 @@ export const queryLLM = async ( } try { - return await extractAnswer(res, setCurrent) + return await extractAnswer(question, res, setCurrent) } catch (e) { if ((e as Error)?.name === 'AbortError') { return {result: {role: 'error', content: 'aborted'}} diff --git a/app/routes/chat.log.ts b/app/routes/chat.log.ts new file mode 100644 index 00000000..d98dd439 --- /dev/null +++ b/app/routes/chat.log.ts @@ -0,0 +1,54 @@ +import type {ActionFunctionArgs} from '@remix-run/cloudflare' +import type {Citation} from '~/hooks/useChat' + +const formatCitation = (citation: Citation) => { + const items = (['title', 'date', 'url', 'source', 'text'] as (keyof Citation)[]) + .map( + (key) => + `\t\t<div>\n\t\t\t<span>${key}</span>\n\t\t\t<span>${citation[key]}</span>\n\t\t</div>` + ) + .join('\n') + return `\t<div>\n${items}\n\t</div>` +} +const formatAnswer = (question?: string, answer?: string, citations?: Citation[]) => { + const formattedCitations = citations?.map(formatCitation).join('\n') + return `<html> + <h1 class="question">${question || '<no question>'}</h1> + <article> + <div class="answer">${answer}</div> + <div class="citations">${formattedCitations}</div> + </article> + </html>` +} + +export const action = async ({request}: ActionFunctionArgs) => { + const {question, answer, citations, type, message, option, pageid} = (await request.json()) as any + + try { + // Convert the large string content to a Blob + const fileBlob = new Blob([formatAnswer(question, answer, citations)], {type: 'text/plain'}) + + // Prepare the form data + const formData = new FormData() + formData.append('file', fileBlob, 'question_and_response.html') + + const info = [ + ['Type', type], + ['Pageid', pageid && `[${pageid}](https://aisafety.info/questions/${pageid}/${question})`], + ['Selected option', option], + ['Feedback', message], + ] + .filter(([_, val]) => val && val.trim()) + .map(([item, val]) => `* ${item} - ${val}`) + .join('\n') + formData.append('payload_json', JSON.stringify({content: `Chat feedback:\n${info}`})) + + const response = await fetch(`${DISCORD_LOGGING_URL}`, {method: 'POST', body: formData}) + if (!response.ok) { + throw new Error(`Failed to post message: ${response.status} ${response.statusText}`) + } + } catch (error) { + console.error('Failed to post message:', error) + } + return null +} diff --git a/remix.env.d.ts b/remix.env.d.ts index 00459893..310f8f42 100644 --- a/remix.env.d.ts +++ b/remix.env.d.ts @@ -10,3 +10,4 @@ declare const CODA_WRITES_TOKEN: string declare const NLP_SEARCH_ENDPOINT: string declare const ALLOW_ORIGINS: string declare const GOOGLE_ANALYTICS_ID: string +declare const DISCORD_LOGGING_URL: string diff --git a/wrangler.toml.template b/wrangler.toml.template index 8bf8fab9..30df39c4 100644 --- a/wrangler.toml.template +++ b/wrangler.toml.template @@ -21,4 +21,5 @@ CODA_INCOMING_TOKEN = "{CODA_INCOMING_TOKEN}" CODA_WRITES_TOKEN = "{CODA_WRITES_TOKEN}" NLP_SEARCH_ENDPOINT = "https://stampy-nlp-t6p37v2uia-uw.a.run.app/" ALLOW_ORIGINS = "https://chat.aisafety.info" -GOOGLE_ANALYTICS_ID = "{GOOGLE_ANALYTICS_ID}" \ No newline at end of file +GOOGLE_ANALYTICS_ID = "{GOOGLE_ANALYTICS_ID}" +DISCORD_LOGGING_URL = "{DISCORD_LOGGING_URL}" \ No newline at end of file From f7889bad7b8303bf09dda4d9eb7fd99fc44af38c Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Sat, 4 May 2024 13:36:14 +0200 Subject: [PATCH 038/132] fix discord logging env vars --- .github/workflows/deploy-dev.yml | 3 ++- .github/workflows/deploy.yml | 3 ++- app/hooks/useChat.ts | 4 +--- app/routes/chat.log.ts | 1 + remix.env.d.ts | 4 +++- wrangler.toml.template | 3 ++- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index 271ea4b8..8d51c6c1 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -25,7 +25,8 @@ jobs: | sed s/{CODA_INCOMING_TOKEN}/${{ secrets.CODA_INCOMING_TOKEN }}/ \ | sed s/{CODA_WRITES_TOKEN}/${{ secrets.CODA_WRITES_TOKEN }}/ \ | sed s/{GOOGLE_ANALYTICS_ID}/${{ secrets.GOOGLE_ANALYTICS_ID }}/ \ - | sed s/{DISCORD_LOGGING_URL}/${{ secrets.DISCORD_LOGGING_URL }}/ \ + | sed s/{DISCORD_LOGGING_CHANNEL_ID}/${{ secrets.DISCORD_LOGGING_CHANNEL_ID }}/ \ + | sed s/{DISCORD_LOGGING_TOKEN}/${{ secrets.DISCORD_LOGGING_TOKEN }}/ \ > wrangler.toml npm ci npm run deploy diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 108ff512..a9031a90 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,7 +24,8 @@ jobs: | sed s/{CODA_INCOMING_TOKEN}/${{ secrets.CODA_INCOMING_TOKEN }}/ \ | sed s/{CODA_WRITES_TOKEN}/${{ secrets.CODA_WRITES_TOKEN }}/ \ | sed s/{GOOGLE_ANALYTICS_ID}/${{ secrets.GOOGLE_ANALYTICS_ID }}/ \ - | sed s/{DISCORD_LOGGING_URL}/${{ secrets.DISCORD_LOGGING_URL }}/ \ + | sed s/{DISCORD_LOGGING_CHANNEL_ID}/${{ secrets.DISCORD_LOGGING_CHANNEL_ID }}/ \ + | sed s/{DISCORD_LOGGING_TOKEN}/${{ secrets.DISCORD_LOGGING_TOKEN }}/ \ > wrangler.toml npm ci npm run deploy diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index 69747950..d66216a3 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -1,5 +1,3 @@ -export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' - export type Citation = { title: string authors: string[] @@ -250,7 +248,7 @@ const fetchLLM = async ( controller: AbortController, settings?: ChatSettings ): Promise<Response | void> => - fetch(CHATBOT_URL, { + fetch(`${CHATBOT_URL}`, { signal: controller.signal, method: 'POST', cache: 'no-cache', diff --git a/app/routes/chat.log.ts b/app/routes/chat.log.ts index d98dd439..55e6c4fe 100644 --- a/app/routes/chat.log.ts +++ b/app/routes/chat.log.ts @@ -43,6 +43,7 @@ export const action = async ({request}: ActionFunctionArgs) => { .join('\n') formData.append('payload_json', JSON.stringify({content: `Chat feedback:\n${info}`})) + const DISCORD_LOGGING_URL = `https://discord.com/api/webhooks/${DISCORD_LOGGING_CHANNEL_ID}/${DISCORD_LOGGING_TOKEN}` const response = await fetch(`${DISCORD_LOGGING_URL}`, {method: 'POST', body: formData}) if (!response.ok) { throw new Error(`Failed to post message: ${response.status} ${response.statusText}`) diff --git a/remix.env.d.ts b/remix.env.d.ts index 310f8f42..d6850c57 100644 --- a/remix.env.d.ts +++ b/remix.env.d.ts @@ -9,5 +9,7 @@ declare const CODA_INCOMING_TOKEN: string declare const CODA_WRITES_TOKEN: string declare const NLP_SEARCH_ENDPOINT: string declare const ALLOW_ORIGINS: string +declare const CHATBOT_URL: string declare const GOOGLE_ANALYTICS_ID: string -declare const DISCORD_LOGGING_URL: string +declare const DISCORD_LOGGING_CHANNEL_ID: string +declare const DISCORD_LOGGING_TOKEN: string diff --git a/wrangler.toml.template b/wrangler.toml.template index 30df39c4..1ff813c1 100644 --- a/wrangler.toml.template +++ b/wrangler.toml.template @@ -22,4 +22,5 @@ CODA_WRITES_TOKEN = "{CODA_WRITES_TOKEN}" NLP_SEARCH_ENDPOINT = "https://stampy-nlp-t6p37v2uia-uw.a.run.app/" ALLOW_ORIGINS = "https://chat.aisafety.info" GOOGLE_ANALYTICS_ID = "{GOOGLE_ANALYTICS_ID}" -DISCORD_LOGGING_URL = "{DISCORD_LOGGING_URL}" \ No newline at end of file +DISCORD_LOGGING_CHANNEL_ID = "{DISCORD_LOGGING_CHANNEL_ID}" +DISCORD_LOGGING_TOKEN = "{DISCORD_LOGGING_TOKEN}" \ No newline at end of file From 6c6dccb5538f18451df9f22516f0d3208aed64c3 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Sat, 4 May 2024 13:48:42 +0200 Subject: [PATCH 039/132] correct chat url --- app/hooks/useChat.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index d66216a3..69747950 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -1,3 +1,5 @@ +export const CHATBOT_URL = 'https://chat.stampy.ai:8443/chat' + export type Citation = { title: string authors: string[] @@ -248,7 +250,7 @@ const fetchLLM = async ( controller: AbortController, settings?: ChatSettings ): Promise<Response | void> => - fetch(`${CHATBOT_URL}`, { + fetch(CHATBOT_URL, { signal: controller.signal, method: 'POST', cache: 'no-cache', From 9a25fb8a1bc8c44b740fd2713120cab0aeabd27e Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Tue, 7 May 2024 14:39:07 -0400 Subject: [PATCH 040/132] CSS --- app/assets/icons/StampyLarge.svg | 21 ++++++ app/assets/icons/StampySmall.svg | 21 ++++++ .../Article/FeedbackForm/feedbackForm.css | 7 +- app/components/Button/button.css | 9 +-- app/components/Chatbot/ChatEntry.tsx | 41 ++++++------ app/components/Chatbot/index.tsx | 16 ++--- app/components/Feedback/Form.tsx | 67 +++++++++++++++++++ app/components/Nav/index.tsx | 7 +- .../icons-generated/StampyLarge.tsx | 48 +++++++++++++ .../icons-generated/StampySmall.tsx | 48 +++++++++++++ app/components/icons-generated/index.ts | 3 + app/root.css | 9 ++- app/routes/chat.tsx | 2 +- 13 files changed, 258 insertions(+), 41 deletions(-) create mode 100644 app/assets/icons/StampyLarge.svg create mode 100644 app/assets/icons/StampySmall.svg create mode 100644 app/components/Feedback/Form.tsx create mode 100644 app/components/icons-generated/StampyLarge.tsx create mode 100644 app/components/icons-generated/StampySmall.tsx diff --git a/app/assets/icons/StampyLarge.svg b/app/assets/icons/StampyLarge.svg new file mode 100644 index 00000000..191f58f9 --- /dev/null +++ b/app/assets/icons/StampyLarge.svg @@ -0,0 +1,21 @@ +<svg width="80" height="69" viewBox="0 0 80 69" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_1479_3671)"> +<path opacity="0.5" d="M77.2483 62.1C75.2003 62.1 73.5363 60.4388 73.5363 58.3944C73.5363 56.35 75.2003 54.6889 77.2483 54.6889C77.3763 54.6889 77.5043 54.6889 77.6963 54.6889V50.1527C77.5683 50.1527 77.4403 50.1527 77.2483 50.1527C75.2003 50.1527 73.5363 48.4916 73.5363 46.4472C73.5363 44.4027 75.2003 42.7416 77.2483 42.7416C77.3763 42.7416 77.5043 42.7416 77.6963 42.7416V38.2055C77.5683 38.2055 77.4403 38.2055 77.2483 38.2055C75.2003 38.2055 73.5363 36.5444 73.5363 34.5C73.5363 32.4555 75.2003 30.7944 77.2483 30.7944C77.3763 30.7944 77.5043 30.7944 77.6963 30.7944V26.2583C76.4803 26.3861 75.2643 25.9388 74.4323 24.9805C73.0883 23.3833 73.2803 21.0833 74.8803 19.7416C75.7123 19.0389 76.7363 18.7833 77.6963 18.9111V14.375C77.5683 14.375 77.4403 14.375 77.2483 14.375C75.2003 14.375 73.5363 12.7139 73.5363 10.6694C73.5363 8.62496 75.2003 6.96385 77.2483 6.96385C77.3763 6.96385 77.5043 6.96385 77.6963 6.96385V1.40552H73.2803C73.2803 3.44996 71.6163 5.11107 69.5683 5.11107C67.5203 5.11107 65.8563 3.44996 65.8563 1.40552H61.0563C61.0563 3.44996 59.3923 5.11107 57.3443 5.11107C55.2963 5.11107 53.6323 3.44996 53.6323 1.40552H48.8323C48.8323 3.44996 47.1683 5.11107 45.1203 5.11107C43.0723 5.11107 41.4083 3.44996 41.4083 1.40552H36.6083C36.6083 3.44996 34.9443 5.11107 32.8963 5.11107C30.8483 5.11107 29.1843 3.44996 29.1843 1.40552H24.3843C24.3843 3.44996 22.7203 5.11107 20.6723 5.11107C18.6243 5.11107 16.9603 3.44996 16.9603 1.40552H12.1603C12.1603 3.44996 10.4963 5.11107 8.44831 5.11107C6.40031 5.11107 4.73631 3.44996 4.73631 1.40552H0.320312V6.96385C2.36831 6.96385 4.03231 8.62496 4.03231 10.6694C4.03231 12.7139 2.36831 14.375 0.320312 14.375V18.8472C1.40831 18.8472 2.43231 19.2944 3.20031 20.1888C4.54431 21.7861 4.35231 24.0861 2.75231 25.4277C2.04831 26.0027 1.21631 26.3222 0.320312 26.3222V30.7944C2.36831 30.7944 4.03231 32.4555 4.03231 34.5C4.03231 36.5444 2.36831 38.2055 0.320312 38.2055V42.6777C2.36831 42.6777 4.03231 44.3388 4.03231 46.3833C4.03231 48.4277 2.36831 50.0888 0.320312 50.0888V54.5611C2.36831 54.5611 4.03231 56.2222 4.03231 58.2666C4.03231 60.3111 2.36831 61.9722 0.320312 61.9722V67.5305H4.73631C4.73631 65.4861 6.40031 63.825 8.44831 63.825C10.4963 63.825 12.1603 65.4861 12.1603 67.5305H16.9603C16.9603 65.4861 18.6243 63.825 20.6723 63.825C22.7203 63.825 24.3843 65.4861 24.3843 67.5305H29.1843C29.1843 65.4861 30.8483 63.825 32.8963 63.825C34.9443 63.825 36.6083 65.4861 36.6083 67.5305H41.4083C41.4083 65.4861 43.0723 63.825 45.1203 63.825C47.1683 63.825 48.8323 65.4861 48.8323 67.5305H53.6323C53.6323 65.4861 55.2963 63.825 57.3443 63.825C59.3923 63.825 61.0563 65.4861 61.0563 67.5305H65.8563C65.8563 65.4861 67.5203 63.825 69.5683 63.825C71.6163 63.825 73.2803 65.4861 73.2803 67.5305H77.6963V61.9722C77.5043 62.1 77.3763 62.1 77.2483 62.1Z" fill="#ECA680"/> +<path d="M79.8079 68.6806H73.2799V67.5945C73.2799 66.1251 72.0639 64.9112 70.5919 64.9112C69.1199 64.9112 67.9039 66.1251 67.9039 67.5945V68.6806H60.9919V67.5945C60.9919 66.1251 59.7759 64.9112 58.3039 64.9112C56.8319 64.9112 55.6159 66.1251 55.6159 67.5945V68.6806H48.7039V67.5945C48.7039 66.1251 47.4879 64.9112 46.0159 64.9112C44.5439 64.9112 43.3279 66.1251 43.3279 67.5945V68.6806H36.5439V67.5945C36.5439 66.1251 35.3279 64.9112 33.8559 64.9112C32.3839 64.9112 31.1679 66.1251 31.1679 67.5945V68.6806H24.2559V67.5945C24.2559 66.1251 23.0399 64.9112 21.5679 64.9112C20.0959 64.9112 18.8799 66.1251 18.8799 67.5945V68.6806H12.0319V67.5945C12.0319 66.1251 10.8159 64.9112 9.34393 64.9112C7.87193 64.9112 6.65593 66.1251 6.65593 67.5945V68.6806H0.12793V61.014H1.21593C2.68793 61.014 3.90393 59.8001 3.90393 58.3306C3.90393 56.8612 2.68793 55.6473 1.21593 55.6473H0.12793V49.0667H1.21593C2.68793 49.0667 3.90393 47.8528 3.90393 46.3834C3.90393 44.914 2.68793 43.7001 1.21593 43.7001H0.12793V37.1195H1.21593C2.68793 37.1195 3.90393 35.9056 3.90393 34.4362C3.90393 32.9667 2.68793 31.7528 1.21593 31.7528H0.12793V25.2362H1.21593C1.85593 25.2362 2.43193 25.0445 2.94393 24.5973C3.51993 24.1501 3.83993 23.5112 3.90393 22.8084C3.96793 22.1056 3.77593 21.4028 3.26393 20.8917C2.75193 20.3167 1.98393 19.9334 1.21593 19.9334H0.12793V13.289H1.21593C2.68793 13.289 3.90393 12.0751 3.90393 10.6056C3.90393 9.13617 2.68793 7.92228 1.21593 7.92228H0.12793V0.255615H6.65593V1.34172C6.65593 2.81117 7.87193 4.02506 9.34393 4.02506C10.8159 4.02506 12.0319 2.81117 12.0319 1.34172V0.255615H18.9439V1.34172C18.9439 2.81117 20.1599 4.02506 21.6319 4.02506C23.1039 4.02506 24.3199 2.81117 24.3199 1.34172V0.255615H31.2319V1.34172C31.2319 2.81117 32.4479 4.02506 33.9199 4.02506C35.3919 4.02506 36.6079 2.81117 36.6079 1.34172V0.255615H43.5199V1.34172C43.5199 2.81117 44.7359 4.02506 46.2079 4.02506C47.6799 4.02506 48.8959 2.81117 48.8959 1.34172V0.255615H55.6799V1.34172C55.6799 2.81117 56.8959 4.02506 58.3679 4.02506C59.8399 4.02506 61.0559 2.81117 61.0559 1.34172V0.255615H67.9679V1.34172C67.9679 2.81117 69.1839 4.02506 70.6559 4.02506C72.1279 4.02506 73.3439 2.81117 73.3439 1.34172V0.255615H79.8719V8.11395L78.6559 7.98617C78.5279 7.98617 78.4639 7.98617 78.3359 7.98617C76.8639 7.98617 75.6479 9.20006 75.6479 10.6695C75.6479 12.1389 76.8639 13.3528 78.3359 13.3528C78.3999 13.3528 78.5279 13.3528 78.6559 13.3528L79.8719 13.2251V20.1251L78.6559 19.9973C77.8879 19.9334 77.1839 20.1251 76.6079 20.5723C76.0319 21.0195 75.7119 21.6584 75.6479 22.3612C75.5839 23.0639 75.7759 23.7667 76.2879 24.2778C76.8639 24.9806 77.7599 25.3001 78.6559 25.2362L79.8719 25.1084V32.0084L78.6559 31.8806C78.5279 31.8806 78.4639 31.8806 78.3359 31.8806C76.8639 31.8806 75.6479 33.0945 75.6479 34.564C75.6479 36.0334 76.8639 37.2473 78.3359 37.2473C78.3999 37.2473 78.5279 37.2473 78.6559 37.2473L79.8719 37.1195V44.0195L78.6559 43.8917C78.5279 43.8917 78.4639 43.8917 78.3359 43.8917C76.8639 43.8917 75.6479 45.1056 75.6479 46.5751C75.6479 48.0445 76.8639 49.2584 78.3359 49.2584C78.3999 49.2584 78.5279 49.2584 78.6559 49.2584L79.8719 49.1306V56.0306L78.6559 55.9028C78.5279 55.9028 78.4639 55.9028 78.3359 55.9028C76.8639 55.9028 75.6479 57.1167 75.6479 58.5862C75.6479 60.0556 76.8639 61.2695 78.3359 61.2695C78.3999 61.2695 78.5279 61.2695 78.6559 61.2695L79.8719 61.1417V68.6806H79.8079ZM75.2639 66.5723H77.6319V63.1223C75.2639 62.8028 73.4719 60.8223 73.4719 58.3945C73.4719 55.9667 75.2639 53.9223 77.6319 53.6667V51.239C75.2639 50.9195 73.4719 48.939 73.4719 46.5112C73.4719 44.0834 75.2639 42.039 77.6319 41.7834V39.3556C75.2639 39.0362 73.4719 37.0556 73.4719 34.6278C73.4719 32.2001 75.2639 30.1556 77.6319 29.9001V27.4723C76.4799 27.3445 75.3919 26.7056 74.6239 25.8112C73.7919 24.8528 73.4079 23.5751 73.5359 22.2973C73.6639 21.0195 74.2399 19.8695 75.1999 19.039C75.9039 18.464 76.7359 18.0806 77.6319 17.9528V15.5251C75.2639 15.2056 73.4719 13.2251 73.4719 10.7973C73.4719 8.3695 75.2639 6.32506 77.6319 6.0695V2.6195H75.2639C74.7519 4.72784 72.8319 6.32506 70.5919 6.32506C68.2879 6.32506 66.3679 4.72784 65.9199 2.6195H63.0399C62.5279 4.72784 60.6079 6.32506 58.3679 6.32506C56.0639 6.32506 54.1439 4.72784 53.6959 2.6195H50.8159C50.3039 4.72784 48.3839 6.32506 46.1439 6.32506C43.8399 6.32506 41.9199 4.72784 41.4719 2.6195H38.5919C38.0799 4.72784 36.1599 6.32506 33.9199 6.32506C31.6159 6.32506 29.6959 4.72784 29.2479 2.6195H26.3679C25.8559 4.72784 23.9359 6.32506 21.6959 6.32506C19.3919 6.32506 17.4719 4.72784 17.0239 2.6195H14.1439C13.6319 4.72784 11.7119 6.32506 9.47193 6.32506C7.16793 6.32506 5.24793 4.72784 4.79993 2.6195H2.43193V6.13339C4.54393 6.6445 6.14393 8.56117 6.14393 10.7973C6.14393 13.0973 4.54393 15.0139 2.43193 15.4612V18.0167C3.45593 18.2723 4.35193 18.7834 5.05593 19.6139C5.88793 20.5723 6.27193 21.8501 6.14393 23.1278C6.01593 24.4056 5.43993 25.5556 4.47993 26.3862C3.90393 26.8973 3.19993 27.2167 2.43193 27.4084V29.964C4.54393 30.4751 6.14393 32.3917 6.14393 34.6278C6.14393 36.8639 4.54393 38.8445 2.43193 39.2917V41.8473C4.54393 42.3584 6.14393 44.2751 6.14393 46.5112C6.14393 48.7473 4.54393 50.7278 2.43193 51.1751V53.7306C4.54393 54.2417 6.14393 56.1584 6.14393 58.3945C6.14393 60.6306 4.54393 62.6112 2.43193 63.0584V66.5723H4.79993C5.31193 64.464 7.23193 62.8667 9.47193 62.8667C11.7759 62.8667 13.6959 64.464 14.1439 66.5723H17.0239C17.5359 64.464 19.4559 62.8667 21.6959 62.8667C23.9999 62.8667 25.9199 64.464 26.3679 66.5723H29.2479C29.7599 64.464 31.6799 62.8667 33.9199 62.8667C36.2239 62.8667 38.1439 64.464 38.5919 66.5723H41.4719C41.9839 64.464 43.9039 62.8667 46.1439 62.8667C48.4479 62.8667 50.3679 64.464 50.8159 66.5723H53.6959C54.2079 64.464 56.1279 62.8667 58.3679 62.8667C60.6719 62.8667 62.5919 64.464 63.0399 66.5723H65.9199C66.4319 64.464 68.3519 62.8667 70.5919 62.8667C72.8959 62.8028 74.8159 64.4001 75.2639 66.5723Z" fill="#ECA680"/> +<path d="M68.928 11.0527H10.624V58.7138H68.928V11.0527Z" fill="#B70808"/> +<path d="M14.7837 18.2083C14.7197 18.911 14.7197 19.6138 14.7197 20.3805C14.7197 37.2471 25.9837 50.9194 39.8717 50.9194C53.7597 50.9194 65.0237 37.2471 65.0237 20.3805C65.0237 19.6777 65.0237 18.9749 64.9597 18.2721H14.7837V18.2083Z" fill="#D7DBE9"/> +<path d="M42.048 34.4361L39.168 25.6194L32.832 34.9472L42.048 34.4361Z" fill="#5F6EA9"/> +<path d="M39.4241 53.0277C37.3761 53.0277 35.4561 52.7083 33.6641 52.0055C32.5761 51.5583 32.0641 50.3444 32.4481 49.2583C32.8961 48.1722 34.1121 47.661 35.2001 48.0444C38.5921 49.386 43.3921 48.811 47.4881 46.5749C51.0721 44.5944 53.4401 41.6555 54.0161 38.5249C54.0801 38.2055 54.1441 37.886 54.1441 37.5027C54.2721 36.3527 55.3601 35.5222 56.5121 35.6499C57.6641 35.7777 58.4961 36.8638 58.3681 38.0138C58.3041 38.461 58.2401 38.8444 58.1761 39.2277C57.4081 43.636 54.2081 47.661 49.5361 50.2805C46.3361 52.1333 42.7521 53.0277 39.4241 53.0277Z" fill="#1B2B3E"/> +<path d="M62.7203 28.9416C68.2343 28.9416 72.7043 24.4794 72.7043 18.975C72.7043 13.4705 68.2343 9.0083 62.7203 9.0083C57.2063 9.0083 52.7363 13.4705 52.7363 18.975C52.7363 24.4794 57.2063 28.9416 62.7203 28.9416Z" fill="white"/> +<path d="M61.4399 26.8972C65.3634 26.8972 68.5439 23.7222 68.5439 19.8055C68.5439 15.8889 65.3634 12.7139 61.4399 12.7139C57.5165 12.7139 54.3359 15.8889 54.3359 19.8055C54.3359 23.7222 57.5165 26.8972 61.4399 26.8972Z" fill="#1B2B3E"/> +<path d="M16.7682 28.8139C22.2822 28.8139 26.7522 24.3517 26.7522 18.8473C26.7522 13.3428 22.2822 8.88062 16.7682 8.88062C11.2542 8.88062 6.78418 13.3428 6.78418 18.8473C6.78418 24.3517 11.2542 28.8139 16.7682 28.8139Z" fill="white"/> +<path d="M18.2397 25.7473C22.1632 25.7473 25.3437 22.5723 25.3437 18.6556C25.3437 14.739 22.1632 11.564 18.2397 11.564C14.3163 11.564 11.1357 14.739 11.1357 18.6556C11.1357 22.5723 14.3163 25.7473 18.2397 25.7473Z" fill="#1B2B3E"/> +<path d="M72.3204 10.0945C71.7444 10.0945 71.1684 9.83892 70.7844 9.45559C68.9284 7.53892 67.2644 6.64448 60.8004 5.43059C59.6484 5.23892 58.8804 4.08892 59.0724 2.93892C59.2644 1.78892 60.4164 1.02226 61.5684 1.21392C68.5444 2.55559 71.1684 3.70559 73.8564 6.5167C74.6884 7.34726 74.6244 8.75281 73.7924 9.51948C73.3444 9.90281 72.8324 10.0945 72.3204 10.0945Z" fill="#1B2B3E"/> +<path d="M12.6077 7.7944C11.7117 7.7944 10.8157 7.2194 10.5597 6.26107C10.2397 5.11107 10.8797 3.96107 12.0317 3.57774C18.8157 1.59718 21.6957 1.40552 25.4077 2.68329C26.4957 3.06663 27.1357 4.28051 26.6877 5.43051C26.3037 6.51663 25.0877 7.15551 23.9357 6.70829C21.4397 5.81385 19.5197 5.81385 13.2477 7.66663C13.0557 7.73051 12.7997 7.7944 12.6077 7.7944Z" fill="#1B2B3E"/> +</g> +<defs> +<clipPath id="clip0_1479_3671"> +<rect width="80" height="69" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/app/assets/icons/StampySmall.svg b/app/assets/icons/StampySmall.svg new file mode 100644 index 00000000..6d2c7bf2 --- /dev/null +++ b/app/assets/icons/StampySmall.svg @@ -0,0 +1,21 @@ +<svg width="40" height="35" viewBox="0 0 40 35" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_1479_3697)"> +<path opacity="0.5" d="M38.6242 31.4999C37.6002 31.4999 36.7682 30.6573 36.7682 29.6203C36.7682 28.5833 37.6002 27.7407 38.6242 27.7407C38.6882 27.7407 38.7522 27.7407 38.8482 27.7407V25.4397C38.7842 25.4397 38.7202 25.4397 38.6242 25.4397C37.6002 25.4397 36.7682 24.5972 36.7682 23.5601C36.7682 22.5231 37.6002 21.6805 38.6242 21.6805C38.6882 21.6805 38.7522 21.6805 38.8482 21.6805V19.3796C38.7842 19.3796 38.7202 19.3796 38.6242 19.3796C37.6002 19.3796 36.7682 18.537 36.7682 17.4999C36.7682 16.4629 37.6002 15.6203 38.6242 15.6203C38.6882 15.6203 38.7522 15.6203 38.8482 15.6203V13.3194C38.2402 13.3842 37.6322 13.1573 37.2162 12.6712C36.5442 11.861 36.6402 10.6944 37.4402 10.0138C37.8562 9.65734 38.3682 9.52771 38.8482 9.59252V7.29159C38.7842 7.29159 38.7202 7.29159 38.6242 7.29159C37.6002 7.29159 36.7682 6.449 36.7682 5.41196C36.7682 4.37493 37.6002 3.53234 38.6242 3.53234C38.6882 3.53234 38.7522 3.53234 38.8482 3.53234V0.712891H36.6402C36.6402 1.74993 35.8082 2.59252 34.7842 2.59252C33.7602 2.59252 32.9282 1.74993 32.9282 0.712891H30.5282C30.5282 1.74993 29.6962 2.59252 28.6722 2.59252C27.6482 2.59252 26.8162 1.74993 26.8162 0.712891H24.4162C24.4162 1.74993 23.5842 2.59252 22.5602 2.59252C21.5362 2.59252 20.7042 1.74993 20.7042 0.712891H18.3042C18.3042 1.74993 17.4722 2.59252 16.4482 2.59252C15.4242 2.59252 14.5922 1.74993 14.5922 0.712891H12.1922C12.1922 1.74993 11.3602 2.59252 10.3362 2.59252C9.31216 2.59252 8.48016 1.74993 8.48016 0.712891H6.08016C6.08016 1.74993 5.24816 2.59252 4.22416 2.59252C3.20016 2.59252 2.36816 1.74993 2.36816 0.712891H0.160156V3.53234C1.18416 3.53234 2.01616 4.37493 2.01616 5.41196C2.01616 6.449 1.18416 7.29159 0.160156 7.29159V9.56011C0.704156 9.56011 1.21616 9.78696 1.60016 10.2407C2.27216 11.0509 2.17616 12.2175 1.37616 12.8981C1.02416 13.1897 0.608156 13.3518 0.160156 13.3518V15.6203C1.18416 15.6203 2.01616 16.4629 2.01616 17.4999C2.01616 18.537 1.18416 19.3796 0.160156 19.3796V21.6481C1.18416 21.6481 2.01616 22.4907 2.01616 23.5277C2.01616 24.5647 1.18416 25.4073 0.160156 25.4073V27.6759C1.18416 27.6759 2.01616 28.5184 2.01616 29.5555C2.01616 30.5925 1.18416 31.4351 0.160156 31.4351V34.2546H2.36816C2.36816 33.2175 3.20016 32.3749 4.22416 32.3749C5.24816 32.3749 6.08016 33.2175 6.08016 34.2546H8.48016C8.48016 33.2175 9.31216 32.3749 10.3362 32.3749C11.3602 32.3749 12.1922 33.2175 12.1922 34.2546H14.5922C14.5922 33.2175 15.4242 32.3749 16.4482 32.3749C17.4722 32.3749 18.3042 33.2175 18.3042 34.2546H20.7042C20.7042 33.2175 21.5362 32.3749 22.5602 32.3749C23.5842 32.3749 24.4162 33.2175 24.4162 34.2546H26.8162C26.8162 33.2175 27.6482 32.3749 28.6722 32.3749C29.6962 32.3749 30.5282 33.2175 30.5282 34.2546H32.9282C32.9282 33.2175 33.7602 32.3749 34.7842 32.3749C35.8082 32.3749 36.6402 33.2175 36.6402 34.2546H38.8482V31.4351C38.7522 31.4999 38.6882 31.4999 38.6242 31.4999Z" fill="#ECA680"/> +<path d="M39.9045 34.838H36.6405V34.287C36.6405 33.5417 36.0325 32.9259 35.2965 32.9259C34.5605 32.9259 33.9525 33.5417 33.9525 34.287V34.838H30.4965V34.287C30.4965 33.5417 29.8885 32.9259 29.1525 32.9259C28.4165 32.9259 27.8085 33.5417 27.8085 34.287V34.838H24.3525V34.287C24.3525 33.5417 23.7445 32.9259 23.0085 32.9259C22.2725 32.9259 21.6645 33.5417 21.6645 34.287V34.838H18.2725V34.287C18.2725 33.5417 17.6645 32.9259 16.9285 32.9259C16.1925 32.9259 15.5845 33.5417 15.5845 34.287V34.838H12.1285V34.287C12.1285 33.5417 11.5205 32.9259 10.7845 32.9259C10.0485 32.9259 9.44045 33.5417 9.44045 34.287V34.838H6.01645V34.287C6.01645 33.5417 5.40845 32.9259 4.67245 32.9259C3.93645 32.9259 3.32845 33.5417 3.32845 34.287V34.838H0.0644531V30.9491H0.608453C1.34445 30.9491 1.95245 30.3333 1.95245 29.588C1.95245 28.8426 1.34445 28.2269 0.608453 28.2269H0.0644531V24.8889H0.608453C1.34445 24.8889 1.95245 24.2732 1.95245 23.5278C1.95245 22.7824 1.34445 22.1667 0.608453 22.1667H0.0644531V18.8287H0.608453C1.34445 18.8287 1.95245 18.213 1.95245 17.4676C1.95245 16.7222 1.34445 16.1065 0.608453 16.1065H0.0644531V12.8009H0.608453C0.928453 12.8009 1.21645 12.7037 1.47245 12.4769C1.76045 12.25 1.92045 11.9259 1.95245 11.5695C1.98445 11.213 1.88845 10.8565 1.63245 10.5972C1.37645 10.3056 0.992453 10.1111 0.608453 10.1111H0.0644531V6.74075H0.608453C1.34445 6.74075 1.95245 6.12501 1.95245 5.37964C1.95245 4.63427 1.34445 4.01853 0.608453 4.01853H0.0644531V0.129639H3.32845V0.680564C3.32845 1.42593 3.93645 2.04167 4.67245 2.04167C5.40845 2.04167 6.01645 1.42593 6.01645 0.680564V0.129639H9.47245V0.680564C9.47245 1.42593 10.0805 2.04167 10.8165 2.04167C11.5525 2.04167 12.1605 1.42593 12.1605 0.680564V0.129639H15.6165V0.680564C15.6165 1.42593 16.2245 2.04167 16.9605 2.04167C17.6965 2.04167 18.3045 1.42593 18.3045 0.680564V0.129639H21.7605V0.680564C21.7605 1.42593 22.3685 2.04167 23.1045 2.04167C23.8405 2.04167 24.4485 1.42593 24.4485 0.680564V0.129639H27.8405V0.680564C27.8405 1.42593 28.4485 2.04167 29.1845 2.04167C29.9205 2.04167 30.5285 1.42593 30.5285 0.680564V0.129639H33.9845V0.680564C33.9845 1.42593 34.5925 2.04167 35.3285 2.04167C36.0645 2.04167 36.6725 1.42593 36.6725 0.680564V0.129639H39.9365V4.11575L39.3285 4.05093C39.2645 4.05093 39.2325 4.05093 39.1685 4.05093C38.4325 4.05093 37.8245 4.66668 37.8245 5.41205C37.8245 6.15742 38.4325 6.77316 39.1685 6.77316C39.2005 6.77316 39.2645 6.77316 39.3285 6.77316L39.9365 6.70834V10.2083L39.3285 10.1435C38.9445 10.1111 38.5925 10.2083 38.3045 10.4352C38.0165 10.662 37.8565 10.9861 37.8245 11.3426C37.7925 11.6991 37.8885 12.0556 38.1445 12.3148C38.4325 12.6713 38.8805 12.8333 39.3285 12.8009L39.9365 12.7361V16.2361L39.3285 16.1713C39.2645 16.1713 39.2325 16.1713 39.1685 16.1713C38.4325 16.1713 37.8245 16.787 37.8245 17.5324C37.8245 18.2778 38.4325 18.8935 39.1685 18.8935C39.2005 18.8935 39.2645 18.8935 39.3285 18.8935L39.9365 18.8287V22.3287L39.3285 22.2639C39.2645 22.2639 39.2325 22.2639 39.1685 22.2639C38.4325 22.2639 37.8245 22.8796 37.8245 23.625C37.8245 24.3704 38.4325 24.9861 39.1685 24.9861C39.2005 24.9861 39.2645 24.9861 39.3285 24.9861L39.9365 24.9213V28.4213L39.3285 28.3565C39.2645 28.3565 39.2325 28.3565 39.1685 28.3565C38.4325 28.3565 37.8245 28.9722 37.8245 29.7176C37.8245 30.463 38.4325 31.0787 39.1685 31.0787C39.2005 31.0787 39.2645 31.0787 39.3285 31.0787L39.9365 31.0139V34.838H39.9045ZM37.6325 33.7685H38.8165V32.0185C37.6325 31.8565 36.7365 30.8519 36.7365 29.6204C36.7365 28.3889 37.6325 27.3519 38.8165 27.2222V25.9907C37.6325 25.8287 36.7365 24.8241 36.7365 23.5926C36.7365 22.3611 37.6325 21.3241 38.8165 21.1945V19.963C37.6325 19.8009 36.7365 18.7963 36.7365 17.5648C36.7365 16.3333 37.6325 15.2963 38.8165 15.1667V13.9352C38.2405 13.8704 37.6965 13.5463 37.3125 13.0926C36.8965 12.6065 36.7045 11.9583 36.7685 11.3102C36.8325 10.662 37.1205 10.0787 37.6005 9.65742C37.9525 9.36575 38.3685 9.1713 38.8165 9.10649V7.87501C37.6325 7.71297 36.7365 6.70834 36.7365 5.47686C36.7365 4.24538 37.6325 3.20834 38.8165 3.07871V1.32871H37.6325C37.3765 2.39816 36.4165 3.20834 35.2965 3.20834C34.1445 3.20834 33.1845 2.39816 32.9605 1.32871H31.5205C31.2645 2.39816 30.3045 3.20834 29.1845 3.20834C28.0325 3.20834 27.0725 2.39816 26.8485 1.32871H25.4085C25.1525 2.39816 24.1925 3.20834 23.0725 3.20834C21.9205 3.20834 20.9605 2.39816 20.7365 1.32871H19.2965C19.0405 2.39816 18.0805 3.20834 16.9605 3.20834C15.8085 3.20834 14.8485 2.39816 14.6245 1.32871H13.1845C12.9285 2.39816 11.9685 3.20834 10.8485 3.20834C9.69645 3.20834 8.73645 2.39816 8.51245 1.32871H7.07245C6.81645 2.39816 5.85645 3.20834 4.73645 3.20834C3.58445 3.20834 2.62445 2.39816 2.40045 1.32871H1.21645V3.11112C2.27245 3.37038 3.07245 4.3426 3.07245 5.47686C3.07245 6.64353 2.27245 7.61575 1.21645 7.8426V9.1389C1.72845 9.26853 2.17645 9.52778 2.52845 9.94908C2.94445 10.4352 3.13645 11.0833 3.07245 11.7315C3.00845 12.3796 2.72045 12.963 2.24045 13.3843C1.95245 13.6435 1.60045 13.8056 1.21645 13.9028V15.1991C2.27245 15.4583 3.07245 16.4306 3.07245 17.5648C3.07245 18.6991 2.27245 19.7037 1.21645 19.9306V21.2269C2.27245 21.4861 3.07245 22.4583 3.07245 23.5926C3.07245 24.7269 2.27245 25.7315 1.21645 25.9583V27.2546C2.27245 27.5139 3.07245 28.4861 3.07245 29.6204C3.07245 30.7546 2.27245 31.7593 1.21645 31.9861V33.7685H2.40045C2.65645 32.6991 3.61645 31.8889 4.73645 31.8889C5.88845 31.8889 6.84845 32.6991 7.07245 33.7685H8.51245C8.76845 32.6991 9.72845 31.8889 10.8485 31.8889C12.0005 31.8889 12.9605 32.6991 13.1845 33.7685H14.6245C14.8805 32.6991 15.8405 31.8889 16.9605 31.8889C18.1125 31.8889 19.0725 32.6991 19.2965 33.7685H20.7365C20.9925 32.6991 21.9525 31.8889 23.0725 31.8889C24.2245 31.8889 25.1845 32.6991 25.4085 33.7685H26.8485C27.1045 32.6991 28.0645 31.8889 29.1845 31.8889C30.3365 31.8889 31.2965 32.6991 31.5205 33.7685H32.9605C33.2165 32.6991 34.1765 31.8889 35.2965 31.8889C36.4485 31.8565 37.4085 32.6667 37.6325 33.7685Z" fill="#ECA680"/> +<path d="M34.4635 5.60645H5.31152V29.7824H34.4635V5.60645Z" fill="#B70808"/> +<path d="M7.39235 9.23608C7.36035 9.59257 7.36035 9.94905 7.36035 10.3379C7.36035 18.8935 12.9924 25.8287 19.9364 25.8287C26.8804 25.8287 32.5124 18.8935 32.5124 10.3379C32.5124 9.98145 32.5124 9.62497 32.4804 9.26849H7.39235V9.23608Z" fill="#D7DBE9"/> +<path d="M21.024 17.4676L19.584 12.9954L16.416 17.7268L21.024 17.4676Z" fill="#5F6EA9"/> +<path d="M19.7115 26.8981C18.6875 26.8981 17.7275 26.736 16.8315 26.3795C16.2875 26.1527 16.0315 25.5369 16.2235 24.986C16.4475 24.4351 17.0555 24.1758 17.5995 24.3703C19.2955 25.0508 21.6955 24.7592 23.7435 23.6249C25.5355 22.6203 26.7195 21.1295 27.0075 19.5416C27.0395 19.3795 27.0715 19.2175 27.0715 19.0231C27.1355 18.4397 27.6795 18.0184 28.2555 18.0832C28.8315 18.1481 29.2475 18.699 29.1835 19.2823C29.1515 19.5092 29.1195 19.7036 29.0875 19.8981C28.7035 22.1342 27.1035 24.1758 24.7675 25.5045C23.1675 26.4444 21.3755 26.8981 19.7115 26.8981Z" fill="#1B2B3E"/> +<path d="M31.3602 14.6804C34.1172 14.6804 36.3522 12.417 36.3522 9.62489C36.3522 6.83278 34.1172 4.56934 31.3602 4.56934C28.6032 4.56934 26.3682 6.83278 26.3682 9.62489C26.3682 12.417 28.6032 14.6804 31.3602 14.6804Z" fill="white"/> +<path d="M30.72 13.6434C32.6817 13.6434 34.272 12.0329 34.272 10.0462C34.272 8.05951 32.6817 6.44897 30.72 6.44897C28.7583 6.44897 27.168 8.05951 27.168 10.0462C27.168 12.0329 28.7583 13.6434 30.72 13.6434Z" fill="#1B2B3E"/> +<path d="M8.3836 14.6157C11.1406 14.6157 13.3756 12.3523 13.3756 9.56019C13.3756 6.76809 11.1406 4.50464 8.3836 4.50464C5.6266 4.50464 3.3916 6.76809 3.3916 9.56019C3.3916 12.3523 5.6266 14.6157 8.3836 14.6157Z" fill="white"/> +<path d="M9.12036 13.0602C11.0821 13.0602 12.6724 11.4496 12.6724 9.46294C12.6724 7.47625 11.0821 5.86572 9.12036 5.86572C7.15864 5.86572 5.56836 7.47625 5.56836 9.46294C5.56836 11.4496 7.15864 13.0602 9.12036 13.0602Z" fill="#1B2B3E"/> +<path d="M36.1602 5.12035C35.8722 5.12035 35.5842 4.99072 35.3922 4.79627C34.4642 3.82405 33.6322 3.37035 30.4002 2.75461C29.8242 2.65739 29.4402 2.07405 29.5362 1.49072C29.6322 0.907385 30.2082 0.518497 30.7842 0.615719C34.2722 1.29627 35.5842 1.87961 36.9282 3.30553C37.3442 3.72683 37.3122 4.43979 36.8962 4.82868C36.6722 5.02313 36.4162 5.12035 36.1602 5.12035Z" fill="#1B2B3E"/> +<path d="M6.30436 3.95377C5.85636 3.95377 5.40836 3.6621 5.28036 3.17599C5.12036 2.59266 5.44036 2.00933 6.01636 1.81488C9.40836 0.810253 10.8484 0.713031 12.7044 1.36118C13.2484 1.55562 13.5684 2.17136 13.3444 2.7547C13.1524 3.30562 12.5444 3.6297 11.9684 3.40285C10.7204 2.94914 9.76036 2.94914 6.62436 3.88896C6.52836 3.92136 6.40036 3.95377 6.30436 3.95377Z" fill="#1B2B3E"/> +</g> +<defs> +<clipPath id="clip0_1479_3697"> +<rect width="40" height="35" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/app/components/Article/FeedbackForm/feedbackForm.css b/app/components/Article/FeedbackForm/feedbackForm.css index 1b8a356a..09e3eebe 100644 --- a/app/components/Article/FeedbackForm/feedbackForm.css +++ b/app/components/Article/FeedbackForm/feedbackForm.css @@ -1,11 +1,14 @@ .feedback-container { max-width: 384px; padding: var(--spacing-32); + margin-top: var(--spacing-8); } + +/* Comment to Nemo when he reviews: why didn't you just do this the way you did the settings buttons? */ .select-option { height: var(--spacing-48); padding: var(--spacing-8) var(--spacing-16); - margin: var(--spacing-8) 0; + margin-bottom: var(--spacing-16); cursor: pointer; width: 100%; } @@ -22,10 +25,10 @@ .feedback-text { width: calc(100% - var(--spacing-24)); max-width: calc(100% - var(--spacing-24)); - height: 128px; padding: var(--spacing-12); margin: var(--spacing-40) 0; box-sizing: content-box; + background: pink; } .feedback-text.no-options { margin: var(--spacing-16) 0; diff --git a/app/components/Button/button.css b/app/components/Button/button.css index b7ef695f..e1a3c8ff 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -134,25 +134,26 @@ /* state */ -.primary:hover { +.primary:hover, .primary-large:hover { background: var(--colors-teal-700, #17736e); } -.primary-alt:hover { +.primary-alt:hover, .primary-alt-large:hover { color: var(--colors-teal-800, #146560); } -.secondary:hover { +.secondary:hover, .secondary-large:hover { border: 1px solid var(--colors-teal-200, #a6d9d7) !important; } -.secondary-alt:hover { +.secondary-alt:hover, .secondary-alt-large:hover { border: 1px solid var(--colors-teal-200, #a6d9d7); } /* #### Composite button #### */ .composite-button { box-shadow: 0px var(--spacing-16) var(--spacing-40) 0px rgba(175, 183, 194, 0.2); + cursor: pointer; } .composite-button > form .button, diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 930c3d2b..4a77c325 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -1,16 +1,22 @@ import {ComponentType} from 'react' import {Link} from '@remix-run/react' import MarkdownIt from 'markdown-it' -import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' -import BotIcon from '~/components/icons-generated/Bot' -import LinkIcon from '~/components/icons-generated/LinkOut' -import PersonIcon from '~/components/icons-generated/Person' -import StampyIcon from '~/components/icons-generated/Stampy' import Contents from '~/components/Article/Contents' import useGlossary from '~/hooks/useGlossary' import './chat_entry.css' import type {Entry, AssistantEntry, StampyEntry, Citation, ErrorMessage} from '~/hooks/useChat' +// icons +import IconBotSmall from '~/components/icons-generated/BotSmall' +import BotIcon from '~/components/icons-generated/Bot' +import LinkIcon from '~/components/icons-generated/LinkOut' +import PersonIcon from '~/components/icons-generated/Person' +import StampyIcon from '~/components/icons-generated/Stampy' +import PersonInCircleIcon from '~/components/icons-generated/PersonInCircle' +import IconStampySmall from '~/components/icons-generated/StampySmall' +import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' + + const MAX_REFERENCES = 10 const hints = { bot: 'bla bla bla something bot', @@ -98,18 +104,15 @@ const Reference = ({id, title, authors, source, url, index}: Citation) => { } return ( - <div key={id} id={id} className="reference padding-bottom-32"> - <div className={`reference-num small ref-${index}`}>{index}</div> - <div> - <div className="title">{title}</div> - <div> - <Authors authors={authors} /> - <span>{' · '}</span> - <Link className="source-link" to={url} target="_blank" rel="noopener noreferrer"> - {referenceSources[source as keyof typeof referenceSources] || new URL(url).host}{' '} - <LinkIcon width="16" height="16" /> - </Link> - </div> + <div> + <div className="title padding-bottom-4">{title}</div> + <div className="small"> + <Authors authors={authors} /> + <span>{' · '}</span> + <Link className="source-link teal-500" to={url} target="_blank" rel="noopener noreferrer"> + {referenceSources[source as keyof typeof referenceSources] || new URL(url).host}{' '} + <LinkIcon width="16" height="16" /> + </Link> </div> </div> ) @@ -145,7 +148,7 @@ const ChatbotReply = ({phase, content, citationsMap}: AssistantEntry) => { return ( <div> - <Title title="Stampy" Icon={StampyIcon} answerType="bot" /> + <Title title="Stampy" Icon={IconStampySmall} answerType="bot" hint="Generated by an AI model" /> <PhaseState /> <div className="padding-bottom-24"> {content?.split(/(\[\d+\])|(\n)/).map((chunk, i) => { @@ -203,7 +206,7 @@ const ChatEntry = (props: Entry) => { const Role = roles[props.role] as ComponentType<Entry> if (!Role) return null return ( - <div className="chat-entry padding-bottom-40"> + <div className="chat-entry padding-bottom-56"> <Role {...props} /> </div> ) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 67d1d78a..de7270e8 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -1,6 +1,8 @@ import {useEffect, useRef, useState} from 'react' import {Link, useFetcher} from '@remix-run/react' import StampyIcon from '~/components/icons-generated/Stampy' +import IconStampyLarge from '~/components/icons-generated/StampyLarge' +import IconStampySmall from '~/components/icons-generated/StampySmall' import SendIcon from '~/components/icons-generated/PlaneSend' import Button from '~/components/Button' import {queryLLM, Entry, AssistantEntry, StampyEntry, Followup, ChatSettings} from '~/hooks/useChat' @@ -28,7 +30,7 @@ export const WidgetStampy = () => { </div> <div className="sample-messages-container padding-bottom-24"> - <StampyIcon /> + <IconStampySmall /> <div className="sample-messages rounded"> <div className="padding-bottom-24">Try asking me...</div> {questions.map((question, i) => ( @@ -107,11 +109,11 @@ type FollowupsProps = { } const Followups = ({title, followups, onSelect, className}: FollowupsProps) => ( <> - {title && <div className={'padding-bottom-24 color-grey ' + (className || '')}>{title}</div>} + {title && <div className={'padding-bottom-24 grey' + (className || '')}>{title}</div>} {followups?.map(({text, pageid}, i) => ( <div key={i} className="padding-bottom-16"> - <Button className="secondary-alt" action={() => onSelect({text, pageid})}> + <Button className="secondary-alt-large" action={() => onSelect({text, pageid})}> {text} </Button> </div> @@ -127,18 +129,16 @@ const SplashScreen = ({ onQuestion: (v: string) => void }) => ( <> - <div className="padding-top-40"> - <StampyIcon /> - <div className="col-6 padding-bottom-40 padding-top-40"> + <IconStampyLarge /> + <div className="col-6 padding-bottom-40 padding-top-24"> <h2 className="teal-500">Hi there, I'm Stampy.</h2> <h2>I can answer your questions about AI Safety</h2> </div> <Followups - title="Popular questions" + title="Not sure where to start? Try these:" followups={questions?.map((text: string) => ({text}))} onSelect={({text}: Followup) => onQuestion(text)} /> - </div> </> ) diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx new file mode 100644 index 00000000..07df94f8 --- /dev/null +++ b/app/components/Feedback/Form.tsx @@ -0,0 +1,67 @@ +import {useEffect, useState} from 'react' +import Button from '~/components/Button' +import useOutsideOnClick from '~/hooks/useOnOutsideClick' +import './feedback.css' + +export type FeedbackFormProps = { + onClose?: () => void + options?: string[] +} +const FeedbackForm = ({onClose, options}: FeedbackFormProps) => { + const [selected, setSelected] = useState<string>() + const [enabledSubmit, setEnabledSubmit] = useState(!options) + const [numClicks, setNumClicks] = useState(0) + const clickCheckerRef = useOutsideOnClick(onClose) + + useEffect(() => { + // Hide the form after 10 seconds if the user hasn't interacted with it + const timeoutId = setInterval(() => { + onClose && onClose() + }, 10000) + + // Clear the timeout to prevent it from running if the component unmounts + return () => clearInterval(timeoutId) + }, [numClicks, onClose]) + + const selectFeedback = (option: string) => { + setSelected(option) + setEnabledSubmit(true) + } + + const handleSubmit = () => { + onClose && onClose() + } + + return ( + <div + ref={clickCheckerRef} + onClick={() => setNumClicks((current) => current + 1)} + className="fcol-5 feedback-form bordered" + > + <span className="black small padding-bottom-32">What was the problem?</span> + {options?.map((option) => ( + <Button + key={option} + className={[ + option == selected ? 'secondary-alt selected' : 'secondary', + 'select-option', + ].join(' ')} + action={() => selectFeedback(option)} + > + {option} + </Button> + ))} + + <textarea + name="feedback-text" + className={['feedback-text bordered', !options ? 'no-options' : ''].join(' ')} + placeholder="Leave a comment (optional)" + /> + <Button className="primary full-width" action={handleSubmit} disabled={!enabledSubmit}> + <p>Submit feedback</p> + </Button> + </div> + ) +} + +export default FeedbackForm diff --git a/app/components/Nav/index.tsx b/app/components/Nav/index.tsx index 2ce3efa5..25d572c5 100644 --- a/app/components/Nav/index.tsx +++ b/app/components/Nav/index.tsx @@ -29,12 +29,7 @@ export const Nav = ({toc, categories}: NavProps) => { id="showArticles" /> <ArticlesDropdown toc={toc} categories={categories || []} /> - <MenuItem - primary={true} - link="https://chat.aisafety.info" - icon={<BotIcon />} - text="Stampy chatbot" - /> + <MenuItem primary={true} link="/chat/" icon={<BotIcon />} text="AI Safety Chatbot" /> <li className="top-menu-item"> <div className="top-menu-divider"></div> </li> diff --git a/app/components/icons-generated/StampyLarge.tsx b/app/components/icons-generated/StampyLarge.tsx new file mode 100644 index 00000000..a4c89807 --- /dev/null +++ b/app/components/icons-generated/StampyLarge.tsx @@ -0,0 +1,48 @@ +import type {SVGProps} from 'react' +const SvgStampyLarge = (props: SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width={80} height={69} fill="none" {...props}> + <g clipPath="url(#StampyLarge_svg__a)"> + <path + fill="#ECA680" + d="M77.248 62.1a3.71 3.71 0 0 1-3.712-3.706 3.71 3.71 0 0 1 3.712-3.705h.448v-4.536h-.448a3.71 3.71 0 0 1-3.712-3.706 3.71 3.71 0 0 1 3.712-3.705h.448v-4.536h-.448a3.71 3.71 0 0 1-3.712-3.706 3.71 3.71 0 0 1 3.712-3.706h.448v-4.536a3.77 3.77 0 0 1-3.264-1.277c-1.344-1.598-1.152-3.898.448-5.24a3.6 3.6 0 0 1 2.816-.83v-4.536h-.448a3.71 3.71 0 0 1-3.712-3.706 3.71 3.71 0 0 1 3.712-3.705h.448V1.406H73.28a3.71 3.71 0 0 1-3.712 3.705 3.71 3.71 0 0 1-3.712-3.705h-4.8a3.71 3.71 0 0 1-3.712 3.705 3.71 3.71 0 0 1-3.712-3.705h-4.8A3.71 3.71 0 0 1 45.12 5.11a3.71 3.71 0 0 1-3.712-3.705h-4.8a3.71 3.71 0 0 1-3.712 3.705 3.71 3.71 0 0 1-3.712-3.705h-4.8a3.71 3.71 0 0 1-3.712 3.705 3.71 3.71 0 0 1-3.712-3.705h-4.8A3.71 3.71 0 0 1 8.448 5.11a3.71 3.71 0 0 1-3.712-3.705H.32v5.558a3.71 3.71 0 0 1 3.712 3.705A3.71 3.71 0 0 1 .32 14.375v4.472c1.088 0 2.112.447 2.88 1.342 1.344 1.597 1.152 3.897-.448 5.239-.704.575-1.536.894-2.432.894v4.472A3.71 3.71 0 0 1 4.032 34.5 3.71 3.71 0 0 1 .32 38.206v4.472a3.71 3.71 0 0 1 3.712 3.705A3.71 3.71 0 0 1 .32 50.09v4.472a3.71 3.71 0 0 1 3.712 3.706A3.71 3.71 0 0 1 .32 61.972v5.559h4.416a3.71 3.71 0 0 1 3.712-3.706 3.71 3.71 0 0 1 3.712 3.706h4.8a3.71 3.71 0 0 1 3.712-3.706 3.71 3.71 0 0 1 3.712 3.706h4.8a3.71 3.71 0 0 1 3.712-3.706 3.71 3.71 0 0 1 3.712 3.706h4.8a3.71 3.71 0 0 1 3.712-3.706 3.71 3.71 0 0 1 3.712 3.706h4.8a3.71 3.71 0 0 1 3.712-3.706 3.71 3.71 0 0 1 3.712 3.706h4.8a3.71 3.71 0 0 1 3.712-3.706 3.71 3.71 0 0 1 3.712 3.706h4.416v-5.559c-.192.128-.32.128-.448.128" + opacity={0.5} + /> + <path + fill="#ECA680" + d="M79.808 68.68H73.28v-1.086a2.7 2.7 0 0 0-2.688-2.683 2.7 2.7 0 0 0-2.688 2.683v1.087h-6.912v-1.087a2.7 2.7 0 0 0-2.688-2.683 2.7 2.7 0 0 0-2.688 2.683v1.087h-6.912v-1.087a2.7 2.7 0 0 0-2.688-2.683 2.7 2.7 0 0 0-2.688 2.683v1.087h-6.784v-1.087a2.7 2.7 0 0 0-2.688-2.683 2.7 2.7 0 0 0-2.688 2.683v1.087h-6.912v-1.087a2.7 2.7 0 0 0-2.688-2.683 2.7 2.7 0 0 0-2.688 2.683v1.087h-6.848v-1.087a2.7 2.7 0 0 0-2.688-2.683 2.7 2.7 0 0 0-2.688 2.683v1.087H.128v-7.667h1.088a2.7 2.7 0 0 0 2.688-2.683 2.7 2.7 0 0 0-2.688-2.684H.128v-6.58h1.088a2.7 2.7 0 0 0 2.688-2.684A2.7 2.7 0 0 0 1.216 43.7H.128v-6.58h1.088a2.7 2.7 0 0 0 2.688-2.684 2.7 2.7 0 0 0-2.688-2.683H.128v-6.517h1.088c.64 0 1.216-.192 1.728-.639a2.5 2.5 0 0 0 .96-1.789c.064-.702-.128-1.405-.64-1.916-.512-.575-1.28-.959-2.048-.959H.128V13.29h1.088a2.7 2.7 0 0 0 2.688-2.683 2.7 2.7 0 0 0-2.688-2.684H.128V.256h6.528v1.086a2.7 2.7 0 0 0 2.688 2.683 2.7 2.7 0 0 0 2.688-2.683V.256h6.912v1.086a2.7 2.7 0 0 0 2.688 2.683 2.7 2.7 0 0 0 2.688-2.683V.256h6.912v1.086a2.7 2.7 0 0 0 2.688 2.683 2.7 2.7 0 0 0 2.688-2.683V.256h6.912v1.086a2.7 2.7 0 0 0 2.688 2.683 2.7 2.7 0 0 0 2.688-2.683V.256h6.784v1.086a2.7 2.7 0 0 0 2.688 2.683 2.7 2.7 0 0 0 2.688-2.683V.256h6.912v1.086a2.7 2.7 0 0 0 2.688 2.683 2.7 2.7 0 0 0 2.688-2.683V.256h6.528v7.858l-1.216-.128h-.32a2.7 2.7 0 0 0-2.688 2.683 2.7 2.7 0 0 0 2.688 2.684h.32l1.216-.128v6.9l-1.216-.128c-.768-.064-1.472.128-2.048.575a2.5 2.5 0 0 0-.96 1.79c-.064.702.128 1.405.64 1.916.576.703 1.472 1.022 2.368.958l1.216-.128v6.9l-1.216-.127h-.32a2.7 2.7 0 0 0-2.688 2.683 2.7 2.7 0 0 0 2.688 2.683h.32l1.216-.127v6.9l-1.216-.128h-.32a2.7 2.7 0 0 0-2.688 2.683 2.7 2.7 0 0 0 2.688 2.683h.32l1.216-.127v6.9l-1.216-.128h-.32a2.7 2.7 0 0 0-2.688 2.683 2.7 2.7 0 0 0 2.688 2.684h.32l1.216-.128v7.539zm-4.544-2.108h2.368v-3.45c-2.368-.32-4.16-2.3-4.16-4.727s1.792-4.473 4.16-4.728v-2.428c-2.368-.32-4.16-2.3-4.16-4.728s1.792-4.472 4.16-4.728v-2.427c-2.368-.32-4.16-2.3-4.16-4.728s1.792-4.472 4.16-4.728v-2.428c-1.152-.128-2.24-.766-3.008-1.66-.832-.96-1.216-2.237-1.088-3.515.128-1.277.704-2.428 1.664-3.258a4.95 4.95 0 0 1 2.432-1.086v-2.428c-2.368-.32-4.16-2.3-4.16-4.728s1.792-4.472 4.16-4.728V2.62h-2.368c-.512 2.109-2.432 3.706-4.672 3.706-2.304 0-4.224-1.597-4.672-3.706h-2.88c-.512 2.109-2.432 3.706-4.672 3.706-2.304 0-4.224-1.597-4.672-3.706h-2.88c-.512 2.109-2.432 3.706-4.672 3.706-2.304 0-4.224-1.597-4.672-3.706h-2.88c-.512 2.109-2.432 3.706-4.672 3.706-2.304 0-4.224-1.597-4.672-3.706h-2.88c-.512 2.109-2.432 3.706-4.672 3.706-2.304 0-4.224-1.597-4.672-3.706h-2.88c-.512 2.109-2.432 3.706-4.672 3.706-2.304 0-4.224-1.597-4.672-3.706H2.432v3.514c2.112.511 3.712 2.428 3.712 4.664 0 2.3-1.6 4.217-3.712 4.664v2.556c1.024.255 1.92.766 2.624 1.597.832.958 1.216 2.236 1.088 3.514s-.704 2.428-1.664 3.258c-.576.511-1.28.83-2.048 1.022v2.556c2.112.511 3.712 2.428 3.712 4.664s-1.6 4.216-3.712 4.664v2.555c2.112.511 3.712 2.428 3.712 4.664s-1.6 4.217-3.712 4.664v2.556c2.112.51 3.712 2.427 3.712 4.663s-1.6 4.217-3.712 4.664v3.514H4.8c.512-2.108 2.432-3.705 4.672-3.705 2.304 0 4.224 1.597 4.672 3.705h2.88c.512-2.108 2.432-3.705 4.672-3.705 2.304 0 4.224 1.597 4.672 3.705h2.88c.512-2.108 2.432-3.705 4.672-3.705 2.304 0 4.224 1.597 4.672 3.705h2.88c.512-2.108 2.432-3.705 4.672-3.705 2.304 0 4.224 1.597 4.672 3.705h2.88c.512-2.108 2.432-3.705 4.672-3.705 2.304 0 4.224 1.597 4.672 3.705h2.88c.512-2.108 2.432-3.705 4.672-3.705a4.624 4.624 0 0 1 4.672 3.705" + /> + <path fill="#B70808" d="M68.928 11.053H10.624v47.66h58.304z" /> + <path + fill="#D7DBE9" + d="M14.784 18.208c-.064.703-.064 1.406-.064 2.173 0 16.866 11.264 30.538 25.152 30.538s25.152-13.672 25.152-30.538c0-.703 0-1.406-.064-2.109H14.784z" + /> + <path fill="#5F6EA9" d="m42.048 34.436-2.88-8.817-6.336 9.328z" /> + <path + fill="#1B2B3E" + d="M39.424 53.028c-2.048 0-3.968-.32-5.76-1.023a2.176 2.176 0 0 1-1.216-2.747c.448-1.086 1.664-1.597 2.752-1.214 3.392 1.342 8.192.767 12.288-1.47 3.584-1.98 5.952-4.918 6.528-8.05.064-.319.128-.638.128-1.021.128-1.15 1.216-1.98 2.368-1.853 1.152.128 1.984 1.214 1.856 2.364-.064.447-.128.83-.192 1.214-.768 4.408-3.968 8.433-8.64 11.053-3.2 1.852-6.784 2.747-10.112 2.747" + /> + <path + fill="#fff" + d="M62.72 28.942c5.514 0 9.984-4.463 9.984-9.967s-4.47-9.967-9.984-9.967-9.984 4.463-9.984 9.967 4.47 9.967 9.984 9.967" + /> + <path + fill="#1B2B3E" + d="M61.44 26.897c3.923 0 7.104-3.175 7.104-7.091s-3.18-7.092-7.104-7.092-7.104 3.175-7.104 7.091 3.18 7.092 7.104 7.092" + /> + <path + fill="#fff" + d="M16.768 28.814c5.514 0 9.984-4.462 9.984-9.967 0-5.504-4.47-9.966-9.984-9.966s-9.984 4.462-9.984 9.966c0 5.505 4.47 9.967 9.984 9.967" + /> + <path + fill="#1B2B3E" + d="M18.24 25.747c3.923 0 7.104-3.175 7.104-7.091s-3.18-7.092-7.104-7.092-7.104 3.175-7.104 7.092 3.18 7.091 7.104 7.091M72.32 10.095a2.24 2.24 0 0 1-1.536-.64c-1.856-1.916-3.52-2.81-9.984-4.024-1.152-.192-1.92-1.342-1.728-2.492s1.344-1.917 2.496-1.725c6.976 1.342 9.6 2.492 12.288 5.303.832.83.768 2.236-.064 3.002-.448.384-.96.575-1.472.575M12.608 7.794c-.896 0-1.792-.575-2.048-1.533-.32-1.15.32-2.3 1.472-2.683 6.784-1.98 9.664-2.172 13.376-.895 1.088.384 1.728 1.598 1.28 2.748-.384 1.086-1.6 1.725-2.752 1.277-2.496-.894-4.416-.894-10.688.959a2.3 2.3 0 0 1-.64.127" + /> + </g> + <defs> + <clipPath id="StampyLarge_svg__a"> + <path fill="#fff" d="M0 0h80v69H0z" /> + </clipPath> + </defs> + </svg> +) +export default SvgStampyLarge diff --git a/app/components/icons-generated/StampySmall.tsx b/app/components/icons-generated/StampySmall.tsx new file mode 100644 index 00000000..68754c6c --- /dev/null +++ b/app/components/icons-generated/StampySmall.tsx @@ -0,0 +1,48 @@ +import type {SVGProps} from 'react' +const SvgStampySmall = (props: SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width={40} height={35} fill="none" {...props}> + <g clipPath="url(#StampySmall_svg__a)"> + <path + fill="#ECA680" + d="M38.624 31.5c-1.024 0-1.856-.843-1.856-1.88s.832-1.88 1.856-1.88h.224v-2.3h-.224c-1.024 0-1.856-.843-1.856-1.88s.832-1.88 1.856-1.88h.224v-2.3h-.224c-1.024 0-1.856-.843-1.856-1.88s.832-1.88 1.856-1.88h.224v-2.3a1.87 1.87 0 0 1-1.632-.649 1.88 1.88 0 0 1 .224-2.657 1.78 1.78 0 0 1 1.408-.421V7.292h-.224c-1.024 0-1.856-.843-1.856-1.88s.832-1.88 1.856-1.88h.224V.712H36.64c0 1.038-.832 1.88-1.856 1.88s-1.856-.842-1.856-1.88h-2.4c0 1.038-.832 1.88-1.856 1.88s-1.856-.842-1.856-1.88h-2.4c0 1.038-.832 1.88-1.856 1.88s-1.856-.842-1.856-1.88h-2.4c0 1.038-.832 1.88-1.856 1.88s-1.856-.842-1.856-1.88h-2.4c0 1.038-.832 1.88-1.856 1.88S8.48 1.75 8.48.713h-2.4c0 1.038-.832 1.88-1.856 1.88S2.368 1.75 2.368.713H.16v2.82c1.024 0 1.856.843 1.856 1.88S1.184 7.292.16 7.292V9.56c.544 0 1.056.227 1.44.68.672.81.576 1.977-.224 2.658a1.9 1.9 0 0 1-1.216.454v2.268c1.024 0 1.856.843 1.856 1.88S1.184 19.38.16 19.38v2.268c1.024 0 1.856.843 1.856 1.88s-.832 1.88-1.856 1.88v2.268c1.024 0 1.856.842 1.856 1.88s-.832 1.88-1.856 1.88v2.819h2.208c0-1.038.832-1.88 1.856-1.88s1.856.843 1.856 1.88h2.4c0-1.038.832-1.88 1.856-1.88s1.856.843 1.856 1.88h2.4c0-1.038.832-1.88 1.856-1.88s1.856.843 1.856 1.88h2.4c0-1.038.832-1.88 1.856-1.88s1.856.843 1.856 1.88h2.4c0-1.038.832-1.88 1.856-1.88s1.856.843 1.856 1.88h2.4c0-1.038.832-1.88 1.856-1.88s1.856.843 1.856 1.88h2.208v-2.82c-.096.065-.16.065-.224.065" + opacity={0.5} + /> + <path + fill="#ECA680" + d="M39.905 34.838H36.64v-.551a1.36 1.36 0 0 0-1.344-1.361 1.36 1.36 0 0 0-1.344 1.361v.551h-3.457v-.551a1.36 1.36 0 0 0-1.343-1.361 1.36 1.36 0 0 0-1.344 1.361v.551h-3.457v-.551a1.36 1.36 0 0 0-1.343-1.361 1.36 1.36 0 0 0-1.344 1.361v.551h-3.392v-.551a1.36 1.36 0 0 0-1.344-1.361 1.36 1.36 0 0 0-1.344 1.361v.551h-3.456v-.551a1.36 1.36 0 0 0-1.344-1.361 1.36 1.36 0 0 0-1.345 1.361v.551H6.016v-.551a1.36 1.36 0 0 0-1.344-1.361 1.36 1.36 0 0 0-1.344 1.361v.551H.064v-3.889h.544a1.36 1.36 0 0 0 1.344-1.361 1.36 1.36 0 0 0-1.344-1.361H.064v-3.338h.544a1.36 1.36 0 0 0 1.344-1.361 1.36 1.36 0 0 0-1.344-1.361H.064v-3.338h.544a1.36 1.36 0 0 0 1.344-1.361 1.36 1.36 0 0 0-1.344-1.361H.064V12.8h.544c.32 0 .608-.097.864-.324.288-.227.448-.551.48-.908.032-.356-.064-.713-.32-.972-.256-.291-.64-.486-1.024-.486H.064v-3.37h.544A1.36 1.36 0 0 0 1.952 5.38 1.36 1.36 0 0 0 .608 4.019H.064V.129h3.264v.552a1.36 1.36 0 0 0 1.344 1.36A1.36 1.36 0 0 0 6.016.682V.13h3.456v.55a1.36 1.36 0 0 0 1.345 1.362A1.36 1.36 0 0 0 12.16.68V.13h3.456v.55a1.36 1.36 0 0 0 1.343 1.362A1.36 1.36 0 0 0 18.306.68V.13h3.456v.55a1.36 1.36 0 0 0 1.344 1.362A1.36 1.36 0 0 0 24.448.68V.13h3.392v.55a1.36 1.36 0 0 0 1.345 1.362A1.36 1.36 0 0 0 30.529.68V.13h3.455v.55a1.36 1.36 0 0 0 1.344 1.362A1.36 1.36 0 0 0 36.673.68V.13h3.265v3.986l-.608-.065h-.16a1.36 1.36 0 0 0-1.344 1.361 1.36 1.36 0 0 0 1.343 1.361h.16l.608-.065v3.5l-.608-.065a1.42 1.42 0 0 0-1.024.292c-.288.227-.448.551-.48.908-.032.356.065.713.32.972.288.356.736.518 1.185.486l.608-.065v3.5l-.608-.065h-.16a1.36 1.36 0 0 0-1.344 1.361 1.36 1.36 0 0 0 1.343 1.361h.16l.608-.064v3.5l-.608-.065h-.16a1.36 1.36 0 0 0-1.343 1.361 1.36 1.36 0 0 0 1.343 1.361h.16l.608-.065v3.5l-.608-.064h-.16a1.36 1.36 0 0 0-1.343 1.36 1.36 1.36 0 0 0 1.343 1.362h.16l.608-.065v3.824zm-2.273-1.07h1.185v-1.75a2.405 2.405 0 0 1-2.08-2.398c0-1.231.895-2.268 2.08-2.398v-1.231a2.405 2.405 0 0 1-2.08-2.398c0-1.232.895-2.269 2.08-2.398v-1.232a2.405 2.405 0 0 1-2.08-2.398c0-1.232.895-2.269 2.08-2.398v-1.232c-.577-.065-1.12-.389-1.505-.842a2.38 2.38 0 0 1-.543-1.783 2.5 2.5 0 0 1 .831-1.653 2.46 2.46 0 0 1 1.216-.55V7.874a2.405 2.405 0 0 1-2.08-2.398c0-1.232.897-2.269 2.08-2.398v-1.75h-1.184c-.255 1.07-1.215 1.88-2.335 1.88a2.38 2.38 0 0 1-2.336-1.88h-1.44c-.256 1.07-1.216 1.88-2.337 1.88a2.38 2.38 0 0 1-2.335-1.88h-1.44c-.256 1.07-1.216 1.88-2.336 1.88a2.38 2.38 0 0 1-2.337-1.88h-1.44c-.255 1.07-1.215 1.88-2.335 1.88a2.38 2.38 0 0 1-2.336-1.88h-1.44c-.257 1.07-1.216 1.88-2.337 1.88a2.38 2.38 0 0 1-2.336-1.88h-1.44c-.256 1.07-1.216 1.88-2.336 1.88A2.38 2.38 0 0 1 2.4 1.328H1.216V3.11a2.455 2.455 0 0 1 1.856 2.366c0 1.167-.8 2.139-1.856 2.366v1.296c.512.13.96.389 1.312.81a2.38 2.38 0 0 1 .544 1.783 2.5 2.5 0 0 1-.832 1.652c-.288.26-.64.422-1.024.519v1.296a2.455 2.455 0 0 1 1.856 2.366c0 1.134-.8 2.139-1.856 2.366v1.296a2.455 2.455 0 0 1 1.856 2.366c0 1.134-.8 2.139-1.856 2.365v1.297a2.455 2.455 0 0 1 1.856 2.365c0 1.135-.8 2.14-1.856 2.366v1.783H2.4c.256-1.07 1.216-1.88 2.336-1.88 1.152 0 2.112.81 2.336 1.88h1.44c.256-1.07 1.216-1.88 2.336-1.88 1.152 0 2.112.81 2.336 1.88h1.44c.256-1.07 1.217-1.88 2.336-1.88 1.152 0 2.113.81 2.337 1.88h1.44c.256-1.07 1.216-1.88 2.336-1.88 1.151 0 2.111.81 2.335 1.88h1.44c.257-1.07 1.217-1.88 2.337-1.88 1.152 0 2.112.81 2.335 1.88h1.44c.257-1.07 1.216-1.88 2.337-1.88 1.152-.032 2.111.778 2.336 1.88" + /> + <path fill="#B70808" d="M34.464 5.606H5.312v24.176h29.152z" /> + <path + fill="#D7DBE9" + d="M7.392 9.236c-.032.357-.032.713-.032 1.102 0 8.556 5.632 15.49 12.576 15.49s12.576-6.934 12.576-15.49c0-.357 0-.713-.032-1.07H7.392z" + /> + <path fill="#5F6EA9" d="m21.024 17.468-1.44-4.473-3.168 4.732z" /> + <path + fill="#1B2B3E" + d="M19.712 26.898c-1.024 0-1.985-.162-2.88-.518a1.11 1.11 0 0 1-.608-1.394c.224-.55.831-.81 1.375-.616 1.697.68 4.096.39 6.145-.745 1.791-1.005 2.976-2.495 3.264-4.083.032-.163.064-.325.064-.519a1.077 1.077 0 0 1 1.184-.94c.575.065.991.616.927 1.2-.032.226-.064.42-.096.615-.384 2.236-1.983 4.278-4.32 5.607-1.6.94-3.392 1.393-5.055 1.393" + /> + <path + fill="#fff" + d="M31.36 14.68c2.757 0 4.992-2.263 4.992-5.055s-2.235-5.056-4.992-5.056-4.992 2.264-4.992 5.056 2.235 5.055 4.992 5.055" + /> + <path + fill="#1B2B3E" + d="M30.72 13.643c1.962 0 3.552-1.61 3.552-3.597S32.682 6.45 30.72 6.45s-3.552 1.61-3.552 3.597 1.59 3.597 3.552 3.597" + /> + <path + fill="#fff" + d="M8.384 14.616c2.757 0 4.992-2.264 4.992-5.056S11.14 4.505 8.384 4.505 3.392 6.768 3.392 9.56s2.235 5.056 4.992 5.056" + /> + <path + fill="#1B2B3E" + d="M9.12 13.06c1.962 0 3.552-1.61 3.552-3.597s-1.59-3.597-3.552-3.597-3.552 1.61-3.552 3.597 1.59 3.597 3.552 3.597M36.16 5.12a1.1 1.1 0 0 1-.768-.324c-.928-.972-1.76-1.426-4.992-2.041-.576-.098-.96-.68-.864-1.264s.672-.973 1.248-.875c3.488.68 4.8 1.264 6.144 2.69.416.42.384 1.134-.032 1.523a1.12 1.12 0 0 1-.736.291M6.304 3.954c-.448 0-.896-.292-1.024-.778-.16-.583.16-1.167.736-1.361C9.408.81 10.848.713 12.704 1.36c.544.195.864.81.64 1.394-.192.55-.8.875-1.376.648-1.248-.454-2.208-.454-5.344.486a1.1 1.1 0 0 1-.32.065" + /> + </g> + <defs> + <clipPath id="StampySmall_svg__a"> + <path fill="#fff" d="M0 0h40v35H0z" /> + </clipPath> + </defs> + </svg> +) +export default SvgStampySmall diff --git a/app/components/icons-generated/index.ts b/app/components/icons-generated/index.ts index 7854bc06..12f8d4bd 100644 --- a/app/components/icons-generated/index.ts +++ b/app/components/icons-generated/index.ts @@ -1,3 +1,5 @@ +export {default as StampyLarge} from './StampyLarge' +export {default as StampySmall} from './StampySmall' export {default as Aisafety} from './Aisafety' export {default as ArrowRight} from './ArrowRight' export {default as ArrowUpRight} from './ArrowUpRight' @@ -39,6 +41,7 @@ export {default as Paper} from './Paper' export {default as Pencil} from './Pencil' export {default as People} from './People' export {default as Person} from './Person' +export {default as Personincircle} from './Personincircle' export {default as PlaneSend} from './PlaneSend' export {default as QuestionMark} from './QuestionMark' export {default as Search} from './Search' diff --git a/app/root.css b/app/root.css index 4a81c8b0..87b43697 100644 --- a/app/root.css +++ b/app/root.css @@ -71,6 +71,7 @@ input { color: var(--colors-cool-grey-900), #1b2b3e; margin: 0; } + body { margin: auto; max-width: 1600px; @@ -390,7 +391,7 @@ a { a:hover { text-decoration: none; - color: var(--colors-teal-500, #1d9089); + /* color: var(--colors-teal-500, #1d9089); */ } a:not(:hover, :focus-visible) { @@ -408,6 +409,7 @@ ul { padding: 0; padding-left: var(--spacing-32); } + ol { padding-left: var(--spacing-32); } @@ -479,6 +481,11 @@ svg { .icon-link path { stroke: var(--colors-cool-grey-600); } + +.icon-link:hover path { + stroke: var(--colors-teal-500); +} + .icon-link.focused path { stroke: var(--colors-teal-600); } diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 725738b1..f5920568 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -19,7 +19,7 @@ export default function App() { const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( <Button - className={chatSettings.mode === mode ? 'secondary-selected' : ''} + className={chatSettings.mode === mode ? 'secondary-selected' : 'secondary'} action={() => setChatSettings({...chatSettings, mode})} > {name} From 90edfd107216731bc247a30bafab8414aaa2249d Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Tue, 7 May 2024 15:00:33 -0400 Subject: [PATCH 041/132] delete thing --- app/components/icons-generated/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/icons-generated/index.ts b/app/components/icons-generated/index.ts index b04848d4..7c2e13b4 100644 --- a/app/components/icons-generated/index.ts +++ b/app/components/icons-generated/index.ts @@ -43,7 +43,6 @@ export {default as Pencil} from './Pencil' export {default as People} from './People' export {default as PersonInCircle} from './PersonInCircle' export {default as Person} from './Person' -export {default as Personincircle} from './Personincircle' export {default as PlaneSend} from './PlaneSend' export {default as QuestionMark} from './QuestionMark' export {default as Search} from './Search' From 2a51ef8ca74e8556b615fca3da1ef11ef7c2fcc2 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Tue, 7 May 2024 17:25:37 -0400 Subject: [PATCH 042/132] lint fix lint fix --- app/root.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/root.css b/app/root.css index 6af755df..78e4fbe9 100644 --- a/app/root.css +++ b/app/root.css @@ -326,7 +326,7 @@ h2 { /* note I may change these to vars later */ .col-1 { - width: clamp(0px, 3.07vw, 53px); + width: clamp(0px, 3.07vw, 53px); } .col-2 { From 75cb5bb09ef4dfbc151c7fbe4fe2a57623082c5f Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Tue, 7 May 2024 17:28:19 -0400 Subject: [PATCH 043/132] lint fix --- app/root.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/root.css b/app/root.css index 78e4fbe9..6af755df 100644 --- a/app/root.css +++ b/app/root.css @@ -326,7 +326,7 @@ h2 { /* note I may change these to vars later */ .col-1 { - width: clamp(0px, 3.07vw, 53px); + width: clamp(0px, 3.07vw, 53px); } .col-2 { From b4c9f271764151125077f4d98280e5e7344c9d5c Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 7 May 2024 23:38:21 +0200 Subject: [PATCH 044/132] linter fixes --- app/components/Button/button.css | 12 ++++++++---- app/components/Chatbot/ChatEntry.tsx | 8 ++++++-- app/components/Chatbot/index.tsx | 23 +++++++++++------------ 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index e1a3c8ff..87cfb8e6 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -134,19 +134,23 @@ /* state */ -.primary:hover, .primary-large:hover { +.primary:hover, +.primary-large:hover { background: var(--colors-teal-700, #17736e); } -.primary-alt:hover, .primary-alt-large:hover { +.primary-alt:hover, +.primary-alt-large:hover { color: var(--colors-teal-800, #146560); } -.secondary:hover, .secondary-large:hover { +.secondary:hover, +.secondary-large:hover { border: 1px solid var(--colors-teal-200, #a6d9d7) !important; } -.secondary-alt:hover, .secondary-alt-large:hover { +.secondary-alt:hover, +.secondary-alt-large:hover { border: 1px solid var(--colors-teal-200, #a6d9d7); } diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 8c0e7db8..7ee57dc2 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -9,7 +9,6 @@ import type {Entry, AssistantEntry, StampyEntry, Citation, ErrorMessage} from '~ // icons import IconBotSmall from '~/components/icons-generated/BotSmall' -import BotIcon from '~/components/icons-generated/Bot' import LinkIcon from '~/components/icons-generated/LinkOut' import PersonIcon from '~/components/icons-generated/Person' import StampyIcon from '~/components/icons-generated/Stampy' @@ -168,7 +167,12 @@ const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) return ( <div> - <Title title="Stampy" Icon={IconStampySmall} answerType="bot" hint="Generated by an AI model" /> + <Title + title="Stampy" + Icon={IconStampySmall} + answerType="bot" + hint="Generated by an AI model" + /> <PhaseState /> <div className="padding-bottom-56 padding-left-56 large-reading"> {content?.split(/(\[\d+\])|(\n)/).map((chunk, i) => { diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 03b73982..d099d446 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -1,6 +1,5 @@ import {useEffect, useRef, useState} from 'react' import {useFetcher, useNavigate} from '@remix-run/react' -import StampyIcon from '~/components/icons-generated/Stampy' import IconStampyLarge from '~/components/icons-generated/StampyLarge' import IconStampySmall from '~/components/icons-generated/StampySmall' import SendIcon from '~/components/icons-generated/PlaneSend' @@ -168,17 +167,17 @@ const SplashScreen = ({ questions?: string[] onQuestion: (v: string) => void }) => ( - <div className="padding-top-40"> - <IconStampyLarge /> - <div className="fcol-6 padding-bottom-40 padding-top-40">n - <h2 className="teal-500">Hi there, I'm Stampy.</h2> - <h2>I can answer your questions about AI Safety</h2> - </div> - <Followups - title="Not sure where to start? Try these:" - followups={questions?.map((text: string) => ({text}))} - onSelect={({text}: Followup) => onQuestion(text)} - /> + <div className="padding-top-40"> + <IconStampyLarge /> + <div className="fcol-6 padding-bottom-40 padding-top-40"> + n<h2 className="teal-500">Hi there, I'm Stampy.</h2> + <h2>I can answer your questions about AI Safety</h2> + </div> + <Followups + title="Not sure where to start? Try these:" + followups={questions?.map((text: string) => ({text}))} + onSelect={({text}: Followup) => onQuestion(text)} + /> </div> ) From 4ab71e960beaf45de18ec8bf12187b06a0f9077f Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Wed, 8 May 2024 20:32:53 -0400 Subject: [PATCH 045/132] Chatbot: question-matching on questions input #592 --- app/components/Button/button.css | 2 +- app/components/Chatbot/index.tsx | 8 +++++--- app/components/Chatbot/widgit.css | 5 +++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 87cfb8e6..4f848a1c 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -218,4 +218,4 @@ .button[disabled] { opacity: 0.6; cursor: inherit; -} +} \ No newline at end of file diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index d099d446..9bbd9b61 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -73,9 +73,11 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { return ( <div className="widget-ask fcol-10"> {results.length > 0 ? ( - <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> - {results[0].title} - </Button> + <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> + <p className="default"> + {results[0].title} + </p> + </Button> ) : undefined} <div className="flex-container"> <Input diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 52931a66..a1b182cc 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -52,6 +52,11 @@ .widget-ask .suggestion { border: 1px solid var(--colors-cool-grey-200, #dfe3e9); justify-content: start; + padding: var(--spacing-8) var(--spacing-12); +} + +.widget-ask .suggestion:hover { + background: var(--colors-teal-50); } .widget-ask .send { From 5e16b4b55486f25d776d66dfa441f2e33c9f4d92 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Wed, 8 May 2024 20:36:25 -0400 Subject: [PATCH 046/132] Lint --- app/components/Button/button.css | 2 +- app/components/Chatbot/index.tsx | 8 +++----- app/components/Chatbot/widgit.css | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 4f848a1c..87cfb8e6 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -218,4 +218,4 @@ .button[disabled] { opacity: 0.6; cursor: inherit; -} \ No newline at end of file +} diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 9bbd9b61..6278cdd2 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -73,11 +73,9 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { return ( <div className="widget-ask fcol-10"> {results.length > 0 ? ( - <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> - <p className="default"> - {results[0].title} - </p> - </Button> + <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> + <p className="default">{results[0].title}</p> + </Button> ) : undefined} <div className="flex-container"> <Input diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index a1b182cc..6673d6c2 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -56,7 +56,7 @@ } .widget-ask .suggestion:hover { - background: var(--colors-teal-50); + background: var(--colors-teal-50); } .widget-ask .send { From aeb41b2a83f6e2fa14caa7102a4df40aa986f235 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 22 May 2024 21:02:14 +0200 Subject: [PATCH 047/132] matomo tracking --- .github/workflows/deploy-dev.yml | 2 +- .github/workflows/deploy.yml | 2 +- app/root.tsx | 46 ++++++++++++++++---------------- remix.env.d.ts | 2 +- wrangler.toml.template | 4 +-- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index 8d51c6c1..a7634beb 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -24,7 +24,7 @@ jobs: | sed s/{CODA_TOKEN}/${{ secrets.CODA_TOKEN }}/ \ | sed s/{CODA_INCOMING_TOKEN}/${{ secrets.CODA_INCOMING_TOKEN }}/ \ | sed s/{CODA_WRITES_TOKEN}/${{ secrets.CODA_WRITES_TOKEN }}/ \ - | sed s/{GOOGLE_ANALYTICS_ID}/${{ secrets.GOOGLE_ANALYTICS_ID }}/ \ + | sed s/{MATOMO_DOMAIN}/${{ secrets.MATOMO_DOMAIN }}/ \ | sed s/{DISCORD_LOGGING_CHANNEL_ID}/${{ secrets.DISCORD_LOGGING_CHANNEL_ID }}/ \ | sed s/{DISCORD_LOGGING_TOKEN}/${{ secrets.DISCORD_LOGGING_TOKEN }}/ \ > wrangler.toml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a9031a90..0bca1d15 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -23,7 +23,7 @@ jobs: | sed s/{CODA_TOKEN}/${{ secrets.CODA_TOKEN }}/ \ | sed s/{CODA_INCOMING_TOKEN}/${{ secrets.CODA_INCOMING_TOKEN }}/ \ | sed s/{CODA_WRITES_TOKEN}/${{ secrets.CODA_WRITES_TOKEN }}/ \ - | sed s/{GOOGLE_ANALYTICS_ID}/${{ secrets.GOOGLE_ANALYTICS_ID }}/ \ + | sed s/{MATOMO_DOMAIN}/${{ secrets.MATOMO_DOMAIN }}/ \ | sed s/{DISCORD_LOGGING_CHANNEL_ID}/${{ secrets.DISCORD_LOGGING_CHANNEL_ID }}/ \ | sed s/{DISCORD_LOGGING_TOKEN}/${{ secrets.DISCORD_LOGGING_TOKEN }}/ \ > wrangler.toml diff --git a/app/root.tsx b/app/root.tsx index 14b8c447..e1300672 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -101,31 +101,31 @@ export const loader = async ({request}: Parameters<LoaderFunction>[0]) => { url: request.url, embed, showSearch, - gaTrackingId: GOOGLE_ANALYTICS_ID, + matomoDomain: MATOMO_DOMAIN, } } -const GoogleAnalytics = ({gaTrackingId}: {gaTrackingId?: string}) => { - if (!gaTrackingId) return null +const AnaliticsTag = ({matomoDomain}: {matomoDomain?: string}) => { + if (!matomoDomain) return null return ( - <> - <script async src={`https://www.googletagmanager.com/gtag/js?id=${gaTrackingId}`} /> - <script - async - id="gtag-init" - dangerouslySetInnerHTML={{ - __html: ` - window.dataLayer = window.dataLayer || []; - function gtag(){dataLayer.push(arguments);} - gtag('js', new Date()); - - gtag('config', '${gaTrackingId}', { - page_path: window.location.pathname, - }); - `, - }} - /> - </> + <script + async + dangerouslySetInnerHTML={{ + __html: ` + var _paq = window._paq = window._paq || []; + /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ + _paq.push(["disableCookies"]); + _paq.push(['trackPageView']); + _paq.push(['enableLinkTracking']); + (function() { + var u="https://${matomoDomain}.matomo.cloud/"; + _paq.push(['setTrackerUrl', u+'matomo.php']); + _paq.push(['setSiteId', '3']); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.async=true; g.src='https://cdn.matomo.cloud/${matomoDomain}.matomo.cloud/matomo.js'; s.parentNode.insertBefore(g,s); + })();`, + }} + /> ) } @@ -182,7 +182,7 @@ type Loader = Awaited<ReturnType<typeof loader>> export type Context = Pick<Loader, 'embed' | 'showSearch'> export default function App() { - const {embed, showSearch, gaTrackingId} = useLoaderData<Loader>() + const {embed, showSearch, matomoDomain} = useLoaderData<Loader>() const {savedTheme} = useTheme() const context: Context = {embed, showSearch} @@ -208,7 +208,7 @@ export default function App() { return ( <BasePage embed={embed} savedTheme={savedTheme}> - <GoogleAnalytics gaTrackingId={gaTrackingId} /> + <AnaliticsTag matomoDomain={matomoDomain} /> <Outlet context={context} /> <ScrollRestoration /> <Scripts /> diff --git a/remix.env.d.ts b/remix.env.d.ts index d6850c57..f478e17f 100644 --- a/remix.env.d.ts +++ b/remix.env.d.ts @@ -10,6 +10,6 @@ declare const CODA_WRITES_TOKEN: string declare const NLP_SEARCH_ENDPOINT: string declare const ALLOW_ORIGINS: string declare const CHATBOT_URL: string -declare const GOOGLE_ANALYTICS_ID: string +declare const MATOMO_DOMAIN: string declare const DISCORD_LOGGING_CHANNEL_ID: string declare const DISCORD_LOGGING_TOKEN: string diff --git a/wrangler.toml.template b/wrangler.toml.template index 1ff813c1..1eb26e82 100644 --- a/wrangler.toml.template +++ b/wrangler.toml.template @@ -21,6 +21,6 @@ CODA_INCOMING_TOKEN = "{CODA_INCOMING_TOKEN}" CODA_WRITES_TOKEN = "{CODA_WRITES_TOKEN}" NLP_SEARCH_ENDPOINT = "https://stampy-nlp-t6p37v2uia-uw.a.run.app/" ALLOW_ORIGINS = "https://chat.aisafety.info" -GOOGLE_ANALYTICS_ID = "{GOOGLE_ANALYTICS_ID}" +MATOMO_DOMAIN = "{MATOMO_DOMAIN}" DISCORD_LOGGING_CHANNEL_ID = "{DISCORD_LOGGING_CHANNEL_ID}" -DISCORD_LOGGING_TOKEN = "{DISCORD_LOGGING_TOKEN}" \ No newline at end of file +DISCORD_LOGGING_TOKEN = "{DISCORD_LOGGING_TOKEN}" From 102db37bdab01a46d698b04fe55874c158d3e89c Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 22 May 2024 21:07:55 +0200 Subject: [PATCH 048/132] show banners --- app/components/Article/article.css | 15 ++ app/components/Article/index.tsx | 27 ++- app/components/Chatbot/index.tsx | 4 +- app/hooks/useQuestionStateInUrl.ts | 292 ----------------------- app/hooks/useSearch.tsx | 33 +-- app/routes/questions.editors.tsx | 77 ------ app/routes/questions.old.$questionId.tsx | 0 app/routes/questions/log.tsx | 7 - 8 files changed, 54 insertions(+), 401 deletions(-) delete mode 100644 app/hooks/useQuestionStateInUrl.ts delete mode 100644 app/routes/questions.old.$questionId.tsx delete mode 100644 app/routes/questions/log.tsx diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 10d06fd4..63dc3960 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -175,6 +175,21 @@ article a.see-more.visible:after { content: 'See less'; } +article .banner { + padding: var(--spacing-12) var(--spacing-24); + margin-bottom: var(--spacing-12); +} +article .banner h3 { + display: flex; + align-items: center; +} +article .banner h3 img { + width: 2em; +} +article .banner h3 .title { + padding-left: 10px; +} + @media only screen and (max-width: 780px) { article { max-width: 100%; diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 905f51d7..7ddc29f6 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -5,8 +5,8 @@ import CopyIcon from '~/components/icons-generated/Copy' import EditIcon from '~/components/icons-generated/Pencil' import Button, {CompositeButton} from '~/components/Button' import Feedback from '~/components/Feedback' -import type {Glossary, Question} from '~/server-utils/stampy' import {tagUrl} from '~/routesMapper' +import type {Glossary, Question, Banner as BannerType} from '~/server-utils/stampy' import Contents from './Contents' import './article.css' @@ -87,6 +87,30 @@ const ArticleMeta = ({question, className}: {question: Question; className?: str ) } +const Banner = ({title, text, icon, backgroundColour, textColour}: BannerType) => { + return ( + <div + key={title} + className="banner rounded" + style={{ + backgroundColor: backgroundColour || 'inherit', + color: textColour || 'inherit', + }} + > + <h3> + <img src={icon?.url} alt={icon?.name} /> + <span className="title">{title}</span> + </h3> + <div + className="banner-contents" + dangerouslySetInnerHTML={{ + __html: text, + }} + ></div> + </div> + ) +} + const Tags = ({tags}: Question) => ( <div className="tags"> {tags?.map((tag) => ( @@ -108,6 +132,7 @@ export const Article = ({question, glossary, className}: ArticleProps) => { return ( <article className={`${className} ${isLoading(question) ? 'loading' : ''}`}> <h1 className="teal-500 padding-bottom-24">{title}</h1> + {question.banners?.map(Banner)} <ArticleMeta question={question} className="padding-bottom-56" /> <Contents pageid={pageid} html={text || ''} glossary={glossary || {}} /> diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index d099d446..ffdd6850 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -170,7 +170,7 @@ const SplashScreen = ({ <div className="padding-top-40"> <IconStampyLarge /> <div className="fcol-6 padding-bottom-40 padding-top-40"> - n<h2 className="teal-500">Hi there, I'm Stampy.</h2> + <h2 className="teal-500">Hi there, I'm Stampy.</h2> <h2>I can answer your questions about AI Safety</h2> </div> <Followups @@ -190,7 +190,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const [followups, setFollowups] = useState<Followup[]>() // FIXME: Generate session id - const [sessionId] = useState('asd') + const [sessionId] = useState(crypto.randomUUID()) const [history, setHistory] = useState([] as Entry[]) const [controller, setController] = useState(() => new AbortController()) const fetcher = useFetcher({key: 'followup-fetcher'}) diff --git a/app/hooks/useQuestionStateInUrl.ts b/app/hooks/useQuestionStateInUrl.ts deleted file mode 100644 index d84e6858..00000000 --- a/app/hooks/useQuestionStateInUrl.ts +++ /dev/null @@ -1,292 +0,0 @@ -import {useState, useRef, useEffect, useMemo, useCallback} from 'react' -import {useSearchParams, useNavigation} from '@remix-run/react' -import {Question, QuestionState, RelatedQuestion, PageId, Glossary} from '~/server-utils/stampy' -import {fetchAllQuestionsOnSite} from '~/routes/questions.allQuestionsOnSite' -import {fetchGlossary} from '~/routes/questions.glossary' -import { - processStateEntries, - getStateEntries, - addQuestions as addQuestionsToState, - insertInto as insertIntoState, - moveQuestion as moveQuestionInState, - moveToTop as moveQuestionToTop, -} from '~/hooks/stateModifiers' - -function updateQuestionMap(question: Question, map: Map<PageId, Question>): Map<PageId, Question> { - map.set(question.pageid, question) - for (const {pageid, title} of question.relatedQuestions) { - if (!pageid || map.has(pageid)) continue - - map.set(pageid, { - title, - pageid, - text: null, - answerEditLink: null, - relatedQuestions: [], - tags: [], - banners: [], - }) - } - return map -} - -const emptyQuestionArray: Question[] = [] - -export default function useQuestionStateInUrl(initialQuestions: Question[]) { - const [remixSearchParams, setRemixParams] = useSearchParams() - const transition = useNavigation() - const embedWithoutDetails = - remixSearchParams.has('embed') && !remixSearchParams.has('showDetails') - const queryFromUrl = remixSearchParams.get('q') || '' - const limitFromUrl = parseInt(remixSearchParams.get('limit') ?? '', 10) || undefined - - const removeQueryFromUrl = useCallback(() => { - remixSearchParams.delete('q') - setRemixParams(remixSearchParams) - }, [remixSearchParams, setRemixParams]) - - const [stateString, setStateString] = useState( - () => - remixSearchParams.get('state') && processStateEntries(remixSearchParams.get('state') ?? '') - ) - const [questionMap, setQuestionMap] = useState(() => { - const initialMap: Map<PageId, Question> = new Map() - for (const question of initialQuestions) { - updateQuestionMap(question, initialMap) - } - return initialMap - }) - const [glossary, setGlossary] = useState({} as Glossary) - - const onSiteQuestionsRef = useRef(emptyQuestionArray) - const allowBrowserBackToInitialStateRef = useRef(true) - - useEffect(() => { - // not needed for initial screen => lazy load on client - fetchAllQuestionsOnSite().then(({data, backgroundPromiseIfReloaded}) => { - onSiteQuestionsRef.current = data - backgroundPromiseIfReloaded.then((x) => { - if (x) onSiteQuestionsRef.current = x.data - }) - }) - fetchGlossary().then(({data, backgroundPromiseIfReloaded}) => { - setGlossary(data) - backgroundPromiseIfReloaded.then((x) => { - if (x) setGlossary(x.data) - }) - }) - }, []) - - useEffect(() => { - if (transition.location) { - const state = new URLSearchParams(transition.location.search).get('state') - setStateString(state) - } - }, [transition.location]) - - const initialCollapsedState = useMemo( - () => initialQuestions.map(({pageid}) => `${pageid}${QuestionState.COLLAPSED}`).join(''), - [initialQuestions] - ) - const questions: Question[] = useMemo(() => { - return getStateEntries(stateString ?? initialCollapsedState).map(([pageid, questionState]) => ({ - pageid, - title: '...', - text: null, - answerEditLink: null, - relatedQuestions: [], - questionState, - tags: [], - banners: [], - ...questionMap.get(pageid), - })) - }, [stateString, initialCollapsedState, questionMap]) - - const moveToTop = (currentState: string, {pageid}: Question) => { - setTimeout(() => { - // scroll to top after the state is updated - window.scrollTo({ - top: 0, - behavior: 'smooth', - }) - }) - return moveQuestionToTop(currentState, pageid) - } - - /* - * Get all related questions of the provided `question` that aren't already displayed on the site - */ - const unshownRelatedQuestions = ( - questions: Question[], - questionProps: Question - ): RelatedQuestion[] => { - const {relatedQuestions} = questionProps - - const onSiteQuestions = onSiteQuestionsRef.current - const onSiteSet = new Set(onSiteQuestions.map(({pageid}) => pageid)) - - return relatedQuestions.filter((question) => { - const isOnSite = onSiteSet.has(question.pageid) - // hide already displayed questions, detect duplicates by pageid (pageid can be different due to redirects) - // TODO: #25 relocate already displayed to slide in as a new related one - const isAlreadyDisplayed = questions.some(({pageid}) => pageid === question.pageid) - return isOnSite && !isAlreadyDisplayed - }) - } - - /* - * Update the window.location with the new URL state - */ - const updateStateString = useCallback( - (newState: string) => { - if (stateString == newState) return - const newSearchParams = new URLSearchParams(remixSearchParams) - newSearchParams.set('state', newState) - - const newUrl = '?' + newSearchParams.toString() - if (allowBrowserBackToInitialStateRef.current) { - history.pushState(newState, '', newUrl) - allowBrowserBackToInitialStateRef.current = false - } else { - history.replaceState(newState, '', newUrl) - } - - setStateString(newState) - }, - [remixSearchParams, stateString] - ) - - /* - * Add the given `questions` to the global questions map. This will not update the URL - */ - const mergeNewQuestions = useCallback((questions: Question[]) => { - setQuestionMap((currentMap) => - questions.reduce((map, question) => updateQuestionMap(question, map), new Map(currentMap)) - ) - }, []) - - /* - * Add the given `newQuestions` to the collection of questions. This will also update the URL - */ - const addQuestions = useCallback( - (newQuestions: Question[]) => { - const questions = newQuestions.filter((q) => !questionMap.get(q.pageid)) - mergeNewQuestions(questions) - - const newState = addQuestionsToState(stateString ?? initialCollapsedState, questions) - updateStateString(newState) - }, - [initialCollapsedState, stateString, questionMap, updateStateString, mergeNewQuestions] - ) - - /* - * Toggle the selected question. - * - * If the question is to be opened, this will also make sure all it's related questions - * are on the page - */ - const toggleQuestion = useCallback( - (questionProps: Question, options?: {moveToTop?: boolean; onlyRelated?: boolean}) => { - const {pageid, relatedQuestions} = questionProps - - let currentState = stateString ?? initialCollapsedState - - if (options?.moveToTop) { - currentState = moveToTop(currentState, questionProps) - } - - const onSiteQuestions = onSiteQuestionsRef.current - if (onSiteQuestions.length === 0 && relatedQuestions.length > 0) { - // if onSiteAnswers (needed for relatedQuestions) are not loaded yet, wait a moment to re-run - setTimeout(() => toggleQuestion(questionProps, options), 200) - return - } - - const newRelatedQuestions = unshownRelatedQuestions(questions, questionProps) - const newState = insertIntoState(currentState, pageid, newRelatedQuestions, { - toggle: !options?.onlyRelated, - }) - - updateStateString(newState) - }, - [initialCollapsedState, questions, stateString, updateStateString] - ) - - const onLazyLoadQuestion = useCallback( - (question: Question) => mergeNewQuestions([question]), - [mergeNewQuestions] - ) - - const moveQuestion = useCallback( - (pageId: PageId, to: PageId | null) => { - const currentState = stateString ?? initialCollapsedState - updateStateString(moveQuestionInState(currentState, pageId, to ?? '')) - }, - [initialCollapsedState, stateString, updateStateString] - ) - - /* - * Moves the given question to the top of the page, opens it, and make sure all related ones are loaded - */ - const selectQuestion = useCallback( - (pageid: string, title: string) => { - // if the question is already loaded, move it to top - for (const q of questionMap.values()) { - if (pageid === q.pageid) { - toggleQuestion(q, {moveToTop: true}) - return - } - } - // else show the new question in main view and let the Question component fetch it - const tmpQuestion: Question = { - pageid, - title, - text: null, - answerEditLink: null, - relatedQuestions: [], - tags: [], - banners: [], - } - onLazyLoadQuestion(tmpQuestion) - toggleQuestion(tmpQuestion, {moveToTop: true}) - }, - [onLazyLoadQuestion, questionMap, toggleQuestion] - ) - - // if there is only 1 question from a direct link, load related questions too - useEffect(() => { - if (questions.length === 1) { - const insertAfterOnSiteStatusIsKnown = () => { - if (onSiteQuestionsRef.current.length === 0) { - setTimeout(insertAfterOnSiteStatusIsKnown, 200) - return - } - const relatedQuestions = unshownRelatedQuestions([], questions[0]) - const newState = insertIntoState( - stateString ?? initialCollapsedState, - questions[0].pageid, - relatedQuestions, - {toggle: false} - ) - - updateStateString(newState) - } - insertAfterOnSiteStatusIsKnown() - } - }, [questions, stateString, initialCollapsedState, updateStateString]) - - return { - questions, - onSiteQuestionsRef, - toggleQuestion, - onLazyLoadQuestion, - selectQuestion, - addQuestions, - moveQuestion, - glossary, - embedWithoutDetails, - queryFromUrl, - limitFromUrl, - removeQueryFromUrl, - } -} diff --git a/app/hooks/useSearch.tsx b/app/hooks/useSearch.tsx index e3063154..d363e4b0 100644 --- a/app/hooks/useSearch.tsx +++ b/app/hooks/useSearch.tsx @@ -1,6 +1,6 @@ import {useState, useEffect, useRef} from 'react' -import {fetchAllQuestionsOnSite} from '~/routes/questions.allQuestionsOnSite' import {Question} from '~/server-utils/stampy' +import {useOnSiteQuestions} from './useCachedObjects' const NUM_RESULTS = 8 @@ -140,16 +140,7 @@ export const useSearch = (numResults = NUM_RESULTS) => { const resultsForRef = useRef<string>() const [results, setResults] = useState([] as SearchResult[]) - const onSiteAnswersRef = useRef<Question[]>([]) - useEffect(() => { - // not needed for initial screen => lazy load on client - fetchAllQuestionsOnSite().then(({data, backgroundPromiseIfReloaded}) => { - onSiteAnswersRef.current = data - backgroundPromiseIfReloaded.then((x) => { - if (x) onSiteAnswersRef.current = x.data - }) - }) - }, []) + const {items} = useOnSiteQuestions() useEffect(() => { const makeWorker = async () => { @@ -183,7 +174,7 @@ export const useSearch = (numResults = NUM_RESULTS) => { const search = (userQuery: string, minSimilarity?: number) => { isPendingSearch.current = true const wordCount = userQuery.split(' ').length - if (wordCount > 2) { + if (wordCount > 2 && tfWorkerRef.current) { if (runningQueryRef.current || !tfWorkerRef.current) { searchLater(userQuery, minSimilarity) return @@ -191,20 +182,18 @@ export const useSearch = (numResults = NUM_RESULTS) => { runningQueryRef.current = userQuery tfWorkerRef.current.postMessage({userQuery, numResults, minSimilarity}) } else { - if (runningQueryRef.current || onSiteAnswersRef.current.length == 0) { + if (!items || items?.length == 0) { searchLater(userQuery, minSimilarity) return } runningQueryRef.current = userQuery - baselineSearch(userQuery, onSiteAnswersRef.current, minSimilarity, numResults).then( - (searchResults) => { - runningQueryRef.current = undefined - resultsRef.current = searchResults - resultsForRef.current = userQuery - isPendingSearch.current = false - setResults(searchResults) - } - ) + baselineSearch(userQuery, items, minSimilarity, numResults).then((searchResults) => { + runningQueryRef.current = undefined + resultsRef.current = searchResults + resultsForRef.current = userQuery + isPendingSearch.current = false + setResults(searchResults) + }) } } diff --git a/app/routes/questions.editors.tsx b/app/routes/questions.editors.tsx index 465f7a6a..e69de29b 100644 --- a/app/routes/questions.editors.tsx +++ b/app/routes/questions.editors.tsx @@ -1,77 +0,0 @@ -import Nav from '~/components/Nav' -import Footer from '~/components/Footer' -import {fetchAllQuestionsOnSite} from '~/routes/questions.allQuestionsOnSite' -import type {Question} from '../server-utils/stampy' - -const formatTwineQuestion = ({title, text, relatedQuestions, tags}: Question) => { - const formattedTags = tags.map((t) => t.replaceAll(' ', '-')).join(' ') - const links = relatedQuestions.map(({title}) => `[[${title}]]`).join('\n') - - return `:: ${title} [${formattedTags}] {"size":"100,100"}\n${text}\n${links}` -} - -const generateTwine = (data: Question[]) => { - const first = data.filter(({pageid}) => pageid == '9OGZ')[0] - - return ( - `:: StoryTitle -Stampy - - -:: StoryData -{ -"ifid": "3B314495-7266-46FE-AD5E-96C9F6FD54D4", -"format": "Snowman", -"format-version": "2.0.2", -"start": "${first.title}", -"zoom": 1 -} - ` + data.map(formatTwineQuestion).join('\n\n') - ) -} - -export default function App() { - const downloadTwine = async () => { - const {data} = await fetchAllQuestionsOnSite() - - const blob = new Blob([generateTwine(data)], {type: 'text/plain'}) - - // Create a temporary URL for the blob - const url = URL.createObjectURL(blob) - - // Create a temporary "download" link - const link = document.createElement('a') - link.href = url - link.download = 'stampy.twee' - - // Programatically triggering the download - link.click() - - // Cleanup: removing the temporary URL object - URL.revokeObjectURL(url) - } - - return ( - <> - <Nav categories={[]} toc={[]} /> - <main> - <ul className="urls"> - <li> - <a href="/questions/cache">Cache</a> - </li> - <li> - <a href="/random">Random question</a> - </li> - <li> - <a href="/toc">Table of Contents</a> - </li> - <li> - <button onClick={downloadTwine}>Download questions for Twine</button> - </li> - </ul> - </main> - - <Footer /> - </> - ) -} diff --git a/app/routes/questions.old.$questionId.tsx b/app/routes/questions.old.$questionId.tsx deleted file mode 100644 index e69de29b..00000000 diff --git a/app/routes/questions/log.tsx b/app/routes/questions/log.tsx deleted file mode 100644 index 05407a16..00000000 --- a/app/routes/questions/log.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import type {ActionFunction} from '@remix-run/cloudflare' - -export const action = async ({request}: Parameters<ActionFunction>[0]) => { - const {query, name, type} = (await request.json()) as any - const url = `${NLP_SEARCH_ENDPOINT}/api/log_query?name=${name}&type=${type}&query=${query}` - return await fetch(url) -} From 3338bf5bbf2029ef6f0b3ed28081897a72c6d50b Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 16:01:48 -0400 Subject: [PATCH 049/132] Feedback updated, ButtonSecondary added --- .gitignore | 1 + app/components/Article/article.css | 4 - app/components/Article/index.tsx | 38 ++++++--- .../ButtonSecondary/button_secondary.css | 15 ++++ app/components/ButtonSecondary/index.tsx | 81 +++++++++++++++++++ app/components/Feedback/Form.tsx | 14 ++-- app/components/Feedback/feedback.css | 6 +- app/components/Feedback/index.tsx | 52 ++++++++---- app/root.css | 3 + app/routes/questions.actions.tsx | 39 ++++----- package.json | 6 +- tailwind.config.js | 9 +++ 12 files changed, 212 insertions(+), 56 deletions(-) create mode 100644 app/components/ButtonSecondary/button_secondary.css create mode 100644 app/components/ButtonSecondary/index.tsx create mode 100644 tailwind.config.js diff --git a/.gitignore b/.gitignore index c151d768..89a15d94 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ wrangler.toml *.sqlite .wrangler +pnpm-lock.yaml diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 63dc3960..acd930a3 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -161,10 +161,6 @@ article .footer-comtainer { margin-bottom: var(--spacing-24); } -article .footer-comtainer > * { - margin: var(--spacing-8, 8px); -} - article a.see-more:not(.visible) + div.see-more-contents { display: none; } diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 7ddc29f6..2ad57909 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -4,7 +4,8 @@ import KeepGoing from '~/components/Article/KeepGoing' import CopyIcon from '~/components/icons-generated/Copy' import EditIcon from '~/components/icons-generated/Pencil' import Button, {CompositeButton} from '~/components/Button' -import Feedback from '~/components/Feedback' +import ButtonSecondary, {ButtonSecondaryWrapper} from '../ButtonSecondary' +import Feedback, {logFeedback} from '~/components/Feedback' import {tagUrl} from '~/routesMapper' import type {Glossary, Question, Banner as BannerType} from '~/server-utils/stampy' import Contents from './Contents' @@ -22,21 +23,34 @@ const ArticleFooter = (question: Question) => { return ( !isLoading(question) && ( - <div className="footer-comtainer padding-bottom-40"> + <div className="footer-comtainer padding-bottom-40 space-x-4"> {date && <div className="grey"> {`Updated ${date}`}</div>} - <div className="flex-double"> - <Button - className="secondary" + <ButtonSecondaryWrapper> + <ButtonSecondary action={question.answerEditLink || ''} - tooltip="Suggest changes in Google Docs" + tooltip="Google Doc" props={{target: '_blank', rel: 'noopener noreferrer'}} > - <EditIcon className="no-fill" /> - </Button> - </div> - <span>Was this page helpful?</span> - - <Feedback pageid={question.pageid} labels /> + <EditIcon /> + </ButtonSecondary> + </ButtonSecondaryWrapper> + <Feedback + showForm + formClassName="left-[845px]" + pageid={question.pageid} + onSubmit={async (message: string, option?: string) => + logFeedback({ + message, + option, + type: 'bot', + question: question.title || '', + answer: question.text || '', + }) + } + options={['Unclear', 'Too wordy', 'Confusing', 'Incorrect', 'Other']} + upHint="This page was helpful" + downHint="This page was unhelpful" + /> </div> ) ) diff --git a/app/components/ButtonSecondary/button_secondary.css b/app/components/ButtonSecondary/button_secondary.css new file mode 100644 index 00000000..bc9eb248 --- /dev/null +++ b/app/components/ButtonSecondary/button_secondary.css @@ -0,0 +1,15 @@ +.button-secondary .tool-tip { + opacity: 0; +} + +.button-secondary:hover .tool-tip { + opacity: 1; +} + +.thumb path { + stroke: #788492; +} + +.active path { + stroke: var(--colors-teal-600); +} diff --git a/app/components/ButtonSecondary/index.tsx b/app/components/ButtonSecondary/index.tsx new file mode 100644 index 00000000..028cadab --- /dev/null +++ b/app/components/ButtonSecondary/index.tsx @@ -0,0 +1,81 @@ +import {ReactNode} from 'react' +import {Link} from '@remix-run/react' +import './button_secondary.css' + +type ButtonProps = { + action?: string | (() => void) + children?: ReactNode + className?: string + tooltip?: string + active?: boolean + disabled?: boolean + props?: {[k: string]: any} +} +const ButtonSecondary = ({ + children, + action, + tooltip, + className, + active = false, + disabled = false, + props, +}: ButtonProps) => { + if (typeof action === 'string') { + return ( + <Link + to={action} + className={ + 'button-secondary relative leading-7 p-1 rounded-[6px] ' + + (active ? 'bg-[#EDFAF9] active' : disabled ? '' : 'hover:bg-[#F9FAFC]') + + (className ? ' ' + className : '') + } + onClick={(e) => { + if (disabled) { + e.preventDefault() + } + }} + {...props} + > + {children} + {tooltip && !disabled && ( + <p className="tool-tip absolute top-[-42px] left-1/2 transform -translate-x-1/2 bg-[#1B2B3E] text-[14px] text-[#f2f2f2] py-[5px] px-[15px] rounded-[8px] whitespace-nowrap pointer-events-none"> + {tooltip} + </p> + )} + </Link> + ) + } + return ( + <button + className={ + 'button-secondary relative leading-7 p-1 rounded-[6px] ' + + (active ? 'bg-[#EDFAF9] active' : disabled ? '' : 'hover:bg-[#F9FAFC]') + + (className ? ' ' + className : '') + } + onClick={action} + disabled={disabled} + {...props} + > + {children} + {tooltip && !disabled && ( + <p className="tool-tip absolute top-[-42px] left-1/2 transform -translate-x-1/2 bg-[#1B2B3E] text-[14px] text-[#f2f2f2] py-[5px] px-[15px] rounded-[8px] whitespace-nowrap pointer-events-none"> + {tooltip} + </p> + )} + </button> + ) +} + +export interface ButtonSecondaryWrapperProps { + children: ReactNode + className?: string +} +export const ButtonSecondaryWrapper = ({children, className}: ButtonSecondaryWrapperProps) => ( + <div + className={`flex border-[var(--colors-cool-grey-200)] border-[1px] rounded-[6px] space-x-[4px] p-[7px] justify-center items-center size-min ${className || ''}`} + > + {children} + </div> +) + +export default ButtonSecondary diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index e9379fd7..460151d1 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -6,9 +6,10 @@ import './feedback.css' export type FeedbackFormProps = { onSubmit?: (msg: string, option?: string) => Promise<any> onClose?: () => void + className?: string options?: string[] } -const FeedbackForm = ({onSubmit, onClose, options}: FeedbackFormProps) => { +const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps) => { const [selected, setSelected] = useState<string>() const [message, setMessage] = useState('') const [enabledSubmit, setEnabledSubmit] = useState(!options) @@ -16,10 +17,10 @@ const FeedbackForm = ({onSubmit, onClose, options}: FeedbackFormProps) => { const clickCheckerRef = useOutsideOnClick(onClose) useEffect(() => { - // Hide the form after 10 seconds if the user hasn't interacted with it + // Hide the form after 15 seconds if the user hasn't interacted with it const timeoutId = setInterval(() => { onClose && onClose() - }, 10000) + }, 15000) // Clear the timeout to prevent it from running if the component unmounts return () => clearInterval(timeoutId) @@ -39,9 +40,12 @@ const FeedbackForm = ({onSubmit, onClose, options}: FeedbackFormProps) => { <div ref={clickCheckerRef} onClick={() => setNumClicks((current) => current + 1)} - className="fcol-5 feedback-form bordered" + className={ + 'flex flex-col feedback-form bordered !fixed top-[50px] left-[calc(13.333vw+85px)] w-[384px] ' + + (className ?? '') + } > - <span className="black small padding-bottom-32">What was the problem?</span> + <span className="black small pb-8">What was the problem?</span> {options?.map((option) => ( <Button key={option} diff --git a/app/components/Feedback/feedback.css b/app/components/Feedback/feedback.css index 992b807b..95f72a7c 100644 --- a/app/components/Feedback/feedback.css +++ b/app/components/Feedback/feedback.css @@ -28,7 +28,6 @@ padding: var(--spacing-12); margin: var(--spacing-40) 0; box-sizing: content-box; - background: pink; } .feedback-text.no-options { margin: var(--spacing-16) 0; @@ -38,6 +37,11 @@ opacity: 1; } +.thanks { + opacity: 0; + transition: opacity 0.25s ease-in-out; /* Transition effect */ +} + .composite-button > .feedback-form { position: absolute; transform: translate(-9vw, var(--spacing-56)); diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 047384cb..88d492cf 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -1,9 +1,9 @@ -import {useEffect, useState} from 'react' -import {CompositeButton} from '~/components/Button' +import {useEffect, useState, useRef} from 'react' import {Action, ActionType} from '~/routes/questions.actions' import './feedback.css' import FeedbackForm from './Form' import type {Citation} from '~/hooks/useChat' +import {ButtonSecondaryWrapper} from '../ButtonSecondary' type FeedbackType = { option?: string @@ -29,8 +29,9 @@ type FeedbackProps = { labels?: boolean upHint?: string downHint?: string + formClassName?: string options?: string[] - onSubmit?: (message: string, option?: string) => Promise<any> + onSubmit: (message: string, option?: string) => Promise<any> } const Feedback = ({ pageid, @@ -39,48 +40,69 @@ const Feedback = ({ upHint, downHint, options, + formClassName, onSubmit, }: FeedbackProps) => { - const [showFeedback, setShowFeedback] = useState(false) + const [showThanks, setShowThanks] = useState(false) const [showFeedbackForm, setShowFeedbackForm] = useState(false) + const [vote, setVote]: any = useState(undefined) + + const thanksRef = useRef<HTMLDivElement | null>(null) useEffect(() => { - const timeout = setInterval(() => setShowFeedback(false), 6000) - return () => clearInterval(timeout) - }, [showFeedback]) + if (showThanks && thanksRef.current) { + thanksRef.current.style.opacity = '1' + setTimeout(() => { + if (thanksRef.current) thanksRef.current.style.opacity = '0' + }, 6000) + } + }, [showThanks]) return ( - <div className="feedback relative"> - <CompositeButton className="flex-container"> + <div className="flex items-center"> + <ButtonSecondaryWrapper> <Action pageid={pageid} showText={!!labels} actionType={ActionType.HELPFUL} + active={vote === 'helpful'} + dissabled={!!vote} hint={upHint} - onClick={() => setShowFeedback(true)} + onClick={() => { + setVote('helpful') + setShowThanks(true) + }} /> <Action pageid={pageid} showText={!!labels} hint={downHint} actionType={ActionType.UNHELPFUL} + active={vote === 'unhelpful'} + dissabled={!!vote} onClick={() => { - setShowFeedback(!showForm) + setVote('unhelpful') + setShowThanks(!showForm) setShowFeedbackForm(!!showForm) }} /> - </CompositeButton> + </ButtonSecondaryWrapper> - {showFeedback && <div className="thanks">Thanks for your feedback!</div>} + <div ref={thanksRef} className="thanks ml-2 opacity-0 pointer-events-none"> + Thank you for your feedback! + </div> {showFeedbackForm && ( <FeedbackForm - onSubmit={onSubmit} + onSubmit={(att) => { + setShowThanks(true) + return onSubmit(att) + }} onClose={() => { - setShowFeedback(true) setShowFeedbackForm(false) }} options={options} + className={formClassName} /> )} </div> diff --git a/app/root.css b/app/root.css index 6af755df..bab7786c 100644 --- a/app/root.css +++ b/app/root.css @@ -1,4 +1,7 @@ @import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Raleway&display=swap'); +@import 'tailwindcss/base'; +@import 'tailwindcss/components'; +@import 'tailwindcss/utilities'; :root { /* colors */ diff --git a/app/routes/questions.actions.tsx b/app/routes/questions.actions.tsx index b08f5a92..1f11bc64 100644 --- a/app/routes/questions.actions.tsx +++ b/app/routes/questions.actions.tsx @@ -3,10 +3,18 @@ import type {ActionFunctionArgs} from '@remix-run/cloudflare' import {Form, useSearchParams} from '@remix-run/react' import {json} from '@remix-run/cloudflare' import {makeColumnIncrementer} from '~/server-utils/stampy' -import ThumbUpIcon from '~/components/icons-generated/ThumbUp' -import ThumbDownIcon from '~/components/icons-generated/ThumbDown' -import Button from '~/components/Button' -import {DarkLight, Edit, Flag, Followup, Hide, Like, Search} from '~/components/icons-generated' +import ButtonSecondary from '~/components/ButtonSecondary' +import { + DarkLight, + Edit, + Flag, + Followup, + Hide, + Like, + Search, + ThumbDownLarge, + ThumbUpLarge, +} from '~/components/icons-generated' export enum ActionType { DARKLIGHT = 'darkLight', @@ -50,12 +58,12 @@ const actions = { handler: makeColumnIncrementer('Request Count'), }, helpful: { - Icon: ThumbUpIcon, + Icon: ThumbUpLarge, title: 'Yes', handler: makeColumnIncrementer('Helpful'), }, unhelpful: { - Icon: ThumbDownIcon, + Icon: ThumbDownLarge, title: 'No', handler: makeColumnIncrementer('Unhelpful'), }, @@ -91,7 +99,8 @@ type Props = { actionType: ActionType showText?: boolean hint?: string - children?: ReactNode | ReactNode[] + dissabled?: boolean + active?: boolean [k: string]: unknown onSuccess?: () => void onClick?: () => void @@ -100,8 +109,9 @@ export const Action = ({ pageid, actionType, showText = true, + dissabled = false, + active = false, hint, - children, onSuccess, onClick, ...props @@ -157,14 +167,12 @@ export const Action = ({ } } - const className = 'secondary icon-link' + (actionTaken ? ' focused' : '') - return ( <Form + className="!leading-[0px]" replace action="/questions/actions" method="post" - title={hint || title} onClick={handleAction} {...props} > @@ -172,14 +180,9 @@ export const Action = ({ <input type="hidden" name="pageid" value={pageid} /> <input type="hidden" name="incBy" value={actionTaken ? -1 : 1} /> <input type="hidden" name="stateString" value={stateString} /> - {children} - <Button className={className}> + <ButtonSecondary disabled={dissabled} active={active} tooltip={hint}> <Icon /> - <p className={[actionTaken ? 'teal-500' : 'grey', 'small'].join(' ')}> - {' '} - {showText && (hint || title)} - </p> - </Button> + </ButtonSecondary> </Form> ) } diff --git a/package.json b/package.json index 26162510..d5f0b715 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "description": "", "license": "MIT", "dependencies": { + "@cloudflare/kv-asset-handler": "^0.3.2", "@remix-run/cloudflare": "^2.6.0", "@remix-run/cloudflare-workers": "^2.6.0", "@remix-run/css-bundle": "^1.19.3", @@ -16,7 +17,9 @@ "react": "^18.2.0", "react-auto-height": "^1.2.1", "react-dom": "^18.2.0", - "remix": "^2.6.0" + "react-router-dom": "^6.23.1", + "remix": "^2.6.0", + "tailwindcss": "^3.4.3" }, "devDependencies": { "@cloudflare/workers-types": "^4.20240129.0", @@ -35,6 +38,7 @@ "@types/lodash": "^4.14.202", "@types/markdown-it": "^13.0.7", "@types/markdown-it-footnote": "^3.0.3", + "@types/node": "^20.12.12", "@types/react": "^18.2.53", "@types/react-dom": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.20.0", diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..d8cd6974 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./app/**/*.{js,jsx,ts,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +} + From d211cf2f18a119b5e9fbcf8940e0b34e68ba45be Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 16:53:47 -0400 Subject: [PATCH 050/132] Fixed reference errors by switching to npm --- .gitignore | 1 - package-lock.json | 23061 ++++++++------------------------------------ package.json | 3 - 3 files changed, 3952 insertions(+), 19113 deletions(-) diff --git a/.gitignore b/.gitignore index 89a15d94..c151d768 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,3 @@ wrangler.toml *.sqlite .wrangler -pnpm-lock.yaml diff --git a/package-lock.json b/package-lock.json index a64d0412..41fcd982 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "stampy-ui", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -20,7 +20,8 @@ "react": "^18.2.0", "react-auto-height": "^1.2.1", "react-dom": "^18.2.0", - "remix": "^2.6.0" + "remix": "^2.6.0", + "tailwindcss": "^3.4.3" }, "devDependencies": { "@cloudflare/workers-types": "^4.20240129.0", @@ -68,29 +69,31 @@ "node": ">=18" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@adobe/css-tools": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", "dev": true }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -109,114 +112,43 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.6", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -241,14 +173,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -268,37 +200,37 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", + "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", + "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -317,19 +249,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", - "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", + "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "semver": "^6.3.1" }, "engines": { @@ -349,12 +281,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", + "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -375,9 +307,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -408,74 +340,74 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", + "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -485,35 +417,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", + "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", + "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-wrap-function": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -523,14 +455,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", + "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -540,105 +472,105 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", + "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", + "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -716,9 +648,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -727,13 +659,29 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", + "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", + "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -743,14 +691,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", + "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -760,13 +708,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", + "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -839,12 +787,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", - "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.6.tgz", + "integrity": "sha512-gInH8LEqBp+wkwTVihCd/qf+4s28g81FZyvlIbAurHk9eSiItEKG7E0uNK2UdpgsD79aJVAW3R3c85h0YJ0jsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -878,12 +826,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.6.tgz", + "integrity": "sha512-gNkksSdV8RbsCoHF9sjVYrHfYACMl/8U32UfUhJ9+84/ASXw8dlx+eHyyF0m6ncQJ9IBSxfuCkB36GJqYdXTOA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -893,12 +841,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", + "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -908,12 +856,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", + "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -947,12 +895,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz", + "integrity": "sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1064,12 +1012,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz", + "integrity": "sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1095,12 +1043,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", + "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1110,14 +1058,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", + "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -1128,14 +1076,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", + "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1145,12 +1093,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", + "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1160,12 +1108,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", + "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1175,13 +1123,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", + "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1191,13 +1139,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", + "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1208,18 +1156,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", + "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "globals": "^11.1.0" }, "engines": { @@ -1230,13 +1178,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", + "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/template": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1246,12 +1194,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", + "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1261,13 +1209,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", + "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1277,12 +1225,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", + "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1292,12 +1240,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", + "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1308,13 +1256,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", + "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1324,12 +1272,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", + "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1340,13 +1288,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.6.tgz", + "integrity": "sha512-1l8b24NoCpaQ13Vi6FtLG1nv6kNoi8PWvQb1AYO7GHZDpFfBYc3lbXArx1lP2KRt8b4pej1eWc/zrRmsQTfOdQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-flow": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1356,13 +1304,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", + "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1372,14 +1320,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", + "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1389,12 +1337,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", + "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1405,12 +1353,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1420,12 +1368,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", + "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1436,12 +1384,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", + "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1451,13 +1399,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", + "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1467,14 +1415,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1484,15 +1432,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", + "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1502,13 +1450,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", + "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1518,13 +1466,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", + "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1534,12 +1482,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", + "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1549,12 +1497,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", + "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1565,12 +1513,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", + "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1581,16 +1529,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", + "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1600,13 +1547,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", + "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1616,12 +1563,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", + "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1632,13 +1579,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", + "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1649,12 +1596,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", + "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1664,13 +1611,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", + "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1680,14 +1627,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", + "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1698,12 +1645,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", + "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1713,12 +1660,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.6.tgz", + "integrity": "sha512-FfZfHXtQ5jYPQsCRyLpOv2GeLIIJhs8aydpNh39vRDjhD411XcfWDni5i7OjP/Rs8GAtTn7sWFFELJSHqkIxYg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1728,12 +1675,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.6.tgz", + "integrity": "sha512-BQTBCXmFRreU3oTUXcGKuPOfXAGb1liNY4AvvFKsOBAJ89RKcTsIrSsnMYkj59fNa66OFKnSa4AJZfy5Y4B9WA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1743,12 +1690,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", + "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1759,12 +1706,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", + "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1774,12 +1721,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", + "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1789,13 +1736,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", + "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1805,12 +1752,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", + "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1820,12 +1767,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", + "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1835,12 +1782,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", + "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1850,15 +1797,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz", + "integrity": "sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/plugin-syntax-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1868,12 +1815,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", + "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1883,13 +1830,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", + "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1899,13 +1846,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", + "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1915,13 +1862,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", + "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1931,26 +1878,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", + "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-assertions": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1962,58 +1910,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.24.6", + "@babel/plugin-transform-async-generator-functions": "^7.24.6", + "@babel/plugin-transform-async-to-generator": "^7.24.6", + "@babel/plugin-transform-block-scoped-functions": "^7.24.6", + "@babel/plugin-transform-block-scoping": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-class-static-block": "^7.24.6", + "@babel/plugin-transform-classes": "^7.24.6", + "@babel/plugin-transform-computed-properties": "^7.24.6", + "@babel/plugin-transform-destructuring": "^7.24.6", + "@babel/plugin-transform-dotall-regex": "^7.24.6", + "@babel/plugin-transform-duplicate-keys": "^7.24.6", + "@babel/plugin-transform-dynamic-import": "^7.24.6", + "@babel/plugin-transform-exponentiation-operator": "^7.24.6", + "@babel/plugin-transform-export-namespace-from": "^7.24.6", + "@babel/plugin-transform-for-of": "^7.24.6", + "@babel/plugin-transform-function-name": "^7.24.6", + "@babel/plugin-transform-json-strings": "^7.24.6", + "@babel/plugin-transform-literals": "^7.24.6", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", + "@babel/plugin-transform-member-expression-literals": "^7.24.6", + "@babel/plugin-transform-modules-amd": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-modules-systemjs": "^7.24.6", + "@babel/plugin-transform-modules-umd": "^7.24.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", + "@babel/plugin-transform-new-target": "^7.24.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", + "@babel/plugin-transform-numeric-separator": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-object-super": "^7.24.6", + "@babel/plugin-transform-optional-catch-binding": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6", + "@babel/plugin-transform-parameters": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-property-literals": "^7.24.6", + "@babel/plugin-transform-regenerator": "^7.24.6", + "@babel/plugin-transform-reserved-words": "^7.24.6", + "@babel/plugin-transform-shorthand-properties": "^7.24.6", + "@babel/plugin-transform-spread": "^7.24.6", + "@babel/plugin-transform-sticky-regex": "^7.24.6", + "@babel/plugin-transform-template-literals": "^7.24.6", + "@babel/plugin-transform-typeof-symbol": "^7.24.6", + "@babel/plugin-transform-unicode-escapes": "^7.24.6", + "@babel/plugin-transform-unicode-property-regex": "^7.24.6", + "@babel/plugin-transform-unicode-regex": "^7.24.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2034,14 +1982,14 @@ } }, "node_modules/@babel/preset-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz", - "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.6.tgz", + "integrity": "sha512-huoe0T1Qs9fQhMWbmqE/NHUeZbqmHDsN6n/jYvPcUUHfuKiPV32C9i8tDhMbQ1DEKTjbBP7Rjm3nSLwlB2X05g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-flow-strip-types": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-transform-flow-strip-types": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2065,16 +2013,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.6.tgz", + "integrity": "sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-syntax-jsx": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-typescript": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -2084,9 +2032,9 @@ } }, "node_modules/@babel/register": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", - "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", + "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -2227,9 +2175,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2239,33 +2187,33 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2274,13 +2222,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2300,17 +2248,21 @@ "dev": true }, "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.1.3.tgz", - "integrity": "sha512-FNcunDuTmEfQTLRLtA6zz+buIXUHj1soPvSWzzQFBC+n2lsy+CGf/NIrR3SEPCmsVNQj70/Jx2lViCpq+09YpQ==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.2.tgz", + "integrity": "sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==", + "dev": true, "dependencies": { - "mime": "^2.5.2" + "mime": "^3.0.0" + }, + "engines": { + "node": ">=16.13" } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240129.0.tgz", - "integrity": "sha512-DfVVB5IsQLVcWPJwV019vY3nEtU88c2Qu2ST5SQxqcGivZ52imagLRK0RHCIP8PK4piSiq90qUC6ybppUsw8eg==", + "version": "1.20240512.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240512.0.tgz", + "integrity": "sha512-VMp+CsSHFALQiBzPdQ5dDI4T1qwLu0mQ0aeKVNDosXjueN0f3zj/lf+mFil5/9jBbG3t4mG0y+6MMnalP9Lobw==", "cpu": [ "x64" ], @@ -2324,9 +2276,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240129.0.tgz", - "integrity": "sha512-t0q8ABkmumG1zRM/MZ/vIv/Ysx0vTAXnQAPy/JW5aeQi/tqrypXkO9/NhPc0jbF/g/hIPrWEqpDgEp3CB7Da7Q==", + "version": "1.20240512.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240512.0.tgz", + "integrity": "sha512-lZktXGmzMrB5rJqY9+PmnNfv1HKlj/YLZwMjPfF0WVKHUFdvQbAHsi7NlKv6mW9uIvlZnS+K4sIkWc0MDXcRnA==", "cpu": [ "arm64" ], @@ -2340,9 +2292,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240129.0.tgz", - "integrity": "sha512-sFV1uobHgDI+6CKBS/ZshQvOvajgwl6BtiYaH4PSFSpvXTmRx+A9bcug+6BnD+V4WgwxTiEO2iR97E1XuwDAVw==", + "version": "1.20240512.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240512.0.tgz", + "integrity": "sha512-wrHvqCZZqXz6Y3MUTn/9pQNsvaoNjbJpuA6vcXsXu8iCzJi911iVW2WUEBX+MpUWD+mBIP0oXni5tTlhkokOPw==", "cpu": [ "x64" ], @@ -2356,9 +2308,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240129.0.tgz", - "integrity": "sha512-O7q7htHaFRp8PgTqNJx1/fYc3+LnvAo6kWWB9a14C5OWak6AAZk42PNpKPx+DXTmGvI+8S1+futBGUeJ8NPDXg==", + "version": "1.20240512.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240512.0.tgz", + "integrity": "sha512-YPezHMySL9J9tFdzxz390eBswQ//QJNYcZolz9Dgvb3FEfdpK345cE/bsWbMOqw5ws2f82l388epoenghtYvAg==", "cpu": [ "arm64" ], @@ -2372,9 +2324,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240129.0.tgz", - "integrity": "sha512-YqGno0XSqqqkDmNoGEX6M8kJlI2lEfWntbTPVtHaZlaXVR9sWfoD7TEno0NKC95cXFz+ioyFLbgbOdnfWwmVAA==", + "version": "1.20240512.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240512.0.tgz", + "integrity": "sha512-SxKapDrIYSscMR7lGIp/av0l6vokjH4xQ9ACxHgXh+OdOus9azppSmjaPyw4/ePvg7yqpkaNjf9o258IxWtvKQ==", "cpu": [ "x64" ], @@ -2388,9 +2340,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240129.0.tgz", - "integrity": "sha512-VyHbih/bqh/RN2FRxnXznG0bpBIg9RfSP1ldbAVnCXFinjOdv0zm2P/RWqOVN9+FgU5sanRltwwT7jGngxZy8w==" + "version": "4.20240512.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240512.0.tgz", + "integrity": "sha512-o2yTEWg+YK/I1t/Me+dA0oarO0aCbjibp6wSeaw52DSE9tDyKJ7S+Qdyw/XsMrKn4t8kF6f/YOba+9O4MJfW9w==" }, "node_modules/@colors/colors": { "version": "1.5.0", @@ -2406,7 +2358,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2418,7 +2370,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2471,9 +2423,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ "ppc64" ], @@ -2885,6 +2837,12 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2910,6 +2868,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2935,9 +2905,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2950,9 +2920,9 @@ "dev": true }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "dev": true, "engines": { "node": ">=14" @@ -2981,31 +2951,31 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", "dev": true, "dependencies": { - "@floating-ui/utils": "^0.2.1" + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", - "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", "dev": true, "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.1" + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", + "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.6.1" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -3013,9 +2983,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==", "dev": true }, "node_modules/@humanwhocodes/config-array": { @@ -3068,9 +3038,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@iarna/toml": { @@ -3083,7 +3053,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3100,7 +3069,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -3112,7 +3080,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3139,15 +3106,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3170,19 +3128,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -3222,15 +3167,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3304,6 +3240,38 @@ } } }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -3319,6 +3287,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", @@ -3361,6 +3343,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/fake-timers/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jest/globals": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", @@ -3376,11 +3372,25 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/reporters": { + "node_modules/@jest/globals/node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -3449,6 +3459,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@jest/reporters/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3655,33 +3681,30 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -3689,14 +3712,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3796,6 +3817,18 @@ "node": ">=16.13" } }, + "node_modules/@miniflare/cache/node_modules/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/@miniflare/core": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/@miniflare/core/-/core-2.14.2.tgz", @@ -3826,6 +3859,18 @@ "node": ">=10" } }, + "node_modules/@miniflare/core/node_modules/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/@miniflare/d1": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/@miniflare/d1/-/d1-2.14.2.tgz", @@ -3854,6 +3899,18 @@ "node": ">=16.13" } }, + "node_modules/@miniflare/durable-objects/node_modules/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/@miniflare/html-rewriter": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.14.2.tgz", @@ -3869,6 +3926,18 @@ "node": ">=16.13" } }, + "node_modules/@miniflare/html-rewriter/node_modules/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/@miniflare/kv": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/@miniflare/kv/-/kv-2.14.2.tgz", @@ -3907,6 +3976,18 @@ "node": ">=16.13" } }, + "node_modules/@miniflare/r2/node_modules/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/@miniflare/runner-vm": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.14.2.tgz", @@ -4024,10 +4105,22 @@ "node": ">=16.13" } }, + "node_modules/@miniflare/web-sockets/node_modules/undici": { + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/@miniflare/web-sockets/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "engines": { "node": ">=10.0.0" @@ -4070,7 +4163,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -4083,7 +4175,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -4092,7 +4183,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4102,9 +4192,9 @@ } }, "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -4175,7 +4265,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" @@ -4845,12 +4934,12 @@ } }, "node_modules/@remix-run/cloudflare": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/cloudflare/-/cloudflare-2.6.0.tgz", - "integrity": "sha512-wL6d9oaaSNherRQZI11q+qedqGDkQdu85BZYgeg6MLoMvyX2ogHe004ZIZAsAfk0LYET1YR0gY1jIGTfXaHYdg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/cloudflare/-/cloudflare-2.9.2.tgz", + "integrity": "sha512-gTITKNS4kEx3svcyXsobC5ODTZJ09P1+NMymr1fi6wLkLpUmLa1jLdPBrfo60b5acAmxPWRTtTtL+UJPHnjHYQ==", "dependencies": { "@cloudflare/kv-asset-handler": "^0.1.3", - "@remix-run/server-runtime": "2.6.0" + "@remix-run/server-runtime": "2.9.2" }, "engines": { "node": ">=18.0.0" @@ -4866,12 +4955,12 @@ } }, "node_modules/@remix-run/cloudflare-workers": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/cloudflare-workers/-/cloudflare-workers-2.6.0.tgz", - "integrity": "sha512-N7FZxVRdwnuXuqui4s1zi4fnHklAKEG2PkWY453+bJIxdHgeU5HCJSUVs7m+oPHYw21SsPV133iA6z7GsiI1EA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/cloudflare-workers/-/cloudflare-workers-2.9.2.tgz", + "integrity": "sha512-strcxLSLhUmAtumj1AaAB7Azlz5kScLDJsF3fERH/aWBIK4UYBQvwkSmESP5PjekMSVFNlrlCcfPaykZng1JFQ==", "dependencies": { "@cloudflare/kv-asset-handler": "^0.1.3", - "@remix-run/cloudflare": "2.6.0" + "@remix-run/cloudflare": "2.9.2" }, "engines": { "node": ">=18.0.0" @@ -4886,6 +4975,44 @@ } } }, + "node_modules/@remix-run/cloudflare-workers/node_modules/@cloudflare/kv-asset-handler": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.1.3.tgz", + "integrity": "sha512-FNcunDuTmEfQTLRLtA6zz+buIXUHj1soPvSWzzQFBC+n2lsy+CGf/NIrR3SEPCmsVNQj70/Jx2lViCpq+09YpQ==", + "dependencies": { + "mime": "^2.5.2" + } + }, + "node_modules/@remix-run/cloudflare-workers/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@remix-run/cloudflare/node_modules/@cloudflare/kv-asset-handler": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.1.3.tgz", + "integrity": "sha512-FNcunDuTmEfQTLRLtA6zz+buIXUHj1soPvSWzzQFBC+n2lsy+CGf/NIrR3SEPCmsVNQj70/Jx2lViCpq+09YpQ==", + "dependencies": { + "mime": "^2.5.2" + } + }, + "node_modules/@remix-run/cloudflare/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@remix-run/css-bundle": { "version": "1.19.3", "resolved": "https://registry.npmjs.org/@remix-run/css-bundle/-/css-bundle-1.19.3.tgz", @@ -4895,9 +5022,9 @@ } }, "node_modules/@remix-run/dev": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.6.0.tgz", - "integrity": "sha512-wf5DoKxBwz3/84FNyFM6NKvQIOEv+Ukwj9DjXrDs6YLI6oSqw2XsJCxWN4lAbOxXuK37pBt1WAE8LzEMuyowsw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.9.2.tgz", + "integrity": "sha512-70dr9HH/mCHP5+uPoQXyS9+r73IL//IDPaFruIhK8kmmLPGAg5bGyFRz/xX6LTa98gPdAwZXxBy7frudeh2Z0Q==", "dev": true, "dependencies": { "@babel/core": "^7.21.8", @@ -4910,9 +5037,9 @@ "@babel/types": "^7.22.5", "@mdx-js/mdx": "^2.3.0", "@npmcli/package-json": "^4.0.1", - "@remix-run/node": "2.6.0", - "@remix-run/router": "1.15.0", - "@remix-run/server-runtime": "2.6.0", + "@remix-run/node": "2.9.2", + "@remix-run/router": "1.16.1", + "@remix-run/server-runtime": "2.9.2", "@types/mdx": "^2.0.5", "@vanilla-extract/integration": "^6.2.0", "arg": "^5.0.1", @@ -4961,10 +5088,11 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@remix-run/serve": "^2.6.0", + "@remix-run/react": "^2.9.2", + "@remix-run/serve": "^2.9.2", "typescript": "^5.1.0", - "vite": "^5.0.0", - "wrangler": "^3.24.0" + "vite": "^5.1.0", + "wrangler": "^3.28.2" }, "peerDependenciesMeta": { "@remix-run/serve": { @@ -4997,19 +5125,18 @@ } }, "node_modules/@remix-run/node": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.6.0.tgz", - "integrity": "sha512-bWemy3g258Kdqi+4OxIEZ7QS64T96jNK6a7NdlPXGJZqeLpxM5NmlCl/slSdx52oTi9r5Xoz1Tm4uR37nD1/Xw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.9.2.tgz", + "integrity": "sha512-2Mt2107pfelz4T+ziDBef3P4A7kgPqCDshnEYCVGxInivJ3HHwAKUcb7MhGa8uMMMA6LMWxbAPYNHPzC3iKv2A==", "dev": true, "dependencies": { - "@remix-run/server-runtime": "2.6.0", + "@remix-run/server-runtime": "2.9.2", "@remix-run/web-fetch": "^4.4.2", - "@remix-run/web-file": "^3.1.0", - "@remix-run/web-stream": "^1.1.0", "@web3-storage/multipart-parser": "^1.0.0", "cookie-signature": "^1.1.0", "source-map-support": "^0.5.21", - "stream-slice": "^0.1.2" + "stream-slice": "^0.1.2", + "undici": "^6.10.1" }, "engines": { "node": ">=18.0.0" @@ -5024,14 +5151,15 @@ } }, "node_modules/@remix-run/react": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.6.0.tgz", - "integrity": "sha512-m/Ph6bryny7wrmrQyXQMvIiW+cBLrU/MepcLGFPvTVVwvfeiGBgXRiYZJ6yPNsfrmHFaS83d+Ja/Mx4N4zUWcg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.9.2.tgz", + "integrity": "sha512-DcZDzm68MBxGn8hjf/VsuUpjxDYZ8VOOH79P1zWu4hb3hBr90WV1Sa/gIAFUEGpOCcSQ0EG/ci8MaFxcAaPz2Q==", "dependencies": { - "@remix-run/router": "1.15.0", - "@remix-run/server-runtime": "2.6.0", - "react-router": "6.22.0", - "react-router-dom": "6.22.0" + "@remix-run/router": "1.16.1", + "@remix-run/server-runtime": "2.9.2", + "react-router": "6.23.1", + "react-router-dom": "6.23.1", + "turbo-stream": "^2.0.0" }, "engines": { "node": ">=18.0.0" @@ -5048,24 +5176,25 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz", - "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", "engines": { "node": ">=14.0.0" } }, "node_modules/@remix-run/server-runtime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.6.0.tgz", - "integrity": "sha512-qFXDl4pK55njBLuvyRn5AkI/hu8fEU3t1XFKv0Syivx0nmUVpWMW25Uzi1pkX/chF1VIxCVrZ8KuQ1rcrKj+DQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.9.2.tgz", + "integrity": "sha512-dX37FEeMVVg7KUbpRhX4hD0nUY0Sscz/qAjU4lYCdd6IzwJGariTmz+bQTXKCjploZuXj09OQZHSOS/ydkUVDA==", "dependencies": { - "@remix-run/router": "1.15.0", + "@remix-run/router": "1.16.1", "@types/cookie": "^0.6.0", "@web3-storage/multipart-parser": "^1.0.0", "cookie": "^0.6.0", "set-cookie-parser": "^2.4.8", - "source-map": "^0.7.3" + "source-map": "^0.7.3", + "turbo-stream": "^2.0.0" }, "engines": { "node": ">=18.0.0" @@ -5157,6 +5286,12 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/@rollup/pluginutils/node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -5164,9 +5299,9 @@ "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "cpu": [ "arm" ], @@ -5177,9 +5312,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "cpu": [ "arm64" ], @@ -5190,9 +5325,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "cpu": [ "arm64" ], @@ -5203,9 +5338,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "cpu": [ "x64" ], @@ -5216,9 +5351,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "cpu": [ "arm" ], @@ -5229,9 +5377,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "cpu": [ "arm64" ], @@ -5242,9 +5390,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", "cpu": [ "arm64" ], @@ -5254,10 +5402,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", "cpu": [ "riscv64" ], @@ -5267,10 +5428,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "cpu": [ "x64" ], @@ -5281,9 +5455,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "cpu": [ "x64" ], @@ -5294,9 +5468,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "cpu": [ "arm64" ], @@ -5307,9 +5481,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", "cpu": [ "ia32" ], @@ -5320,9 +5494,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], @@ -5357,12 +5531,12 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.12.tgz", - "integrity": "sha512-vK/H6K+AJ4ZSsCu/+MapYYI/xrynB6JoCOejt//flTigZOhwTWv7WXbmEeqGIIToXy0LA2IUZ1/kCjFXR0lEdQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.19.tgz", + "integrity": "sha512-ATLrA5QKFJt7tIAScRHz5T3eBQ+RG3jaZk08L7gChvyQZhei8knWwePElZ7GaWbCr9BgznQp1lQUUXq/UUblAQ==", "dev": true, "dependencies": { - "@storybook/core-events": "7.6.12", + "@storybook/core-events": "7.6.19", "@storybook/global": "^5.0.0", "@types/uuid": "^9.0.1", "dequal": "^2.0.2", @@ -5375,9 +5549,9 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.12.tgz", - "integrity": "sha512-G14uN5lDXUtXw+dmEPaB6lpDpR9K25ssYuWWn8yYR44B1WMuD4kDgw0QGb0g+xYQj9R1TsalKEJHA4AuSYkVGQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.19.tgz", + "integrity": "sha512-Nu3LAZODRSV2e5bOroKm/Jp6BIFzwu/nJxD5OvLWkkwNCh+vDXUFbbaVrZf5xRL+fHd9iLFPtWbJQpF/w7UsCw==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5390,12 +5564,12 @@ } }, "node_modules/@storybook/addon-controls": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.12.tgz", - "integrity": "sha512-NX4KajscOsuXyYE3hhniF+y0E59E6rM0FgIaZ48P9c0DD+wDo8bAISHjZvmKXtDVajLk4/JySvByx1eN6V3hmA==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.19.tgz", + "integrity": "sha512-cl6PCNEwihDjuWIUsKTyDNKk+/IE4J3oMbSY5AZV/9Z0jJbpMV2shVm5DMZm5LhCCVcu5obWcxCIa4FMIMJAMQ==", "dev": true, "dependencies": { - "@storybook/blocks": "7.6.12", + "@storybook/blocks": "7.6.19", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" }, @@ -5432,26 +5606,26 @@ } }, "node_modules/@storybook/addon-docs": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.12.tgz", - "integrity": "sha512-AzMgnGYfEg+Z1ycJh8MEp44x1DfjRijKCVYNaPFT6o+TjN/9GBaAkV4ydxmQzMEMnnnh/0E9YeHO+ivBVSkNog==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.19.tgz", + "integrity": "sha512-nv+9SR/NOtM8Od2esOXHcg0NQT8Pk8BMUyGwZu5Q3MLI4JxNVEG65dY0IP2j6Knc4UtlvQTpM0f7m5xp4seHjQ==", "dev": true, "dependencies": { "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/components": "7.6.12", - "@storybook/csf-plugin": "7.6.12", - "@storybook/csf-tools": "7.6.12", + "@storybook/blocks": "7.6.19", + "@storybook/client-logger": "7.6.19", + "@storybook/components": "7.6.19", + "@storybook/csf-plugin": "7.6.19", + "@storybook/csf-tools": "7.6.19", "@storybook/global": "^5.0.0", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.6.12", - "@storybook/postinstall": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/react-dom-shim": "7.6.12", - "@storybook/theming": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/node-logger": "7.6.19", + "@storybook/postinstall": "7.6.19", + "@storybook/preview-api": "7.6.19", + "@storybook/react-dom-shim": "7.6.19", + "@storybook/theming": "7.6.19", + "@storybook/types": "7.6.19", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -5481,24 +5655,24 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.12.tgz", - "integrity": "sha512-Pl6n+19QC/T+cuU8DZjCwILXVxrdRTivNxPOiy8SEX+jjR4H0uAfXC9+RXCPjRFn64t4j1K7oIyoNokEn39cNw==", - "dev": true, - "dependencies": { - "@storybook/addon-actions": "7.6.12", - "@storybook/addon-backgrounds": "7.6.12", - "@storybook/addon-controls": "7.6.12", - "@storybook/addon-docs": "7.6.12", - "@storybook/addon-highlight": "7.6.12", - "@storybook/addon-measure": "7.6.12", - "@storybook/addon-outline": "7.6.12", - "@storybook/addon-toolbars": "7.6.12", - "@storybook/addon-viewport": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/manager-api": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/preview-api": "7.6.12", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.19.tgz", + "integrity": "sha512-SC33ZEQ5YaOt9wDkrdZmwQgqPWo9om/gqnyif06eug3SwrTe9JjO5iq1PIBfQodLD9MAxr9cwBvO0NG505oszQ==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "7.6.19", + "@storybook/addon-backgrounds": "7.6.19", + "@storybook/addon-controls": "7.6.19", + "@storybook/addon-docs": "7.6.19", + "@storybook/addon-highlight": "7.6.19", + "@storybook/addon-measure": "7.6.19", + "@storybook/addon-outline": "7.6.19", + "@storybook/addon-toolbars": "7.6.19", + "@storybook/addon-viewport": "7.6.19", + "@storybook/core-common": "7.6.19", + "@storybook/manager-api": "7.6.19", + "@storybook/node-logger": "7.6.19", + "@storybook/preview-api": "7.6.19", "ts-dedent": "^2.0.0" }, "funding": { @@ -5511,9 +5685,9 @@ } }, "node_modules/@storybook/addon-highlight": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.12.tgz", - "integrity": "sha512-rWNEyBhwncXEDd9z7l67BLBIPqn0SRI/CJpZvCSF5KLWrVaoSEDF8INavmbikd1JBMcajJ28Ur6NsGj+eJjJiw==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.19.tgz", + "integrity": "sha512-/pApl0oiVU1CQ8xETRNDLDthMBjeTmvFnTRq8RJ9m0JYTrSsoyHDmj9zS4K1k9gReqijE7brslhP8d2tblBpNw==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5524,13 +5698,13 @@ } }, "node_modules/@storybook/addon-interactions": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.12.tgz", - "integrity": "sha512-D8NX2xu9WiqPInoN842DU+KAFVC8HscGczqkDGEiWCAqq0DfXtW/0ClMSaE6d2+twhGv6uiPfeJ2IdynSZolXg==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.19.tgz", + "integrity": "sha512-lMQDu6JT2LXDWcRnIGvrKRk/W+67zOtUNpDKwoVuvM5eHVJcza5SPV6v8yXDLCHLOt7RZ15h6LT2uXabfKpcww==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.12", + "@storybook/types": "7.6.19", "jest-mock": "^27.0.6", "polished": "^4.2.2", "ts-dedent": "^2.2.0" @@ -5540,48 +5714,10 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/addon-interactions/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@storybook/addon-interactions/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@storybook/addon-interactions/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, "node_modules/@storybook/addon-links": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.12.tgz", - "integrity": "sha512-rGwPYpZAANPrf2GaNi5t9zAjLF8PgzKizyBPltIXUtplxDg88ziXlDA1dhsuGDs4Kf0oXECyAHPw79JjkJQziA==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.19.tgz", + "integrity": "sha512-qMIFfcsMf4olxhYUHUV2ZJhxphh6Xpf1DMd0lxKqAibfxl/sX1m0rJkyiqWSBxbCmAy/pwdgqEOJ1lpDUsJ33w==", "dev": true, "dependencies": { "@storybook/csf": "^0.1.2", @@ -5602,9 +5738,9 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.12.tgz", - "integrity": "sha512-K3aKErr84V0eVK7t+wco5cSYDdeotwoXi4e7VLSa2cdUz0wanOb4R7v3kf6vxucUyp05Lv+yHkz9zsbwuezepA==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.19.tgz", + "integrity": "sha512-n+cfhVXXouBv9oQr3a77vvip5dTznaNoBDWMafP2ohauc8jBlAxeBwCjk5r3pyThMRIFCTG/ypZrhiJcSJT3bw==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5630,9 +5766,9 @@ } }, "node_modules/@storybook/addon-outline": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.12.tgz", - "integrity": "sha512-r6eO4EKh+zwGUNjxe8v/44BhyV+JD3Dl9GYMutsFqbwYsoWHJaZmzHuyqeFBXwx2MEoixdWdIzNMP71+srQqvw==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.19.tgz", + "integrity": "sha512-Tt4MrfjK5j/Mdh8nJ8ccVyh78Dy7aiEPxO31YVvr5XUkge0pDi1PX328mHRDPur0i56NM8ssVbekWBZr+9MxlA==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5644,9 +5780,9 @@ } }, "node_modules/@storybook/addon-toolbars": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.12.tgz", - "integrity": "sha512-TSwq8xO7fmS6GRTgJJa31OBzm+5zlgDYK2Q42jxFo/Vm10uMzCpjYJE6mIHpUDyjyBVQk6xxMMEcvo6no2eAWg==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.19.tgz", + "integrity": "sha512-+qGbPP2Vo/HoPiS4EJopZ127HGculCV74Hkz6ot7ob6AkYdA1yLMPzWns/ZXNIWm6ab3jV+iq+mQCM/i1qJzvA==", "dev": true, "funding": { "type": "opencollective", @@ -5654,9 +5790,9 @@ } }, "node_modules/@storybook/addon-viewport": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.12.tgz", - "integrity": "sha512-51zsBeoaEzq699SKDCe+GG/2PDAJKKJtpjqxIc4lDskogaCJSb3Ie8LyookHAKYgbi2qealVgK8zaP27KUj3Pg==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.19.tgz", + "integrity": "sha512-OQQtJ2kYwImbvE9QiC3I3yR0O0EBgNjq+XSaSS4ixJrvUyesfuB7Lm7RkubhEEiP4yANi9OlbzsqZelmPOnk6w==", "dev": true, "dependencies": { "memoizerific": "^1.11.3" @@ -5667,76 +5803,231 @@ } }, "node_modules/@storybook/addons": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.6.12.tgz", - "integrity": "sha512-q1oN9TMdtpFqwb/oKZfbjcfGj/q629vJjhV0Q5SP9y89rBbhyxLf3U4miATQdzPo9lC3WHvaNm5ME8BjNkqO/Q==", + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.6.17.tgz", + "integrity": "sha512-Ok18Y698Ccyg++MoUNJNHY0cXUvo8ETFIRLJk1g9ElJ70j6kPgNnzW2pAtZkBNmswHtofZ7pT156cj96k/LgfA==", "dev": true, "peer": true, "dependencies": { - "@storybook/manager-api": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/types": "7.6.12" + "@storybook/manager-api": "7.6.17", + "@storybook/preview-api": "7.6.17", + "@storybook/types": "7.6.17" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/blocks": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.12.tgz", - "integrity": "sha512-T47KOAjgZmhV+Ov59A70inE5edInh1Jh5w/5J5cjpk9a2p4uhd337SnK4B8J5YLhcM2lbKRWJjzIJ0nDZQTdnQ==", + "node_modules/@storybook/addons/node_modules/@storybook/channels": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.17.tgz", + "integrity": "sha512-GFG40pzaSxk1hUr/J/TMqW5AFDDPUSu+HkeE/oqSWJbOodBOLJzHN6CReJS6y1DjYSZLNFt1jftPWZZInG/XUA==", "dev": true, + "peer": true, "dependencies": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/components": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/csf": "^0.1.2", - "@storybook/docs-tools": "7.6.12", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/theming": "7.6.12", - "@storybook/types": "7.6.12", - "@types/lodash": "^4.14.167", - "color-convert": "^2.0.1", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "markdown-to-jsx": "^7.1.8", - "memoizerific": "^1.11.3", - "polished": "^4.2.2", - "react-colorful": "^5.1.2", + "qs": "^6.10.0", "telejson": "^7.2.0", - "tocbot": "^4.20.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" + "tiny-invariant": "^1.3.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/builder-manager": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.12.tgz", - "integrity": "sha512-AJFrtBj0R11OFwwz+2j+ivRzttWXT6LesSGoLnxown24EV9uLQoHtGb7GOA2GyzY5wjUJS9gQBPGHXjvQEfLJA==", + "node_modules/@storybook/addons/node_modules/@storybook/client-logger": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.17.tgz", + "integrity": "sha512-6WBYqixAXNAXlSaBWwgljWpAu10tPRBJrcFvx2gPUne58EeMM20Gi/iHYBz2kMCY+JLAgeIH7ZxInqwO8vDwiQ==", "dev": true, + "peer": true, "dependencies": { - "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.6.12", - "@storybook/manager": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@types/ejs": "^3.1.1", - "@types/find-cache-dir": "^3.2.1", - "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", - "browser-assert": "^1.2.1", - "ejs": "^3.1.8", - "esbuild": "^0.18.0", + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/core-events": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.17.tgz", + "integrity": "sha512-AriWMCm/k1cxlv10f+jZ1wavThTRpLaN3kY019kHWbYT9XgaSuLU67G7GPr3cGnJ6HuA6uhbzu8qtqVCd6OfXA==", + "dev": true, + "peer": true, + "dependencies": { + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/manager-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.17.tgz", + "integrity": "sha512-IJIV1Yc6yw1dhCY4tReHCfBnUKDqEBnMyHp3mbXpsaHxnxJZrXO45WjRAZIKlQKhl/Ge1CrnznmHRCmYgqmrWg==", + "dev": true, + "peer": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/router": "7.6.17", + "@storybook/theming": "7.6.17", + "@storybook/types": "7.6.17", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "store2": "^2.14.2", + "telejson": "^7.2.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/preview-api": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.17.tgz", + "integrity": "sha512-wLfDdI9RWo1f2zzFe54yRhg+2YWyxLZvqdZnSQ45mTs4/7xXV5Wfbv3QNTtcdw8tT3U5KRTrN1mTfTCiRJc0Kw==", + "dev": true, + "peer": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@storybook/client-logger": "7.6.17", + "@storybook/core-events": "7.6.17", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.17", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/router": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.17.tgz", + "integrity": "sha512-GnyC0j6Wi5hT4qRhSyT8NPtJfGmf82uZw97LQRWeyYu5gWEshUdM7aj40XlNiScd5cZDp0owO1idduVF2k2l2A==", + "dev": true, + "peer": true, + "dependencies": { + "@storybook/client-logger": "7.6.17", + "memoizerific": "^1.11.3", + "qs": "^6.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/theming": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.17.tgz", + "integrity": "sha512-ZbaBt3KAbmBtfjNqgMY7wPMBshhSJlhodyMNQypv+95xLD/R+Az6aBYbpVAOygLaUQaQk4ar7H/Ww6lFIoiFbA==", + "dev": true, + "peer": true, + "dependencies": { + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@storybook/client-logger": "7.6.17", + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addons/node_modules/@storybook/types": { + "version": "7.6.17", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.17.tgz", + "integrity": "sha512-GRY0xEJQ0PrL7DY2qCNUdIfUOE0Gsue6N+GBJw9ku1IUDFLJRDOF+4Dx2BvYcVCPI5XPqdWKlEyZdMdKjiQN7Q==", + "dev": true, + "peer": true, + "dependencies": { + "@storybook/channels": "7.6.17", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks": { + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.19.tgz", + "integrity": "sha512-/c/bVQRmyRPoviJhPrFdLfubRcrnZWTwkjxsCvrOTJ/UDOyEl0t/H8yY1mGq7KWWTdbIznnZWhAIofHnH4/Esw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.19", + "@storybook/client-logger": "7.6.19", + "@storybook/components": "7.6.19", + "@storybook/core-events": "7.6.19", + "@storybook/csf": "^0.1.2", + "@storybook/docs-tools": "7.6.19", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.6.19", + "@storybook/preview-api": "7.6.19", + "@storybook/theming": "7.6.19", + "@storybook/types": "7.6.19", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.8", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "tocbot": "^4.20.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/builder-manager": { + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.19.tgz", + "integrity": "sha512-Dt5OLh97xeWh4h2mk9uG0SbCxBKHPhIiHLHAKEIDzIZBdwUhuyncVNDPHW2NlXM+S7U0/iKs2tw05waqh2lHvg==", + "dev": true, + "dependencies": { + "@fal-works/esbuild-plugin-global-externals": "^2.1.2", + "@storybook/core-common": "7.6.19", + "@storybook/manager": "7.6.19", + "@storybook/node-logger": "7.6.19", + "@types/ejs": "^3.1.1", + "@types/find-cache-dir": "^3.2.1", + "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", + "browser-assert": "^1.2.1", + "ejs": "^3.1.8", + "esbuild": "^0.18.0", "esbuild-plugin-alias": "^0.2.1", "express": "^4.17.3", "find-cache-dir": "^3.0.0", @@ -6153,19 +6444,19 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.6.12.tgz", - "integrity": "sha512-VJIn+XYVVhdJHHMEtYDnEyQQU4fRupugSFpP9XLYTRYgXPN9PSVey4vI/IyuHcHYINPba39UY2+8PW+5NgShxQ==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/csf-plugin": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/preview": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/types": "7.6.12", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.6.19.tgz", + "integrity": "sha512-llYpfYCHQCD0nPy+5J+H67iKcOpBrexIFO13wXxHQyl27Z+1T2JJj4cHqZs5S3a2XLiwf4df44NBvvwV5cmJmQ==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.19", + "@storybook/client-logger": "7.6.19", + "@storybook/core-common": "7.6.19", + "@storybook/csf-plugin": "7.6.19", + "@storybook/node-logger": "7.6.19", + "@storybook/preview": "7.6.19", + "@storybook/preview-api": "7.6.19", + "@storybook/types": "7.6.19", "@types/find-cache-dir": "^3.2.1", "browser-assert": "^1.2.1", "es-module-lexer": "^0.9.3", @@ -6217,42 +6508,14 @@ "node": ">=14.14" } }, - "node_modules/@storybook/builder-vite/node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-vite/node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/@storybook/channels": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.12.tgz", - "integrity": "sha512-TaPl5Y3lOoVi5kTLgKNRX8xh2sUPekH0Id1l4Ymw+lpgriEY6r60bmkZLysLG1GhlskpQ/da2+S2ap2ht8P2TQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.19.tgz", + "integrity": "sha512-2JGh+i95GwjtjqWqhtEh15jM5ifwbRGmXeFqkY7dpdHH50EEWafYHr2mg3opK3heVDwg0rJ/VBptkmshloXuvA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", + "@storybook/client-logger": "7.6.19", + "@storybook/core-events": "7.6.19", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.2.0", @@ -6264,23 +6527,23 @@ } }, "node_modules/@storybook/cli": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.12.tgz", - "integrity": "sha512-x4sG1oIVERxp+WnWUexVlgaJCFmML0kGi7a5qfx7z4vHMxCV/WG7g1q7mPS/kqStCGEiQdTciCqOEFqlMh9MLw==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.19.tgz", + "integrity": "sha512-7OVy7nPgkLfgivv6/dmvoyU6pKl9EzWFk+g9izyQHiM/jS8jOiEyn6akG8Ebj6k5pWslo5lgiXUSW+cEEZUnqQ==", "dev": true, "dependencies": { "@babel/core": "^7.23.2", "@babel/preset-env": "^7.23.2", "@babel/types": "^7.23.0", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/core-server": "7.6.12", - "@storybook/csf-tools": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/telemetry": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/codemod": "7.6.19", + "@storybook/core-common": "7.6.19", + "@storybook/core-events": "7.6.19", + "@storybook/core-server": "7.6.19", + "@storybook/csf-tools": "7.6.19", + "@storybook/node-logger": "7.6.19", + "@storybook/telemetry": "7.6.19", + "@storybook/types": "7.6.19", "@types/semver": "^7.3.4", "@yarnpkg/fslib": "2.10.3", "@yarnpkg/libzip": "2.3.0", @@ -6358,9 +6621,9 @@ } }, "node_modules/@storybook/client-logger": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.12.tgz", - "integrity": "sha512-hiRv6dXsOttMPqm9SxEuFoAtDe9rs7TUS8XcO5rmJ9BgfwBJsYlHzAxXkazxmvlyZtKL7gMx6m8OYbCdZgUqtA==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.19.tgz", + "integrity": "sha512-oGzOxbmLmciSIfd5gsxDzPmX8DttWhoYdPKxjMuCuWLTO2TWpkCWp1FTUMWO72mm/6V/FswT/aqpJJBBvdZ3RQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -6371,18 +6634,18 @@ } }, "node_modules/@storybook/codemod": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.12.tgz", - "integrity": "sha512-4EI4Ah1cvz6gFkXOS/LGf23oN8LO6ABGpWwPQoMHpIV3wUkFWBwrKFUe/UAQZGptnM0VZRYx4grS82Hluw4XJA==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.19.tgz", + "integrity": "sha512-bmHE0iEEgWZ65dXCmasd+GreChjPiWkXu2FEa0cJmNz/PqY12GsXGls4ke1TkNTj4gdSZnbtJxbclPZZnib2tQ==", "dev": true, "dependencies": { "@babel/core": "^7.23.2", "@babel/preset-env": "^7.23.2", "@babel/types": "^7.23.0", "@storybook/csf": "^0.1.2", - "@storybook/csf-tools": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/csf-tools": "7.6.19", + "@storybook/node-logger": "7.6.19", + "@storybook/types": "7.6.19", "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", "globby": "^11.0.2", @@ -6412,18 +6675,18 @@ } }, "node_modules/@storybook/components": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.12.tgz", - "integrity": "sha512-PCijPqmlZd7qyTzNr+vD0Kf8sAI9vWJIaxbSjXwn/De3e63m4fsEcIf8FaUT8cMZ46AWZvaxaxX5km2u0UISJQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.19.tgz", + "integrity": "sha512-8Zw/RQ4crzKkUR7ojxvRIj8vktKiBBO8Nq93qv4JfDqDWrcR7cro0hOlZgmZmrzbFunBBt6WlsNNO6nVP7R4Xw==", "dev": true, "dependencies": { "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-toolbar": "^1.0.4", - "@storybook/client-logger": "7.6.12", + "@storybook/client-logger": "7.6.19", "@storybook/csf": "^0.1.2", "@storybook/global": "^5.0.0", - "@storybook/theming": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/theming": "7.6.19", + "@storybook/types": "7.6.19", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" @@ -6438,13 +6701,13 @@ } }, "node_modules/@storybook/core-client": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.12.tgz", - "integrity": "sha512-VzVp32tMZsCzM4UIqfvCoJF7N9mBf6dsAxh1/ZgViy75Fht78pGo3JwZXW8osMbFSRpmWD7fxlUM5S7TQOYQug==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.19.tgz", + "integrity": "sha512-F0V9nzcEnj6DIpnw2ilrxsV4d9ibyyQS+Wi2uQtXy+wCQQm9PeBVqrOywjXAY2F9pcoftXOaepfhp8jrxX4MXw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.6.12", - "@storybook/preview-api": "7.6.12" + "@storybook/client-logger": "7.6.19", + "@storybook/preview-api": "7.6.19" }, "funding": { "type": "opencollective", @@ -6452,14 +6715,14 @@ } }, "node_modules/@storybook/core-common": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.12.tgz", - "integrity": "sha512-kM9YiBBMM2x5v/oylL7gdO1PS4oehgJC21MivS9p5QZ8uuXKtCQ6UQvI3rzaV+1ZzUA4n+I8MyaMrNIQk8KDbw==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.19.tgz", + "integrity": "sha512-njwpGzFJrfbJr/AFxGP8KMrfPfxN85KOfSlxYnQwRm5Z0H1D/lT33LhEBf5m37gaGawHeG7KryxO6RvaioMt2Q==", "dev": true, "dependencies": { - "@storybook/core-events": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/core-events": "7.6.19", + "@storybook/node-logger": "7.6.19", + "@storybook/types": "7.6.19", "@types/find-cache-dir": "^3.2.1", "@types/node": "^18.0.0", "@types/node-fetch": "^2.6.4", @@ -6839,9 +7102,9 @@ } }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6898,31 +7161,10 @@ "node": ">=14.14" } }, - "node_modules/@storybook/core-common/node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@storybook/core-common/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@storybook/core-events": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.12.tgz", - "integrity": "sha512-IO4cwk7bBCKH6lLnnIlHO9FwQXt/9CzLUAoZSY9msWsdPppCdKlw8ynJI5YarSNKDBUn8ArIfnRf0Mve0KQr9Q==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.19.tgz", + "integrity": "sha512-K/W6Uvum0ocZSgjbi8hiotpe+wDEHDZlvN+KlPqdh9ae9xDK8aBNBq9IelCoqM+uKO1Zj+dDfSQds7CD781DJg==", "dev": true, "dependencies": { "ts-dedent": "^2.0.0" @@ -6933,26 +7175,26 @@ } }, "node_modules/@storybook/core-server": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.12.tgz", - "integrity": "sha512-tjWifKsDnIc8pvbjVyQrOHef70Gcp93Bg3WwuysB8PGk7lcX2RD9zv44HNIyjxdOLSSv66IGKrOldEBL3hab4w==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.19.tgz", + "integrity": "sha512-7mKL73Wv5R2bEl0kJ6QJ9bOu5YY53Idu24QgvTnUdNsQazp2yUONBNwHIrNDnNEXm8SfCi4Mc9o0mmNRMIoiRA==", "dev": true, "dependencies": { "@aw-web-design/x-default-browser": "1.4.126", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.6.12", - "@storybook/channels": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/core-events": "7.6.12", + "@storybook/builder-manager": "7.6.19", + "@storybook/channels": "7.6.19", + "@storybook/core-common": "7.6.19", + "@storybook/core-events": "7.6.19", "@storybook/csf": "^0.1.2", - "@storybook/csf-tools": "7.6.12", + "@storybook/csf-tools": "7.6.19", "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/telemetry": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/manager": "7.6.19", + "@storybook/node-logger": "7.6.19", + "@storybook/preview-api": "7.6.19", + "@storybook/telemetry": "7.6.19", + "@storybook/types": "7.6.19", "@types/detect-port": "^1.3.0", "@types/node": "^18.0.0", "@types/pretty-hrtime": "^1.0.0", @@ -6965,7 +7207,7 @@ "express": "^4.17.3", "fs-extra": "^11.1.0", "globby": "^11.0.2", - "ip": "^2.0.0", + "ip": "^2.0.1", "lodash": "^4.17.21", "open": "^8.4.0", "pretty-hrtime": "^1.0.3", @@ -6986,9 +7228,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -7009,9 +7251,9 @@ } }, "node_modules/@storybook/core-server/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "engines": { "node": ">=10.0.0" @@ -7030,21 +7272,21 @@ } }, "node_modules/@storybook/csf": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.2.tgz", - "integrity": "sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.7.tgz", + "integrity": "sha512-53JeLZBibjQxi0Ep+/AJTfxlofJlxy1jXcSKENlnKxHjWEYyHQCumMP5yTFjf7vhNnMjEpV3zx6t23ssFiGRyw==", "dev": true, "dependencies": { "type-fest": "^2.19.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.12.tgz", - "integrity": "sha512-fe/84AyctJcrpH1F/tTBxKrbjv0ilmG3ZTwVcufEiAzupZuYjQ/0P+Pxs8m8VxiGJZZ1pWofFFDbYi+wERjamQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.19.tgz", + "integrity": "sha512-yUP0xfJyR8e6fmCgKoEt4c1EvslF8dZ8wtwVLE5hnC3kfs7xt8RVDiKLB/9NhYjY3mD/oOesX60HqRXDgJQHwA==", "dev": true, "dependencies": { - "@storybook/csf-tools": "7.6.12", + "@storybook/csf-tools": "7.6.19", "unplugin": "^1.3.1" }, "funding": { @@ -7053,9 +7295,9 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.12.tgz", - "integrity": "sha512-MdhkYYxSW5I6Jpk34gTkAZsuj9sxe0xdyeUQpNa8CgJxG43F+ehZ6scW/IPjoSG9gCXBUJMekq26UrmbVfsLCQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.19.tgz", + "integrity": "sha512-8Vzia3cHhDdGHuS3XKXJReCRxmfRq3vmTm/Te9yKZnPSAsC58CCKcMh8FNEFJ44vxYF9itKTkRutjGs+DprKLQ==", "dev": true, "dependencies": { "@babel/generator": "^7.23.0", @@ -7063,7 +7305,7 @@ "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0", "@storybook/csf": "^0.1.2", - "@storybook/types": "7.6.12", + "@storybook/types": "7.6.19", "fs-extra": "^11.1.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" @@ -7087,18 +7329,6 @@ "node": ">=14.14" } }, - "node_modules/@storybook/csf/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@storybook/docs-mdx": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz", @@ -7106,14 +7336,14 @@ "dev": true }, "node_modules/@storybook/docs-tools": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.12.tgz", - "integrity": "sha512-nY2lqEDTd/fR/D91ZLlIp+boSuJtkb8DqHW7pECy61rJqzGq4QpepRaWjQDKnGTgPItrsPfTPOu6iXvXNK07Ow==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.19.tgz", + "integrity": "sha512-JuwV6wtm7Hb7Kb5ValChfxy4J7XngfrSQNpvwsDCSBNVcQUv2y843hvclpa26Ptfr/c7zpUX8r9FGSaMDy+2aQ==", "dev": true, "dependencies": { - "@storybook/core-common": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/core-common": "7.6.19", + "@storybook/preview-api": "7.6.19", + "@storybook/types": "7.6.19", "@types/doctrine": "^0.0.3", "assert": "^2.1.0", "doctrine": "^3.0.0", @@ -7131,16 +7361,16 @@ "dev": true }, "node_modules/@storybook/instrumenter": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-7.6.12.tgz", - "integrity": "sha512-BK+hCz2tuUSDPvN0kACR+Ev7lQj4SLlMdXiJgRGdnKWR7zr1OFEg9MEIwPHNC+Ywny1x7YOwrbNJ9sdISNIh0g==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-7.6.19.tgz", + "integrity": "sha512-chPRR8/N1fMss4gSOiEbLzDFqA+0tinnrrFeUSHhvadf+VqUcA/G72sf4b3C/jxBDdK6WPC6L+A3pFR/C1dN5A==", "dev": true, "dependencies": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", + "@storybook/channels": "7.6.19", + "@storybook/client-logger": "7.6.19", + "@storybook/core-events": "7.6.19", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.6.12", + "@storybook/preview-api": "7.6.19", "@vitest/utils": "^0.34.6", "util": "^0.12.4" }, @@ -7150,9 +7380,9 @@ } }, "node_modules/@storybook/manager": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.12.tgz", - "integrity": "sha512-WMWvswJHGiqJFJb98WQMQfZQhLuVtmci4y/VJGQ/Jnq1nJQs76BCtaeGiHcsYmRaAP1HMI4DbzuTSEgca146xw==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.19.tgz", + "integrity": "sha512-fZWQcf59x4P0iiBhrL74PZrqKJAPuk9sWjP8BIkGbf8wTZtUunbY5Sv4225fOL4NLJbuX9/RYLUPoxQ3nucGHA==", "dev": true, "funding": { "type": "opencollective", @@ -7160,19 +7390,19 @@ } }, "node_modules/@storybook/manager-api": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.12.tgz", - "integrity": "sha512-XA5KQpY44d6mlqt0AlesZ7fsPpm1PCpoV+nRGFBR0YtF6RdPFvrPyHhlGgLkJC4xSyb2YJmLKn8cERSluAcEgQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.19.tgz", + "integrity": "sha512-dVCx1Q+HZEA4U08XqYljiG88BeS3I3ahnPAQLZAeWQXQRkoc9G2jMgLNPKYPIqEtq7Xrn6SRlFMIofhwWrwZpg==", "dev": true, "dependencies": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", + "@storybook/channels": "7.6.19", + "@storybook/client-logger": "7.6.19", + "@storybook/core-events": "7.6.19", "@storybook/csf": "^0.1.2", "@storybook/global": "^5.0.0", - "@storybook/router": "7.6.12", - "@storybook/theming": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/router": "7.6.19", + "@storybook/theming": "7.6.19", + "@storybook/types": "7.6.19", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -7192,9 +7422,9 @@ "dev": true }, "node_modules/@storybook/node-logger": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.12.tgz", - "integrity": "sha512-iS44/EjfF6hLecKzICmcpQoB9bmVi4tXx5gVXnbI5ZyziBibRQcg/U191Njl7wY2ScN/RCQOr8lh5k57rI3Prg==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.19.tgz", + "integrity": "sha512-2g29QC44Zl1jKY37DmQ0/dO7+VSKnGgPI/x0mwVwQffypSapxH3rwLLT5Q5XLHeFyD+fhRu5w9Cj4vTGynJgpA==", "dev": true, "funding": { "type": "opencollective", @@ -7202,9 +7432,9 @@ } }, "node_modules/@storybook/postinstall": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.12.tgz", - "integrity": "sha512-uR0mDPxLzPaouCNrLp8vID8lATVTOtG7HB6lfjjzMdE3sN6MLmK9n2z2nXjb5DRRxOFWMeE1/4Age1/Ml2tnmA==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.19.tgz", + "integrity": "sha512-s6p1vpgMfn+QGDfCK2YNdyyWKidUgb3nGicB81FANRyzYqGB//QlJlghEc2LKCIQbGIZQiwP3l8PdZQmczEJRw==", "dev": true, "funding": { "type": "opencollective", @@ -7212,9 +7442,9 @@ } }, "node_modules/@storybook/preview": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.12.tgz", - "integrity": "sha512-7vbeqQY3X+FCt/ccgCuBmj4rkbQebLHGEBAt8elcX0E2pr7SGW57lWhnasU3jeMaz7tNrkcs0gfl4hyVRWUHDg==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.19.tgz", + "integrity": "sha512-VqRPua2koOQTOteB+VvuKNXFYQ7IDEopaPpj9Nx+3kom+bqp0hWdAysWcm6CtKN2GGzBQm+5PvGibMNdawsaVg==", "dev": true, "funding": { "type": "opencollective", @@ -7222,17 +7452,17 @@ } }, "node_modules/@storybook/preview-api": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz", - "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.19.tgz", + "integrity": "sha512-04hdMSQucroJT4dBjQzRd7ZwH2hij8yx2nm5qd4HYGkd1ORkvlH6GOLph4XewNJl5Um3xfzFQzBhvkqvG0WaCQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", + "@storybook/channels": "7.6.19", + "@storybook/client-logger": "7.6.19", + "@storybook/core-events": "7.6.19", "@storybook/csf": "^0.1.2", "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.12", + "@storybook/types": "7.6.19", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -7248,18 +7478,18 @@ } }, "node_modules/@storybook/react": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.12.tgz", - "integrity": "sha512-ITDRGi79Qg+z1kGYv+yyJESz/5AsJVdBTMO7tr1qV7gmHElkASt6UR8SBSqKgePOnYgy3k/1PLfbzOs6G4OgYQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.19.tgz", + "integrity": "sha512-uKShAAp1/pRki1YnRjBveH/jAD3f8V0W2WP1LxTQqnKVFkl01mTbDZ/9ZIK6rVTSILUlmsk3fwsNyRbOKVgBGQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.6.12", - "@storybook/core-client": "7.6.12", - "@storybook/docs-tools": "7.6.12", + "@storybook/client-logger": "7.6.19", + "@storybook/core-client": "7.6.19", + "@storybook/docs-tools": "7.6.19", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.6.12", - "@storybook/react-dom-shim": "7.6.12", - "@storybook/types": "7.6.12", + "@storybook/preview-api": "7.6.19", + "@storybook/react-dom-shim": "7.6.19", + "@storybook/types": "7.6.19", "@types/escodegen": "^0.0.6", "@types/estree": "^0.0.51", "@types/node": "^18.0.0", @@ -7294,9 +7524,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.12.tgz", - "integrity": "sha512-P8eu/s/RQlc/7Yvr260lqNa6rttxIYiPUuHQBu9oCacwkpB3Xep2R/PUY2CifRHqlDhaOINO/Z79oGZl4EBQRQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.19.tgz", + "integrity": "sha512-tpt2AC1428d1gF4fetMkpkeFZ1WdDr1CLKoLbSInWQZ7i96nbnIMIA9raR/W8ai1bo55KSz9Bq5ytC/1Pac2qQ==", "dev": true, "funding": { "type": "opencollective", @@ -7308,15 +7538,15 @@ } }, "node_modules/@storybook/react-vite": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-7.6.12.tgz", - "integrity": "sha512-kQjCWmTcHuZM1Mlt1QjpYNXP1TxfkSDFWC36fSEUC0q48wzyjUEZs6YraxZu0YE+zXK+X4tmaZhz8pUPgV3gLw==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-7.6.19.tgz", + "integrity": "sha512-TqKQvWi53vE0KbWrlNq61cTLpzfQ5QMZv42YiwEUhM7ysSmrrg6WjgfEnvEyiAuY8yyaRspPF6Y8pYTKGHM8Nw==", "dev": true, "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "7.6.12", - "@storybook/react": "7.6.12", + "@storybook/builder-vite": "7.6.19", + "@storybook/react": "7.6.19", "@vitejs/plugin-react": "^3.0.1", "magic-string": "^0.30.0", "react-docgen": "^7.0.0" @@ -7365,73 +7595,22 @@ "node": ">=12" } }, - "node_modules/@storybook/react-vite/node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/react/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, "node_modules/@storybook/react/node_modules/@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, - "node_modules/@storybook/react/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@storybook/react/node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@storybook/react/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@storybook/router": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.12.tgz", - "integrity": "sha512-1fqscJbePFJXhapqiv7fAIIqAvouSsdPnqWjJGJrUMR6JBtRYMcrb3MnDeqi9OYnU73r65BrQBPtSzWM8nP0LQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.19.tgz", + "integrity": "sha512-q2/AvY8rG0znFEfbg50OIhkS5yQ6OmyzdCdztoEsDDdsbq87YPmsDj7k8Op1EkTa2T5CB8XhBOCQDtcj7gUUtg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.6.12", + "@storybook/client-logger": "7.6.19", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -7441,14 +7620,14 @@ } }, "node_modules/@storybook/telemetry": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.12.tgz", - "integrity": "sha512-eBG3sLb9CZ05pyK2JXBvnaAsxDzbZH57VyhtphhuZmx0DqF/78qIoHs9ebRJpJWV0sL5rtT9vIq8QXpQhDHLWg==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.19.tgz", + "integrity": "sha512-rA5xum4I36M57iiD3uzmW0MOdpl0vEpHWBSAa5hK0a0ALPeY9TgAsQlI/0dSyNYJ/K7aczEEN6d4qm1NC4u10A==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/csf-tools": "7.6.12", + "@storybook/client-logger": "7.6.19", + "@storybook/core-common": "7.6.19", + "@storybook/csf-tools": "7.6.19", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", @@ -7475,15 +7654,15 @@ } }, "node_modules/@storybook/test": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-7.6.12.tgz", - "integrity": "sha512-kOkgr9EJqeitoN3ubbVRrAysHCqxpAFAyKzWCGuic9ynxvfTOc5prup0e05/GJmbHYqkWsOyaordXgcHvy8JaQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-7.6.19.tgz", + "integrity": "sha512-pEMyrPsV6zfcoH8z/sXlmJYBMBocZU6MZhM//dVGf4OiaOSwCLGDXNImZYNDUOpq4//kxC51yTytkdDgm1QFMg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/instrumenter": "7.6.12", - "@storybook/preview-api": "7.6.12", + "@storybook/client-logger": "7.6.19", + "@storybook/core-events": "7.6.19", + "@storybook/instrumenter": "7.6.19", + "@storybook/preview-api": "7.6.19", "@testing-library/dom": "^9.3.1", "@testing-library/jest-dom": "^6.1.3", "@testing-library/user-event": "14.3.0", @@ -7499,13 +7678,13 @@ } }, "node_modules/@storybook/theming": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.12.tgz", - "integrity": "sha512-P4zoMKlSYbNrWJjQROuz+DZSDEpdf3TUvk203EqBRdElqw2EMHcqZ8+0HGPFfVHpqEj05+B9Mr6R/Z/BURj0lw==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.19.tgz", + "integrity": "sha512-sAho13MmtA80ctOaLn8lpkQBsPyiqSdLcOPH5BWFhatQzzBQCpTAKQk+q/xGju8bNiPZ+yQBaBzbN8SfX8ceCg==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.6.12", + "@storybook/client-logger": "7.6.19", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -7519,12 +7698,12 @@ } }, "node_modules/@storybook/types": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.12.tgz", - "integrity": "sha512-Wsbd+NS10/2yMHQ/26rXHflXam0hm2qufTFiHOX6VXZWxij3slRU88Fnwzp+1QSyjXb0qkEr8dOx7aG00+ItVw==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.19.tgz", + "integrity": "sha512-DeGYrRPRMGTVfT7o2rEZtRzyLT2yKTI2exgpnxbwPWEFAduZCSfzBrcBXZ/nb5B0pjA9tUNWls1YzGkJGlkhpg==", "dev": true, "dependencies": { - "@storybook/channels": "7.6.12", + "@storybook/channels": "7.6.19", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", "file-system-cache": "2.3.0" @@ -7881,42 +8060,10 @@ "node": ">=14" } }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, "node_modules/@testing-library/jest-dom": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz", - "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==", + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz", + "integrity": "sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==", "dev": true, "dependencies": { "@adobe/css-tools": "^4.3.2", @@ -7925,7 +8072,7 @@ "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.15", + "lodash": "^4.17.21", "redent": "^3.0.0" }, "engines": { @@ -8000,28 +8147,28 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "devOptional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "devOptional": true }, "node_modules/@types/acorn": { "version": "4.0.6", @@ -8071,18 +8218,18 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/better-sqlite3": { - "version": "7.6.9", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.9.tgz", - "integrity": "sha512-FvktcujPDj9XKMJQWFcl2vVl7OdRIqsSRX9b0acWwTmwLK9CF2eqo/FRcmMLNpugKoX/avA6pb7TorDLmpgTnQ==", + "version": "7.6.10", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz", + "integrity": "sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw==", "dev": true, "dependencies": { "@types/node": "*" @@ -8099,9 +8246,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", "dev": true }, "node_modules/@types/connect": { @@ -8155,9 +8302,9 @@ "dev": true }, "node_modules/@types/emscripten": { - "version": "1.39.10", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz", - "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==", + "version": "1.39.12", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.12.tgz", + "integrity": "sha512-AQImDBgudQfMqUBfrjZYilRxoHDzTBp+ejh+g1fY67eSMalwIKtBXofjpyI0JBgNpHGzxeGAR2QDya0wxW9zbA==", "dev": true }, "node_modules/@types/escodegen": { @@ -8167,15 +8314,15 @@ "dev": true }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "node_modules/@types/estree-jsx": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.4.tgz", - "integrity": "sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dev": true, "dependencies": { "@types/estree": "*" @@ -8194,9 +8341,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.1.tgz", + "integrity": "sha512-ej0phymbFLoCB26dbbq5PGScsf2JAJ4IJHjG10LalgUV36XKTmA4GdA+PVllKvRk0sEKt64X8975qFnkSi0hqA==", "dev": true, "dependencies": { "@types/node": "*", @@ -8279,6 +8426,38 @@ "pretty-format": "^29.0.0" } }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -8292,25 +8471,25 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==", "dev": true }, "node_modules/@types/markdown-it": { - "version": "13.0.7", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", - "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "version": "13.0.8", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.8.tgz", + "integrity": "sha512-V+KmpgiipS+zoypeUSS9ojesWtY/0k4XfqcK2fnVrX/qInJhX7rsCxZ/rygiPH2zxlPPrhfuW0I6ddMcWTKLsg==", "dev": true, "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^3", + "@types/mdurl": "^1" } }, "node_modules/@types/markdown-it-footnote": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", - "integrity": "sha512-sMLBj0VcWo/4vi1J7jx3DNdup2w+14RwDMdQtcFJPabeDwt945ghc8sFBgsUfnEjcBOuKaELY22JwGb7KGmsVw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/markdown-it-footnote/-/markdown-it-footnote-3.0.4.tgz", + "integrity": "sha512-XJ6n+v+2u+2gmYLSHcxyoNT/YrgrKvHuDJQlykFjuxCQCr86P2/fx1V6/0lcKxv5cSIlCaJ6sUcNS3zDI7I+LA==", "dev": true, "dependencies": { "@types/markdown-it": "*" @@ -8332,9 +8511,9 @@ "dev": true }, "node_modules/@types/mdx": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.11.tgz", - "integrity": "sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", "dev": true }, "node_modules/@types/mime": { @@ -8362,10 +8541,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.3.tgz", - "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==", - "dev": true + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "devOptional": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { "version": "2.6.11", @@ -8399,15 +8581,15 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", "dev": true }, "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true }, "node_modules/@types/range-parser": { @@ -8417,20 +8599,19 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.53", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.53.tgz", - "integrity": "sha512-52IHsMDT8qATp9B9zoOyobW8W3/0QhaJQTw1HwRj0UY2yBpCAQ7+S/CqHYQ8niAm3p4ji+rWUQ9UCib0GxQ60w==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dev": true, "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", - "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "dependencies": { "@types/react": "*" @@ -8442,16 +8623,10 @@ "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", "dev": true }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/send": { @@ -8465,14 +8640,14 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/stack-utils": { @@ -8515,16 +8690,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.20.0.tgz", - "integrity": "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/type-utils": "6.20.0", - "@typescript-eslint/utils": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -8550,15 +8725,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz", - "integrity": "sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -8578,13 +8753,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", - "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -8595,13 +8770,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.20.0.tgz", - "integrity": "sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.20.0", - "@typescript-eslint/utils": "6.20.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -8622,9 +8797,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz", - "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -8635,13 +8810,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz", - "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -8662,18 +8837,33 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz", - "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { @@ -8688,12 +8878,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", - "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -8711,31 +8901,31 @@ "dev": true }, "node_modules/@vanilla-extract/babel-plugin-debug-ids": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.4.tgz", - "integrity": "sha512-mevYcVMwsT6960xnXRw/Rr2K7SOEwzwVBApg/2SJ3eg2KGsHfj1rN0oQ12WdoTT3RzThq+0551bVQKPvQnjeaA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.6.tgz", + "integrity": "sha512-C188vUEYmw41yxg3QooTs8r1IdbDQQ2mH7L5RkORBnHx74QlmsNfqVmKwAVTgrlYt8JoRaWMtPfGm/Ql0BNQrA==", "dev": true, "dependencies": { - "@babel/core": "^7.20.7" + "@babel/core": "^7.23.9" } }, "node_modules/@vanilla-extract/css": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.14.1.tgz", - "integrity": "sha512-V4JUuHNjZgl64NGfkDJePqizkNgiSpphODtZEs4cCPuxLAzwOUJYATGpejwimJr1n529kq4DEKWexW22LMBokw==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.15.2.tgz", + "integrity": "sha512-Bi61iCAtojCuqvV+FYaF5i69vBjuMQJpHPdpgKYyQvx+e2Hp79V0ELglyYOdcyg9Wh0k0MFwgCDipVd7EloTXQ==", "dev": true, "dependencies": { "@emotion/hash": "^0.9.0", - "@vanilla-extract/private": "^1.0.3", - "chalk": "^4.1.1", + "@vanilla-extract/private": "^1.0.5", "css-what": "^6.1.0", "cssesc": "^3.0.0", "csstype": "^3.0.7", + "dedent": "^1.5.3", "deep-object-diff": "^1.1.9", "deepmerge": "^4.2.2", "media-query-parser": "^2.0.2", "modern-ahocorasick": "^1.0.0", - "outdent": "^0.8.0" + "picocolors": "^1.0.0" } }, "node_modules/@vanilla-extract/integration": { @@ -8760,22 +8950,22 @@ } }, "node_modules/@vanilla-extract/private": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.3.tgz", - "integrity": "sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.5.tgz", + "integrity": "sha512-6YXeOEKYTA3UV+RC8DeAjFk+/okoNz/h88R+McnzA2zpaVqTR/Ep+vszkWYlGBcMNO7vEkqbq5nT/JMMvhi+tw==", "dev": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.0.tgz", + "integrity": "sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==", "dev": true, "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" + "react-refresh": "^0.14.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -8824,6 +9014,38 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/@web3-storage/multipart-parser": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz", @@ -8915,9 +9137,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -8936,9 +9158,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -9006,11 +9228,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -9019,7 +9252,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -9030,11 +9262,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -9052,18 +9288,21 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/aria-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", - "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", "dev": true, "dependencies": { "tslib": "^2.0.0" @@ -9104,15 +9343,16 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -9131,6 +9371,26 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -9167,6 +9427,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "node_modules/array.prototype.tosorted": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", @@ -9266,15 +9538,6 @@ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -9282,10 +9545,13 @@ "dev": true }, "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -9339,31 +9605,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", @@ -9380,13 +9621,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -9403,25 +9644,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -9479,8 +9720,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -9524,12 +9764,14 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -9550,13 +9792,13 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -9564,7 +9806,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -9588,6 +9830,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -9609,18 +9866,16 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -9642,9 +9897,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -9661,8 +9916,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -9734,9 +9989,9 @@ "dev": true }, "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "dependencies": { "semver": "^7.0.0" @@ -9805,14 +10060,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9839,10 +10099,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001584", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001584.tgz", - "integrity": "sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==", + "version": "1.0.30001621", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", + "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", "dev": true, "funding": [ { @@ -9975,16 +10243,9 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -9997,6 +10258,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -10011,9 +10275,9 @@ } }, "node_modules/chromatic": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-10.7.1.tgz", - "integrity": "sha512-ERxfVxTm8gnbv3bdWeNyUVQ4msbtYc/dZIpt+3TVxqEq4tMlzVCnTFl1rDfJ7Jj1enGFoxvZ+Q2xon7Jfi+cZw==", + "version": "10.9.6", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-10.9.6.tgz", + "integrity": "sha512-1MoT+/U+vQwEiq2GuehPyStbqhxqHmM1B9pdpVU1dKh26userQg1FyOFYifkTgy+9reo2w2p7sAbc0JRd2kzlA==", "dev": true, "bin": { "chroma": "dist/bin.js", @@ -10049,18 +10313,18 @@ } }, "node_modules/citty": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.5.tgz", - "integrity": "sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "dev": true, "dependencies": { "consola": "^3.2.3" } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", "dev": true }, "node_modules/clean-stack": { @@ -10097,9 +10361,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -10237,7 +10501,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10248,8 +10511,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -10405,6 +10667,12 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, "node_modules/consola": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", @@ -10467,12 +10735,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -10511,6 +10779,24 @@ } } }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -10536,7 +10822,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "devOptional": true }, "node_modules/cross-env": { "version": "7.0.3", @@ -10560,7 +10846,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -10574,7 +10859,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -10643,7 +10927,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -10708,6 +10991,57 @@ "node": ">= 6" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -10739,9 +11073,9 @@ } }, "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -10846,17 +11180,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -11044,9 +11381,9 @@ } }, "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", "dev": true, "dependencies": { "address": "^1.0.1", @@ -11055,13 +11392,21 @@ "bin": { "detect": "bin/detect-port.js", "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.3.1" } @@ -11087,6 +11432,11 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -11167,15 +11517,15 @@ } }, "node_modules/dotenv": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", - "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { @@ -11238,8 +11588,7 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/ee-first": { "version": "1.1.1", @@ -11248,9 +11597,9 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { "jake": "^10.8.5" @@ -11263,9 +11612,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.656", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz", - "integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==", + "version": "1.4.783", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.783.tgz", + "integrity": "sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==", "dev": true }, "node_modules/emittery": { @@ -11283,8 +11632,7 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -11316,9 +11664,9 @@ } }, "node_modules/envinfo": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", - "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -11343,50 +11691,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "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", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -11395,6 +11750,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -11425,42 +11792,57 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -11536,9 +11918,9 @@ "dev": true }, "node_modules/esbuild-plugins-node-modules-polyfill": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.2.tgz", - "integrity": "sha512-UwFku/RAQkKi6YsL6SkltZOz7qjmLadvT+7B46jzUqcHrQw524dn4MyMmMRUkAklBsX9nXzVt3LswQlznTJN7A==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.4.tgz", + "integrity": "sha512-x3MCOvZrKDGAfqAYS/pZUUSwiN+XH7x84A+Prup0CZBJKuGfuGkTAC4g01D6JPs/GCM9wzZVfd8bmiy+cP/iXA==", "dev": true, "dependencies": { "@jspm/core": "^2.0.1", @@ -11549,7 +11931,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "esbuild": "^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0" + "esbuild": "^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0" } }, "node_modules/esbuild-register": { @@ -11565,9 +11947,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -11623,16 +12005,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -11678,27 +12060,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.0.17", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.10" }, "engines": { "node": ">=4" @@ -11708,9 +12092,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "engines": { "node": ">=10" @@ -11720,9 +12104,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", - "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz", + "integrity": "sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==", "dev": true, "peerDependencies": { "eslint": ">=7" @@ -11921,9 +12305,9 @@ } }, "node_modules/eslint-plugin-unused-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", - "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz", + "integrity": "sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==", "dev": true, "dependencies": { "eslint-rule-composer": "^0.3.0" @@ -11978,6 +12362,12 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -12015,6 +12405,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -12056,6 +12458,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -12115,6 +12529,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/estree-util-attach-comments/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/estree-util-build-jsx": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", @@ -12190,6 +12610,12 @@ "@types/estree": "^1.0.0" } }, + "node_modules/estree-walker/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -12291,17 +12717,17 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -12332,15 +12758,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -12362,6 +12779,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -12392,18 +12824,6 @@ "ms": "2.0.0" } }, - "node_modules/extract-zip/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/extract-zip/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -12420,7 +12840,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -12448,7 +12867,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -12548,10 +12966,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -12609,58 +13026,98 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flat-cache/node_modules/brace-expansion": { @@ -12721,15 +13178,15 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/flow-parser": { - "version": "0.228.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.228.0.tgz", - "integrity": "sha512-xPWkzCO07AnS8X+fQFpWm+tJ+C7aeaiVzJ+rSepbkCXUvUJ6l6squEl63axoMcixyH4wLjmypOzq/+zTD0O93w==", + "version": "0.236.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.236.0.tgz", + "integrity": "sha512-0OEk9Gr+Yj7wjDW2KgaNYUypKau71jAfFyeLQF5iVtxqc6uJHag/MT7pmaEApf4qM7u86DkBcd4ualddYMfbLw==", "dev": true, "engines": { "node": ">=0.4.0" @@ -12748,7 +13205,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -12764,7 +13220,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -12855,7 +13310,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -12869,7 +13323,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12938,12 +13391,12 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.3.tgz", - "integrity": "sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "es-errors": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", @@ -13033,13 +13486,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -13049,18 +13503,18 @@ } }, "node_modules/giget": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.1.tgz", - "integrity": "sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz", + "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", "dev": true, "dependencies": { - "citty": "^0.1.5", + "citty": "^0.1.6", "consola": "^3.2.3", - "defu": "^6.1.3", - "node-fetch-native": "^1.6.1", - "nypm": "^0.3.3", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.3", + "nypm": "^0.3.8", "ohash": "^1.1.3", - "pathe": "^1.1.1", + "pathe": "^1.1.2", "tar": "^6.2.0" }, "bin": { @@ -13074,22 +13528,21 @@ "dev": true }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -13099,7 +13552,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -13123,12 +13575,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -13247,21 +13700,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -13298,10 +13751,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -13336,6 +13788,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-estree/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/hast-util-whitespace": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", @@ -13512,6 +13970,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -13531,6 +13998,70 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -13553,6 +14084,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -13572,12 +14104,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -13595,9 +14127,9 @@ } }, "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", "dev": true }, "node_modules/ipaddr.js": { @@ -13711,7 +14243,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -13774,7 +14305,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -13782,6 +14312,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -13832,7 +14377,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -13853,7 +14397,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -13886,7 +14429,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -13923,10 +14465,13 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13948,9 +14493,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -13963,7 +14508,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -14048,21 +14592,27 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14138,10 +14688,13 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14159,13 +14712,16 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14200,8 +14756,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", @@ -14222,19 +14777,28 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "semver": "^6.3.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report": { @@ -14251,6 +14815,21 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -14275,9 +14854,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -14301,10 +14880,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -14319,9 +14897,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -14435,6 +15013,38 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", @@ -14513,7 +15123,19 @@ } } }, - "node_modules/jest-config/node_modules/brace-expansion": { + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", @@ -14555,6 +15177,26 @@ "node": "*" } }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -14570,6 +15212,38 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", @@ -14598,6 +15272,38 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/jest-environment-miniflare": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/jest-environment-miniflare/-/jest-environment-miniflare-2.14.2.tgz", @@ -14638,6 +15344,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", @@ -14685,6 +15405,38 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", @@ -14700,6 +15452,38 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", @@ -14720,20 +15504,76 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-mock": { + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -14924,6 +15764,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-runtime/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -14967,6 +15821,38 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -15001,17 +15887,49 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" @@ -15050,27 +15968,36 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jscodeshift": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.1.tgz", - "integrity": "sha512-hIJfxUy8Rt4HkJn/zZPU9ChKfKZM1342waJ1QC2e2YsPcWhM+3BJ4dcfQCzArTrk1jJeNLB341H+qOcEHRxJZg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", + "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", "dev": true, "dependencies": { "@babel/core": "^7.23.0", @@ -15142,9 +16069,9 @@ "dev": true }, "node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -15174,12 +16101,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -15271,19 +16192,20 @@ } }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/linkify-it": { "version": "5.0.0", @@ -15504,34 +16426,43 @@ } }, "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.15" } }, "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { - "semver": "^7.5.3" + "semver": "^6.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "devOptional": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -15558,16 +16489,16 @@ } }, "node_modules/markdown-it": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", - "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", - "uc.micro": "^2.0.0" + "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" @@ -15578,10 +16509,15 @@ "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-4.0.0.tgz", "integrity": "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==" }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/markdown-to-jsx": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", - "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==", + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.7.tgz", + "integrity": "sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==", "dev": true, "engines": { "node": ">= 10" @@ -15591,14 +16527,51 @@ } }, "node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dev": true, + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" }, "funding": { "type": "opencollective", @@ -15753,6 +16726,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-hast/node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-markdown": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", @@ -15849,7 +16837,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -15974,6 +16961,12 @@ "uvu": "^0.5.0" } }, + "node_modules/micromark-extension-mdx-expression/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/micromark-extension-mdx-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", @@ -15996,6 +16989,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-mdx-jsx/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/micromark-extension-mdx-md": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", @@ -16050,6 +17049,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/micromark-extension-mdxjs/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/micromark-factory-destination": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", @@ -16119,6 +17136,12 @@ "vfile-message": "^3.0.0" } }, + "node_modules/micromark-factory-mdx-expression/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/micromark-factory-space": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", @@ -16346,6 +17369,12 @@ "vfile-message": "^3.0.0" } }, + "node_modules/micromark-util-events-to-acorn/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/micromark-util-html-tag-name": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", @@ -16476,12 +17505,11 @@ ] }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -16489,14 +17517,15 @@ } }, "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=10.0.0" } }, "node_modules/mime-db": { @@ -16539,9 +17568,9 @@ } }, "node_modules/miniflare": { - "version": "3.20240129.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240129.0.tgz", - "integrity": "sha512-27pDhlP2G/4gXmvnSt6LjMQ8KrkmbJElIQmn+BLjdiyIx+zXY4E8MSPJmi9flgf0dn3wtjuHO2ASenuopqqxrw==", + "version": "3.20240512.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240512.0.tgz", + "integrity": "sha512-X0PlKR0AROKpxFoJNmRtCMIuJxj+ngEcyTOlEokj2rAQ0TBwUhB4/1uiPvdI6ofW5NugPOD1uomAv+gLjwsLDQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "0.8.1", @@ -16552,7 +17581,7 @@ "glob-to-regexp": "^0.4.1", "stoppable": "^1.1.0", "undici": "^5.28.2", - "workerd": "1.20240129.0", + "workerd": "1.20240512.0", "ws": "^8.11.0", "youch": "^3.2.2", "zod": "^3.20.6" @@ -16564,10 +17593,43 @@ "node": ">=16.13" } }, + "node_modules/miniflare/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/miniflare/node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/miniflare/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/miniflare/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, "engines": { "node": ">=10.0.0" @@ -16586,10 +17648,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -16610,10 +17671,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -16740,15 +17800,15 @@ "dev": true }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/mkdirp-classic": { @@ -16758,15 +17818,27 @@ "dev": true }, "node_modules/mlly": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz", + "integrity": "sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==", "dev": true, "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" + "pkg-types": "^1.1.0", + "ufo": "^1.5.3" + } + }, + "node_modules/mlly/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/modern-ahocorasick": { @@ -16808,11 +17880,20 @@ "mustache": "bin/mustache" } }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -16918,9 +17999,9 @@ } }, "node_modules/node-fetch-native": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.1.tgz", - "integrity": "sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", "dev": true }, "node_modules/node-forge": { @@ -16933,9 +18014,9 @@ } }, "node_modules/node-html-parser": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.12.tgz", - "integrity": "sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" @@ -16972,7 +18053,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17306,9 +18386,9 @@ } }, "node_modules/npx-import/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -17383,15 +18463,16 @@ } }, "node_modules/nypm": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.6.tgz", - "integrity": "sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.8.tgz", + "integrity": "sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==", "dev": true, "dependencies": { - "citty": "^0.1.5", + "citty": "^0.1.6", + "consola": "^3.2.3", "execa": "^8.0.1", "pathe": "^1.1.2", - "ufo": "^1.3.2" + "ufo": "^1.4.0" }, "bin": { "nypm": "dist/cli.mjs" @@ -17469,9 +18550,9 @@ } }, "node_modules/nypm/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -17538,11 +18619,18 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -17553,13 +18641,13 @@ } }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -17596,28 +18684,29 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -17627,27 +18716,31 @@ } }, "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", "dev": true, "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -17725,17 +18818,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -17932,7 +19025,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -17940,30 +19032,27 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "engines": { "node": "14 || >=16.14" } @@ -18026,17 +19115,21 @@ "is-reference": "^3.0.0" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "node_modules/periscopic/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -18069,84 +19162,31 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "find-up": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", "dev": true, "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" + "confbox": "^0.1.7", + "mlly": "^1.7.0", + "pathe": "^1.1.2" } }, "node_modules/polished": { @@ -18161,11 +19201,19 @@ "node": ">=10" } }, - "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -18183,7 +19231,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -18201,11 +19249,60 @@ "postcss": "^8.2.15" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, "node_modules/postcss-load-config": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -18256,9 +19353,9 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" @@ -18268,9 +19365,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -18285,9 +19382,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -18314,11 +19411,28 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -18330,8 +19444,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -18358,17 +19471,17 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", + "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "react-is": "^17.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -18505,9 +19618,9 @@ "dev": true }, "node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "dev": true, "funding": { "type": "github", @@ -18622,6 +19735,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/puppeteer-core/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/puppeteer-core/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -18656,9 +19781,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -18672,12 +19797,12 @@ ] }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -18690,7 +19815,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -18726,9 +19850,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -18741,9 +19865,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -18838,15 +19962,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-element-to-jsx-string": { @@ -18871,15 +19995,15 @@ "dev": true }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -18911,9 +20035,9 @@ } }, "node_modules/react-remove-scroll-bar": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", - "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", "dev": true, "dependencies": { "react-style-singleton": "^2.2.1", @@ -18933,11 +20057,11 @@ } }, "node_modules/react-router": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz", - "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", "dependencies": { - "@remix-run/router": "1.15.0" + "@remix-run/router": "1.16.1" }, "engines": { "node": ">=14.0.0" @@ -18947,12 +20071,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz", - "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", "dependencies": { - "@remix-run/router": "1.15.0", - "react-router": "6.22.0" + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" }, "engines": { "node": ">=14.0.0" @@ -18985,6 +20109,22 @@ } } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -19219,7 +20359,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -19228,15 +20367,15 @@ } }, "node_modules/recast": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", - "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", + "version": "0.23.7", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.7.tgz", + "integrity": "sha512-MpQlLZVpqbbxYcqEjwpRWo88sGvjOYoXptySz710RuddNMHx+wPkoNX6YyLZJlXAh5VZr1qmPrTwcTuFMh0Lag==", "dev": true, "dependencies": { - "assert": "^2.0.0", "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" }, "engines": { @@ -19278,16 +20417,16 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -19332,14 +20471,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -19403,19 +20543,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-external-links/node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dev": true, - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-external-links/node_modules/space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", @@ -19510,6 +20637,12 @@ "node": ">=12.2.0" } }, + "node_modules/remark-mdx-frontmatter/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/remark-mdx-frontmatter/node_modules/estree-util-is-identifier-name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-1.1.0.tgz", @@ -19520,6 +20653,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/remark-mdx-frontmatter/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/remark-parse": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", @@ -19616,9 +20761,9 @@ } }, "node_modules/remix": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/remix/-/remix-2.6.0.tgz", - "integrity": "sha512-E8HDqKUeTEeuS+foqsTi7hCNPsO3VXLRV9ffdHUmlOR5busM9MvuQ34ZuOx/kzciyCirmFLMsSVXhLG4I9glyg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/remix/-/remix-2.9.2.tgz", + "integrity": "sha512-Z+a5UFtnelvSgmahHmQHSoLR8y2L68oQdiS1jlDXRiHfKGt3BBBlcbSqXbJIBXuszNIJoGcQ7ZSDnZBLyZjF3Q==", "engines": { "node": ">=18.0.0" } @@ -19679,7 +20824,7 @@ "node": ">=8" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", @@ -19688,15 +20833,6 @@ "node": ">=8" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -19732,16 +20868,15 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -19750,41 +20885,25 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=18.0.0", + "node": ">=14.18.0", "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", "fsevents": "~2.3.2" } }, @@ -19806,6 +20925,15 @@ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, + "node_modules/rollup-plugin-inject/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/rollup-plugin-node-polyfills": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", @@ -19834,7 +20962,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -19866,13 +20993,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -19904,13 +21031,13 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -19927,9 +21054,9 @@ "dev": true }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -19948,13 +21075,10 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -19962,24 +21086,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -20058,30 +21164,32 @@ "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -20109,7 +21217,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -20121,7 +21228,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -20136,14 +21242,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20189,10 +21299,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -20244,9 +21353,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", - "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -20260,9 +21369,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/sprintf-js": { @@ -20272,9 +21381,9 @@ "dev": true }, "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -20346,18 +21455,18 @@ } }, "node_modules/store2": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", - "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==", + "version": "2.14.3", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", + "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==", "dev": true }, "node_modules/storybook": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.12.tgz", - "integrity": "sha512-zcH9CwIsE8N4PX3he5vaJ3mTTWGxu7cxJ/ag9oja/k3N5/IvQjRyIU1TLkRVb28BB8gaLyorpnc4C4aLVGy4WQ==", + "version": "7.6.19", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.19.tgz", + "integrity": "sha512-xWD1C4vD/4KMffCrBBrUpsLUO/9uNpm8BVW8+Vcb30gkQDfficZ0oziWkmLexpT53VSioa24iazGXMwBqllYjQ==", "dev": true, "dependencies": { - "@storybook/cli": "7.6.12" + "@storybook/cli": "7.6.19" }, "bin": { "sb": "index.js", @@ -20421,7 +21530,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -20439,7 +21547,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -20452,14 +21559,12 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -20471,7 +21576,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -20483,34 +21587,41 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.padend": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", - "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -20520,14 +21631,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -20537,37 +21649,40 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dev": true, "dependencies": { "character-entities-html4": "^2.0.0", @@ -20582,7 +21697,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -20595,7 +21709,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -20657,6 +21770,35 @@ "inline-style-parser": "0.1.1" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -20673,7 +21815,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -20688,9 +21829,9 @@ "dev": true }, "node_modules/svgo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", - "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, "dependencies": { "@trysound/sax": "0.2.0", @@ -20727,10 +21868,81 @@ "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", "dev": true }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -20821,6 +22033,18 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -21004,6 +22228,25 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -21051,15 +22294,15 @@ } }, "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "dev": true }, "node_modules/tinyspy": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", - "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, "engines": { "node": ">=14.0.0" @@ -21084,7 +22327,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -21093,9 +22335,9 @@ } }, "node_modules/tocbot": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.25.0.tgz", - "integrity": "sha512-kE5wyCQJ40hqUaRVkyQ4z5+4juzYsv/eK+aqD97N62YH0TxFhzJvo22RUQQZdO3YnXAk42ZOfOpjVdy+Z0YokA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.28.2.tgz", + "integrity": "sha512-/MaSa9xI6mIo84IxqqliSCtPlH0oy7sLcY9s26qPMyH/2CxtZ2vNAXYlIdEQ7kjAkCQnc0rbLygf//F5c663oQ==", "dev": true }, "node_modules/toggle-selection": { @@ -21145,12 +22387,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.0.tgz", - "integrity": "sha512-d+3WxW4r8WQy2cZWpNRPPGExX8ffOLGcIhheUANKbL5Sqjbhkneki76fRAWeXkaslV2etTb4tSJBSxOsH5+CJw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=18" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -21165,10 +22407,15 @@ "node": ">=6.10" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.1.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.3.tgz", + "integrity": "sha512-6L9qz3ginTd1NKhOxmkP0qU3FyKjj5CPoY+anszfVn6Pmv/RIKzhiMCsH7Yb7UvJR9I2A64rm4zQl531s2F1iw==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -21184,10 +22431,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -21197,6 +22445,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -21212,7 +22463,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, + "devOptional": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -21251,11 +22502,32 @@ } } }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "devOptional": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ts-node/node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "devOptional": true }, "node_modules/tsconfig-paths": { "version": "4.2.0", @@ -21307,6 +22579,11 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/turbo-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.0.1.tgz", + "integrity": "sha512-sm0ZtcX9YWh28p5X8t5McxC2uthrt9p+g0bGE0KTVFhnhNWefpSVCr+67zRNDUOfo4bpXwiOp7otO+dyQ7/y/A==" + }, "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", @@ -21335,12 +22612,12 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -21360,29 +22637,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -21392,16 +22670,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -21411,14 +22690,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21431,9 +22716,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -21444,14 +22729,14 @@ } }, "node_modules/uc.micro": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.0.0.tgz", - "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" }, "node_modules/ufo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", - "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, "node_modules/uglify-js": { @@ -21483,22 +22768,19 @@ } }, "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.1.tgz", + "integrity": "sha512-/0BWqR8rJNRysS5lqVmfc7eeOErcOP4tZpATVjJOojjHZ71gSYVAtFhEmadcIjwMIUehh5NFyKGsXCnXIajtbA==", "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { - "node": ">=14.0" + "node": ">=18.17" } }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "devOptional": true }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -21731,15 +23013,30 @@ } }, "node_modules/unplugin": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.7.1.tgz", - "integrity": "sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", + "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==", "dev": true, "dependencies": { "acorn": "^8.11.3", - "chokidar": "^3.5.3", + "chokidar": "^3.6.0", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.6.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/unplugin/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/untildify": { @@ -21752,9 +23049,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -21771,8 +23068,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -21797,9 +23094,9 @@ "dev": true }, "node_modules/use-callback-ref": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz", - "integrity": "sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", "dev": true, "dependencies": { "tslib": "^2.0.0" @@ -21868,8 +23165,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -21912,9 +23208,9 @@ } }, "node_modules/uvu/node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, "engines": { "node": ">=0.3.1" @@ -21924,7 +23220,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "devOptional": true }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -21951,13 +23247,10 @@ } }, "node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -22002,14 +23295,14 @@ } }, "node_modules/vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -22057,9 +23350,9 @@ } }, "node_modules/vite-node": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.2.2.tgz", - "integrity": "sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -22079,9 +23372,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -22095,9 +23388,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -22111,9 +23404,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -22127,9 +23420,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -22143,9 +23436,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -22159,9 +23452,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -22175,9 +23468,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -22191,9 +23484,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -22207,9 +23500,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -22223,9 +23516,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -22239,9 +23532,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -22255,9 +23548,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -22271,9 +23564,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -22287,9 +23580,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -22303,9 +23596,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -22319,9 +23612,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -22335,9 +23628,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -22351,9 +23644,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -22367,9 +23660,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -22383,9 +23676,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -22399,9 +23692,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -22415,9 +23708,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -22430,10 +23723,16 @@ "node": ">=12" } }, + "node_modules/vite/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/vite/node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -22443,29 +23742,64 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" } }, "node_modules/walker": { @@ -22478,9 +23812,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -22512,9 +23846,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", - "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "dev": true, "engines": { "node": ">= 8" @@ -22609,31 +23943,34 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -22642,6 +23979,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -22649,9 +23995,9 @@ "dev": true }, "node_modules/workerd": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240129.0.tgz", - "integrity": "sha512-t4pnsmjjk/u+GdVDgH2M1AFmJaBUABshYK/vT/HNrAXsHSwN6VR8Yqw0JQ845OokO34VLkuUtYQYyxHHKpdtsw==", + "version": "1.20240512.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240512.0.tgz", + "integrity": "sha512-VUBmR1PscAPHEE0OF/G2K7/H1gnr9aDWWZzdkIgWfNKkv8dKFCT75H+GJtUHjfwqz3rYCzaNZmatSXOpLGpF8A==", "dev": true, "hasInstallScript": true, "bin": { @@ -22661,26 +24007,26 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20240129.0", - "@cloudflare/workerd-darwin-arm64": "1.20240129.0", - "@cloudflare/workerd-linux-64": "1.20240129.0", - "@cloudflare/workerd-linux-arm64": "1.20240129.0", - "@cloudflare/workerd-windows-64": "1.20240129.0" + "@cloudflare/workerd-darwin-64": "1.20240512.0", + "@cloudflare/workerd-darwin-arm64": "1.20240512.0", + "@cloudflare/workerd-linux-64": "1.20240512.0", + "@cloudflare/workerd-linux-arm64": "1.20240512.0", + "@cloudflare/workerd-windows-64": "1.20240512.0" } }, "node_modules/wrangler": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.26.0.tgz", - "integrity": "sha512-2FKDyL0wV6ws+9AHkQl5/Yzn17kG9jlpgyT7wqCDkhb5q+TCL/I8N5IKVwXe8tRrTluBI1QQZRRymoA5nu0pHw==", + "version": "3.57.1", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.57.1.tgz", + "integrity": "sha512-M8YnWUwdrb8AFiRePtVnzlDn02OX4osWvdl8oVh6eyZqqkqXYg7lwlYBr14Qj92pMN4JvMBmDZoukkYHvwpJRg==", "dev": true, "dependencies": { - "@cloudflare/kv-asset-handler": "^0.2.0", + "@cloudflare/kv-asset-handler": "0.3.2", "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "blake3-wasm": "^2.1.5", "chokidar": "^3.5.3", "esbuild": "0.17.19", - "miniflare": "3.20240129.0", + "miniflare": "3.20240512.0", "nanoid": "^3.3.3", "path-to-regexp": "^6.2.0", "resolve": "^1.22.8", @@ -22698,15 +24044,14 @@ }, "optionalDependencies": { "fsevents": "~2.3.2" - } - }, - "node_modules/wrangler/node_modules/@cloudflare/kv-asset-handler": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", - "integrity": "sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==", - "dev": true, - "dependencies": { - "mime": "^3.0.0" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20240512.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } } }, "node_modules/wrangler/node_modules/@esbuild/android-arm": { @@ -23098,22 +24443,10 @@ "@esbuild/win32-x64": "0.17.19" } }, - "node_modules/wrangler/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/wrangler/node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", "dev": true }, "node_modules/wrangler/node_modules/resolve": { @@ -23146,7 +24479,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -23164,7 +24496,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -23180,14 +24511,12 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -23201,7 +24530,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -23213,7 +24541,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { "node": ">=12" }, @@ -23225,7 +24552,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -23307,10 +24633,12 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -23376,7 +24704,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -23414,9 +24742,9 @@ } }, "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "dev": true, "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -23432,16490 +24760,5 @@ "url": "https://github.com/sponsors/wooorm" } } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@adobe/css-tools": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@aw-web-design/x-default-browser": { - "version": "1.4.126", - "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", - "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==", - "dev": true, - "requires": { - "default-browser-id": "3.0.0" - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true - }, - "@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.23.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", - "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "dependencies": { - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dev": true, - "requires": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", - "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", - "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", - "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.23.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dev": true, - "requires": { - "@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/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/preset-flow": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz", - "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-flow-strip-types": "^7.23.3" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - } - }, - "@babel/register": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", - "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - } - }, - "@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@base2/pretty-print-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", - "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", - "dev": true - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cloudflare/kv-asset-handler": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.1.3.tgz", - "integrity": "sha512-FNcunDuTmEfQTLRLtA6zz+buIXUHj1soPvSWzzQFBC+n2lsy+CGf/NIrR3SEPCmsVNQj70/Jx2lViCpq+09YpQ==", - "requires": { - "mime": "^2.5.2" - } - }, - "@cloudflare/workerd-darwin-64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240129.0.tgz", - "integrity": "sha512-DfVVB5IsQLVcWPJwV019vY3nEtU88c2Qu2ST5SQxqcGivZ52imagLRK0RHCIP8PK4piSiq90qUC6ybppUsw8eg==", - "dev": true, - "optional": true - }, - "@cloudflare/workerd-darwin-arm64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240129.0.tgz", - "integrity": "sha512-t0q8ABkmumG1zRM/MZ/vIv/Ysx0vTAXnQAPy/JW5aeQi/tqrypXkO9/NhPc0jbF/g/hIPrWEqpDgEp3CB7Da7Q==", - "dev": true, - "optional": true - }, - "@cloudflare/workerd-linux-64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240129.0.tgz", - "integrity": "sha512-sFV1uobHgDI+6CKBS/ZshQvOvajgwl6BtiYaH4PSFSpvXTmRx+A9bcug+6BnD+V4WgwxTiEO2iR97E1XuwDAVw==", - "dev": true, - "optional": true - }, - "@cloudflare/workerd-linux-arm64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240129.0.tgz", - "integrity": "sha512-O7q7htHaFRp8PgTqNJx1/fYc3+LnvAo6kWWB9a14C5OWak6AAZk42PNpKPx+DXTmGvI+8S1+futBGUeJ8NPDXg==", - "dev": true, - "optional": true - }, - "@cloudflare/workerd-windows-64": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240129.0.tgz", - "integrity": "sha512-YqGno0XSqqqkDmNoGEX6M8kJlI2lEfWntbTPVtHaZlaXVR9sWfoD7TEno0NKC95cXFz+ioyFLbgbOdnfWwmVAA==", - "dev": true, - "optional": true - }, - "@cloudflare/workers-types": { - "version": "4.20240129.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240129.0.tgz", - "integrity": "sha512-VyHbih/bqh/RN2FRxnXznG0bpBIg9RfSP1ldbAVnCXFinjOdv0zm2P/RWqOVN9+FgU5sanRltwwT7jGngxZy8w==" - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==", - "dev": true - }, - "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "dev": true, - "requires": {} - }, - "@esbuild-plugins/node-globals-polyfill": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", - "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", - "dev": true, - "requires": {} - }, - "@esbuild-plugins/node-modules-polyfill": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", - "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", - "dev": true, - "requires": { - "escape-string-regexp": "^4.0.0", - "rollup-plugin-node-polyfills": "^0.2.1" - } - }, - "@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz", - "integrity": "sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.6.tgz", - "integrity": "sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.6.tgz", - "integrity": "sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.6.tgz", - "integrity": "sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.6.tgz", - "integrity": "sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.6.tgz", - "integrity": "sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.6.tgz", - "integrity": "sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.6.tgz", - "integrity": "sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.6.tgz", - "integrity": "sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.6.tgz", - "integrity": "sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.6.tgz", - "integrity": "sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.6.tgz", - "integrity": "sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.6.tgz", - "integrity": "sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.6.tgz", - "integrity": "sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.6.tgz", - "integrity": "sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.6.tgz", - "integrity": "sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.6.tgz", - "integrity": "sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.6.tgz", - "integrity": "sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.6.tgz", - "integrity": "sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.6.tgz", - "integrity": "sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.6.tgz", - "integrity": "sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.6.tgz", - "integrity": "sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true - }, - "@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", - "dev": true - }, - "@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "dev": true - }, - "@figspec/components": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@figspec/components/-/components-1.0.3.tgz", - "integrity": "sha512-fBwHzJ4ouuOUJEi+yBZIrOy+0/fAjB3AeTcIHTT1PRxLz8P63xwC7R0EsIJXhScIcc+PljGmqbbVJCjLsnaGYA==", - "dev": true, - "requires": { - "lit": "^2.1.3" - } - }, - "@figspec/react": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@figspec/react/-/react-1.0.3.tgz", - "integrity": "sha512-r683qOko+5CbT48Ox280fMx2MNAtaFPgCNJvldOqN3YtmAzlcTT+YSxd3OahA+kjXGGrnzDbUgeTOX1cPLII+g==", - "dev": true, - "requires": { - "@figspec/components": "^1.0.1", - "@lit-labs/react": "^1.0.2" - } - }, - "@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "dev": true, - "requires": { - "@floating-ui/utils": "^0.2.1" - } - }, - "@floating-ui/dom": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", - "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", - "dev": true, - "requires": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.1" - } - }, - "@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", - "dev": true, - "requires": { - "@floating-ui/dom": "^1.6.1" - } - }, - "@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@joshwooding/vite-plugin-react-docgen-typescript": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.3.0.tgz", - "integrity": "sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==", - "dev": true, - "requires": { - "glob": "^7.2.0", - "glob-promise": "^4.2.0", - "magic-string": "^0.27.0", - "react-docgen-typescript": "^2.2.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-promise": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", - "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", - "dev": true, - "requires": { - "@types/glob": "^7.1.3" - } - }, - "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@jspm/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.1.tgz", - "integrity": "sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==", - "dev": true - }, - "@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", - "dev": true - }, - "@lit-labs/react": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lit-labs/react/-/react-1.2.1.tgz", - "integrity": "sha512-DiZdJYFU0tBbdQkfwwRSwYyI/mcWkg3sWesKRsHUd4G+NekTmmeq9fzsurvcKTNVa0comNljwtg4Hvi1ds3V+A==", - "dev": true - }, - "@lit-labs/ssr-dom-shim": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", - "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==", - "dev": true - }, - "@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", - "dev": true, - "requires": { - "@lit-labs/ssr-dom-shim": "^1.0.0" - } - }, - "@mdx-js/mdx": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", - "integrity": "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==", - "dev": true, - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/mdx": "^2.0.0", - "estree-util-build-jsx": "^2.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "estree-util-to-js": "^1.1.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^2.0.0", - "markdown-extensions": "^1.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^2.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "unified": "^10.0.0", - "unist-util-position-from-estree": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - } - }, - "@mdx-js/react": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz", - "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==", - "dev": true, - "requires": { - "@types/mdx": "^2.0.0", - "@types/react": ">=16" - } - }, - "@miniflare/cache": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/cache/-/cache-2.14.2.tgz", - "integrity": "sha512-XH218Y2jxSOfxG8EyuprBKhI/Fn6xLrb9A39niJBlzpiKXqr8skl/sy/sUL5tfvqEbEnqDagGne8zEcjM+1fBg==", - "dev": true, - "requires": { - "@miniflare/core": "2.14.2", - "@miniflare/shared": "2.14.2", - "http-cache-semantics": "^4.1.0", - "undici": "5.28.2" - } - }, - "@miniflare/core": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/core/-/core-2.14.2.tgz", - "integrity": "sha512-n/smm5ZTg7ilGM4fxO7Gxhbe573oc8Za06M3b2fO+lPWqF6NJcEKdCC+sJntVFbn3Cbbd2G1ChISmugPfmlCkQ==", - "dev": true, - "requires": { - "@iarna/toml": "^2.2.5", - "@miniflare/queues": "2.14.2", - "@miniflare/shared": "2.14.2", - "@miniflare/watcher": "2.14.2", - "busboy": "^1.6.0", - "dotenv": "^10.0.0", - "kleur": "^4.1.4", - "set-cookie-parser": "^2.4.8", - "undici": "5.28.2", - "urlpattern-polyfill": "^4.0.3" - }, - "dependencies": { - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true - } - } - }, - "@miniflare/d1": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/d1/-/d1-2.14.2.tgz", - "integrity": "sha512-3NPJyBLbFfzz9VAAdIZrDRdRpyslVCJoZHQk0/0CX3z2mJIfcQzjZhox2cYCFNH8NMJ7pRg6AeSMPYAnDKECDg==", - "dev": true, - "requires": { - "@miniflare/core": "2.14.2", - "@miniflare/shared": "2.14.2" - } - }, - "@miniflare/durable-objects": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/durable-objects/-/durable-objects-2.14.2.tgz", - "integrity": "sha512-BfK+ZkJABoi7gd/O6WbpsO4GrgW+0dmOBWJDlNBxQ7GIpa+w3n9+SNnrYUxKzWlPSvz+TfTTk381B1z/Z87lPw==", - "dev": true, - "requires": { - "@miniflare/core": "2.14.2", - "@miniflare/shared": "2.14.2", - "@miniflare/storage-memory": "2.14.2", - "undici": "5.28.2" - } - }, - "@miniflare/html-rewriter": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/html-rewriter/-/html-rewriter-2.14.2.tgz", - "integrity": "sha512-tu0kd9bj38uZ04loHb3sMI8kzUzZPgPOAJEdS9zmdSPh0uOkjCDf/TEkKsDdv2OFysyb0DRsIrwhPqCTIrPf1Q==", - "dev": true, - "requires": { - "@miniflare/core": "2.14.2", - "@miniflare/shared": "2.14.2", - "html-rewriter-wasm": "^0.4.1", - "undici": "5.28.2" - } - }, - "@miniflare/kv": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/kv/-/kv-2.14.2.tgz", - "integrity": "sha512-3rs4cJOGACT/U7NH7j4KD29ugXRYUiM0aGkvOEdFQtChXLsYClJljXpezTfJJxBwZjdS4F2UFTixtFcHp74UfA==", - "dev": true, - "requires": { - "@miniflare/shared": "2.14.2" - } - }, - "@miniflare/queues": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/queues/-/queues-2.14.2.tgz", - "integrity": "sha512-OylkRs4lOWKvGnX+Azab3nx+1qwC87M36/hkgAU1RRvVDCOxOrYLvNLUczFfgmgMBwpYsmmW8YOIASlI3p4Qgw==", - "dev": true, - "requires": { - "@miniflare/shared": "2.14.2" - } - }, - "@miniflare/r2": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/r2/-/r2-2.14.2.tgz", - "integrity": "sha512-uuc7dx6OqSQT8i0F2rsigfizXmInssRvvJAjoi1ltaNZNJCHH9l1PwHfaNc/XAuDjYmiCjtHDaPdRvZU9g9F3g==", - "dev": true, - "requires": { - "@miniflare/core": "2.14.2", - "@miniflare/shared": "2.14.2", - "undici": "5.28.2" - } - }, - "@miniflare/runner-vm": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/runner-vm/-/runner-vm-2.14.2.tgz", - "integrity": "sha512-WlyxAQ+bv/9Pm/xnbpgAg7RNX4pz/q3flytUoo4z4OrRmNEuXrbMUsJZnH8dziqzrZ2gCLkYIEzeaTmSQKp5Jg==", - "dev": true, - "requires": { - "@miniflare/shared": "2.14.2" - } - }, - "@miniflare/shared": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/shared/-/shared-2.14.2.tgz", - "integrity": "sha512-dDnYIztz10zDQjaFJ8Gy9UaaBWZkw3NyhFdpX6tAeyPA/2lGvkftc42MYmNi8s5ljqkZAtKgWAJnSf2K75NCJw==", - "dev": true, - "requires": { - "@types/better-sqlite3": "^7.6.0", - "kleur": "^4.1.4", - "npx-import": "^1.1.4", - "picomatch": "^2.3.1" - } - }, - "@miniflare/shared-test-environment": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/shared-test-environment/-/shared-test-environment-2.14.2.tgz", - "integrity": "sha512-97y/95EzDC86jM2bKYacKk4n59miFC+WXueRdW5TeVzBw2UTL2Alvy36AZuyMUgBqxZdJSv88/q0jHTw7LvyMA==", - "dev": true, - "requires": { - "@cloudflare/workers-types": "^4.20221111.1", - "@miniflare/cache": "2.14.2", - "@miniflare/core": "2.14.2", - "@miniflare/d1": "2.14.2", - "@miniflare/durable-objects": "2.14.2", - "@miniflare/html-rewriter": "2.14.2", - "@miniflare/kv": "2.14.2", - "@miniflare/queues": "2.14.2", - "@miniflare/r2": "2.14.2", - "@miniflare/shared": "2.14.2", - "@miniflare/sites": "2.14.2", - "@miniflare/storage-memory": "2.14.2", - "@miniflare/web-sockets": "2.14.2" - } - }, - "@miniflare/sites": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/sites/-/sites-2.14.2.tgz", - "integrity": "sha512-jFOx1G5kD+kTubsga6jcFbMdU2nSuNG2/EkojwuhYT8hYp3qd8duvPyh1V+OR2tMvM4FWu6jXPXNZNBHXHQaUQ==", - "dev": true, - "requires": { - "@miniflare/kv": "2.14.2", - "@miniflare/shared": "2.14.2", - "@miniflare/storage-file": "2.14.2" - } - }, - "@miniflare/storage-file": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/storage-file/-/storage-file-2.14.2.tgz", - "integrity": "sha512-tn8rqMBeTtN+ICHQAMKQ0quHGYIkcyDK0qKW+Ic14gdfGDZx45BqXExQM9wTVqKtwAt85zp5eKVUYQCFfUx46Q==", - "dev": true, - "requires": { - "@miniflare/shared": "2.14.2", - "@miniflare/storage-memory": "2.14.2" - } - }, - "@miniflare/storage-memory": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/storage-memory/-/storage-memory-2.14.2.tgz", - "integrity": "sha512-9Wtz9mayHIY0LDsfpMGx+/sfKCq3eAQJzYY+ju1tTEaKR0sVAuO51wu0wbyldsjj9OcBcd2X32iPbIa7KcSZQQ==", - "dev": true, - "requires": { - "@miniflare/shared": "2.14.2" - } - }, - "@miniflare/watcher": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/watcher/-/watcher-2.14.2.tgz", - "integrity": "sha512-/TL0np4uYDl+6MdseDApZmDdlJ6Y7AY5iDY0TvUQJG9nyBoCjX6w0Zn4SiKDwO6660rPtSqZ5c7HzbPhGb5vsA==", - "dev": true, - "requires": { - "@miniflare/shared": "2.14.2" - } - }, - "@miniflare/web-sockets": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@miniflare/web-sockets/-/web-sockets-2.14.2.tgz", - "integrity": "sha512-kpbVlznPuxNQahssQvZiNPQo/iPme7qV3WMQeg6TYNCkYD7n6vEqeFZ5E/eQgB59xCanpvw4Ci8y/+SdMK6BUg==", - "dev": true, - "requires": { - "@miniflare/core": "2.14.2", - "@miniflare/shared": "2.14.2", - "undici": "5.28.2", - "ws": "^8.2.2" - }, - "dependencies": { - "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "requires": {} - } - } - }, - "@ndelangen/get-tarball": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz", - "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==", - "dev": true, - "requires": { - "gunzip-maybe": "^1.4.2", - "pump": "^3.0.0", - "tar-fs": "^2.1.1" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, - "@npmcli/package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==", - "dev": true, - "requires": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" - } - }, - "@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "requires": { - "which": "^3.0.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@radix-ui/number": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", - "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/react-arrow": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", - "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - } - }, - "@radix-ui/react-collection": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", - "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2" - } - }, - "@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/react-direction": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", - "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/react-dismissable-layer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", - "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" - } - }, - "@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/react-focus-scope": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", - "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" - } - }, - "@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - } - }, - "@radix-ui/react-popper": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", - "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-rect": "1.0.1", - "@radix-ui/react-use-size": "1.0.1", - "@radix-ui/rect": "1.0.1" - } - }, - "@radix-ui/react-portal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", - "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - } - }, - "@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - } - }, - "@radix-ui/react-roving-focus": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", - "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1" - } - }, - "@radix-ui/react-select": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", - "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/number": "1.0.1", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-collection": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.3", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.2", - "@radix-ui/react-portal": "1.0.3", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-controllable-state": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-previous": "1.0.1", - "@radix-ui/react-visually-hidden": "1.0.3", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - } - }, - "@radix-ui/react-separator": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz", - "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - } - }, - "@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" - } - }, - "@radix-ui/react-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", - "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - } - }, - "@radix-ui/react-toggle-group": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", - "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-toggle": "1.0.3", - "@radix-ui/react-use-controllable-state": "1.0.1" - } - }, - "@radix-ui/react-toolbar": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz", - "integrity": "sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-roving-focus": "1.0.4", - "@radix-ui/react-separator": "1.0.3", - "@radix-ui/react-toggle-group": "1.0.4" - } - }, - "@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - } - }, - "@radix-ui/react-use-escape-keydown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - } - }, - "@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/react-use-previous": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", - "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@radix-ui/react-use-rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", - "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/rect": "1.0.1" - } - }, - "@radix-ui/react-use-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", - "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - } - }, - "@radix-ui/react-visually-hidden": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", - "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - } - }, - "@radix-ui/rect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", - "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.13.10" - } - }, - "@remix-run/cloudflare": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/cloudflare/-/cloudflare-2.6.0.tgz", - "integrity": "sha512-wL6d9oaaSNherRQZI11q+qedqGDkQdu85BZYgeg6MLoMvyX2ogHe004ZIZAsAfk0LYET1YR0gY1jIGTfXaHYdg==", - "requires": { - "@cloudflare/kv-asset-handler": "^0.1.3", - "@remix-run/server-runtime": "2.6.0" - } - }, - "@remix-run/cloudflare-workers": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/cloudflare-workers/-/cloudflare-workers-2.6.0.tgz", - "integrity": "sha512-N7FZxVRdwnuXuqui4s1zi4fnHklAKEG2PkWY453+bJIxdHgeU5HCJSUVs7m+oPHYw21SsPV133iA6z7GsiI1EA==", - "requires": { - "@cloudflare/kv-asset-handler": "^0.1.3", - "@remix-run/cloudflare": "2.6.0" - } - }, - "@remix-run/css-bundle": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/@remix-run/css-bundle/-/css-bundle-1.19.3.tgz", - "integrity": "sha512-XccfuPmTdtXT+Kx7Df62cyk8d2I6DrHIB02uDyIGOTq8lPlMXznErMW14asVcbGOV5ieAOvnch/pUJrsKoWRmw==" - }, - "@remix-run/dev": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/dev/-/dev-2.6.0.tgz", - "integrity": "sha512-wf5DoKxBwz3/84FNyFM6NKvQIOEv+Ukwj9DjXrDs6YLI6oSqw2XsJCxWN4lAbOxXuK37pBt1WAE8LzEMuyowsw==", - "dev": true, - "requires": { - "@babel/core": "^7.21.8", - "@babel/generator": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/plugin-syntax-decorators": "^7.22.10", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/preset-typescript": "^7.21.5", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.22.5", - "@mdx-js/mdx": "^2.3.0", - "@npmcli/package-json": "^4.0.1", - "@remix-run/node": "2.6.0", - "@remix-run/router": "1.15.0", - "@remix-run/server-runtime": "2.6.0", - "@types/mdx": "^2.0.5", - "@vanilla-extract/integration": "^6.2.0", - "arg": "^5.0.1", - "cacache": "^17.1.3", - "chalk": "^4.1.2", - "chokidar": "^3.5.1", - "cross-spawn": "^7.0.3", - "dotenv": "^16.0.0", - "es-module-lexer": "^1.3.1", - "esbuild": "0.17.6", - "esbuild-plugins-node-modules-polyfill": "^1.6.0", - "execa": "5.1.1", - "exit-hook": "2.2.1", - "express": "^4.17.1", - "fs-extra": "^10.0.0", - "get-port": "^5.1.1", - "gunzip-maybe": "^1.4.2", - "jsesc": "3.0.2", - "json5": "^2.2.2", - "lodash": "^4.17.21", - "lodash.debounce": "^4.0.8", - "minimatch": "^9.0.0", - "ora": "^5.4.1", - "picocolors": "^1.0.0", - "picomatch": "^2.3.1", - "pidtree": "^0.6.0", - "postcss": "^8.4.19", - "postcss-discard-duplicates": "^5.1.0", - "postcss-load-config": "^4.0.1", - "postcss-modules": "^6.0.0", - "prettier": "^2.7.1", - "pretty-ms": "^7.0.1", - "react-refresh": "^0.14.0", - "remark-frontmatter": "4.0.1", - "remark-mdx-frontmatter": "^1.0.1", - "semver": "^7.3.7", - "set-cookie-parser": "^2.6.0", - "tar-fs": "^2.1.1", - "tsconfig-paths": "^4.0.0", - "ws": "^7.4.5" - }, - "dependencies": { - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - } - } - }, - "@remix-run/node": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/node/-/node-2.6.0.tgz", - "integrity": "sha512-bWemy3g258Kdqi+4OxIEZ7QS64T96jNK6a7NdlPXGJZqeLpxM5NmlCl/slSdx52oTi9r5Xoz1Tm4uR37nD1/Xw==", - "dev": true, - "requires": { - "@remix-run/server-runtime": "2.6.0", - "@remix-run/web-fetch": "^4.4.2", - "@remix-run/web-file": "^3.1.0", - "@remix-run/web-stream": "^1.1.0", - "@web3-storage/multipart-parser": "^1.0.0", - "cookie-signature": "^1.1.0", - "source-map-support": "^0.5.21", - "stream-slice": "^0.1.2" - } - }, - "@remix-run/react": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/react/-/react-2.6.0.tgz", - "integrity": "sha512-m/Ph6bryny7wrmrQyXQMvIiW+cBLrU/MepcLGFPvTVVwvfeiGBgXRiYZJ6yPNsfrmHFaS83d+Ja/Mx4N4zUWcg==", - "requires": { - "@remix-run/router": "1.15.0", - "@remix-run/server-runtime": "2.6.0", - "react-router": "6.22.0", - "react-router-dom": "6.22.0" - } - }, - "@remix-run/router": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz", - "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==" - }, - "@remix-run/server-runtime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/server-runtime/-/server-runtime-2.6.0.tgz", - "integrity": "sha512-qFXDl4pK55njBLuvyRn5AkI/hu8fEU3t1XFKv0Syivx0nmUVpWMW25Uzi1pkX/chF1VIxCVrZ8KuQ1rcrKj+DQ==", - "requires": { - "@remix-run/router": "1.15.0", - "@types/cookie": "^0.6.0", - "@web3-storage/multipart-parser": "^1.0.0", - "cookie": "^0.6.0", - "set-cookie-parser": "^2.4.8", - "source-map": "^0.7.3" - } - }, - "@remix-run/web-blob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-blob/-/web-blob-3.1.0.tgz", - "integrity": "sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==", - "dev": true, - "requires": { - "@remix-run/web-stream": "^1.1.0", - "web-encoding": "1.1.5" - } - }, - "@remix-run/web-fetch": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@remix-run/web-fetch/-/web-fetch-4.4.2.tgz", - "integrity": "sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==", - "dev": true, - "requires": { - "@remix-run/web-blob": "^3.1.0", - "@remix-run/web-file": "^3.1.0", - "@remix-run/web-form-data": "^3.1.0", - "@remix-run/web-stream": "^1.1.0", - "@web3-storage/multipart-parser": "^1.0.0", - "abort-controller": "^3.0.0", - "data-uri-to-buffer": "^3.0.1", - "mrmime": "^1.0.0" - } - }, - "@remix-run/web-file": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-file/-/web-file-3.1.0.tgz", - "integrity": "sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==", - "dev": true, - "requires": { - "@remix-run/web-blob": "^3.1.0" - } - }, - "@remix-run/web-form-data": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-form-data/-/web-form-data-3.1.0.tgz", - "integrity": "sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==", - "dev": true, - "requires": { - "web-encoding": "1.1.5" - } - }, - "@remix-run/web-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@remix-run/web-stream/-/web-stream-1.1.0.tgz", - "integrity": "sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==", - "dev": true, - "requires": { - "web-streams-polyfill": "^3.1.1" - } - }, - "@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", - "dev": true, - "optional": true - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@storybook/addon-actions": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.12.tgz", - "integrity": "sha512-vK/H6K+AJ4ZSsCu/+MapYYI/xrynB6JoCOejt//flTigZOhwTWv7WXbmEeqGIIToXy0LA2IUZ1/kCjFXR0lEdQ==", - "dev": true, - "requires": { - "@storybook/core-events": "7.6.12", - "@storybook/global": "^5.0.0", - "@types/uuid": "^9.0.1", - "dequal": "^2.0.2", - "polished": "^4.2.2", - "uuid": "^9.0.0" - } - }, - "@storybook/addon-backgrounds": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.12.tgz", - "integrity": "sha512-G14uN5lDXUtXw+dmEPaB6lpDpR9K25ssYuWWn8yYR44B1WMuD4kDgw0QGb0g+xYQj9R1TsalKEJHA4AuSYkVGQ==", - "dev": true, - "requires": { - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/addon-controls": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.12.tgz", - "integrity": "sha512-NX4KajscOsuXyYE3hhniF+y0E59E6rM0FgIaZ48P9c0DD+wDo8bAISHjZvmKXtDVajLk4/JySvByx1eN6V3hmA==", - "dev": true, - "requires": { - "@storybook/blocks": "7.6.12", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/addon-designs": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@storybook/addon-designs/-/addon-designs-7.0.9.tgz", - "integrity": "sha512-xJdw1/FgkC8ovTdRIL5FyEJaXtF1XPxsb6rsl2jByG+8tXyM0PJ/yFEkBrqn35Dei2i4N7x8EHXFd8DnzriBRg==", - "dev": true, - "requires": { - "@figspec/react": "^1.0.0" - } - }, - "@storybook/addon-docs": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.12.tgz", - "integrity": "sha512-AzMgnGYfEg+Z1ycJh8MEp44x1DfjRijKCVYNaPFT6o+TjN/9GBaAkV4ydxmQzMEMnnnh/0E9YeHO+ivBVSkNog==", - "dev": true, - "requires": { - "@jest/transform": "^29.3.1", - "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/components": "7.6.12", - "@storybook/csf-plugin": "7.6.12", - "@storybook/csf-tools": "7.6.12", - "@storybook/global": "^5.0.0", - "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.6.12", - "@storybook/postinstall": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/react-dom-shim": "7.6.12", - "@storybook/theming": "7.6.12", - "@storybook/types": "7.6.12", - "fs-extra": "^11.1.0", - "remark-external-links": "^8.0.0", - "remark-slug": "^6.0.0", - "ts-dedent": "^2.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "@storybook/addon-essentials": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.12.tgz", - "integrity": "sha512-Pl6n+19QC/T+cuU8DZjCwILXVxrdRTivNxPOiy8SEX+jjR4H0uAfXC9+RXCPjRFn64t4j1K7oIyoNokEn39cNw==", - "dev": true, - "requires": { - "@storybook/addon-actions": "7.6.12", - "@storybook/addon-backgrounds": "7.6.12", - "@storybook/addon-controls": "7.6.12", - "@storybook/addon-docs": "7.6.12", - "@storybook/addon-highlight": "7.6.12", - "@storybook/addon-measure": "7.6.12", - "@storybook/addon-outline": "7.6.12", - "@storybook/addon-toolbars": "7.6.12", - "@storybook/addon-viewport": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/manager-api": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/preview-api": "7.6.12", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/addon-highlight": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.12.tgz", - "integrity": "sha512-rWNEyBhwncXEDd9z7l67BLBIPqn0SRI/CJpZvCSF5KLWrVaoSEDF8INavmbikd1JBMcajJ28Ur6NsGj+eJjJiw==", - "dev": true, - "requires": { - "@storybook/global": "^5.0.0" - } - }, - "@storybook/addon-interactions": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.12.tgz", - "integrity": "sha512-D8NX2xu9WiqPInoN842DU+KAFVC8HscGczqkDGEiWCAqq0DfXtW/0ClMSaE6d2+twhGv6uiPfeJ2IdynSZolXg==", - "dev": true, - "requires": { - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.12", - "jest-mock": "^27.0.6", - "polished": "^4.2.2", - "ts-dedent": "^2.2.0" - }, - "dependencies": { - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" - } - } - } - }, - "@storybook/addon-links": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.12.tgz", - "integrity": "sha512-rGwPYpZAANPrf2GaNi5t9zAjLF8PgzKizyBPltIXUtplxDg88ziXlDA1dhsuGDs4Kf0oXECyAHPw79JjkJQziA==", - "dev": true, - "requires": { - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/addon-measure": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.12.tgz", - "integrity": "sha512-K3aKErr84V0eVK7t+wco5cSYDdeotwoXi4e7VLSa2cdUz0wanOb4R7v3kf6vxucUyp05Lv+yHkz9zsbwuezepA==", - "dev": true, - "requires": { - "@storybook/global": "^5.0.0", - "tiny-invariant": "^1.3.1" - } - }, - "@storybook/addon-onboarding": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-1.0.11.tgz", - "integrity": "sha512-0Sa7PJDsM6AANOWZX7vq3kgCbS9AZFjr3tfr3bLGfXviwIBKjoZDDdIErJkS3D4mNcDa78lYQvp3PTCKwLIJ9A==", - "dev": true, - "requires": { - "@storybook/telemetry": "^7.1.0", - "react-confetti": "^6.1.0" - } - }, - "@storybook/addon-outline": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.12.tgz", - "integrity": "sha512-r6eO4EKh+zwGUNjxe8v/44BhyV+JD3Dl9GYMutsFqbwYsoWHJaZmzHuyqeFBXwx2MEoixdWdIzNMP71+srQqvw==", - "dev": true, - "requires": { - "@storybook/global": "^5.0.0", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/addon-toolbars": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.12.tgz", - "integrity": "sha512-TSwq8xO7fmS6GRTgJJa31OBzm+5zlgDYK2Q42jxFo/Vm10uMzCpjYJE6mIHpUDyjyBVQk6xxMMEcvo6no2eAWg==", - "dev": true - }, - "@storybook/addon-viewport": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.12.tgz", - "integrity": "sha512-51zsBeoaEzq699SKDCe+GG/2PDAJKKJtpjqxIc4lDskogaCJSb3Ie8LyookHAKYgbi2qealVgK8zaP27KUj3Pg==", - "dev": true, - "requires": { - "memoizerific": "^1.11.3" - } - }, - "@storybook/addons": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-7.6.12.tgz", - "integrity": "sha512-q1oN9TMdtpFqwb/oKZfbjcfGj/q629vJjhV0Q5SP9y89rBbhyxLf3U4miATQdzPo9lC3WHvaNm5ME8BjNkqO/Q==", - "dev": true, - "peer": true, - "requires": { - "@storybook/manager-api": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/types": "7.6.12" - } - }, - "@storybook/blocks": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.12.tgz", - "integrity": "sha512-T47KOAjgZmhV+Ov59A70inE5edInh1Jh5w/5J5cjpk9a2p4uhd337SnK4B8J5YLhcM2lbKRWJjzIJ0nDZQTdnQ==", - "dev": true, - "requires": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/components": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/csf": "^0.1.2", - "@storybook/docs-tools": "7.6.12", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/theming": "7.6.12", - "@storybook/types": "7.6.12", - "@types/lodash": "^4.14.167", - "color-convert": "^2.0.1", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "markdown-to-jsx": "^7.1.8", - "memoizerific": "^1.11.3", - "polished": "^4.2.2", - "react-colorful": "^5.1.2", - "telejson": "^7.2.0", - "tocbot": "^4.20.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/builder-manager": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.12.tgz", - "integrity": "sha512-AJFrtBj0R11OFwwz+2j+ivRzttWXT6LesSGoLnxown24EV9uLQoHtGb7GOA2GyzY5wjUJS9gQBPGHXjvQEfLJA==", - "dev": true, - "requires": { - "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.6.12", - "@storybook/manager": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@types/ejs": "^3.1.1", - "@types/find-cache-dir": "^3.2.1", - "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", - "browser-assert": "^1.2.1", - "ejs": "^3.1.8", - "esbuild": "^0.18.0", - "esbuild-plugin-alias": "^0.2.1", - "express": "^4.17.3", - "find-cache-dir": "^3.0.0", - "fs-extra": "^11.1.0", - "process": "^0.11.10", - "util": "^0.12.4" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "requires": { - "@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" - } - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "@storybook/builder-vite": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.6.12.tgz", - "integrity": "sha512-VJIn+XYVVhdJHHMEtYDnEyQQU4fRupugSFpP9XLYTRYgXPN9PSVey4vI/IyuHcHYINPba39UY2+8PW+5NgShxQ==", - "dev": true, - "requires": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/csf-plugin": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/preview": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/types": "7.6.12", - "@types/find-cache-dir": "^3.2.1", - "browser-assert": "^1.2.1", - "es-module-lexer": "^0.9.3", - "express": "^4.17.3", - "find-cache-dir": "^3.0.0", - "fs-extra": "^11.1.0", - "magic-string": "^0.30.0", - "rollup": "^2.25.0 || ^3.3.0" - }, - "dependencies": { - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - } - } - }, - "@storybook/channels": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.12.tgz", - "integrity": "sha512-TaPl5Y3lOoVi5kTLgKNRX8xh2sUPekH0Id1l4Ymw+lpgriEY6r60bmkZLysLG1GhlskpQ/da2+S2ap2ht8P2TQ==", - "dev": true, - "requires": { - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - } - }, - "@storybook/cli": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.12.tgz", - "integrity": "sha512-x4sG1oIVERxp+WnWUexVlgaJCFmML0kGi7a5qfx7z4vHMxCV/WG7g1q7mPS/kqStCGEiQdTciCqOEFqlMh9MLw==", - "dev": true, - "requires": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/types": "^7.23.0", - "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/core-server": "7.6.12", - "@storybook/csf-tools": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/telemetry": "7.6.12", - "@storybook/types": "7.6.12", - "@types/semver": "^7.3.4", - "@yarnpkg/fslib": "2.10.3", - "@yarnpkg/libzip": "2.3.0", - "chalk": "^4.1.0", - "commander": "^6.2.1", - "cross-spawn": "^7.0.3", - "detect-indent": "^6.1.0", - "envinfo": "^7.7.3", - "execa": "^5.0.0", - "express": "^4.17.3", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "get-npm-tarball-url": "^2.0.3", - "get-port": "^5.1.1", - "giget": "^1.0.0", - "globby": "^11.0.2", - "jscodeshift": "^0.15.1", - "leven": "^3.1.0", - "ora": "^5.4.1", - "prettier": "^2.8.0", - "prompts": "^2.4.0", - "puppeteer-core": "^2.1.1", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", - "strip-json-comments": "^3.0.1", - "tempy": "^1.0.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - } - } - }, - "@storybook/client-logger": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.12.tgz", - "integrity": "sha512-hiRv6dXsOttMPqm9SxEuFoAtDe9rs7TUS8XcO5rmJ9BgfwBJsYlHzAxXkazxmvlyZtKL7gMx6m8OYbCdZgUqtA==", - "dev": true, - "requires": { - "@storybook/global": "^5.0.0" - } - }, - "@storybook/codemod": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.12.tgz", - "integrity": "sha512-4EI4Ah1cvz6gFkXOS/LGf23oN8LO6ABGpWwPQoMHpIV3wUkFWBwrKFUe/UAQZGptnM0VZRYx4grS82Hluw4XJA==", - "dev": true, - "requires": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/csf-tools": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/types": "7.6.12", - "@types/cross-spawn": "^6.0.2", - "cross-spawn": "^7.0.3", - "globby": "^11.0.2", - "jscodeshift": "^0.15.1", - "lodash": "^4.17.21", - "prettier": "^2.8.0", - "recast": "^0.23.1" - }, - "dependencies": { - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - } - } - }, - "@storybook/components": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.12.tgz", - "integrity": "sha512-PCijPqmlZd7qyTzNr+vD0Kf8sAI9vWJIaxbSjXwn/De3e63m4fsEcIf8FaUT8cMZ46AWZvaxaxX5km2u0UISJQ==", - "dev": true, - "requires": { - "@radix-ui/react-select": "^1.2.2", - "@radix-ui/react-toolbar": "^1.0.4", - "@storybook/client-logger": "7.6.12", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/theming": "7.6.12", - "@storybook/types": "7.6.12", - "memoizerific": "^1.11.3", - "use-resize-observer": "^9.1.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/core-client": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.12.tgz", - "integrity": "sha512-VzVp32tMZsCzM4UIqfvCoJF7N9mBf6dsAxh1/ZgViy75Fht78pGo3JwZXW8osMbFSRpmWD7fxlUM5S7TQOYQug==", - "dev": true, - "requires": { - "@storybook/client-logger": "7.6.12", - "@storybook/preview-api": "7.6.12" - } - }, - "@storybook/core-common": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.12.tgz", - "integrity": "sha512-kM9YiBBMM2x5v/oylL7gdO1PS4oehgJC21MivS9p5QZ8uuXKtCQ6UQvI3rzaV+1ZzUA4n+I8MyaMrNIQk8KDbw==", - "dev": true, - "requires": { - "@storybook/core-events": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/types": "7.6.12", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "dev": true, - "optional": true - }, - "@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "requires": { - "@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" - } - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@storybook/core-events": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.12.tgz", - "integrity": "sha512-IO4cwk7bBCKH6lLnnIlHO9FwQXt/9CzLUAoZSY9msWsdPppCdKlw8ynJI5YarSNKDBUn8ArIfnRf0Mve0KQr9Q==", - "dev": true, - "requires": { - "ts-dedent": "^2.0.0" - } - }, - "@storybook/core-server": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.12.tgz", - "integrity": "sha512-tjWifKsDnIc8pvbjVyQrOHef70Gcp93Bg3WwuysB8PGk7lcX2RD9zv44HNIyjxdOLSSv66IGKrOldEBL3hab4w==", - "dev": true, - "requires": { - "@aw-web-design/x-default-browser": "1.4.126", - "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.6.12", - "@storybook/channels": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/csf": "^0.1.2", - "@storybook/csf-tools": "7.6.12", - "@storybook/docs-mdx": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/manager": "7.6.12", - "@storybook/node-logger": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/telemetry": "7.6.12", - "@storybook/types": "7.6.12", - "@types/detect-port": "^1.3.0", - "@types/node": "^18.0.0", - "@types/pretty-hrtime": "^1.0.0", - "@types/semver": "^7.3.4", - "better-opn": "^3.0.2", - "chalk": "^4.1.0", - "cli-table3": "^0.6.1", - "compression": "^1.7.4", - "detect-port": "^1.3.0", - "express": "^4.17.3", - "fs-extra": "^11.1.0", - "globby": "^11.0.2", - "ip": "^2.0.0", - "lodash": "^4.17.21", - "open": "^8.4.0", - "pretty-hrtime": "^1.0.3", - "prompts": "^2.4.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", - "watchpack": "^2.2.0", - "ws": "^8.2.3" - }, - "dependencies": { - "@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "requires": {} - } - } - }, - "@storybook/csf": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.2.tgz", - "integrity": "sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==", - "dev": true, - "requires": { - "type-fest": "^2.19.0" - }, - "dependencies": { - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "@storybook/csf-plugin": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.12.tgz", - "integrity": "sha512-fe/84AyctJcrpH1F/tTBxKrbjv0ilmG3ZTwVcufEiAzupZuYjQ/0P+Pxs8m8VxiGJZZ1pWofFFDbYi+wERjamQ==", - "dev": true, - "requires": { - "@storybook/csf-tools": "7.6.12", - "unplugin": "^1.3.1" - } - }, - "@storybook/csf-tools": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.12.tgz", - "integrity": "sha512-MdhkYYxSW5I6Jpk34gTkAZsuj9sxe0xdyeUQpNa8CgJxG43F+ehZ6scW/IPjoSG9gCXBUJMekq26UrmbVfsLCQ==", - "dev": true, - "requires": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/types": "7.6.12", - "fs-extra": "^11.1.0", - "recast": "^0.23.1", - "ts-dedent": "^2.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "@storybook/docs-mdx": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz", - "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==", - "dev": true - }, - "@storybook/docs-tools": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.12.tgz", - "integrity": "sha512-nY2lqEDTd/fR/D91ZLlIp+boSuJtkb8DqHW7pECy61rJqzGq4QpepRaWjQDKnGTgPItrsPfTPOu6iXvXNK07Ow==", - "dev": true, - "requires": { - "@storybook/core-common": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@storybook/types": "7.6.12", - "@types/doctrine": "^0.0.3", - "assert": "^2.1.0", - "doctrine": "^3.0.0", - "lodash": "^4.17.21" - } - }, - "@storybook/global": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", - "dev": true - }, - "@storybook/instrumenter": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-7.6.12.tgz", - "integrity": "sha512-BK+hCz2tuUSDPvN0kACR+Ev7lQj4SLlMdXiJgRGdnKWR7zr1OFEg9MEIwPHNC+Ywny1x7YOwrbNJ9sdISNIh0g==", - "dev": true, - "requires": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.6.12", - "@vitest/utils": "^0.34.6", - "util": "^0.12.4" - } - }, - "@storybook/manager": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.12.tgz", - "integrity": "sha512-WMWvswJHGiqJFJb98WQMQfZQhLuVtmci4y/VJGQ/Jnq1nJQs76BCtaeGiHcsYmRaAP1HMI4DbzuTSEgca146xw==", - "dev": true - }, - "@storybook/manager-api": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.12.tgz", - "integrity": "sha512-XA5KQpY44d6mlqt0AlesZ7fsPpm1PCpoV+nRGFBR0YtF6RdPFvrPyHhlGgLkJC4xSyb2YJmLKn8cERSluAcEgQ==", - "dev": true, - "requires": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/router": "7.6.12", - "@storybook/theming": "7.6.12", - "@storybook/types": "7.6.12", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "store2": "^2.14.2", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/mdx2-csf": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz", - "integrity": "sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==", - "dev": true - }, - "@storybook/node-logger": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.12.tgz", - "integrity": "sha512-iS44/EjfF6hLecKzICmcpQoB9bmVi4tXx5gVXnbI5ZyziBibRQcg/U191Njl7wY2ScN/RCQOr8lh5k57rI3Prg==", - "dev": true - }, - "@storybook/postinstall": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.12.tgz", - "integrity": "sha512-uR0mDPxLzPaouCNrLp8vID8lATVTOtG7HB6lfjjzMdE3sN6MLmK9n2z2nXjb5DRRxOFWMeE1/4Age1/Ml2tnmA==", - "dev": true - }, - "@storybook/preview": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.12.tgz", - "integrity": "sha512-7vbeqQY3X+FCt/ccgCuBmj4rkbQebLHGEBAt8elcX0E2pr7SGW57lWhnasU3jeMaz7tNrkcs0gfl4hyVRWUHDg==", - "dev": true - }, - "@storybook/preview-api": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.12.tgz", - "integrity": "sha512-uSzeMSLnCRROjiofJP0F0niLWL+sboQ5ktHW6BAYoPwprumXduPxKBUVEZNxMbVYoAz9v/kEZmaLauh8LRP2Hg==", - "dev": true, - "requires": { - "@storybook/channels": "7.6.12", - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.12", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/react": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.12.tgz", - "integrity": "sha512-ITDRGi79Qg+z1kGYv+yyJESz/5AsJVdBTMO7tr1qV7gmHElkASt6UR8SBSqKgePOnYgy3k/1PLfbzOs6G4OgYQ==", - "dev": true, - "requires": { - "@storybook/client-logger": "7.6.12", - "@storybook/core-client": "7.6.12", - "@storybook/docs-tools": "7.6.12", - "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.6.12", - "@storybook/react-dom-shim": "7.6.12", - "@storybook/types": "7.6.12", - "@types/escodegen": "^0.0.6", - "@types/estree": "^0.0.51", - "@types/node": "^18.0.0", - "acorn": "^7.4.1", - "acorn-jsx": "^5.3.1", - "acorn-walk": "^7.2.0", - "escodegen": "^2.1.0", - "html-tags": "^3.1.0", - "lodash": "^4.17.21", - "prop-types": "^15.7.2", - "react-element-to-jsx-string": "^15.0.0", - "ts-dedent": "^2.0.0", - "type-fest": "~2.19", - "util-deprecate": "^1.0.2" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/node": { - "version": "18.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", - "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "@storybook/react-dom-shim": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.12.tgz", - "integrity": "sha512-P8eu/s/RQlc/7Yvr260lqNa6rttxIYiPUuHQBu9oCacwkpB3Xep2R/PUY2CifRHqlDhaOINO/Z79oGZl4EBQRQ==", - "dev": true, - "requires": {} - }, - "@storybook/react-vite": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-7.6.12.tgz", - "integrity": "sha512-kQjCWmTcHuZM1Mlt1QjpYNXP1TxfkSDFWC36fSEUC0q48wzyjUEZs6YraxZu0YE+zXK+X4tmaZhz8pUPgV3gLw==", - "dev": true, - "requires": { - "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.0", - "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "7.6.12", - "@storybook/react": "7.6.12", - "@vitejs/plugin-react": "^3.0.1", - "magic-string": "^0.30.0", - "react-docgen": "^7.0.0" - }, - "dependencies": { - "@vitejs/plugin-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", - "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", - "dev": true, - "requires": { - "@babel/core": "^7.20.12", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.19.6", - "magic-string": "^0.27.0", - "react-refresh": "^0.14.0" - }, - "dependencies": { - "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - } - } - }, - "magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - } - } - }, - "@storybook/router": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.12.tgz", - "integrity": "sha512-1fqscJbePFJXhapqiv7fAIIqAvouSsdPnqWjJGJrUMR6JBtRYMcrb3MnDeqi9OYnU73r65BrQBPtSzWM8nP0LQ==", - "dev": true, - "requires": { - "@storybook/client-logger": "7.6.12", - "memoizerific": "^1.11.3", - "qs": "^6.10.0" - } - }, - "@storybook/telemetry": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.12.tgz", - "integrity": "sha512-eBG3sLb9CZ05pyK2JXBvnaAsxDzbZH57VyhtphhuZmx0DqF/78qIoHs9ebRJpJWV0sL5rtT9vIq8QXpQhDHLWg==", - "dev": true, - "requires": { - "@storybook/client-logger": "7.6.12", - "@storybook/core-common": "7.6.12", - "@storybook/csf-tools": "7.6.12", - "chalk": "^4.1.0", - "detect-package-manager": "^2.0.1", - "fetch-retry": "^5.0.2", - "fs-extra": "^11.1.0", - "read-pkg-up": "^7.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "@storybook/test": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-7.6.12.tgz", - "integrity": "sha512-kOkgr9EJqeitoN3ubbVRrAysHCqxpAFAyKzWCGuic9ynxvfTOc5prup0e05/GJmbHYqkWsOyaordXgcHvy8JaQ==", - "dev": true, - "requires": { - "@storybook/client-logger": "7.6.12", - "@storybook/core-events": "7.6.12", - "@storybook/instrumenter": "7.6.12", - "@storybook/preview-api": "7.6.12", - "@testing-library/dom": "^9.3.1", - "@testing-library/jest-dom": "^6.1.3", - "@testing-library/user-event": "14.3.0", - "@types/chai": "^4", - "@vitest/expect": "^0.34.2", - "@vitest/spy": "^0.34.1", - "chai": "^4.3.7", - "util": "^0.12.4" - } - }, - "@storybook/theming": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.12.tgz", - "integrity": "sha512-P4zoMKlSYbNrWJjQROuz+DZSDEpdf3TUvk203EqBRdElqw2EMHcqZ8+0HGPFfVHpqEj05+B9Mr6R/Z/BURj0lw==", - "dev": true, - "requires": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.6.12", - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" - } - }, - "@storybook/types": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.12.tgz", - "integrity": "sha512-Wsbd+NS10/2yMHQ/26rXHflXam0hm2qufTFiHOX6VXZWxij3slRU88Fnwzp+1QSyjXb0qkEr8dOx7aG00+ItVw==", - "dev": true, - "requires": { - "@storybook/channels": "7.6.12", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - } - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "dev": true, - "requires": {} - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "dev": true, - "requires": {} - }, - "@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - } - }, - "@svgr/cli": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/cli/-/cli-8.1.0.tgz", - "integrity": "sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A==", - "dev": true, - "requires": { - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-prettier": "8.1.0", - "@svgr/plugin-svgo": "8.1.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "dashify": "^2.0.0", - "glob": "^8.0.3", - "snake-case": "^3.0.4" - }, - "dependencies": { - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dev": true, - "requires": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dev": true, - "requires": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - } - }, - "@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "dev": true, - "requires": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - } - }, - "@svgr/plugin-prettier": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-prettier/-/plugin-prettier-8.1.0.tgz", - "integrity": "sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw==", - "dev": true, - "requires": { - "deepmerge": "^4.3.1", - "prettier": "^2.8.7" - }, - "dependencies": { - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - } - } - }, - "@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "dev": true, - "requires": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - } - }, - "@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - } - } - }, - "@testing-library/jest-dom": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz", - "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==", - "dev": true, - "requires": { - "@adobe/css-tools": "^4.3.2", - "@babel/runtime": "^7.9.2", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true - } - } - }, - "@testing-library/user-event": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.3.0.tgz", - "integrity": "sha512-P02xtBBa8yMaLhK8CzJCIns8rqwnF6FxhR9zs810flHOBXUYCFjLd8Io1rQrAkQRWEmW2PGdZIEdMxf/KLsqFA==", - "dev": true, - "requires": {} - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/better-sqlite3": { - "version": "7.6.9", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.9.tgz", - "integrity": "sha512-FvktcujPDj9XKMJQWFcl2vVl7OdRIqsSRX9b0acWwTmwLK9CF2eqo/FRcmMLNpugKoX/avA6pb7TorDLmpgTnQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", - "dev": true - }, - "@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "@types/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/detect-port": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz", - "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==", - "dev": true - }, - "@types/doctrine": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz", - "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==", - "dev": true - }, - "@types/ejs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", - "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", - "dev": true - }, - "@types/emscripten": { - "version": "1.39.10", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz", - "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==", - "dev": true - }, - "@types/escodegen": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz", - "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==", - "dev": true - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "@types/estree-jsx": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.4.tgz", - "integrity": "sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/find-cache-dir": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz", - "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==", - "dev": true - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "dev": true, - "requires": { - "@types/unist": "^2" - } - }, - "@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true - }, - "@types/markdown-it": { - "version": "13.0.7", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", - "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", - "dev": true, - "requires": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "@types/markdown-it-footnote": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz", - "integrity": "sha512-sMLBj0VcWo/4vi1J7jx3DNdup2w+14RwDMdQtcFJPabeDwt945ghc8sFBgsUfnEjcBOuKaELY22JwGb7KGmsVw==", - "dev": true, - "requires": { - "@types/markdown-it": "*" - } - }, - "@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dev": true, - "requires": { - "@types/unist": "^2" - } - }, - "@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", - "dev": true - }, - "@types/mdx": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.11.tgz", - "integrity": "sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==", - "dev": true - }, - "@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "@types/mime-types": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", - "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", - "dev": true - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "@types/node": { - "version": "20.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.3.tgz", - "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==", - "dev": true - }, - "@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "@types/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true - }, - "@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "@types/react": { - "version": "18.2.53", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.53.tgz", - "integrity": "sha512-52IHsMDT8qATp9B9zoOyobW8W3/0QhaJQTw1HwRj0UY2yBpCAQ7+S/CqHYQ8niAm3p4ji+rWUQ9UCib0GxQ60w==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", - "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/resolve": { - "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", - "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", - "dev": true - }, - "@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, - "@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dev": true, - "requires": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true - }, - "@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true - }, - "@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.20.0.tgz", - "integrity": "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/type-utils": "6.20.0", - "@typescript-eslint/utils": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/parser": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz", - "integrity": "sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", - "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.20.0.tgz", - "integrity": "sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "6.20.0", - "@typescript-eslint/utils": "6.20.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz", - "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz", - "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz", - "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.0", - "semver": "^7.5.4" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", - "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "6.20.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "@vanilla-extract/babel-plugin-debug-ids": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.4.tgz", - "integrity": "sha512-mevYcVMwsT6960xnXRw/Rr2K7SOEwzwVBApg/2SJ3eg2KGsHfj1rN0oQ12WdoTT3RzThq+0551bVQKPvQnjeaA==", - "dev": true, - "requires": { - "@babel/core": "^7.20.7" - } - }, - "@vanilla-extract/css": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.14.1.tgz", - "integrity": "sha512-V4JUuHNjZgl64NGfkDJePqizkNgiSpphODtZEs4cCPuxLAzwOUJYATGpejwimJr1n529kq4DEKWexW22LMBokw==", - "dev": true, - "requires": { - "@emotion/hash": "^0.9.0", - "@vanilla-extract/private": "^1.0.3", - "chalk": "^4.1.1", - "css-what": "^6.1.0", - "cssesc": "^3.0.0", - "csstype": "^3.0.7", - "deep-object-diff": "^1.1.9", - "deepmerge": "^4.2.2", - "media-query-parser": "^2.0.2", - "modern-ahocorasick": "^1.0.0", - "outdent": "^0.8.0" - } - }, - "@vanilla-extract/integration": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@vanilla-extract/integration/-/integration-6.5.0.tgz", - "integrity": "sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==", - "dev": true, - "requires": { - "@babel/core": "^7.20.7", - "@babel/plugin-syntax-typescript": "^7.20.0", - "@vanilla-extract/babel-plugin-debug-ids": "^1.0.4", - "@vanilla-extract/css": "^1.14.0", - "esbuild": "npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0", - "eval": "0.1.8", - "find-up": "^5.0.0", - "javascript-stringify": "^2.0.1", - "lodash": "^4.17.21", - "mlly": "^1.4.2", - "outdent": "^0.8.0", - "vite": "^5.0.11", - "vite-node": "^1.2.0" - } - }, - "@vanilla-extract/private": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@vanilla-extract/private/-/private-1.0.3.tgz", - "integrity": "sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==", - "dev": true - }, - "@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", - "dev": true, - "requires": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" - } - }, - "@vitest/expect": { - "version": "0.34.7", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.7.tgz", - "integrity": "sha512-G9iEtwrD6ZQ4MVHZufif9Iqz3eLtuwBBNx971fNAGPaugM7ftAWjQN+ob2zWhtzURp8RK3zGXOxVb01mFo3zAQ==", - "dev": true, - "requires": { - "@vitest/spy": "0.34.7", - "@vitest/utils": "0.34.7", - "chai": "^4.3.10" - } - }, - "@vitest/spy": { - "version": "0.34.7", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.7.tgz", - "integrity": "sha512-NMMSzOY2d8L0mcOt4XcliDOS1ISyGlAXuQtERWVOoVHnKwmG+kKhinAiGw3dTtMQWybfa89FG8Ucg9tiC/FhTQ==", - "dev": true, - "requires": { - "tinyspy": "^2.1.1" - } - }, - "@vitest/utils": { - "version": "0.34.7", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.7.tgz", - "integrity": "sha512-ziAavQLpCYS9sLOorGrFFKmy2gnfiNU0ZJ15TsMz/K92NAPS/rp9K4z6AJQQk5Y8adCy4Iwpxy7pQumQ/psnRg==", - "dev": true, - "requires": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - } - }, - "@web3-storage/multipart-parser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz", - "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==" - }, - "@yarnpkg/esbuild-plugin-pnp": { - "version": "3.0.0-rc.15", - "resolved": "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz", - "integrity": "sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==", - "dev": true, - "requires": { - "tslib": "^2.4.0" - } - }, - "@yarnpkg/fslib": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", - "integrity": "sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==", - "dev": true, - "requires": { - "@yarnpkg/libzip": "^2.3.0", - "tslib": "^1.13.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@yarnpkg/libzip": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz", - "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==", - "dev": true, - "requires": { - "@types/emscripten": "^1.39.6", - "tslib": "^1.13.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@zxing/text-encoding": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", - "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", - "dev": true, - "optional": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true - }, - "address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true - }, - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==", - "dev": true - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "aria-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", - "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "requires": { - "deep-equal": "^2.0.5" - } - }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "requires": { - "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": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - } - }, - "as-table": { - "version": "1.0.55", - "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", - "dev": true, - "requires": { - "printable-characters": "^1.0.42" - } - }, - "assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, - "astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", - "dev": true - }, - "async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", - "dev": true - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "requires": {} - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, - "requires": { - "open": "^8.0.4" - } - }, - "big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "blake3-wasm": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", - "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", - "dev": true - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "requires": { - "big-integer": "^1.6.44" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-assert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", - "dev": true - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dev": true, - "requires": { - "pako": "~0.2.0" - } - }, - "browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true - }, - "cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001584", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001584.tgz", - "integrity": "sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==", - "dev": true - }, - "capnp-ts": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", - "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", - "dev": true, - "requires": { - "debug": "^4.3.1", - "tslib": "^2.2.0" - } - }, - "ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true - }, - "chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true - }, - "character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true - }, - "character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true - }, - "character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true - }, - "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "requires": { - "get-func-name": "^2.0.2" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chromatic": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-10.7.1.tgz", - "integrity": "sha512-ERxfVxTm8gnbv3bdWeNyUVQ4msbtYc/dZIpt+3TVxqEq4tMlzVCnTFl1rDfJ7Jj1enGFoxvZ+Q2xon7Jfi+cZw==", - "dev": true, - "requires": {} - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - }, - "citty": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.5.tgz", - "integrity": "sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==", - "dev": true, - "requires": { - "consola": "^3.2.3" - } - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true - }, - "cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true - }, - "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" - }, - "cookie-signature": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", - "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", - "dev": true - }, - "copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "requires": { - "toggle-selection": "^1.0.6" - } - }, - "core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", - "dev": true, - "requires": { - "browserslist": "^4.22.2" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - } - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "requires": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dev": true, - "requires": { - "css-tree": "~2.2.0" - }, - "dependencies": { - "css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dev": true, - "requires": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - } - }, - "mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true - } - } - }, - "csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "dashify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dashify/-/dashify-2.0.0.tgz", - "integrity": "sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==", - "dev": true - }, - "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dev": true, - "requires": { - "character-entities": "^2.0.0" - } - }, - "dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "requires": {} - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "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.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deep-object-diff": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz", - "integrity": "sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "requires": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - } - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true - }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "dev": true - }, - "detect-package-manager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", - "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", - "dev": true, - "requires": { - "execa": "^5.1.1" - } - }, - "detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dotenv": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", - "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", - "dev": true - }, - "dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "electron-to-chromium": { - "version": "1.4.656", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz", - "integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "envinfo": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", - "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "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.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "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.13" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true - }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "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" - } - }, - "es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "requires": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.6.tgz", - "integrity": "sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.6", - "@esbuild/android-arm64": "0.17.6", - "@esbuild/android-x64": "0.17.6", - "@esbuild/darwin-arm64": "0.17.6", - "@esbuild/darwin-x64": "0.17.6", - "@esbuild/freebsd-arm64": "0.17.6", - "@esbuild/freebsd-x64": "0.17.6", - "@esbuild/linux-arm": "0.17.6", - "@esbuild/linux-arm64": "0.17.6", - "@esbuild/linux-ia32": "0.17.6", - "@esbuild/linux-loong64": "0.17.6", - "@esbuild/linux-mips64el": "0.17.6", - "@esbuild/linux-ppc64": "0.17.6", - "@esbuild/linux-riscv64": "0.17.6", - "@esbuild/linux-s390x": "0.17.6", - "@esbuild/linux-x64": "0.17.6", - "@esbuild/netbsd-x64": "0.17.6", - "@esbuild/openbsd-x64": "0.17.6", - "@esbuild/sunos-x64": "0.17.6", - "@esbuild/win32-arm64": "0.17.6", - "@esbuild/win32-ia32": "0.17.6", - "@esbuild/win32-x64": "0.17.6" - } - }, - "esbuild-plugin-alias": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", - "integrity": "sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==", - "dev": true - }, - "esbuild-plugins-node-modules-polyfill": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.6.2.tgz", - "integrity": "sha512-UwFku/RAQkKi6YsL6SkltZOz7qjmLadvT+7B46jzUqcHrQw524dn4MyMmMRUkAklBsX9nXzVt3LswQlznTJN7A==", - "dev": true, - "requires": { - "@jspm/core": "^2.0.1", - "local-pkg": "^0.5.0", - "resolve.exports": "^2.0.2" - } - }, - "esbuild-register": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", - "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "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" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} - }, - "eslint-plugin-react-refresh": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", - "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", - "dev": true, - "requires": {} - }, - "eslint-plugin-storybook": { - "version": "0.6.15", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.15.tgz", - "integrity": "sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w==", - "dev": true, - "requires": { - "@storybook/csf": "^0.0.1", - "@typescript-eslint/utils": "^5.45.0", - "requireindex": "^1.1.0", - "ts-dedent": "^2.2.0" - }, - "dependencies": { - "@storybook/csf": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", - "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - } - }, - "@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "eslint-plugin-unused-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", - "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-util-attach-comments": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz", - "integrity": "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - }, - "estree-util-build-jsx": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz", - "integrity": "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==", - "dev": true, - "requires": { - "@types/estree-jsx": "^1.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "estree-walker": "^3.0.0" - } - }, - "estree-util-is-identifier-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz", - "integrity": "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==", - "dev": true - }, - "estree-util-to-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz", - "integrity": "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==", - "dev": true, - "requires": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - } - }, - "estree-util-value-to-estree": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz", - "integrity": "sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==", - "dev": true, - "requires": { - "is-plain-obj": "^3.0.0" - } - }, - "estree-util-visit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.1.tgz", - "integrity": "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==", - "dev": true, - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^2.0.0" - } - }, - "estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0" - } - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dev": true, - "requires": { - "@types/node": "*", - "require-like": ">= 0.1.1" - } - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": true - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "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" - }, - "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dev": true, - "requires": { - "format": "^0.2.0" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-retry": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", - "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==", - "dev": true - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-system-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", - "integrity": "sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==", - "dev": true, - "requires": { - "fs-extra": "11.1.1", - "ramda": "0.29.0" - }, - "dependencies": { - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "flow-parser": { - "version": "0.228.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.228.0.tgz", - "integrity": "sha512-xPWkzCO07AnS8X+fQFpWm+tJ+C7aeaiVzJ+rSepbkCXUvUJ6l6squEl63axoMcixyH4wLjmypOzq/+zTD0O93w==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "requires": { - "loader-utils": "^3.2.0" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.3.tgz", - "integrity": "sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==", - "dev": true, - "requires": { - "es-errors": "^1.0.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "dev": true - }, - "get-npm-tarball-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.1.0.tgz", - "integrity": "sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true - }, - "get-source": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", - "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", - "dev": true, - "requires": { - "data-uri-to-buffer": "^2.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "data-uri-to-buffer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "giget": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.1.tgz", - "integrity": "sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==", - "dev": true, - "requires": { - "citty": "^0.1.5", - "consola": "^3.2.3", - "defu": "^6.1.3", - "node-fetch-native": "^1.6.1", - "nypm": "^0.3.3", - "ohash": "^1.1.3", - "pathe": "^1.1.1", - "tar": "^6.2.0" - } - }, - "github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "dev": true - }, - "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "gunzip-maybe": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", - "dev": true, - "requires": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - } - }, - "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.2" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "hast-util-to-estree": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", - "integrity": "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "estree-util-attach-comments": "^2.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "mdast-util-mdx-expression": "^1.0.0", - "mdast-util-mdxjs-esm": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.1", - "unist-util-position": "^4.0.0", - "zwitch": "^2.0.0" - } - }, - "hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-rewriter-wasm": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/html-rewriter-wasm/-/html-rewriter-wasm-0.4.1.tgz", - "integrity": "sha512-lNovG8CMCCmcVB1Q7xggMSf7tqPCijZXaH4gL6iE8BFghdQCbaY5Met9i1x2Ex8m/cZHDUtXK9H6/znKamRP8Q==", - "dev": true - }, - "html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "dev": true - }, - "internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true - }, - "is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "requires": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true - }, - "is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", - "dev": true - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", - "dev": true - }, - "is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.14" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isbot": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-4.4.0.tgz", - "integrity": "sha512-8ZvOWUA68kyJO4hHJdWjyreq7TYNWTS9y15IzeqVdKxR9pPr3P/3r9AHcoIv9M0Rllkao5qWz2v1lmcyKIVCzQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "javascript-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", - "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", - "dev": true - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - } - }, - "jest-environment-miniflare": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/jest-environment-miniflare/-/jest-environment-miniflare-2.14.2.tgz", - "integrity": "sha512-ssczII1i1aRUsVRLGAijICq4vmFlrDJyOsnG7dqIkC/N9dQmusXA/A+x7TgEHnBGCVk7+JVS/QyZtJRbiXCUmQ==", - "dev": true, - "requires": { - "@jest/environment": ">=27", - "@jest/fake-timers": ">=27", - "@jest/types": ">=27", - "@miniflare/queues": "2.14.2", - "@miniflare/runner-vm": "2.14.2", - "@miniflare/shared": "2.14.2", - "@miniflare/shared-test-environment": "2.14.2", - "jest-mock": ">=27", - "jest-util": ">=27" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jscodeshift": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.1.tgz", - "integrity": "sha512-hIJfxUy8Rt4HkJn/zZPU9ChKfKZM1342waJ1QC2e2YsPcWhM+3BJ4dcfQCzArTrk1jJeNLB341H+qOcEHRxJZg==", - "dev": true, - "requires": { - "@babel/core": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/preset-flow": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@babel/register": "^7.22.15", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.23.3", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "dependencies": { - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - } - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "lazy-universal-dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", - "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==", - "dev": true, - "requires": { - "app-root-dir": "^1.0.2", - "dotenv": "^16.0.0", - "dotenv-expand": "^10.0.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "requires": { - "uc.micro": "^2.0.0" - } - }, - "lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "dev": true, - "requires": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - } - }, - "lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "dev": true, - "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" - } - }, - "lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", - "dev": true, - "requires": { - "@types/trusted-types": "^2.0.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true - }, - "local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "requires": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.1" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-or-similar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", - "dev": true - }, - "markdown-extensions": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", - "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==", - "dev": true - }, - "markdown-it": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", - "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", - "requires": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.0.0" - } - }, - "markdown-it-footnote": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-4.0.0.tgz", - "integrity": "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==" - }, - "markdown-to-jsx": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", - "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==", - "dev": true, - "requires": {} - }, - "mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - } - }, - "mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - } - }, - "mdast-util-frontmatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", - "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-extension-frontmatter": "^1.0.0" - } - }, - "mdast-util-mdx": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", - "integrity": "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==", - "dev": true, - "requires": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-mdx-expression": "^1.0.0", - "mdast-util-mdx-jsx": "^2.0.0", - "mdast-util-mdxjs-esm": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - } - }, - "mdast-util-mdx-expression": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", - "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", - "dev": true, - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - } - }, - "mdast-util-mdx-jsx": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz", - "integrity": "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==", - "dev": true, - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "mdast-util-from-markdown": "^1.1.0", - "mdast-util-to-markdown": "^1.3.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^4.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "mdast-util-mdxjs-esm": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz", - "integrity": "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==", - "dev": true, - "requires": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - } - }, - "mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - } - }, - "mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - } - }, - "mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0" - } - }, - "mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" - }, - "media-query-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", - "integrity": "sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", - "dev": true, - "requires": { - "map-or-similar": "^1.5.0" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "dev": true, - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-extension-frontmatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz", - "integrity": "sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==", - "dev": true, - "requires": { - "fault": "^2.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-extension-mdx-expression": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", - "integrity": "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "micromark-factory-mdx-expression": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-extension-mdx-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz", - "integrity": "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==", - "dev": true, - "requires": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "estree-util-is-identifier-name": "^2.0.0", - "micromark-factory-mdx-expression": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - } - }, - "micromark-extension-mdx-md": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz", - "integrity": "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==", - "dev": true, - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-extension-mdxjs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz", - "integrity": "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==", - "dev": true, - "requires": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^1.0.0", - "micromark-extension-mdx-jsx": "^1.0.0", - "micromark-extension-mdx-md": "^1.0.0", - "micromark-extension-mdxjs-esm": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-extension-mdxjs-esm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz", - "integrity": "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "micromark-core-commonmark": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-position-from-estree": "^1.1.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - } - }, - "micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-mdx-expression": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz", - "integrity": "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-events-to-acorn": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-position-from-estree": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - } - }, - "micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "dev": true - }, - "micromark-util-events-to-acorn": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz", - "integrity": "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==", - "dev": true, - "requires": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^2.0.0", - "estree-util-visit": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0", - "vfile-message": "^3.0.0" - } - }, - "micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "dev": true - }, - "micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "dev": true, - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "dev": true - }, - "micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "miniflare": { - "version": "3.20240129.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240129.0.tgz", - "integrity": "sha512-27pDhlP2G/4gXmvnSt6LjMQ8KrkmbJElIQmn+BLjdiyIx+zXY4E8MSPJmi9flgf0dn3wtjuHO2ASenuopqqxrw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.8.1", - "acorn": "^8.8.0", - "acorn-walk": "^8.2.0", - "capnp-ts": "^0.7.0", - "exit-hook": "^2.2.1", - "glob-to-regexp": "^0.4.1", - "stoppable": "^1.1.0", - "undici": "^5.28.2", - "workerd": "1.20240129.0", - "ws": "^8.11.0", - "youch": "^3.2.2", - "zod": "^3.20.6" - }, - "dependencies": { - "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "requires": {} - } - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mlly": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.5.0.tgz", - "integrity": "sha512-NPVQvAY1xr1QoVeG0cy8yUYC7FQcOx6evl/RjT1wL5FvzPnzOysoqB/jmx/DhssT2dYa8nxECLAaFI/+gVLhDQ==", - "dev": true, - "requires": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" - } - }, - "modern-ahocorasick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz", - "integrity": "sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==", - "dev": true - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "dev": true, - "requires": { - "minimatch": "^3.0.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-fetch-native": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.1.tgz", - "integrity": "sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==", - "dev": true - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-html-parser": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.12.tgz", - "integrity": "sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==", - "requires": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true - }, - "npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "requires": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - } - }, - "npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", - "dev": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - } - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "npx-import": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/npx-import/-/npx-import-1.1.4.tgz", - "integrity": "sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==", - "dev": true, - "requires": { - "execa": "^6.1.0", - "parse-package-name": "^1.0.0", - "semver": "^7.3.7", - "validate-npm-package-name": "^4.0.0" - }, - "dependencies": { - "execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - }, - "validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", - "dev": true, - "requires": { - "builtins": "^5.0.0" - } - } - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "nypm": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.6.tgz", - "integrity": "sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==", - "dev": true, - "requires": { - "citty": "^0.1.5", - "execa": "^8.0.1", - "pathe": "^1.1.2", - "ufo": "^1.3.2" - }, - "dependencies": { - "execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - } - }, - "get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true - }, - "human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "requires": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "ohash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", - "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "outdent": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", - "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "dependencies": { - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - } - } - }, - "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "dev": true - }, - "parse-package-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-package-name/-/parse-package-name-1.0.0.tgz", - "integrity": "sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true - } - } - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "peek-stream": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "requires": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "polished": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", - "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.17.8" - } - }, - "postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "dev": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} - }, - "postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "requires": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - } - }, - "postcss-modules": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-6.0.0.tgz", - "integrity": "sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==", - "dev": true, - "requires": { - "generic-names": "^4.0.0", - "icss-utils": "^5.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "dev": true - }, - "pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dev": true, - "requires": { - "parse-ms": "^2.1.0" - } - }, - "printable-characters": { - "version": "1.0.42", - "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", - "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", - "dev": true - }, - "proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "dependencies": { - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - } - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, - "property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" - }, - "puppeteer-core": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz", - "integrity": "sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==", - "dev": true, - "requires": { - "@types/mime-types": "^2.1.0", - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^4.0.0", - "mime": "^2.0.3", - "mime-types": "^2.1.25", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "ramda": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", - "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-auto-height": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-auto-height/-/react-auto-height-1.2.1.tgz", - "integrity": "sha512-Ad1xI3dXBYF0LVhMV0eE5KJNHYkOWzuE0Wx78rDvGBK79lRxSUamogP3HbmStP1FLQ2vbO2PX5cbLwolsZRg1A==", - "requires": {} - }, - "react-colorful": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "dev": true, - "requires": {} - }, - "react-confetti": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", - "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==", - "dev": true, - "requires": { - "tween-functions": "^1.2.0" - } - }, - "react-docgen": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz", - "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==", - "dev": true, - "requires": { - "@babel/core": "^7.18.9", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "@types/babel__core": "^7.18.0", - "@types/babel__traverse": "^7.18.0", - "@types/doctrine": "^0.0.9", - "@types/resolve": "^1.20.2", - "doctrine": "^3.0.0", - "resolve": "^1.22.1", - "strip-indent": "^4.0.0" - }, - "dependencies": { - "@types/doctrine": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", - "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } - } - }, - "react-docgen-typescript": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", - "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", - "dev": true, - "requires": {} - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-element-to-jsx-string": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", - "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", - "dev": true, - "requires": { - "@base2/pretty-print-object": "1.0.1", - "is-plain-object": "5.0.0", - "react-is": "18.1.0" - }, - "dependencies": { - "react-is": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", - "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", - "dev": true - } - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true - }, - "react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "dev": true, - "requires": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - } - }, - "react-remove-scroll-bar": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", - "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", - "dev": true, - "requires": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - } - }, - "react-router": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz", - "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==", - "requires": { - "@remix-run/router": "1.15.0" - } - }, - "react-router-dom": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz", - "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==", - "requires": { - "@remix-run/router": "1.15.0", - "react-router": "6.22.0" - } - }, - "react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dev": true, - "requires": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "recast": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", - "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", - "dev": true, - "requires": { - "assert": "^2.0.0", - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "dependencies": { - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - } - } - }, - "reflect.getprototypeof": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", - "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0", - "get-intrinsic": "^1.2.3", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@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": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "remark-external-links": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", - "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "is-absolute-url": "^3.0.0", - "mdast-util-definitions": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "unist-util-visit": "^2.0.0" - }, - "dependencies": { - "mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, - "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "dev": true - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - } - } - }, - "remark-frontmatter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz", - "integrity": "sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-frontmatter": "^1.0.0", - "micromark-extension-frontmatter": "^1.0.0", - "unified": "^10.0.0" - } - }, - "remark-mdx": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", - "integrity": "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==", - "dev": true, - "requires": { - "mdast-util-mdx": "^2.0.0", - "micromark-extension-mdxjs": "^1.0.0" - } - }, - "remark-mdx-frontmatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/remark-mdx-frontmatter/-/remark-mdx-frontmatter-1.1.1.tgz", - "integrity": "sha512-7teX9DW4tI2WZkXS4DBxneYSY7NHiXl4AKdWDO9LXVweULlCT8OPWsOjLEnMIXViN1j+QcY8mfbq3k0EK6x3uA==", - "dev": true, - "requires": { - "estree-util-is-identifier-name": "^1.0.0", - "estree-util-value-to-estree": "^1.0.0", - "js-yaml": "^4.0.0", - "toml": "^3.0.0" - }, - "dependencies": { - "estree-util-is-identifier-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-1.1.0.tgz", - "integrity": "sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ==", - "dev": true - } - } - }, - "remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, - "remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "dev": true, - "requires": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - } - }, - "remark-slug": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", - "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", - "dev": true, - "requires": { - "github-slugger": "^1.0.0", - "mdast-util-to-string": "^1.0.0", - "unist-util-visit": "^2.0.0" - }, - "dependencies": { - "mdast-util-to-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", - "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", - "dev": true - }, - "unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true - }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - } - } - }, - "remix": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/remix/-/remix-2.6.0.tgz", - "integrity": "sha512-E8HDqKUeTEeuS+foqsTi7hCNPsO3VXLRV9ffdHUmlOR5busM9MvuQ34ZuOx/kzciyCirmFLMsSVXhLG4I9glyg==" - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "dev": true - }, - "requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true - }, - "resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "requires": { - "glob": "^10.3.7" - } - }, - "rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - "dev": true, - "requires": { - "rollup-plugin-inject": "^3.0.0" - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "requires": { - "mri": "^1.1.0" - } - }, - "safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "requires": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" - }, - "set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, - "requires": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - } - }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", - "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - } - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "stacktracey": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", - "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", - "dev": true, - "requires": { - "as-table": "^1.0.36", - "get-source": "^2.0.12" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "requires": { - "internal-slot": "^1.0.4" - } - }, - "stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true - }, - "store2": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", - "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==", - "dev": true - }, - "storybook": { - "version": "7.6.12", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.12.tgz", - "integrity": "sha512-zcH9CwIsE8N4PX3he5vaJ3mTTWGxu7cxJ/ag9oja/k3N5/IvQjRyIU1TLkRVb28BB8gaLyorpnc4C4aLVGy4WQ==", - "dev": true, - "requires": { - "@storybook/cli": "7.6.12" - } - }, - "stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true - }, - "stream-slice": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz", - "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==", - "dev": true - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - } - } - }, - "string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "requires": { - "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", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "string.prototype.padend": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", - "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", - "dev": true, - "requires": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "requires": { - "min-indent": "^1.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "dev": true, - "requires": { - "inline-style-parser": "0.1.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true - }, - "svgo": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.2.0.tgz", - "integrity": "sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "synchronous-promise": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", - "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", - "dev": true - }, - "tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "telejson": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", - "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", - "dev": true, - "requires": { - "memoizerific": "^1.11.3" - } - }, - "temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "dev": true, - "requires": { - "rimraf": "~2.6.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, - "requires": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", - "dev": true - }, - "tinyspy": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", - "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tocbot": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.25.0.tgz", - "integrity": "sha512-kE5wyCQJ40hqUaRVkyQ4z5+4juzYsv/eK+aqD97N62YH0TxFhzJvo22RUQQZdO3YnXAk42ZOfOpjVdy+Z0YokA==", - "dev": true - }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "dev": true - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true - }, - "trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "dev": true - }, - "ts-api-utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.0.tgz", - "integrity": "sha512-d+3WxW4r8WQy2cZWpNRPPGExX8ffOLGcIhheUANKbL5Sqjbhkneki76fRAWeXkaslV2etTb4tSJBSxOsH5+CJw==", - "dev": true, - "requires": {} - }, - "ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true - }, - "ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tween-functions": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", - "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "requires": { - "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.10" - } - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "devOptional": true - }, - "uc.micro": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.0.0.tgz", - "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==" - }, - "ufo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", - "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", - "dev": true - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", - "dev": true, - "requires": { - "@fastify/busboy": "^2.0.0" - } - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true - } - } - }, - "unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "dev": true - }, - "unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-position-from-estree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz", - "integrity": "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-remove-position": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", - "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - } - }, - "unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "unplugin": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.7.1.tgz", - "integrity": "sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw==", - "dev": true, - "requires": { - "acorn": "^8.11.3", - "chokidar": "^3.5.3", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.6.1" - } - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urlpattern-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-4.0.3.tgz", - "integrity": "sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==", - "dev": true - }, - "use-callback-ref": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz", - "integrity": "sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==", - "dev": true, - "requires": { - "tslib": "^2.0.0" - } - }, - "use-resize-observer": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", - "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==", - "dev": true, - "requires": { - "@juggle/resize-observer": "^3.3.1" - } - }, - "use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dev": true, - "requires": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - } - }, - "util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true - }, - "uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "requires": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "dependencies": { - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - } - } - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - }, - "vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", - "dev": true, - "requires": { - "esbuild": "^0.19.3", - "fsevents": "~2.3.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - } - } - }, - "vite-node": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.2.2.tgz", - "integrity": "sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==", - "dev": true, - "requires": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "web-encoding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", - "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", - "dev": true, - "requires": { - "@zxing/text-encoding": "0.9.0", - "util": "^0.12.3" - } - }, - "web-streams-polyfill": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", - "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "webpack-virtual-modules": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", - "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "requires": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "workerd": { - "version": "1.20240129.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240129.0.tgz", - "integrity": "sha512-t4pnsmjjk/u+GdVDgH2M1AFmJaBUABshYK/vT/HNrAXsHSwN6VR8Yqw0JQ845OokO34VLkuUtYQYyxHHKpdtsw==", - "dev": true, - "requires": { - "@cloudflare/workerd-darwin-64": "1.20240129.0", - "@cloudflare/workerd-darwin-arm64": "1.20240129.0", - "@cloudflare/workerd-linux-64": "1.20240129.0", - "@cloudflare/workerd-linux-arm64": "1.20240129.0", - "@cloudflare/workerd-windows-64": "1.20240129.0" - } - }, - "wrangler": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.26.0.tgz", - "integrity": "sha512-2FKDyL0wV6ws+9AHkQl5/Yzn17kG9jlpgyT7wqCDkhb5q+TCL/I8N5IKVwXe8tRrTluBI1QQZRRymoA5nu0pHw==", - "dev": true, - "requires": { - "@cloudflare/kv-asset-handler": "^0.2.0", - "@esbuild-plugins/node-globals-polyfill": "^0.2.3", - "@esbuild-plugins/node-modules-polyfill": "^0.2.2", - "blake3-wasm": "^2.1.5", - "chokidar": "^3.5.3", - "esbuild": "0.17.19", - "fsevents": "~2.3.2", - "miniflare": "3.20240129.0", - "nanoid": "^3.3.3", - "path-to-regexp": "^6.2.0", - "resolve": "^1.22.8", - "resolve.exports": "^2.0.2", - "selfsigned": "^2.0.1", - "source-map": "0.6.1", - "xxhash-wasm": "^1.0.1" - }, - "dependencies": { - "@cloudflare/kv-asset-handler": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", - "integrity": "sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==", - "dev": true, - "requires": { - "mime": "^3.0.0" - } - }, - "@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "xxhash-wasm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", - "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "youch": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", - "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", - "dev": true, - "requires": { - "cookie": "^0.5.0", - "mustache": "^4.2.0", - "stacktracey": "^2.1.8" - }, - "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - } - } - }, - "zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", - "dev": true - }, - "zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true - } } } diff --git a/package.json b/package.json index d5f0b715..a32c5588 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,6 @@ "description": "", "license": "MIT", "dependencies": { - "@cloudflare/kv-asset-handler": "^0.3.2", "@remix-run/cloudflare": "^2.6.0", "@remix-run/cloudflare-workers": "^2.6.0", "@remix-run/css-bundle": "^1.19.3", @@ -17,7 +16,6 @@ "react": "^18.2.0", "react-auto-height": "^1.2.1", "react-dom": "^18.2.0", - "react-router-dom": "^6.23.1", "remix": "^2.6.0", "tailwindcss": "^3.4.3" }, @@ -38,7 +36,6 @@ "@types/lodash": "^4.14.202", "@types/markdown-it": "^13.0.7", "@types/markdown-it-footnote": "^3.0.3", - "@types/node": "^20.12.12", "@types/react": "^18.2.53", "@types/react-dom": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.20.0", From 6224504b7adcbb00ac06ad18b5384b5403270ec9 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 17:00:52 -0400 Subject: [PATCH 051/132] Fixed linting error --- app/routes/questions.actions.tsx | 6 ++---- tailwind.config.js | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/routes/questions.actions.tsx b/app/routes/questions.actions.tsx index 1f11bc64..1c2a7b9c 100644 --- a/app/routes/questions.actions.tsx +++ b/app/routes/questions.actions.tsx @@ -1,4 +1,4 @@ -import {useState, useEffect, MouseEvent, useCallback, ReactNode} from 'react' +import {useState, useEffect, MouseEvent, useCallback} from 'react' import type {ActionFunctionArgs} from '@remix-run/cloudflare' import {Form, useSearchParams} from '@remix-run/react' import {json} from '@remix-run/cloudflare' @@ -97,7 +97,6 @@ export const action = async ({request}: ActionFunctionArgs) => { type Props = { pageid: string actionType: ActionType - showText?: boolean hint?: string dissabled?: boolean active?: boolean @@ -108,7 +107,6 @@ type Props = { export const Action = ({ pageid, actionType, - showText = true, dissabled = false, active = false, hint, @@ -118,7 +116,7 @@ export const Action = ({ }: Props) => { const [remixSearchParams] = useSearchParams() const [stateString] = useState(() => remixSearchParams.get('state') ?? '') - const {Icon, title} = actions[actionType] + const {Icon} = actions[actionType] // Get the state of this action for the given `pageid` from localstorage. This // will result in each action only being allowed once per browser diff --git a/tailwind.config.js b/tailwind.config.js index d8cd6974..4dfe6202 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -6,4 +6,3 @@ module.exports = { }, plugins: [], } - From bc3bb587e7947f90b999858cebfaad7a052ac672 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 17:22:57 -0400 Subject: [PATCH 052/132] added node/types --- package-lock.json | 1 + package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/package-lock.json b/package-lock.json index 41fcd982..de97cbdd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "@types/lodash": "^4.14.202", "@types/markdown-it": "^13.0.7", "@types/markdown-it-footnote": "^3.0.3", + "@types/node": "^20.12.12", "@types/react": "^18.2.53", "@types/react-dom": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.20.0", diff --git a/package.json b/package.json index a32c5588..bcdd666a 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@types/lodash": "^4.14.202", "@types/markdown-it": "^13.0.7", "@types/markdown-it-footnote": "^3.0.3", + "@types/node": "^20.12.12", "@types/react": "^18.2.53", "@types/react-dom": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.20.0", From 9ce820ca2af45deae611240a0b952085c6f94c17 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 17:25:27 -0400 Subject: [PATCH 053/132] Hopefully fixed test err --- app/server-utils/stampy.ts | 2 +- package-lock.json | 1 - package.json | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/server-utils/stampy.ts b/app/server-utils/stampy.ts index cb1a6295..5a7569ba 100644 --- a/app/server-utils/stampy.ts +++ b/app/server-utils/stampy.ts @@ -200,7 +200,7 @@ const sendToCoda = async ( export const fetchJson = async (url: string, params?: RequestInit) => { let json try { - json = await (await fetch(url, params)).json() + json = (await (await fetch(url, params)).json()) as any } catch (e: unknown) { // forward debug message to HTTP Response if (e && typeof e === 'object' && 'message' in e) { diff --git a/package-lock.json b/package-lock.json index de97cbdd..41fcd982 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,6 @@ "@types/lodash": "^4.14.202", "@types/markdown-it": "^13.0.7", "@types/markdown-it-footnote": "^3.0.3", - "@types/node": "^20.12.12", "@types/react": "^18.2.53", "@types/react-dom": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.20.0", diff --git a/package.json b/package.json index bcdd666a..a32c5588 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ "@types/lodash": "^4.14.202", "@types/markdown-it": "^13.0.7", "@types/markdown-it-footnote": "^3.0.3", - "@types/node": "^20.12.12", "@types/react": "^18.2.53", "@types/react-dom": "^18.2.18", "@typescript-eslint/eslint-plugin": "^6.20.0", From 0a3dca9c4a115c253ccd69bfacafbd70f5a02f44 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 17:33:38 -0400 Subject: [PATCH 054/132] Fixed type errors --- app/server-utils/kv-cache.ts | 4 +++- app/server-utils/stampy.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/server-utils/kv-cache.ts b/app/server-utils/kv-cache.ts index abfc8ff8..0aab5759 100644 --- a/app/server-utils/kv-cache.ts +++ b/app/server-utils/kv-cache.ts @@ -37,7 +37,9 @@ export function withCache<Fn extends (...args: string[]) => Promise<any>>( export async function reloadInBackgroundIfNeeded(url: string, timestamp: string) { const ageInMilliseconds = new Date().getTime() - new Date(timestamp).getTime() if (ageInMilliseconds > 10 * 60 * 1000) { - const text = await (await fetch(`${url}${url.includes('?') ? '&' : '?'}reload`)).text() + const text = await ( + (await fetch(`${url}${url.includes('?') ? '&' : '?'}reload`)) as Response + ).text() try { const json = JSON.parse(text) return json diff --git a/app/server-utils/stampy.ts b/app/server-utils/stampy.ts index 5a7569ba..302404ef 100644 --- a/app/server-utils/stampy.ts +++ b/app/server-utils/stampy.ts @@ -200,7 +200,7 @@ const sendToCoda = async ( export const fetchJson = async (url: string, params?: RequestInit) => { let json try { - json = (await (await fetch(url, params)).json()) as any + json = await ((await fetch(url, params)) as Response).json() } catch (e: unknown) { // forward debug message to HTTP Response if (e && typeof e === 'object' && 'message' in e) { From f38104cb687f7c9e587bac0a90d4fc2b40200180 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 22:51:44 -0400 Subject: [PATCH 055/132] save feedback to local storage --- app/components/Feedback/index.tsx | 36 ++++++++++++++----------------- app/routes/questions.actions.tsx | 22 ++++++++++++------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 88d492cf..0a30f4ca 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -1,4 +1,4 @@ -import {useEffect, useState, useRef} from 'react' +import {useState, useRef} from 'react' import {Action, ActionType} from '~/routes/questions.actions' import './feedback.css' import FeedbackForm from './Form' @@ -43,20 +43,18 @@ const Feedback = ({ formClassName, onSubmit, }: FeedbackProps) => { - const [showThanks, setShowThanks] = useState(false) const [showFeedbackForm, setShowFeedbackForm] = useState(false) - const [vote, setVote]: any = useState(undefined) + const [voted, setVoted]: any = useState(false) const thanksRef = useRef<HTMLDivElement | null>(null) - useEffect(() => { - if (showThanks && thanksRef.current) { - thanksRef.current.style.opacity = '1' - setTimeout(() => { - if (thanksRef.current) thanksRef.current.style.opacity = '0' - }, 6000) - } - }, [showThanks]) + function showThanks() { + if (thanksRef.current) thanksRef.current.style.opacity = '1' + const timeout = setInterval(() => { + if (thanksRef.current) thanksRef.current.style.opacity = '0' + }, 6000) + return () => clearInterval(timeout) + } return ( <div className="flex items-center"> @@ -65,12 +63,11 @@ const Feedback = ({ pageid={pageid} showText={!!labels} actionType={ActionType.HELPFUL} - active={vote === 'helpful'} - dissabled={!!vote} + disabled={voted} hint={upHint} + setVoted={setVoted} onClick={() => { - setVote('helpful') - setShowThanks(true) + showThanks() }} /> <Action @@ -78,11 +75,10 @@ const Feedback = ({ showText={!!labels} hint={downHint} actionType={ActionType.UNHELPFUL} - active={vote === 'unhelpful'} - dissabled={!!vote} + disabled={voted} + setVoted={setVoted} onClick={() => { - setVote('unhelpful') - setShowThanks(!showForm) + if (!showForm) showThanks() setShowFeedbackForm(!!showForm) }} /> @@ -95,7 +91,7 @@ const Feedback = ({ {showFeedbackForm && ( <FeedbackForm onSubmit={(att) => { - setShowThanks(true) + showThanks() return onSubmit(att) }} onClose={() => { diff --git a/app/routes/questions.actions.tsx b/app/routes/questions.actions.tsx index 1c2a7b9c..fd545077 100644 --- a/app/routes/questions.actions.tsx +++ b/app/routes/questions.actions.tsx @@ -1,4 +1,4 @@ -import {useState, useEffect, MouseEvent, useCallback} from 'react' +import {useState, useEffect, MouseEvent, useCallback, ReactNode} from 'react' import type {ActionFunctionArgs} from '@remix-run/cloudflare' import {Form, useSearchParams} from '@remix-run/react' import {json} from '@remix-run/cloudflare' @@ -98,20 +98,22 @@ type Props = { pageid: string actionType: ActionType hint?: string - dissabled?: boolean - active?: boolean + children?: ReactNode | ReactNode[] + disabled?: boolean [k: string]: unknown onSuccess?: () => void onClick?: () => void + setVoted?: (v: boolean) => void } export const Action = ({ pageid, actionType, - dissabled = false, - active = false, + disabled = false, hint, + children, onSuccess, onClick, + setVoted, ...props }: Props) => { const [remixSearchParams] = useSearchParams() @@ -132,6 +134,7 @@ export const Action = ({ }, [actionId]) useEffect(() => setActionTaken(loadActionTaken()), [loadActionTaken]) useEffect(() => { + if (actionTaken && setVoted) setVoted(true) if (loadActionTaken() || actionTaken) { try { localStorage.setItem(actionId, actionTaken.toString()) @@ -139,7 +142,7 @@ export const Action = ({ // This will happen when local storage is disabled } } - }, [actionTaken, loadActionTaken, actionId]) + }, [actionTaken, loadActionTaken, actionId, setVoted]) const handleAction = async (e: MouseEvent<HTMLElement>) => { e.preventDefault() @@ -159,7 +162,9 @@ export const Action = ({ const response = await fetch('/questions/actions', {method: 'POST', body: searchParams}) if (response.ok !== true) { - setActionTaken(!actionTaken) + // don't ask + setActionTaken(actionTaken) + if (!actionTaken && setVoted) setVoted(false) } else if (onSuccess) { onSuccess() } @@ -178,7 +183,8 @@ export const Action = ({ <input type="hidden" name="pageid" value={pageid} /> <input type="hidden" name="incBy" value={actionTaken ? -1 : 1} /> <input type="hidden" name="stateString" value={stateString} /> - <ButtonSecondary disabled={dissabled} active={active} tooltip={hint}> + {children} + <ButtonSecondary disabled={disabled} active={actionTaken} tooltip={hint}> <Icon /> </ButtonSecondary> </Form> From 9b394eadb3a52624d94f925480ecb6ab048ba3c3 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 23:11:23 -0400 Subject: [PATCH 056/132] fixed js css interaction --- app/components/Feedback/feedback.css | 5 ----- app/components/Feedback/index.tsx | 29 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/app/components/Feedback/feedback.css b/app/components/Feedback/feedback.css index 95f72a7c..b4437ce8 100644 --- a/app/components/Feedback/feedback.css +++ b/app/components/Feedback/feedback.css @@ -37,11 +37,6 @@ opacity: 1; } -.thanks { - opacity: 0; - transition: opacity 0.25s ease-in-out; /* Transition effect */ -} - .composite-button > .feedback-form { position: absolute; transform: translate(-9vw, var(--spacing-56)); diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 0a30f4ca..95b234bf 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -1,4 +1,4 @@ -import {useState, useRef} from 'react' +import {useEffect, useState, useRef} from 'react' import {Action, ActionType} from '~/routes/questions.actions' import './feedback.css' import FeedbackForm from './Form' @@ -43,18 +43,14 @@ const Feedback = ({ formClassName, onSubmit, }: FeedbackProps) => { + const [showThanks, setShowThanks] = useState(false) const [showFeedbackForm, setShowFeedbackForm] = useState(false) const [voted, setVoted]: any = useState(false) - const thanksRef = useRef<HTMLDivElement | null>(null) - - function showThanks() { - if (thanksRef.current) thanksRef.current.style.opacity = '1' - const timeout = setInterval(() => { - if (thanksRef.current) thanksRef.current.style.opacity = '0' - }, 6000) + useEffect(() => { + const timeout = setTimeout(() => setShowThanks(false), 6000) return () => clearInterval(timeout) - } + }, [showThanks]) return ( <div className="flex items-center"> @@ -67,7 +63,7 @@ const Feedback = ({ hint={upHint} setVoted={setVoted} onClick={() => { - showThanks() + setShowThanks(true) }} /> <Action @@ -78,20 +74,25 @@ const Feedback = ({ disabled={voted} setVoted={setVoted} onClick={() => { - if (!showForm) showThanks() + if (!showForm) setShowThanks(true) setShowFeedbackForm(!!showForm) }} /> </ButtonSecondaryWrapper> - <div ref={thanksRef} className="thanks ml-2 opacity-0 pointer-events-none"> + <p + className={ + 'transition-opacity duration-200 ease-in-out ml-2 pointer-events-none ' + + (showThanks ? 'opacity-100' : 'opacity-0') + } + > Thank you for your feedback! - </div> + </p> {showFeedbackForm && ( <FeedbackForm onSubmit={(att) => { - showThanks() + setShowThanks(true) return onSubmit(att) }} onClose={() => { From 488843bdef0c9362f7a28a46cc85b67bc6a64742 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 23:14:08 -0400 Subject: [PATCH 057/132] linting issue fix --- app/components/Feedback/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 95b234bf..0d04309f 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -1,4 +1,4 @@ -import {useEffect, useState, useRef} from 'react' +import {useEffect, useState} from 'react' import {Action, ActionType} from '~/routes/questions.actions' import './feedback.css' import FeedbackForm from './Form' From 3510b72ab5c31a4bd78bae059b9b13be3fd9d060 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 25 May 2024 23:35:18 -0400 Subject: [PATCH 058/132] prettier is acting weird --- app/components/Article/article.css | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/Article/article.css b/app/components/Article/article.css index acd930a3..56478bb3 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -160,7 +160,6 @@ article .footer-comtainer { margin-top: var(--spacing-56); margin-bottom: var(--spacing-24); } - article a.see-more:not(.visible) + div.see-more-contents { display: none; } From 02a4246276518aa4247b37584a350ac8bbf0d6f9 Mon Sep 17 00:00:00 2001 From: Peter Hozak <peter.hozak@gmail.com> Date: Sun, 26 May 2024 07:19:30 +0200 Subject: [PATCH 059/132] clean up fcol-x lefovers from merge --- app/components/Chatbot/index.tsx | 10 ++--- app/components/Feedback/Form.tsx | 2 +- app/components/Menu/menuItem.css | 1 + app/components/Nav/nav.css | 1 - app/components/SearchResults/Dropdown.tsx | 2 +- app/root.css | 52 ++--------------------- 6 files changed, 11 insertions(+), 57 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index fdf9e522..b3e61a96 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -71,7 +71,7 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { } return ( - <div className="widget-ask fcol-10"> + <div className="widget-ask col-10"> {results.length > 0 ? ( <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> <p className="default">{results[0].title}</p> @@ -106,8 +106,8 @@ export const WidgetStampy = ({className}: {className?: string}) => { const stampyUrl = (question: string) => `/chat/?question=${question.trim()}` return ( - <div className={`centered fcol-9 padding-bottom-128 ${className || ''}`}> - <div className="fcol-6 padding-bottom-56"> + <div className={`centered col-9 padding-bottom-128 ${className || ''}`}> + <div className="col-6 padding-bottom-56"> <h2 className="teal-500">Questions?</h2> <h2>Ask Stampy, our chatbot, any question about AI safety</h2> </div> @@ -169,7 +169,7 @@ const SplashScreen = ({ }) => ( <div className="padding-top-40"> <IconStampyLarge /> - <div className="fcol-6 padding-bottom-40 padding-top-40"> + <div className="col-6 padding-bottom-40 padding-top-40"> <h2 className="teal-500">Hi there, I'm Stampy.</h2> <h2>I can answer your questions about AI Safety</h2> </div> @@ -299,7 +299,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { }) return ( - <div className="centered fcol-10 height-70"> + <div className="centered col-10 height-70"> {history.length === 0 ? ( <SplashScreen questions={questions} onQuestion={onQuestion} /> ) : undefined} diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index e9379fd7..25cb510f 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -39,7 +39,7 @@ const FeedbackForm = ({onSubmit, onClose, options}: FeedbackFormProps) => { <div ref={clickCheckerRef} onClick={() => setNumClicks((current) => current + 1)} - className="fcol-5 feedback-form bordered" + className="col-5 feedback-form bordered" > <span className="black small padding-bottom-32">What was the problem?</span> {options?.map((option) => ( diff --git a/app/components/Menu/menuItem.css b/app/components/Menu/menuItem.css index 96afb55b..c72ad158 100644 --- a/app/components/Menu/menuItem.css +++ b/app/components/Menu/menuItem.css @@ -1,5 +1,6 @@ .top-menu-link { display: flex; + white-space: nowrap; } .top-menu-icon { width: var(--spacing-24); diff --git a/app/components/Nav/nav.css b/app/components/Nav/nav.css index 64911744..9931cf76 100644 --- a/app/components/Nav/nav.css +++ b/app/components/Nav/nav.css @@ -5,7 +5,6 @@ display: flex; justify-content: flex-start; flex-direction: row; - flex-wrap: wrap; align-items: center; } diff --git a/app/components/SearchResults/Dropdown.tsx b/app/components/SearchResults/Dropdown.tsx index 2caac3cf..16231c87 100644 --- a/app/components/SearchResults/Dropdown.tsx +++ b/app/components/SearchResults/Dropdown.tsx @@ -27,7 +27,7 @@ export const SearchResults = ({results}: {results: SearchResultsProps[]}) => { const noResults = results.length === 0 if (noResults) { return ( - <div className="full-width container-search-results bordered fcol-5 container-search-results-mobile"> + <div className="full-width container-search-results bordered col-5 container-search-results-mobile"> <div className="search-result">No results found</div> </div> ) diff --git a/app/root.css b/app/root.css index 6af755df..cac8d69f 100644 --- a/app/root.css +++ b/app/root.css @@ -43,7 +43,7 @@ --spacing-104: clamp(56px, 10.6vw, 104px); --spacing-128: clamp(56px, 13.8vw, 128px); --spacing-192: clamp(80px, 17vw, 192px); - --spacing-288: clamp(128px, 25.6vw, 288px); + --spacing-288: clamp(128px, 20vw, 288px); } /* CSS Reset */ @@ -373,40 +373,6 @@ h2 { width: clamp(0px, 73.33vw, 1344px); } -.fcol-2 { - flex: 2; -} -.fcol-3 { - flex: 3; -} -.fcol-4 { - flex: 4; -} -.fcol-5 { - flex: 5; -} -.fcol-6 { - flex: 6; -} -.fcol-7 { - flex: 7; -} -.fcol-8 { - flex: 8; -} -.fcol-9 { - flex: 9; -} -.fcol-10 { - flex: 10; -} -.fcol-11 { - flex: 11; -} -.fcol-12 { - flex: 12; -} - .full-width { width: 100%; } @@ -498,7 +464,7 @@ svg { /* defines the standard left and right margins */ .page-body { - padding: 0px 13.333vw; + padding: 0px var(--spacing-128); } /* all other classes */ @@ -542,20 +508,8 @@ svg { /* mobile */ @media (max-width: 780px) { - :root { - --spacing-24: 16px; - --spacing-32: 24px; - --spacing-40: 24px; - --spacing-56: 24px; - --spacing-80: 40px; - --spacing-104: 56px; - --spacing-128: 56px; - --spacing-192: 80px; - --spacing-288: 128px; - } - .page-body { - padding: 0px 6.4vw; + padding: 0px var(--spacing-48); } /* typography tags */ From e8cc39b2b390c354a88c7f8081d58c3b2db99b9e Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sun, 26 May 2024 10:25:41 -0400 Subject: [PATCH 060/132] correct prettier file --- .prettierrc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.prettierrc b/.prettierrc index dfd9f75f..df3c2383 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,7 @@ -semi: false -singleQuote: true -bracketSpacing: false -printWidth: 100 -trailingComma: es5 \ No newline at end of file +{ + "semi": false, + "singleQuote": true, + "bracketSpacing": false, + "printWidth": 100, + "trailingComma": "es5" +} \ No newline at end of file From 90c0f4c91f1b3061cdb0ecc43e7b8043b052385f Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sun, 26 May 2024 10:34:36 -0400 Subject: [PATCH 061/132] prettier is not pretty --- .prettierrc | 10 +++++++++- app/components/Article/article.css | 4 ++-- app/components/ArticlesNav/articlenav.css | 2 +- app/root.css | 8 ++++---- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.prettierrc b/.prettierrc index df3c2383..ba998cd6 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,5 +3,13 @@ "singleQuote": true, "bracketSpacing": false, "printWidth": 100, - "trailingComma": "es5" + "trailingComma": "es5", + "overrides": [ + { + "files": "*.css", + "options": { + "singleQuote": false + } + } + ] } \ No newline at end of file diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 56478bb3..e2405651 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -164,10 +164,10 @@ article a.see-more:not(.visible) + div.see-more-contents { display: none; } article a.see-more:after { - content: 'See more...'; + content: "See more..."; } article a.see-more.visible:after { - content: 'See less'; + content: "See less"; } article .banner { diff --git a/app/components/ArticlesNav/articlenav.css b/app/components/ArticlesNav/articlenav.css index e33810c2..1a5722b9 100644 --- a/app/components/ArticlesNav/articlenav.css +++ b/app/components/ArticlesNav/articlenav.css @@ -64,7 +64,7 @@ } .articles-group .parent::before { - content: ' '; + content: " "; background-image: url(/assets/green-dot.svg); background-repeat: no-repeat; width: var(--spacing-32); diff --git a/app/root.css b/app/root.css index bab7786c..f85f8bf7 100644 --- a/app/root.css +++ b/app/root.css @@ -1,7 +1,7 @@ -@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Raleway&display=swap'); -@import 'tailwindcss/base'; -@import 'tailwindcss/components'; -@import 'tailwindcss/utilities'; +@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Raleway&display=swap"); +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; :root { /* colors */ From a96a9ebcb4cbae93c0eae2a7594534bd8dafe845 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sun, 26 May 2024 10:40:54 -0400 Subject: [PATCH 062/132] prettier needs to die --- .prettierrc | 10 +--------- app/components/Article/article.css | 9 +++++++-- app/components/ArticlesNav/articlenav.css | 2 +- app/root.css | 8 ++++---- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/.prettierrc b/.prettierrc index ba998cd6..df3c2383 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,13 +3,5 @@ "singleQuote": true, "bracketSpacing": false, "printWidth": 100, - "trailingComma": "es5", - "overrides": [ - { - "files": "*.css", - "options": { - "singleQuote": false - } - } - ] + "trailingComma": "es5" } \ No newline at end of file diff --git a/app/components/Article/article.css b/app/components/Article/article.css index e2405651..63dc3960 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -160,14 +160,19 @@ article .footer-comtainer { margin-top: var(--spacing-56); margin-bottom: var(--spacing-24); } + +article .footer-comtainer > * { + margin: var(--spacing-8, 8px); +} + article a.see-more:not(.visible) + div.see-more-contents { display: none; } article a.see-more:after { - content: "See more..."; + content: 'See more...'; } article a.see-more.visible:after { - content: "See less"; + content: 'See less'; } article .banner { diff --git a/app/components/ArticlesNav/articlenav.css b/app/components/ArticlesNav/articlenav.css index 1a5722b9..e33810c2 100644 --- a/app/components/ArticlesNav/articlenav.css +++ b/app/components/ArticlesNav/articlenav.css @@ -64,7 +64,7 @@ } .articles-group .parent::before { - content: " "; + content: ' '; background-image: url(/assets/green-dot.svg); background-repeat: no-repeat; width: var(--spacing-32); diff --git a/app/root.css b/app/root.css index f85f8bf7..bab7786c 100644 --- a/app/root.css +++ b/app/root.css @@ -1,7 +1,7 @@ -@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Raleway&display=swap"); -@import "tailwindcss/base"; -@import "tailwindcss/components"; -@import "tailwindcss/utilities"; +@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Raleway&display=swap'); +@import 'tailwindcss/base'; +@import 'tailwindcss/components'; +@import 'tailwindcss/utilities'; :root { /* colors */ From 519ac26ebb1e10bed0b5b24cc028e855b59d719d Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sun, 26 May 2024 10:42:11 -0400 Subject: [PATCH 063/132] idk anymore --- app/components/Article/article.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 63dc3960..56478bb3 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -160,11 +160,6 @@ article .footer-comtainer { margin-top: var(--spacing-56); margin-bottom: var(--spacing-24); } - -article .footer-comtainer > * { - margin: var(--spacing-8, 8px); -} - article a.see-more:not(.visible) + div.see-more-contents { display: none; } From 33d0f2cde1f11ca1a8fa8c1d87b6bbb62eebc7a7 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Sun, 26 May 2024 16:48:07 +0200 Subject: [PATCH 064/132] fix linter error --- app/components/Chatbot/widgit.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 6673d6c2..a1b182cc 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -56,7 +56,7 @@ } .widget-ask .suggestion:hover { - background: var(--colors-teal-50); + background: var(--colors-teal-50); } .widget-ask .send { From f1adb8f60a70c96b2b6027c030af0028c3713e38 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Mon, 27 May 2024 20:24:13 +0200 Subject: [PATCH 065/132] update favicons --- public/favicon-512.png | Bin 29912 -> 49303 bytes public/favicon-min-512.png | Bin 0 -> 49303 bytes public/favicon-min.ico | Bin 0 -> 16863 bytes public/favicon.ico | Bin 28465 -> 4286 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/favicon-min-512.png create mode 100644 public/favicon-min.ico diff --git a/public/favicon-512.png b/public/favicon-512.png index a176426e507aab646b035736556f9f2f38aa8ecb..71a5b4352628049d0ae52113882217bfac3d5037 100644 GIT binary patch literal 49303 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 literal 29912 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 H`rPd2Z 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 diff --git a/public/favicon-min-512.png b/public/favicon-min-512.png new file mode 100644 index 0000000000000000000000000000000000000000..71a5b4352628049d0ae52113882217bfac3d5037 GIT binary patch literal 49303 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 literal 0 HcmV?d00001 diff --git a/public/favicon-min.ico b/public/favicon-min.ico new file mode 100644 index 0000000000000000000000000000000000000000..93922649a656e65a8de214eeb7e09749fa506e0c GIT binary patch literal 16863 zcmbt+i$Bxv|Nb_^oHysQne$-|le3ufF(z_|oN_3wx8+<;+vI!<IaF9uNh;@rm~xB| zDnf>&Bu2_HelLB#|G_Vn?Xm5(d-wgkpV#%guID`v2n_rj{{e%LpaEkLh#$C}hO@Wi zU=?NsZgN;#nVmj<^!Oi)3Haq1S`~PFFC^6789Y)EbqfSCPP8^Nc8>n^vy>&=xvykB z<E@}brtu})ENJQ(VlEseStp{_tNht*b#jt;Ia6KB>cZUieOK$$Q*5^v{qqK-uc}^= zEy>?`Ip9CsZI6+=oquQ2+Td;8WcR*?4%6EH$CtCGqaJ(2h0NVwzga!JTdLIV<G!{1 zqk6CU@Dxl0U)#m>|M{P~S??FN%N=*P><d!D4t4f*RS(X-Ma=%-{kGAoP876>QoCai zoIUBJr5#Dim(=l<y8>?cvBc9IK2-f_Tj-;&<iNRy)(7eyMq;Q7&k^|oESDj{+0ch) zsPjoD;r!ls2FI{s4-adU8gqpV^esclf(06!36b@&xXUc_=Cy9fozK#=^_=%spnJHT zE7VLsE-Uu?`p7i-L;WTMF#?)y#LD;|=KxEa?te(0b;AU*bhw){A91()%Gn(rQprOp z=ugOl_zLdQW`r;c&7L<NrS@x*!S{RLS5r~J`!_(n3nieTxW-h<lmKrBOXg`OP~(m_ za}klPN4!9uYq|Z(X%(_|SLkoXQH!)B=ph571?nlkL+r-2#<jpcgWJB_`D|WHNrzC@ z51REi4475!^`Dc}^^NNJ9meQ<zhg%+&1enh2yzJxibL~ZHCrH_24a#I1h5<4Ov|`~ zs9Vmw*u2@bs~_h$K7$2F8GYig3{|Z`8Txtn<0KH3l`h)?^E@8jiyT{8gd(^h9irBj zQT}T_)~CYY&ab|!90qobgzc*j(;>7VkOq~Hy0H~afJ!Hi{WP^!E`;&uJqc#>!IT}b zv>4haGbOFhv&WxIR^gfu4u2yNH54gQ76e{4O@V#78V_Nys~Chd^|D)vq(!+^fo#A6 z@HQj<1eM#XPZYx4DYtMQXK@F`XWW%@XjeJRM;I%C^@{Th9bt0j1;wRo3t(XgJ5FVC zdvU{0|5r*Y?LPNfr%yuMm<?BXs2~J8ioqBpcRuFly>EsjMOE@I{*g}!!aEr`pvr#Q z^}m+kLX>6@b(YoyhQL+HMv0HYLy+?m3hy5rrP=?G=iPfmfxr~WhC;Eh51adtVg86e z?{D4e=T+)(&5)7c#@5B~B*U%?fzOFo;c%~d%cf5D2(apVB4C*4t7B8m)3W84oGd{P z^{uwt_4%+}#04(JM4|@y2=dMu#4{}Bbg-X!@rT)lzPyLyw{j*v>;;4;^w&38-x-z^ z)}9c#jZ&>Qu>^%GkjWs;sa8gOFip@SYqKYZjL}tS7Bom;6(SgnnG@K0%FBIvLMvWc z-~1@gTJC+cxEnxq^iQWQeU`x8rCcwK)#xnTR$XNq3n0!dURKLU57>MW8PNGrBYIh& zg)NqgASp8{;tVN1sq?`JZ1>{=?oY~I)3Y0sDspK*BC<12{=C2}I-<ZVkPQ2en5h0x z?Ud2ocIU<EZ|iJ&msN=(xuB0J;fThb$mX2PA5{GP*0WPf6BqT>n>M&7L57e!15)7c zsAxVrS{tKQK#?-b9~WZ~{~(^;Yzg{&o!9vB0|;$8DsbDPOf9QOj(nR!7;{C#vCJh~ znoAE7-_3I7fV9Y5SHaP6G(<uu{M1_LXa1zQqKe6_qeebeH|8|mpH_?^zgegv7g5pZ zwaTnWZmS^$#!iPJ`31e71s8aaj=-LGo`WhgXgNMAo$NXfX10aqhC6@p<iCy-N$;3; zI{0kG+r>=tiZ`v>x*mGFpm^^#lK5SdGw(tZ@7>7|CT=WEsEg77;bSCxuvTXfpg~!- zGO&&8u}3fF$S=Z$;O{Rvt<IKXcJb3@2AyI{=MLsGXeVp4%cP1Y-rH2fe0j!lem01m zJ|~p5@Ekmx$d2%2-apmnVLfEcoMt3*6eOJSD#wWPZg^vE%VP5~Zs+4k2uvQbVas59 zXIx!RyaCku92s+R_OpFOot-rWa-rceRhjk@3&~Z6r2M|^Q?aZ}!ZawvmTM`Y4`0wu zQ8(PkQm3J0(AoEJBF^nEgnonAkPzmumr2oHS<2qXS8e>2lKSQCY0>s7*|P9V>MvM} zJtIw0&r=A7+L5%%Ttjf`_Jl_!cdqp{8u4S&Om6gs>xzS1!OLh81p|{IJN=nUG!JLW z1ufVo%>|_0pPOUxb&y=Ueo|wt<u4a;aU&lqh-qOJSBr47j(wO|toOQ{Wz;CcKj@@2 z#py`vwouQJ6m=JF!_>t{5EHeoZO&BlRlwe8T6>t}z$G~KWYKZ!Wn9mCmdtf_at3wD z(2`<ed#d>KZAUAW4$ANzq67AnRBydJ{on0yaMJH3y4LiJ25+dVtA3mz`{By3zXJkY zXc$GV^`m-Pq<~+xgq$-|UPAWC$oVbbqAdOdtsM^UgU{FVu;1dy5<aqOrI7*^+2?h` zPhSf{{(=78z7zfNp;JO%xWUnrXFGAZGUU1Ls82;b&!7A8gAmuRq$<?CwaA<PbUh;B z_GRv}le7;Y@O8Lxs!*4AmsFT~113qACp9EQ+WPI~*bTW)`12demUZ52@}N4DV2cB# z9(1iV(BRxVuO41cXx<+dL-5Ufum8&75qFQ|>x$J`*7u@HpKta!IQ*UO+?Ve-EC<gO zVNg4e@VoR=CK+{E-D4bf2od)y^3lHrWbO8UO4r>>Tyv^1sXOw+ZYar-U5$fd1!lQw z^DEbQ{1-Mx+osa`vTs;F6xn&D{q9sJ&mU)cFl}Kw54(ffVRYl0jmz_9HIsNOb*0ZN z6=W3FngIX!-*S%d`LmZXP1E+bKRxk=qT>}%g7S$+;5P16txsOk18%Lw(>18M-;P_6 z8T2)Wx!sE!)5_(b|8QU{0Wj1@eY}A&Sgcx|!PVQih0S6!6Ily;ny3-(KpS?|o7v{L zBfYW2&mGofNQp8$j8#pGoYPL#we^U%=Q)gdPg6XaJ1IieK>5S*vZFr^yzHK7Xt!=p zTFoz$-3OCgFyCwD&K54#CO=IyIJwQK_Itg4j&J<uB-i0Y)MS+{RI-Q(Y);pxMSrb~ zQ=Y|F>VFAe2hW)jzjtuB?Zz-|U9ubOtDsAOjDG3iyE#<IG}}ZtW``%5zk$@Y6Df6) z5H5OY_rux4pl=N^Yqh!3wi&oBF)i*TLbe$&f&@lwFf$9RA8wrM-gO3dlh)YXH@%x^ zA^mR3hWqigx|z*59<}F9d0%+m#znFFO`rXyq1hFvoAIi1SfJAgV-A9X-6puPIpv^h zacr^_*su+M*KG=X=sKv^E_9s(irO&QhaGx#y=Z<&&Dr?PF(;G?L)_tru^=ECD|R$0 zhIM*-{xmYT#D1YYJa8;+m#)CAPE((EX?Bh$2dC5GMiV<bxQ`C5PcC{DWq%WccF<1> zWQhWJL;tO45aURf*x~KuMOc+1VwpM^o5@wukKb>PIR+gqNqxGJ8q$#U`lC>|1_IL} zI3mzt<g$T*cUlq{4)mkB2T9i}vs)1?oVVBSOFbL3O#AaeUH-tG0z2S@&<v!Rq+$^* zL|sQdFid-SXszMbtKLZ;l#bMui!`Og+cb2%1>x>b-Gi4+NIpB}2Fc`^0f9Sh8xbP$ z<ww2iQM2n+>JRV2R7lSfr5s;g7TK`N_<p6*Eb95&ZVfi0$6^%lfnY3mE&V;bi^}o3 zGjW}S(Nm&nvpP%%cHe1yi|tZ1*$8>vz#hwWFdNsJo57RliP(8V<Ds7)1w|5TcFuor z-w8TRj}T^!m+EH#xE4fI)5R5PU;ei1h{=AtG|@AER!>Bu;QP)saW^)w0rN2NIrUWe zy<RQvSKOpCrr?%mePbe_Dszb#aJpZuJ85gUi-Rt?qjY#ELtt#@GL#^+5~x=e)yxR8 zt8tLl6FY(jSw$u}zc4N7<?n(}>!R`~$c<8lYYX&qhYL3dyWh^yANA`qr>A4PYlx9- zDh${5=pnT8y!&WG6elE=DjR<hdD(@oyQAL%QF)=wVe}=4?GJpLv!EE^rpb?;V{^`i z4J(eB@LmO5f6l~`_$vwqE$0WY@ypoNQU)PzTxA&Y@UyWzqESf&V&A(YC1Zw!QLB?d ztvh8+LM=N2cYsS+1KepHcVqH)YJDK%CKsP>N(#*Wn-x^-mI}wKm$B0EE^5V~niV!$ z`Uu<be$S(?nN%1Gc2rfjiTZY$hI?l{;F`yw2sxwAyprZaVSiesNSsvZGi%RP+=$TL zaiz-<PBp`Z<)z7Ntf{n`YLR3=6$x`J^i4mO2N53Jc;bTgbs&)&-K8Dzg(upm0kM;L zB^*esdIMrI_S|9Bm&3O%?nB#)AM}OmM$Mc5v6;K_fnv*GNkipgq;%xGq4_uOAnu$= zu%JvP&wsDgW1fG@+PE&-e+%&~>MGnBx_+15$sS3%7#Q>8y7Z+V-!7ix&zqRR=A9KT z5Wt!|%PJmmV>#6a5D4jaukx_PLgCXPeQd$#jzg^-gG$&n>2&18l9aA3!xJs`-zc)m zPcw@3GOgG`BpIX6%$i1%kUtDb)MWYdVLIu24<zt0;iV3#_wLlhTaPV05t=lQYWSuY z+08dijYYNgG~Jkb5^{f=Wq5F1)J&)@Z1l;y<avdFLgp(rc)>`{tYH#6A{GR8rs)pk zd)>jGG+yV+P0f)Xf>}*l$7{jg_jrfI4O>El@q&sUbm0vrbRIUr{NE5GI4e~-$Zx2^ zEQodoE<PDO<$D)5<|665>h4d>q7uErvJ8JxK6*Zarc)yh&H3ygq(Y{X^Xb$9J?79N zrn8p?%X~^1STHS2ta<nkj%jNnn9<*<2=4#B_2jcecg4zl*k{yCg-Msoj5;l2!w|K@ zq{{oo4@sPS9K2mhJKM5!<A>K&<41}|uinY2e3gM@^W18`07=KL+^z8HQI)u;L~am9 zbFhEVRkLGroE`@MHAqxGyQA=%)34Zfr8%#~Ny|?!KrBmun${s;GKnI{cb?FBRz7Te z;)iI}XWi6~jbW5xShif_wB@*iWBQL;xM|i-8Pj%z(|+8}>!Zo-9^@&g`X?_#zfy)J z)#KnwUKfqUhknu;dz4UrKU?s>(K}l6*)P!Gk-4qE^Vd4z?OrFUGl=I5{fcrjWys!g zI+tZ{g(}M>U@BgVow&lhQv^<^HAL0gavO(N@gyf+=I2b(XMU--A}aVG>4L`DWtzx_ z{j}HvEhY6;ii9*GVMdQTL8o+!EA>#4Q<3Z>83;W+!o9^=I%w%=y0CepL!bG|9=CCj za&SsKIqwSN=tY@#-aj9J^R<qQq^(gpXh-O2ZFbEcqB<$@%fPTs2frQ-{_nz9sZn<Q zZz(orVhvf{Ty5ja%&KRhicy@y@)Nphr`fJlMR1~cJRT&$vP&+|9*qZn5ds}u8H=Lr zjvR1lra~d<w90gp+O=g`X0{f4%Jh=dPc8ON&R+0&{-X(v_hlpbIelC|T@8&!yUYkC zGnv>e7Sj*9KBb8SJ?0w%U8=?gNR3a^S#rdI5BBkY$r7)a=!m1&gd^IXInvjKV6%|y zTWpzi&kZk>fzF_nGN=m0LO+a;7!}Wa4z6wL9JgM;9jJ?aaNLo&Btd^Ih=jB?E|CgM z&0n{KQT+xpMLfRp8++Ut*UGa&u3abDLu8{)aJNQwX?MVmOxL&m<}mJ%x)qcm@Aa5p z>osRK!KHXT{@8oAp%Yn=@BYhe12xhWST29i_pJ>J*W;ll5JrW%Xc$~m7&0n{*i%?H zi3!kW4m#CW6SX;b@#S+U&opjF{;(zg!;J@8KYZyWwf7WiE-g&Uq+=hJCQ6EU^y)ER zTNRCE^7>K)c~y3cb2?6pKkxMUWg{;1Zt>;Hfs1k6Jx66DT}%on9a%@HO^9IqBxW(3 zGuaY96+=@PztUH=!>ONk`I1~Q-#4F!oi9r(PkiLb*MHRgrFN7?jwQTb4$QYhTz}~s zZL_c>#qZJUH@GF@5y>a2DHdi&;ik;|lwUR)KG!xI#~T|SBv-EYCgH;i{TnBSeI+<p zlwY&c9<RZqB;QIGL-+iB0I<;1XXYN^uARj2dpyV=wEReQrDB{?!ZK@BeFO~EOV(Q> zHZ`k<_dcilJwH28@PQw*v7@vlc9adhErY;Y*Lv8KZR1!Te7<2}pN7H_EZ|DdkJrTw zU*b}fQ~8!vC2?)%{2!nQt9bM}vaj?fzu&9Vo=tB}j6sEMR7V<gj@ou~n>KDX!py(5 zRKyG?Nnuw8i1$gFu?VYKwSsXI|GI$J^<k9P{0k3hr|2BCN?RzQNDor$mb!m0<r(zA z$7H*YFAZV*$_E8&av&&oC(mCA$QHgdrmG|1_d56A5(1gumFUg~E|vr}AVEd@4gHJ| zE9AQ$4MWa6#wlh9tCP0>8}o)9v&wJiC@Z+J`PN1_SfvUINkdL#Qtwv4Oo04W(BfNl z<#=oP)dg?^Ac)OsfP5`<Vg2`tP-h5(na_=u6ScN?5dELk3hEpPpH!ZNQGn3?Aqq_J zI}`zYlW`ORZo~l<sF_dmbqyt$3i*1jNOCjXL9lvC*QYLEb=dfe9<w4FWy%)xIeL&< zLEpqy!WLfZ+KxV29JEw!&g?0)UKg#BBPzUo!mA-ogNQm{S)d3~K<<6gXMJYi2@#x` z2oG5p#fbxaqUrPyl@UR3GT?^EKpu%CUt0l2QtvC`!GC^e&{Bm$0^LFqWsM=m=A)>8 z>7!}&c&I>*wOFPy4qd5+Q4o*|c=g38RgjFC52DS|2k}uCw|D(+%_OExu`b}<Yu)CW zqMkwy6hxD8bb%k6!A5|CwXx7stm#PSWvb-HuyG7jRYF0`BQp7TG3tpZIF#VY2$t4t z#0^o=Ag(720i&zhN*7pU8Tihoa{nipepdLKLbKiTqMSR*&2|!{3<5;Zsv?Zikz~S1 zKoANPI6k8;u%M4W&)G=MOkNM!?O|{Rdi-eV9*-}YOQjl3G^6vke7`}IN2GcQ!%$WQ zZN623%m3TYabAY4ET181)i9(G1hj}dn5H&R_<N2{(FF+i9GFmM$ZO?P?zMku$^AGh zY1reZIOqcOQ#iJ=o*(~-cm*vI^)!h7zWh{;rn@)nE?#)a;61`<i92|<pGx&+^39-} zxwZ`4$OclNVo%}sgG~f5y0~SUEbBo;dm(4yi|DvnUz4srNBXeDkN9f62NNEtFFxDk z37=(@JhAX&&qbr-soBQS+n}q+(AT){!=x%xb55}+PJ7$i2=-XVhRJ$KL61KwRg6vx z4tjg(hF`Dab`V0=5pRoyPHdp8s_;T3&U5X2-bb8-u5A`GWsY0S0>+g9r@1UxJ*g{b zQx_2Aj-NuJcEl!yBW4V_9eCTb1c?9j7PRsYvDcm;!f^+WyCkAncG8dv6JrzwGd9OH z$MgIi{9ebQY*rsek7*Zo=_{+v734KCFFMb9QfYM3X6Q_oGlYx0y(bN~fo5?75#^hM z4Jl=i>M1Pc__cYXOpm#@BX&zXT5YW{sk<zkyB+cEAPg)?{Ichg=RA$kd-U`^%gp8t zD#bPt7S8z(5ysEsOKMNFFbbcycek8p0SkWl1<qIcVI6u|!}{r^Qcm!JFu~wA7#3wg z`BcgPjIeIda(PRhocdXJCt~Je-<A$<f@e?$$x!0XqE+ZAwvw^WR_3^T&yPbgG171= zrn`kqKnSgJkEbV}#=CO?%Vdi$@nAahZmYC&aNuLXT_!$|5nI(|FQ%secWySn1>2g@ z%@y|efasdUym$_G$Gc0fiFziDHf%`mgh?lh4rsnDxIk}3f>fD!NMpxC0upp4zenV! zjq&2~Ki>rJ@f#&rfFM@YmpjBD(ToHGuvxC?Qy5TSv)`YrUqt-de`q~s@9eeaoUFBa z5m%7Y<J$v6)ejKS&2p}7jBq<>(}KC0`9*}FZu6>623n+|F5ogx>nBUI@!y?}ec?l( zUeU`GRPCwz5PA_7DKyd4Kdt6mABNmkHkLj=XwUf*$N+@h{=$Rbdfai<Z>bu@H-VU@ zii=wl)nA>6_qgeB9Fy-b?A0f=g0S8GH-3X=Vv54)7tKEb3z@kVnhCMs$MOUiq#w1l zgAC*qAdiAr8Z*%iO0m0Dud#IjHDO3s=v>;*x}2QvTHnO6HW3UZOklgm_%c?Oc1GO6 zDbF2LE|6iu@g)<(q%yz3YXDl96y+Sk9zcLOosEVR2R%lOE8dcCLy|86Z?TgBY$lW$ z#qD?pn?E?l7n1>+@TAaqfZU?jn)>8dZz0ys_8WHS5K(6E0S_%&kuf#^?gnvsJ*DPM zNxI-tef*l_K>U=@DS*>yR!^&|2saRm#S@ho14V=76ndV(K{v7EvUD(QPnssf@D5c~ z*m7dDK1}TnFkuaon49Kw@Z|MQ2kut9zeU>`Q1e+os_tc{+{n{;QuAH2W9KD{0)%BB z+9c_ZQ{6BCvJua}bS~^=xaSz2b5gSUqp|F7x8E^x$fc^J$_ba;f-xq{%a)6;w#IrF zbE#-$=9Y`%(rJ{E47X*f6|kUs>1ciQm5ac*yN6i+BiSGP-Ut^`+jZ7R`#Al8wp9^` zd0CrOS#aXCti9^RMiWpuL-xZ=ZY+dkh6B)QrQk)jK~HL3fMkv^F#Nc5;*st-<`2bQ zeY4Trt<sc{{>~o)^RpdrUd=oqnWnAM1g-QV$PP1Y4~n#aE&<f@=B7vLz}a(#V_|sr zlv{NHk+1s-zwZop8BrMzYQA=dKmWy@x)Mph(D1?)xBh@MB+qLFZonPnVohuu7fA&R zz24w#)%Xx#7o^_rI&mWg>Zi?qrY+XLa<cxsseZHFGl}R5A}pS<EMq0|)`GX;2W=5L zJki_9nHxKsTEh5yF^E^wjtt5}5;=+)C+_adfsQCW>xouCMi;k27-waxNC05c-(AQt zI}9%6Xa@&x{NQ-^GP|-$yifYzS}fjS8g>&picMn@peC4r5+D+$5K(DbQaN;nT~A3q zzu7_UjQz3?)twv|kRyDl#HHJBurUWc?#;F#MVC9c6A$^uEqV6lU$7U*Qe-IFi^)?W z38Ekl04b9Ey$6_}`<Oszs5bl3XOjtce2Mk@NleTaAeK{rJC#pKzcBF@fe}!`1e$n{ zLxs9)g)D%j^LhyvT$((lG@rT)2TnS7t4KI{?o1VLID3IKB#9-vUJyFc2AVj;TB*!Y zSte68v33j{=j#IWQqf`Ho6uZu2S7A711{$S7XoB}N2Q6Z05050al}ut00i#JGByDG z<th|6!jcLn9c5B*LJ0XW-KsHwwftj3--~hp$EM5!bQO*jPd6HoA|WyIusVa>PrC9q zKk63C23^GQbRoy@ih4x)UFa(`r-UJ4v`k@$&S?kr#CR|}+}M=nPLfAlf8pz<*FT2+ zF-!`q3*i5k<{)WQ#t8&f8Rk=H39`hkS{_K#<j6w1+}p6qNKP9QWsWzfNucJymzXZd z0jq~OnSnJ2i#~l=OkyK605dC1ZZ|GuvWeof35euW<TY>x)&$56V<O38euJJ=(fjEj zuj+?eY*aK@0wKyGOH$Kjzqu-EWoYX|o2;*WDg}i4h6ZG|w~z&*^Ee%}A|FU2!&(ek zq6e^zFth&zEh@v*3j79@0b1c&lrym|+Cof+M8A_F>OJLBK+*HNGHdmjvoM9sr_!VT z4}j8O6Fk&afgkdL1Qrx6de00VZJ}mc05c2cWCccPBQ2_UdT;Z_#AH3wze#wNjc%)K z2HDY;X^J~1C@>Q=7w-kh^mD>iWr%+)J8)>S-l6LZJuH?>_9hhPAf&n6v-e2;Fmozp zrFp@f)hh}5bWfQL@|N|Wh{-bixJbjhGyIDJ1Noii^@UDH)@EYnx3J+yjzMDgDu#6@ zZh<Fa0wD$sUKgkhk&q5Ame#KQ4h=FDg$sX;bND|Hn&^z(GK|krIq*`d7}1k6^S&Up z^Y<kIeg>+Bg{i*J(@nV)jTo9w!s+vSkGpq?G%zc3tN@BY<uI(VJ=S^HZ!rAbzp+#` zR{W}vrt3{&c4PN1mytX7GZXDx&c9LJW59B`<|i?WTty5SbdRuqC9dOGt^>T&mf^lO zdj!8nA+Vmwk@%7wedf8YxpLFFSxFFgL~D}W-Y12>W{D$LA7u~4rIoYf0#osTBmuIo zhB^Nb<z3NfuCaJKS<fG_E;<Rs15;5>2iJr7XZhCNYsh?+Z(BU%K(T5$4e#!HkOS`# ziXIcfvNb@v4=+uWdUL#vC5L{4+{wXs_Z$E!J54u&%zU3DXrEi}T$OGWZ>R!&3!J}e zqe%Ko(^Dm3QS_p&d4e{3kGJ8iyC0VB-R1T8@XBw{`Mao9XKc6_WYTE&K;3S??z2%y zZVt<G5J;7n$l=)FT@}MYh~oxgNLd{Pk1Iq%N)wM?It0uczsDcpGRNpVK&R}+NiFp- zVYYqHX1FN$3{6HY6?WpgsGve~O?pq^MQ)Es&*yak-jtp4^6)PEg=^V}*IDi<EB&G{ z&=7;bvS>IPmIKlMRu(7~fFMq&3lK0?Jo#QA>_MquXbU4jJDP)Fpt_SrV|-!;e>7Py z8`oX<9@uG#J%xW^sN$+Ov+-}C^jLIB3?-1gEC}>b4*0-={uXK;L#4;1AaG4UZcuK< zt0A^5$|JJVv>HKWk7XNNFW*HG=ny&$4N>O!$}USbl{6#h91L0_){pCj_v7j8q8@?E zIwrEe8%5ke%++b%)nPOclt8rwfz6SC`bW5klZ&&UEG^yRUhFND(X^RSo4ANC8Hlb6 zAcI;tl!+4znv`opGYm~ZUr&RhaaPcZKP+zesoGSu2FJ_E`p;G3%HV74?NF<@r^%t) zGt0r=45BxQDMVDXmpMYzWtSiIZ;!l*<c#N?{dq@l_NQ9l#>i)HOW<;=&q`93WvCm+ zDTd*0AhZdi$E=ruR`LakOT%V6&t)2_nAyrM>h=ayZE=?gb5x>;iAs2DOkf}wh_mbr zU<+VCIv#bxyVteW1=MS?14&-|{NS;Nc}|OaI-oWY8&=lacBG+MP&E;B$&10W9AuK} z^Ry}sl2)2n1Qh66aXLMPn!rk=)df8BWr3Rqf!{sks25P%{w|CO@<v-Hblj;lbZU_B zd<dcUx<WNEX2>h$SRiJ_Gtg{G&2}ryWkBTy=qf*aIv)+%RM;Cs9^$X59tLAXAjQn5 z%b&glDh6>vTy%y{0t{iG4dmwkaqlz0o1XF;%vJ)TFs4?%dC=O={*(2LLg_H{>reCf z^~VhF<quab=2AQF8)lg#d;%8COwH$Ft@lDEc5s+<!*5WLHyb@(ALerm-M6|6|AOpt zbT7*}_WhI=MvabKONf%PPI#IsfL#GfnAT_4RHW(WsBdG=Vl!cob)NojqGp?$?{Mkp z$KtO58e!T~_>%SXVw<S+*Md^%h;nJ39BuQb^zlCvc}X!V0|yU-`wvb=f1LBsi2VF{ zg_$}6>SLoasFH<+P=bIE9c6Jm3~m7HtnejoYwH4x7^eN~^?Lm*uzu=NsXu!gY!iiy zKRMkrU@NOZ{hF;@Q+Ws}27zlJFXa!ob{4j4Rj<R!TyRiklMJ8i{s!ocbhIrH2FlIK zTQz{?!2qtw)csiukD0NcUqZpU&`INwH=(r;{kF&ts~=SC2#_xSDz8>ym}5vt0qJo4 z`V(!9%!U0)audFuN4f<RJAH*WIqyx@fAy8{_!C7xiL(e|ls`0wznUl>Z+@p93?p{@ zQk^^(@ah+U4^X-S?W@t!-LpP9s)i`IhLWJ&F{SuxrsnbHSlfA!1MFa+sPVZ-S7>2n zIS?)WW{15BUj54G!&C%%PUP>@4o;^gXdxpk2-w%h8z5uoI7~2aWPBdjLL#7as47T6 z6~yJRH$Zzt!xTT<%A~np31Tr*<>0iSZ@zO3I6rtA*kpuEbl3(2ckfi{f&lO$;BWdN ziz*A0yDJ}HIx)_?q+?wIP~2skYi{%u3h6cvd4S~3aAQ9$p5gsP?t2M^TS40r-@>XH z-XOnZ`jn@mbSN`-QT!f(-IJJ%J%G>N>Mh)Wqyjw*H+eM(U``ZGIt|%v*abpB4Q!Ej z!)m<;j%#>;>HvZ`z>Z!Jg{qK5)icNXg^nUv(+nQ!LT_y3FukwOT<<r?`2)a&@T%^@ zCeGza3<o1k2227S3qTZKz_m!0%s}T~Wdla4(BLchc??i8u#8{>mw%2sP@Y;rb5hC> zsk3Ul)4En?g3JHMjexWSysNw_F)7F8^d2K^-j)<l3j}c_pyvPrGLUf*M^v7ZeT7Xc zhRvA**!EixkO~#ORY*mmU^-H`*05S_GGLelu>}4=H`iFrPS!t4?=5U%2Uy8tLBP=x zs*)z2;{!Z&lRL04ctMxJZ=&)EyH@#=^{@BR(6&PMbpdbnve9fWeZRdLXLp8EpRyW* z+7vyB9xa2e5Xm5@VkBp`m*FkBP>bVo#ux8Co|}qxas=rs0qn#bPE3KLqLsTdX&bOe z&M##$z=&@p&{%*9F}$3HQ6)z5L3265#0vy4_YO<62xLdT3if4<XSJ}!0A>n(6g+EU zK)DB0WakIJL>{xBB`LZVl+Hr{o8A8O{x&!hwAfYID7IuB{nT>fBUzie9EX8<KyThH zVrol7b5y_54+g+4*&JUI_#EDphTa!#=L}w$uK6KJlvW#<2ownk4$D+)nmWUSmAJST zv~pf1JcJ4@W9SscTjW0QU#3}?XppUX3&liP>jJX&a?p>@V47<*>+1skqIP5^xe&z_ zIr=cxxvaNYrBx^*b&zZ$9-m0C)Gb?TKqmd7Nf@Fg@6*O;EG4!KKuP*P{Q!_vji|fO zw#$*^dug=Ua%ml9C@M7;qozu<RGL9m6~n-8)ClS>UeHi6?6n#I+VgxKE+YVF3wkgi zJX4@&c}hQ|!9nSB*$W>XPw0pVP1{=SEpkYUaraNU>lwxcnai~d*aGYx0Epac6K(^8 zmLvao-h+$ysZ&-oH*!-%Y{iqC(kI-l7V0ei#_QpFpPtR@xR>X@T4iT7=eQwdMYP?v zqIyH`0#!e2ok6t8{Jmb~=AmeyLfT5c3)Eg{-&x%q--`R1;06$P$Ysgvi(7v;d`d<P zZ81@W#t=T~xR{=}=ngKO9M~8`I(B}T^sNC3KzY{jmU2>VUX3G2Kmo7niN9Awle!_2 zcm1#(#Q&eFM9Q+!281qK1$$*=TZ;vZqo?NwS1Qq5Ksm1@YEc)k63N+-?%t(?<$mJg zSEYW`p*W)KBiF(Nu|ZbB8dpX8&k399G%Fu)m;%Y_>@qeUKc!il$e(b_@$+t+9s}2} z9)}Xv&kKw+Up0jMOW%GVJmT^0ySbU@eW^f@lO#BAX3T_L7bC8~9I&`?phAn4rm2#} zxXs~R$1Fq{Pz7v~ZSd|H#gp~x(#>wYi`MM=V-gBdY!V70Sqnzyj5Omyn7^l?aA;is zvm4&MC5rRG%5MgTJ##{6dXHAHO-4@(gfd9nfBw=8Bd!9p%y>Xfn^F3c?*h2?XYilc z65uyjjS}_<yzM?|!+w&XKe{TjGDJb}#s==HK9D=(QT=p*u1G#}N(P_<s7RcA_7ULv zyLAC)o8dPNoq4_R?$ZTd^Q9h~aL-aAn!~9TDK;VATew}NTu`4zF-#nggeM<m!cL^2 zr~CW{dB2PDJ_h)}DI<X9*#`%U-JZBW6QWiy56ZvG5LZr!yI~0;nZbjv)=FJxkNkc& zj53Ng17>%4Noo-wap5-S!%mbjp%0laY!ofJcd(B<CN5sJLMkKhMe-0pYCHKB(3=n* zA1cq_r_SVZSk)tBu#CA)O{s>LKz)lhh(+wq2tb%h^yT%?y4_Ql_CwS;nA^ie%yo(# z+_-YYN!)hZ^wAuMC3fr=-6zg%u>kO9@)jokp*D;zQ&P%+2DIEbwvAnwm*JbBx&UJ{ z`j5)w58thS=VBvXs;3);*($g<HWm2)hZZY+@uY@j1~OA|Ii4GaB2zG<*2`FD{8aw6 z4D{oGx&WqBG~2Pbck4l8V|FskDztQ18!8Z@AX#!dL;d%&>!3H{Os-%{M%r5nDjHV- z<6S%En!sED0_bDfU4?Ld+?-7nY|H&%yC|>cwrzg}`V8Fo`>i2#Kmte<SUO2_9Di&M zO|rx`QB1Ej7N|Zlg*;r2HNpg|>X38!&Y#U5Ogzt3h|v4Q>skNky8mTGK4|SD|A~dS z_qnj3PG;aD3CAedJc`2MUlSe<{bR^Yll3JPTI^DU-704RK(_*kr#`zZmgJpZDXh#A zEOkP}t-dZ(`Go*pISFKA-TMI3zF%}plB8%b$LJ}MnCA1iTZmNnPZ#|O;N5HK=GAk! z+nyiw0)kC>=FLGvzX28Y?0c0x?z^<_zYGZph`+zZ;MkRgQ}?gRA8J!Ms2lh{uRWk1 zfT`@fOq1mBNVUjD#{>%Y74lhVHRG#8MUu50cS49#KL4GL8x$K41`0A<-jAe*tPo0% zw;m^Ck_o)Z9AUer^p`)HnY)FhrRVkx&>|&@NS#sR)t7=@eWeCawO=<4juSfXi`dG= z$$Al*m=(=Ken+oX0-p%#b!4eJ!60u94Iz2JL2@|7+DGL*e*U#dr)A^Iu{O)dZg(>K z3&3y4Mo&LpoWwBdF`H^P*I56DpF+cE=-jF|>_|2U=xa@kt;)gxdV^4|-2s58(xm7G z7fRl-T#za1(QG+a7tjDuZ6-kCP&I*m{c=_lN(f;|Vg)#XcnAW&#X~x(p~b6fK(2@+ zXP7m^BgT(mdZoKi44`!JfZqb6xHE$B@^_1kJ3%wbH&EnL+~&yN%3TbK>Hp^j^c7x| zCUVHfa(%|&P6MVE;5WOIQ^I3+Qvp-s?<7Vy2HK^~evZmsAV3}aEkl{S(<BaYTbKD? zVD!@Vp$q0XVXtLc7hH~=?-rtp+v5-PACbu`WL6ns9g40-5+i#4XVs{ZaHtm7g-oCP zP_)?;un8qRT<!t(0{CTb;d>?EPR&(($))NQpz9P|qx7{3N>2Al1pKL4wM?I7AFIB? zpTM@c70x-40mwlbIBU>$Gz<0hH6tN>Zi~UF`?8N)cj3wV1pJf+z$0R;ffS=q-B+mj zNS+uo18HG~wDbY&-k(wl>sH}#o>c>csQHNF`uIa#fQk>(8#bf}q~Gg@3@8Lh@Tst^ z3Ek20rF-WvA(F?GRu@Rf#q7~w+9NXP1M4yOaqLb-R<Q%lSn!l?ZcHI<9^f4v(i+XH z*1ISxvGlrtP@q9Uwt0xrnVWhGm986esuN_EhFuxMzDmCPwJ3+3$3u4Qn6`=l>6;9C zbA}K54(I^xM|54g33L>A8J?DJwyS|TXQ5+&;#f$hd6gCT%#SnVqe!v5oeT#WJLnx~ z1H>Cq!zTwZ*J8i#W%#LrZb-^2O)UNAlqIF2fAMw6<x)c=NzY6noVhs*owldIa9(Xm zPcirA=4jFQQWzM|B-dr0fbgG_3Mj|U^H-#Lq?TOELQkt_`VE$8y5LJ{?)AR8Ea+vi z5k-1CZY#o#Bwg{>mmF6VW<kfFfnqKH`%lunW3>v&(5hfn#Q2!a`oqe?yB$4|SVm7a z1#*O>9`g?wKqhMaKW8-l{NPiPE0TDB{LM-)76gSL;UH^;5J@LCv7M$<ZFuVa?KAnS zJtL;j9)ATRQ~5g}@E6iH<R{N{PhkK>TdaHj;qAcEy%+n(${(#XaT|AF`9MH3r>~x9 zXFC5-0x$P<Wu;$^LDk#UY^<JbR|uRQEnU{u)dnaO<%s^DqCiMZw1?sN4@((J`wG#x z_T#ac&6vartd`yUh{4>iO0zTalTrxKJE%n7b;8-Xs5}!*3wV`5Ylvr&M;<GWS(~a7 z9M31~PoM!P{SGV+<17GBMpm@Z#=O=W3Q5H)0-7uP<D|kTDu3{TpI_i3-U%7#mT4Yd zS0bxvu>*zRtg3o5o(-TV0T<!(K!ELKqV*Zph%np%NAFH7_2%P2D^6(;21)8v{$+*C zW&f~J6$a>|tbmY*X<l^%kRW!M;?<k%OP#Fm98$i}PXzU6N-^ycaEA;guFLrWN^Aq0 ze3q6f9%m+)bjsdCD$FQL?vN)yRAQR(0)X2C<X#zbzrjy|yeG2nTxq;9B!5vlS@`k# zTPgW#c`vIkoGg?0Z4HpS0>fi1vH(FM`3-(GyhIta?AnGIl3^d_tpj;o0gdMBuWEHR z`HJpDZ!pkW10<QBn~s7S5C$N<eER3OF^7wJ{IP|Pu+eb(>R<ZZ9j!tO1wPl|&EFaQ zg3xOfYuR}b##O^zK%pEH-O^WhhHGiE{@F<XGm#WI^;PUf{>)6p4S1J2aY6M<tXb{p zH<{R_LCetdgQ#7STn;<1KjU7@Hm|ykz58@S;c7%LA9Zty(f=_0tRh5&kC+mmRKRC! zrhP12Wa}}%@it5c>SrY6(#l<7%&$~Z5a`9=MLCL(G<1|jr;M+IT@jKXbX~_5z6mG* z=Lf}stO^c*D>mDW6y-3ji-r#mToTpYw@M^2=6YaXNXb2?d+$Lh*I_QUyvNUP2Bdjk zVUIr?Ly$G<cyUkXwFu3G7&YzZ@<8(p79u*b3ED}es8z!1Z+?;+HOIRHHY)&yBs2Q$ zl9V4jNCr$>ZBI0$|7>{fmoL1;SEpX+CY56$o=+_yB!76YMeXSx{)&I@8vo}dsoB25 z_ZP0RZJZ}aAREdasZF*eM5?=YWCk+x<_w>6A)vG$5)+|&K=$Y3E@FBd5xaW<)?JwP zQ?$~2bJG#9#5m;zJecf<^k&qqX$68CvYkaNL2O0hDBZ!@LvNQBUPuc}M;y?Hy@hLF zbtl|p>XHB^>-_DQjl2^{UQm%Z2X$}YdY`ZBpvOM8=W&*r-_}Tfx-`Y;J@D4zT~He% zB^g$5OkV2gDiS}10c;&H+hTC&!2IfIWr^la@5nIvAwTk_=H5L?k{^twM=NB`!y*wo zgGeBg;WQxsgyqIGbQ@>-*AAS~+2`DDNfmR&PFNRON&ZbECT<-NI2P1mSidiX1lH|K zGMrRV%8-_l{;vj#u>cxHc14oc6PE*D!dTjImc2&qc7ftGS+Voa+-^A(KGU;vQP#C_ zQT{r&D`yJ138$tEHsDs>y&!;GMr<G-Yw{t2ic`93o_O~iTZWf?g>PLqtLozY1`VO_ zb4@2!1y%-D6C<Q|OY|_mu4V;7FKKKJ=+&~;xLx-fSp{H63;>^zBaTBbkfvT3vh?#A zXAklFN&l}cz$gRlK{3Zqd5QHD{#NDc03BWW(A644{TZ%B{pBZCVt(~5snXEf;j6gw zJbm<_XIGjdx872cNPee;VOu*}Qc_+Yy78_Lci;^M*kZ<9in5WA6+bDH!xUkgXspkC zEgd~wd2i6tRJR$Q({X-q2Gzpa0TE{$mn5<@cvXv>JHkj>Gipjd!X+ILZ)R*N@EG%b zbAR#e+xEuVQ4k@{T$Z)8ev<7G%B{KrR_SGk3B{MN7Uclq2LHgnifPY`z;ST(&)wGb zL~$IWY<0b33%65(50fhrWKXNYKEPrT%AAs9<una4Xdikjg7XXD8P$i?_E75rPU|zj z)@dGk7Diy~332fNKy^cT(*kHWdCOXF+K-eoTSmIJ@mH*J832qX-TPmmvjB9d_&nH$ zym`Ji_Ddm<2JtM1#`+UZ&}#sl^3{x5!IeUvk`JW}J${2WDRFrBTf^rEzbf!~$X<Ru z%7`dlz90!I%Y>u)+0~Wca%2&jDcu!D<8Fbl9EioLJPLzvDjVOJx!3!g+D8kaai<>v z?e~V`zWAw!aB3S3GvX5avT4;xthX>Od7%?%@UbmM9B}j;skht*c=<@zoa2EjRfg_L z2NYt{ra?=R3=Q&CH~0?1tx2uik4c64+nPAcG{#`<lN(1K)ga$?6Fxw2e*=_A=1VTh zXe;v#2k)|TIwB*Ybf`29)Cn9la(xm8-{W5}r)v@fHOMiJ2W<5p`A_wQ$+9M}q{r!( z{igNN@?pJ&=gc=cS#7#L^xPiA;8rzeMxQ+=pQbCeR7V0v-_pH!L@fKE7^I4MT9PEg z7IkyPZrWX4jN1*gW<D<g_GTzT33^0|9YAz&2M$Bi9{CyxA#Yc&?gu|ebcXqGM00ML zKoYt$X%CoyjubTpKujrg_%1+92{#h*hvt)D$7gkTc(D+TBGmzr#TOpb{GYae77h^6 zvRH@%Il*#cZnQRx20`ay_v$sxpR1l*JnZ&Y#nBCvT)w<p_OIoO%_!%)!0VAbMctP_ z{I8bV+rh2zNijeW8bD;!w(q;bP_jum@tG@GoK8wEO&p<WJ05t9MY-4yPkLD(LG`)y zgSTz+njhb)T(53FdD%69DZP`i<pfY{Lm)ey@&~iOwkL}DPkz!tMR;qHpwK_>Te?0v zxaKp)Jnp0YD51bR<HJVrkX^tT<DsrJ8l+!6bGD2PFue-6Nyx+>6oH`uud}Ztl)O5m z%V!c_d8a*#GXyGr#6i>PJX=+<fM3r!zkl4=X=QDfdk~h(6Av`JK<SG81Lw-L^N!?C z@E)Z%$w&*B8zBXJ&#}1IcQiUMxnIgyd-cnm-po`N5Q2qx6wP>J3RU;^ZLL4_hSq=S zs0Yt2FI*1rAJ7U>D9G*!6WJ*_er942AOe)v5-gK|ZoKeRAL@3=hG0jZ9BUP*|CQzA zezKU1l;f5z?F_*QK+$b1qcpszwJjM7@jrCZl%DU;@Sloo8`(~KCHLK7e%%Q{WE?5t zN%d3dFl1oybX5QtD*`ZOtwC&?L(#1uXs$L60`^Cqh5{JGCx5u1^!>(y%vGef=c?dM z(4o5``Oa#EV=-bCw64sxyy^H~zfhL|jW^w>EdJX-{h1{H-LqGGIc#wUY?6t}isYD# zDs~rQ`D37kM@&sFj0f7tl62(5IN<5ZySeX4NKhZRT6H>?%Fqt~N?xx9o)yM>^d{4C z#d_~gXkNp;JmpU+YeBa*%ubp)+K(a0jpz6_a(ge*lWK;I2}11*EURW4IS~JMVSLh; zz3;b-^iO)2p5C6=)F5AtxzuM0S)%dq0d8v8BT$)>DTr+b;sydM_b*mKW6j`x7Vy~D zYDdCmxaQ!2chkU`miOP24)oi<9CYD*OKJ(G>cFWO@PX#HrF(a3wb(;QPw(7Jidudu zkIGnAkk(bokWMJK{XRzY7B8T=7i8Uk6~dc^=7G}V)HpOi^}PPZpgg0`mo*9*ZcApN z0}3wEm=ys(LD)ZtLK~OpEjYS?8JG*wgVyfUNv#Q)?n*23w05BfEVGyey7*wU`Q80n z0|&Fk5e5o>D`)S_W=UU8(Csv^nsp5mN$+I$bOI9Taj9`&kS+v+&>tK(bEy$t*9P@e zNJTvz8j{<Z_5QF_SpzA%X=`JFg;)~TBmA#MamE+7waZ_b3T^$;FLzPo)sfdDP~j6a z6;HXN-1ab9M4E7>YqEaM7$OwySM6<Ah*##^-yfQBF)lPnjq+EPz&tMqGy!$GeyOTM zlDCnhCneL52VODTB8i)|og<BM*?GHM<L+49Svf1Hku!a`D*{HNH$G&w9GW|4&A<Az z;J5J7HnW;k@pEPk(#!WJS^El&L7H%E)*DE14!L|Cu;?1dU4=|!SbWCvotxh+2W}-X zrZeW%z>8C#b>1Icx)&u$jM&Q0c3CReBs~o6t8Yq@-WOM9)Z)#u*zn+M1zgLdBRo_5 z9KQY6c^2gUzGpp$1_@nUhktTkBxS$rch6}P8*&CU@5Q~~6K2>k3FVuA<5d2h22`L% zi^&r+?sekr4{`V@?QwC{&P!d3H~kNJ-rT7x|8*h|><o!{yiA-^jNa`BME0xTnvx<* z^=D<w;Gr-!A2_0h6%8E2^VzKs7*K@yd>=DSk9#&)xb`cYQ>%3Z-v2Uo;%2E+xQD&H zWO;bagj@TAJId!wwGkOk4Ig=5-lsC(>uCP+IZu9Xtuy?5n%|rpAE+~}<;4ls_6Jls z=_3TBIDZ#(c=TLBAlkYJ%oepdQ`pf^;XxYF-2vg<cJA9?{-nK5k1K!m)rX^G-%Q~q zR<h+04lkribk<}90mAy?vEl2c_AQfk8R%LdP`_1G%>4+x<wU#>0**5}OniSulVdl6 z{s;?8w_39aNT{8D9%8v6kXNI*D<w(PDgiV+|0k;PhL_GE20pn}@01@cJW2B3_`Bo` zVeZPRJwFHqH{K6<ELZ{t=LQG7RtY-kX*QN*4>UpF0QxWIdc1Fg`rG?%p89&<7Tl3h z`|z4pv<DvVo;ploD<-i*tWKJ!Gkm<|Yz#6sSM#12qrJM7wEO&tSFyu{;A4%8D)Ww? z><wBCetbi#KZhq)^8FQn!Z}`jy2GwnuT{8lxqJ1!xkuMSjNhP&3Fr|Vd{+b1!&v*G zI7BM&v$q!4h%NAlA)^QA!(a3Cgz}Oc7dFVGBZ4Dd_`{Oa-JKB90i)Yl|5atjB~85q z2ad~9*-0QT7kOZl9os2GCrz%f(O_~wi^tW|X1PVrLyZlma(`DS8qM6aWxZZmArp%m zNXc6l-D0EpuhmyLZq<;46Kw*fR#0zFz-X$#d&f71pBpeUIK!6Y-u@^vR6G4hQ|O|3 z0+Z9O)?#7snU0aIpEso!Z>%_epH{LTXo=mDbYt7GPZX9~#A=p2zg^DwMJasOiUAl( zC=1~)H$loA%C`BGlydRXMp>r8d#~F6z(XL{S1bxwR5@%y8*=jQEUm=pBoZD_E?{;X zgvxVcW%tX*)Ei$`eV{C}Pz4Dty-WAXiPp}b>bUY8{u@a-6vA`Yf;TO(;X)cDUPVxo z#i#Ktq$6L+k^g(CXfG#Z^D4I*!&2u|6C9*Q`Z&u?*r>erdYx;lD@1U3`@HdIbGodX zJtO5SWtkPLyu(Fc=~>@o;s!DPRsKC+v5$TC-?dd8xrb)wz%?ozJR@N=4B<tNa9jP! znvDmONekOwS)n-1o?RyQ)(+>Ub&X3-EbdL}<u(*yPw>;8g8jdft9^y11)#K0Z$rK3 z(U*2hgISSbmbwFz!wn)mN1VXfYXkj*Nrl?c*D7VUw7!dNihiW(XO6r^0gTZ++`z+d zB30ZQchIr=Yo6PTuBY~n!SW58&oJVRJXXfXYw=XI#H+x&Q?r_CZPO`#mHTboG>sB! zEFgl63&fJ3G}T;?{I{S-T*s%`AAu%BbsuL~uieT+$REi2tetPdHm7KQ=DqE>^V!bM zdz(96;y0_(rE`n}(W`3iq2Axkcsr+F`@Q)akN<Pt_K{GJL)zK;CO@b&Wo0D%-5<=G zQlXpzxeEGQ!&UnEhg1`;wrJoez`aH|wO#IU-|?|`IPrEc>0}3m9yhhjfIf5#X2oLN zIJfdwPL(}8PhA9#B;*h(a<L#YDez8xx4?V@J1ex1i5j<Ibs3DCu_eV{e+h0imapw) z>&&n$NV>$8cc)2_)yGuVI%WmVM-0-XHbmzWMyM%o<3|TAUp+E0$?%o}!(l`f#@MO( zzTx!43`?(~oUxe;NYIEK){UF)%(l95e|_vmN?g1Fn)?6y)dk1jeZYQm;|Pp1|4+wO UX>JPmZU&IGxxLv_6Cd*b1K6}HIRF3v literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico index 86ca42fcc229c9808485e33c288a85a85946d29c..ffc16844e99a7fafc072dbb261b3a5e2e7dccca9 100644 GIT binary patch literal 4286 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 TdEQms*ZdS)_x}NYs_p*(e+{*t literal 28465 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 F|3CVPn3Dhi From 95b377f9a40cb0372979ae31ba650cda6aea2494 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 28 May 2024 18:32:00 +0200 Subject: [PATCH 066/132] Filter out empty banners --- app/components/Article/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 7ddc29f6..42606a24 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -132,7 +132,7 @@ export const Article = ({question, glossary, className}: ArticleProps) => { return ( <article className={`${className} ${isLoading(question) ? 'loading' : ''}`}> <h1 className="teal-500 padding-bottom-24">{title}</h1> - {question.banners?.map(Banner)} + {question.banners?.filter((b) => b.title).map(Banner)} <ArticleMeta question={question} className="padding-bottom-56" /> <Contents pageid={pageid} html={text || ''} glossary={glossary || {}} /> From 1c5288680c9134f425682e4398bc3bf279bd8e0b Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 28 May 2024 21:54:16 -0400 Subject: [PATCH 067/132] removed tailwind --- app/components/Article/article.css | 5 + app/components/Article/index.tsx | 4 +- .../ButtonSecondary/button_secondary.css | 47 +- app/components/ButtonSecondary/index.tsx | 26 +- app/components/Feedback/Form.tsx | 9 +- app/components/Feedback/feedback.css | 32 +- app/components/Feedback/index.tsx | 11 +- app/root.css | 6 +- app/routes/questions.actions.tsx | 2 +- package-lock.json | 424 +++++------------- package.json | 3 +- tailwind.config.js | 8 - 12 files changed, 217 insertions(+), 360 deletions(-) delete mode 100644 tailwind.config.js diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 56478bb3..820374c3 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -154,11 +154,16 @@ article .link-popup p { gap: var(--spacing-32); } +.form { + left: 845px; +} + article .footer-comtainer { display: flex; align-items: center; margin-top: var(--spacing-56); margin-bottom: var(--spacing-24); + gap: 16px; } article a.see-more:not(.visible) + div.see-more-contents { display: none; diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 2ad57909..fb613aa5 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -23,7 +23,7 @@ const ArticleFooter = (question: Question) => { return ( !isLoading(question) && ( - <div className="footer-comtainer padding-bottom-40 space-x-4"> + <div className="footer-comtainer padding-bottom-40"> {date && <div className="grey"> {`Updated ${date}`}</div>} <ButtonSecondaryWrapper> <ButtonSecondary @@ -36,7 +36,7 @@ const ArticleFooter = (question: Question) => { </ButtonSecondaryWrapper> <Feedback showForm - formClassName="left-[845px]" + formClassName="form" pageid={question.pageid} onSubmit={async (message: string, option?: string) => logFeedback({ diff --git a/app/components/ButtonSecondary/button_secondary.css b/app/components/ButtonSecondary/button_secondary.css index bc9eb248..edf0f542 100644 --- a/app/components/ButtonSecondary/button_secondary.css +++ b/app/components/ButtonSecondary/button_secondary.css @@ -1,5 +1,10 @@ -.button-secondary .tool-tip { - opacity: 0; +.button-secondary { + position: relative; + padding: 0.25rem; + border-radius: 6px; + border-width: 0; + line-height: 0; + background: inherit; } .button-secondary:hover .tool-tip { @@ -13,3 +18,41 @@ .active path { stroke: var(--colors-teal-600); } + +.active { + background-color: #edfaf9; +} + +.inactive:hover { + background-color: #f9fafc; +} + +.wrapper { + display: flex; + border-style: solid; + border-color: var(--colors-cool-grey-200); + border-width: 1px; + border-radius: 6px; + justify-content: center; + align-items: center; + padding: 7px; + gap: 4px; + min-width: min-content; + min-height: min-content; +} + +.tool-tip { + opacity: 0; + position: absolute; + top: -42px; + left: 50%; + transform: translateX(-50%); + background-color: #1b2b3e; + font-size: 14px; + color: #f2f2f2; + padding: 5px 15px; + border-radius: 8px; + white-space: nowrap; + pointer-events: none; + line-height: 30px; +} diff --git a/app/components/ButtonSecondary/index.tsx b/app/components/ButtonSecondary/index.tsx index 028cadab..488bbe0c 100644 --- a/app/components/ButtonSecondary/index.tsx +++ b/app/components/ButtonSecondary/index.tsx @@ -25,8 +25,8 @@ const ButtonSecondary = ({ <Link to={action} className={ - 'button-secondary relative leading-7 p-1 rounded-[6px] ' + - (active ? 'bg-[#EDFAF9] active' : disabled ? '' : 'hover:bg-[#F9FAFC]') + + 'button-secondary ' + + (active ? 'active' : disabled ? '' : 'inactive') + (className ? ' ' + className : '') } onClick={(e) => { @@ -37,19 +37,15 @@ const ButtonSecondary = ({ {...props} > {children} - {tooltip && !disabled && ( - <p className="tool-tip absolute top-[-42px] left-1/2 transform -translate-x-1/2 bg-[#1B2B3E] text-[14px] text-[#f2f2f2] py-[5px] px-[15px] rounded-[8px] whitespace-nowrap pointer-events-none"> - {tooltip} - </p> - )} + {tooltip && !disabled && <p className="tool-tip">{tooltip}</p>} </Link> ) } return ( <button className={ - 'button-secondary relative leading-7 p-1 rounded-[6px] ' + - (active ? 'bg-[#EDFAF9] active' : disabled ? '' : 'hover:bg-[#F9FAFC]') + + 'button-secondary ' + + (active ? 'active' : disabled ? '' : 'inactive') + (className ? ' ' + className : '') } onClick={action} @@ -57,11 +53,7 @@ const ButtonSecondary = ({ {...props} > {children} - {tooltip && !disabled && ( - <p className="tool-tip absolute top-[-42px] left-1/2 transform -translate-x-1/2 bg-[#1B2B3E] text-[14px] text-[#f2f2f2] py-[5px] px-[15px] rounded-[8px] whitespace-nowrap pointer-events-none"> - {tooltip} - </p> - )} + {tooltip && !disabled && <p className="tool-tip">{tooltip}</p>} </button> ) } @@ -71,11 +63,7 @@ export interface ButtonSecondaryWrapperProps { className?: string } export const ButtonSecondaryWrapper = ({children, className}: ButtonSecondaryWrapperProps) => ( - <div - className={`flex border-[var(--colors-cool-grey-200)] border-[1px] rounded-[6px] space-x-[4px] p-[7px] justify-center items-center size-min ${className || ''}`} - > - {children} - </div> + <div className={`wrapper ${className || ''}`}>{children}</div> ) export default ButtonSecondary diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index 460151d1..2885c085 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -40,12 +40,9 @@ const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps <div ref={clickCheckerRef} onClick={() => setNumClicks((current) => current + 1)} - className={ - 'flex flex-col feedback-form bordered !fixed top-[50px] left-[calc(13.333vw+85px)] w-[384px] ' + - (className ?? '') - } + className={'feedback-form bordered ' + (className ?? '')} > - <span className="black small pb-8">What was the problem?</span> + <span className="black small padding-bottom-32">What was the problem?</span> {options?.map((option) => ( <Button key={option} @@ -61,7 +58,7 @@ const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps <textarea name="feedback-text" - className={['feedback-text bordered', !options ? 'no-options' : ''].join(' ')} + className={['feedback-text small bordered', !options ? 'no-options' : ''].join(' ')} placeholder="Leave a comment (optional)" onChange={(e) => setMessage(e.target.value)} /> diff --git a/app/components/Feedback/feedback.css b/app/components/Feedback/feedback.css index b4437ce8..98ba3701 100644 --- a/app/components/Feedback/feedback.css +++ b/app/components/Feedback/feedback.css @@ -1,19 +1,37 @@ -.feedback .composite-button { - width: fit-content; +.feedback { + display: flex; + align-items: center; +} + +.thanks { + transition: opacity 200ms ease-in-out; + margin-left: 0.5rem; + pointer-events: none; +} +.show { + opacity: 1; +} + +.hide { + opacity: 0; } .feedback-form { - position: relative; - z-index: 2; - max-width: 384px; - padding: var(--spacing-32); - margin-top: var(--spacing-8); + display: flex; + flex-direction: column; + position: fixed; + top: 50px; + left: calc(13.333vw + 85px); + width: 384px; + padding: 30px; + border-radius: 6px; } /* Comment to Nemo when he reviews: why didn't you just do this the way you did the settings buttons? */ .select-option { height: var(--spacing-48); padding: var(--spacing-8) var(--spacing-16); + border-radius: 6px; margin-bottom: var(--spacing-16); cursor: pointer; width: 100%; diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 0d04309f..978ccf53 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -53,7 +53,7 @@ const Feedback = ({ }, [showThanks]) return ( - <div className="flex items-center"> + <div className="feedback"> <ButtonSecondaryWrapper> <Action pageid={pageid} @@ -80,14 +80,7 @@ const Feedback = ({ /> </ButtonSecondaryWrapper> - <p - className={ - 'transition-opacity duration-200 ease-in-out ml-2 pointer-events-none ' + - (showThanks ? 'opacity-100' : 'opacity-0') - } - > - Thank you for your feedback! - </p> + <p className={'thanks ' + (showThanks ? 'show' : 'hide')}>Thank you for your feedback!</p> {showFeedbackForm && ( <FeedbackForm diff --git a/app/root.css b/app/root.css index bab7786c..e2ab2f6a 100644 --- a/app/root.css +++ b/app/root.css @@ -1,7 +1,4 @@ @import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Raleway&display=swap'); -@import 'tailwindcss/base'; -@import 'tailwindcss/components'; -@import 'tailwindcss/utilities'; :root { /* colors */ @@ -163,6 +160,9 @@ h2 { letter-spacing: -0.14px; } +.leading-0 { + line-height: 0 !important; +} /* color classes */ .black { diff --git a/app/routes/questions.actions.tsx b/app/routes/questions.actions.tsx index fd545077..5173c324 100644 --- a/app/routes/questions.actions.tsx +++ b/app/routes/questions.actions.tsx @@ -172,7 +172,7 @@ export const Action = ({ return ( <Form - className="!leading-[0px]" + className="leading-0" replace action="/questions/actions" method="post" diff --git a/package-lock.json b/package-lock.json index 41fcd982..24f240aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,8 +20,7 @@ "react": "^18.2.0", "react-auto-height": "^1.2.1", "react-dom": "^18.2.0", - "remix": "^2.6.0", - "tailwindcss": "^3.4.3" + "remix": "^2.6.0" }, "devDependencies": { "@cloudflare/workers-types": "^4.20240129.0", @@ -75,17 +74,6 @@ "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", "dev": true }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -2358,7 +2346,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2370,7 +2358,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -3053,6 +3041,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3069,6 +3058,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { "node": ">=12" }, @@ -3080,6 +3070,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3684,6 +3675,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3697,6 +3689,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -3705,6 +3698,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -3712,12 +3706,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4163,6 +4159,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -4175,6 +4172,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -4183,6 +4181,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4265,6 +4264,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "optional": true, "engines": { "node": ">=14" @@ -8150,25 +8150,25 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true + "dev": true }, "node_modules/@types/acorn": { "version": "4.0.6", @@ -8544,7 +8544,7 @@ "version": "20.12.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", - "devOptional": true, + "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -9244,6 +9244,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -9252,6 +9253,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -9262,15 +9264,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -9288,7 +9286,8 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true }, "node_modules/argparse": { "version": "1.0.10", @@ -9720,7 +9719,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/base64-js": { "version": "1.5.1", @@ -9767,6 +9767,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "engines": { "node": ">=8" }, @@ -9866,6 +9867,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -9874,6 +9876,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -10099,14 +10102,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001621", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", @@ -10246,6 +10241,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -10501,6 +10497,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -10511,7 +10508,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -10822,7 +10820,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true + "dev": true }, "node_modules/cross-env": { "version": "7.0.3", @@ -10846,6 +10844,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -10859,6 +10858,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -10927,6 +10927,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -11397,16 +11398,11 @@ "node": ">= 4.0.0" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.3.1" } @@ -11432,11 +11428,6 @@ "node": ">=8" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -11588,7 +11579,8 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true }, "node_modules/ee-first": { "version": "1.1.1", @@ -11632,7 +11624,8 @@ "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/encodeurl": { "version": "1.0.2", @@ -12840,6 +12833,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -12867,6 +12861,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -12969,6 +12964,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -13205,6 +13201,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -13220,6 +13217,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "engines": { "node": ">=14" }, @@ -13310,6 +13308,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -13323,6 +13322,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13531,6 +13531,7 @@ "version": "10.4.1", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -13552,6 +13553,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -13754,6 +13756,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -14243,6 +14246,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -14305,6 +14309,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -14377,6 +14382,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -14397,6 +14403,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -14429,6 +14436,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -14508,6 +14516,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -14756,7 +14765,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", @@ -14883,6 +14893,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -15968,14 +15979,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "bin": { - "jiti": "bin/jiti.js" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -16195,6 +16198,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, "engines": { "node": ">=14" }, @@ -16205,7 +16209,8 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/linkify-it": { "version": "5.0.0", @@ -16462,7 +16467,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "dev": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -16837,6 +16842,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { "node": ">= 8" } @@ -17508,6 +17514,7 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -17651,6 +17658,7 @@ "version": "9.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -17674,6 +17682,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -17880,20 +17889,11 @@ "mustache": "bin/mustache" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", @@ -18053,6 +18053,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18619,18 +18620,11 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -19025,6 +19019,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -19032,12 +19027,14 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -19053,6 +19050,7 @@ "version": "10.2.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, "engines": { "node": "14 || >=16.14" } @@ -19124,12 +19122,14 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -19162,6 +19162,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, "engines": { "node": ">= 6" } @@ -19214,6 +19215,7 @@ "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, "funding": [ { "type": "opencollective", @@ -19249,60 +19251,11 @@ "postcss": "^8.2.15" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-import/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, "node_modules/postcss-load-config": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -19411,28 +19364,11 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, "node_modules/postcss-selector-parser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19444,7 +19380,8 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -19815,6 +19752,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -20109,22 +20047,6 @@ } } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -20359,6 +20281,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -20868,6 +20791,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -20962,6 +20886,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -21217,6 +21142,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -21228,6 +21154,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -21302,6 +21229,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -21530,6 +21458,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -21547,6 +21476,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21559,12 +21489,14 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { "node": ">=12" }, @@ -21576,6 +21508,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -21697,6 +21630,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -21709,6 +21643,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -21770,35 +21705,6 @@ "inline-style-parser": "0.1.1" } }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -21815,6 +21721,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -21868,77 +21775,6 @@ "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", "dev": true }, - "node_modules/tailwindcss": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", - "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tailwindcss/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/tailwindcss/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -22228,25 +22064,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -22327,6 +22144,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -22407,11 +22225,6 @@ "node": ">=6.10" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, "node_modules/ts-jest": { "version": "29.1.3", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.3.tgz", @@ -22463,7 +22276,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "devOptional": true, + "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -22506,7 +22319,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true, + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -22518,7 +22331,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.4.0" } @@ -22527,7 +22340,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true + "dev": true }, "node_modules/tsconfig-paths": { "version": "4.2.0", @@ -22780,7 +22593,7 @@ "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "devOptional": true + "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -23165,7 +22978,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", @@ -23220,7 +23034,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true + "dev": true }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -24479,6 +24293,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -24496,6 +24311,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -24511,12 +24327,14 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -24530,6 +24348,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { "node": ">=12" }, @@ -24541,6 +24360,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { "node": ">=12" }, @@ -24552,6 +24372,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -24636,6 +24457,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "dev": true, "bin": { "yaml": "bin.mjs" }, @@ -24704,7 +24526,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } diff --git a/package.json b/package.json index a32c5588..26162510 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,7 @@ "react": "^18.2.0", "react-auto-height": "^1.2.1", "react-dom": "^18.2.0", - "remix": "^2.6.0", - "tailwindcss": "^3.4.3" + "remix": "^2.6.0" }, "devDependencies": { "@cloudflare/workers-types": "^4.20240129.0", diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index 4dfe6202..00000000 --- a/tailwind.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ['./app/**/*.{js,jsx,ts,tsx}'], - theme: { - extend: {}, - }, - plugins: [], -} From efc5302ded52be2e5b8d21bf05e272bd06a50c5c Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 28 May 2024 22:37:01 -0400 Subject: [PATCH 068/132] form styling --- app/components/Feedback/Form.tsx | 2 +- app/components/Feedback/feedback.css | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index 2885c085..218c6b34 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -62,7 +62,7 @@ const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps placeholder="Leave a comment (optional)" onChange={(e) => setMessage(e.target.value)} /> - <Button className="primary full-width" action={handleSubmit} disabled={!enabledSubmit}> + <Button className="primary full-width submit" action={handleSubmit} disabled={!enabledSubmit}> <p>Submit feedback</p> </Button> </div> diff --git a/app/components/Feedback/feedback.css b/app/components/Feedback/feedback.css index 98ba3701..300a1388 100644 --- a/app/components/Feedback/feedback.css +++ b/app/components/Feedback/feedback.css @@ -30,12 +30,20 @@ /* Comment to Nemo when he reviews: why didn't you just do this the way you did the settings buttons? */ .select-option { height: var(--spacing-48); - padding: var(--spacing-8) var(--spacing-16); border-radius: 6px; margin-bottom: var(--spacing-16); cursor: pointer; width: 100%; } + +.submit { + height: var(--spacing-48); + border-radius: 6px; + font-weight: 500 !important; + cursor: pointer; + width: 100%; +} + .select-option.selected { border: 1px solid var(--colors-teal-500); } From 282a58bdefb6bc5d3d56e092a8d446a3aeaba2de Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 1 Jun 2024 12:54:36 -0400 Subject: [PATCH 069/132] Incorporated feedback, Deleted ButtonSecondary --- app/components/Article/article.css | 2 +- app/components/Article/index.tsx | 10 +-- app/components/Button/button.css | 55 +++++++++++++++ app/components/Button/index.tsx | 36 ++++++++-- .../ButtonSecondary/button_secondary.css | 58 ---------------- app/components/ButtonSecondary/index.tsx | 69 ------------------- app/components/Feedback/feedback.css | 4 +- app/components/Feedback/index.tsx | 10 +-- app/routes/questions.actions.tsx | 6 +- 9 files changed, 101 insertions(+), 149 deletions(-) delete mode 100644 app/components/ButtonSecondary/button_secondary.css delete mode 100644 app/components/ButtonSecondary/index.tsx diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 820374c3..1f62278b 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -163,7 +163,7 @@ article .footer-comtainer { align-items: center; margin-top: var(--spacing-56); margin-bottom: var(--spacing-24); - gap: 16px; + gap: var(--spacing-16); } article a.see-more:not(.visible) + div.see-more-contents { display: none; diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index fb613aa5..00cfb42a 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -4,7 +4,6 @@ import KeepGoing from '~/components/Article/KeepGoing' import CopyIcon from '~/components/icons-generated/Copy' import EditIcon from '~/components/icons-generated/Pencil' import Button, {CompositeButton} from '~/components/Button' -import ButtonSecondary, {ButtonSecondaryWrapper} from '../ButtonSecondary' import Feedback, {logFeedback} from '~/components/Feedback' import {tagUrl} from '~/routesMapper' import type {Glossary, Question, Banner as BannerType} from '~/server-utils/stampy' @@ -25,15 +24,16 @@ const ArticleFooter = (question: Question) => { !isLoading(question) && ( <div className="footer-comtainer padding-bottom-40"> {date && <div className="grey"> {`Updated ${date}`}</div>} - <ButtonSecondaryWrapper> - <ButtonSecondary + <CompositeButton secondary> + <Button + secondary action={question.answerEditLink || ''} tooltip="Google Doc" props={{target: '_blank', rel: 'noopener noreferrer'}} > <EditIcon /> - </ButtonSecondary> - </ButtonSecondaryWrapper> + </Button> + </CompositeButton> <Feedback showForm formClassName="form" diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 87cfb8e6..2d7d189a 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -20,6 +20,15 @@ letter-spacing: -0.16px; } +.button-secondary { + position: relative; + padding: 0.25rem; + border-radius: var(--border-radius); + border-width: 0; + line-height: 0; + background: inherit; +} + /* style */ .primary { @@ -154,6 +163,22 @@ border: 1px solid var(--colors-teal-200, #a6d9d7); } +.button-secondary:hover .tool-tip-secondary { + opacity: 1; +} + +.active path { + stroke: var(--colors-teal-600); +} + +.active { + background-color: #edfaf9; +} + +.inactive:hover { + background-color: #f9fafc; +} + /* #### Composite button #### */ .composite-button { box-shadow: 0px var(--spacing-16) var(--spacing-40) 0px rgba(175, 183, 194, 0.2); @@ -196,6 +221,20 @@ border-width: 1px; } +.composite-button-secondary { + display: flex; + border-style: solid; + border-color: var(--colors-cool-grey-200); + border-width: 1px; + border-radius: var(--border-radius); + justify-content: center; + align-items: center; + padding: 7px; + gap: var(--spacing-4); + min-width: min-content; + min-height: min-content; +} + .tooltip::after { content: attr(data-tooltip); position: absolute; @@ -209,6 +248,22 @@ font-size: 16px; /* hard to set via classes, what with this being a pseudoclass */ } +.tool-tip-secondary { + opacity: 0; + position: absolute; + top: -42px; + left: 50%; + transform: translateX(-50%); + background-color: #1b2b3e; + font-size: 14px; + color: #f2f2f2; + padding: 5px 15px; + border-radius: var(--spacing-8); + white-space: nowrap; + pointer-events: none; + line-height: var(--spacing-32); +} + .button.full-width { width: 100%; height: 48px; diff --git a/app/components/Button/index.tsx b/app/components/Button/index.tsx index a1bff2d3..c1e4b2c2 100644 --- a/app/components/Button/index.tsx +++ b/app/components/Button/index.tsx @@ -8,15 +8,32 @@ type ButtonProps = { className?: string tooltip?: string disabled?: boolean + active?: boolean + secondary?: boolean props?: {[k: string]: any} } -const Button = ({children, action, tooltip, className, disabled = false, props}: ButtonProps) => { - const classes = ['button', className, tooltip && 'tooltip'].filter((i) => i).join(' ') +const Button = ({ + children, + action, + secondary, + tooltip, + className, + disabled = false, + active = false, + props, +}: ButtonProps) => { + const classes = [ + (secondary && 'button-secondary') || 'button', + className, + tooltip && !secondary && 'tooltip', + ] + .filter((i) => i) + .join(' ') if (typeof action === 'string') { return ( <Link to={action} - className={classes} + className={classes + ' ' + (secondary && (active ? 'active' : disabled ? '' : 'inactive'))} data-tooltip={tooltip} onClick={(e) => { if (disabled) { @@ -26,18 +43,20 @@ const Button = ({children, action, tooltip, className, disabled = false, props}: {...props} > {children} + {secondary && tooltip && !disabled && <p className="tool-tip-secondary">{tooltip}</p>} </Link> ) } return ( <button - className={classes} + className={classes + ' ' + (secondary && (active ? 'active' : disabled ? '' : 'inactive'))} onClick={action} data-tooltip={tooltip} disabled={disabled} {...props} > {children} + {secondary && tooltip && !disabled && <p className="tool-tip-secondary">{tooltip}</p>} </button> ) } @@ -45,9 +64,14 @@ const Button = ({children, action, tooltip, className, disabled = false, props}: export interface CompositeButtonProps { children: ReactNode className?: string + secondary?: boolean } -export const CompositeButton = ({children, className}: CompositeButtonProps) => ( - <div className={`composite-button ${className || ''}`}>{children}</div> +export const CompositeButton = ({children, className = '', secondary}: CompositeButtonProps) => ( + <div + className={`${(secondary ? 'composite-button-secondary' : 'composite-button') + ' ' + className}`} + > + {children} + </div> ) export default Button diff --git a/app/components/ButtonSecondary/button_secondary.css b/app/components/ButtonSecondary/button_secondary.css deleted file mode 100644 index edf0f542..00000000 --- a/app/components/ButtonSecondary/button_secondary.css +++ /dev/null @@ -1,58 +0,0 @@ -.button-secondary { - position: relative; - padding: 0.25rem; - border-radius: 6px; - border-width: 0; - line-height: 0; - background: inherit; -} - -.button-secondary:hover .tool-tip { - opacity: 1; -} - -.thumb path { - stroke: #788492; -} - -.active path { - stroke: var(--colors-teal-600); -} - -.active { - background-color: #edfaf9; -} - -.inactive:hover { - background-color: #f9fafc; -} - -.wrapper { - display: flex; - border-style: solid; - border-color: var(--colors-cool-grey-200); - border-width: 1px; - border-radius: 6px; - justify-content: center; - align-items: center; - padding: 7px; - gap: 4px; - min-width: min-content; - min-height: min-content; -} - -.tool-tip { - opacity: 0; - position: absolute; - top: -42px; - left: 50%; - transform: translateX(-50%); - background-color: #1b2b3e; - font-size: 14px; - color: #f2f2f2; - padding: 5px 15px; - border-radius: 8px; - white-space: nowrap; - pointer-events: none; - line-height: 30px; -} diff --git a/app/components/ButtonSecondary/index.tsx b/app/components/ButtonSecondary/index.tsx deleted file mode 100644 index 488bbe0c..00000000 --- a/app/components/ButtonSecondary/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import {ReactNode} from 'react' -import {Link} from '@remix-run/react' -import './button_secondary.css' - -type ButtonProps = { - action?: string | (() => void) - children?: ReactNode - className?: string - tooltip?: string - active?: boolean - disabled?: boolean - props?: {[k: string]: any} -} -const ButtonSecondary = ({ - children, - action, - tooltip, - className, - active = false, - disabled = false, - props, -}: ButtonProps) => { - if (typeof action === 'string') { - return ( - <Link - to={action} - className={ - 'button-secondary ' + - (active ? 'active' : disabled ? '' : 'inactive') + - (className ? ' ' + className : '') - } - onClick={(e) => { - if (disabled) { - e.preventDefault() - } - }} - {...props} - > - {children} - {tooltip && !disabled && <p className="tool-tip">{tooltip}</p>} - </Link> - ) - } - return ( - <button - className={ - 'button-secondary ' + - (active ? 'active' : disabled ? '' : 'inactive') + - (className ? ' ' + className : '') - } - onClick={action} - disabled={disabled} - {...props} - > - {children} - {tooltip && !disabled && <p className="tool-tip">{tooltip}</p>} - </button> - ) -} - -export interface ButtonSecondaryWrapperProps { - children: ReactNode - className?: string -} -export const ButtonSecondaryWrapper = ({children, className}: ButtonSecondaryWrapperProps) => ( - <div className={`wrapper ${className || ''}`}>{children}</div> -) - -export default ButtonSecondary diff --git a/app/components/Feedback/feedback.css b/app/components/Feedback/feedback.css index 300a1388..57514a4d 100644 --- a/app/components/Feedback/feedback.css +++ b/app/components/Feedback/feedback.css @@ -30,7 +30,7 @@ /* Comment to Nemo when he reviews: why didn't you just do this the way you did the settings buttons? */ .select-option { height: var(--spacing-48); - border-radius: 6px; + border-radius: var(--border-radius); margin-bottom: var(--spacing-16); cursor: pointer; width: 100%; @@ -38,7 +38,7 @@ .submit { height: var(--spacing-48); - border-radius: 6px; + border-radius: var(--border-radius); font-weight: 500 !important; cursor: pointer; width: 100%; diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 978ccf53..daca3a06 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -3,7 +3,7 @@ import {Action, ActionType} from '~/routes/questions.actions' import './feedback.css' import FeedbackForm from './Form' import type {Citation} from '~/hooks/useChat' -import {ButtonSecondaryWrapper} from '../ButtonSecondary' +import {CompositeButton} from '../Button' type FeedbackType = { option?: string @@ -54,7 +54,7 @@ const Feedback = ({ return ( <div className="feedback"> - <ButtonSecondaryWrapper> + <CompositeButton secondary> <Action pageid={pageid} showText={!!labels} @@ -78,15 +78,15 @@ const Feedback = ({ setShowFeedbackForm(!!showForm) }} /> - </ButtonSecondaryWrapper> + </CompositeButton> <p className={'thanks ' + (showThanks ? 'show' : 'hide')}>Thank you for your feedback!</p> {showFeedbackForm && ( <FeedbackForm - onSubmit={(att) => { + onSubmit={(message, option) => { setShowThanks(true) - return onSubmit(att) + return onSubmit(message, option) }} onClose={() => { setShowFeedbackForm(false) diff --git a/app/routes/questions.actions.tsx b/app/routes/questions.actions.tsx index 5173c324..f50425a1 100644 --- a/app/routes/questions.actions.tsx +++ b/app/routes/questions.actions.tsx @@ -3,7 +3,7 @@ import type {ActionFunctionArgs} from '@remix-run/cloudflare' import {Form, useSearchParams} from '@remix-run/react' import {json} from '@remix-run/cloudflare' import {makeColumnIncrementer} from '~/server-utils/stampy' -import ButtonSecondary from '~/components/ButtonSecondary' +import Button from '~/components/Button' import { DarkLight, Edit, @@ -184,9 +184,9 @@ export const Action = ({ <input type="hidden" name="incBy" value={actionTaken ? -1 : 1} /> <input type="hidden" name="stateString" value={stateString} /> {children} - <ButtonSecondary disabled={disabled} active={actionTaken} tooltip={hint}> + <Button secondary disabled={disabled} active={actionTaken} tooltip={hint}> <Icon /> - </ButtonSecondary> + </Button> </Form> ) } From 3f7bdbe4644a6ba6d31cb3401aa9b94341f5f768 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 1 Jun 2024 14:33:24 -0400 Subject: [PATCH 070/132] color vars added --- app/components/Button/button.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 2d7d189a..87d5c020 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -172,11 +172,11 @@ } .active { - background-color: #edfaf9; + background-color: var(----colors-teal-50); } .inactive:hover { - background-color: #f9fafc; + background-color: var(--colors-light-grey); } /* #### Composite button #### */ From 755242a217abe915832987a29c2964e01cdc5641 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Mon, 3 Jun 2024 18:52:18 -0400 Subject: [PATCH 071/132] testing permissions --- app/components/Chatbot/widgit.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index a1b182cc..de8fd4cf 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -17,8 +17,8 @@ } .widget-ask { - position: sticky; - bottom: 0; + position: fixed; + bottom: 10px; } .right-icon { padding-right: var(--spacing-56); From a571c1b6eb7b89b267f75d340f021d420c0937fb Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Mon, 3 Jun 2024 21:41:27 -0400 Subject: [PATCH 072/132] vars added, position form absolutely --- app/components/Article/article.css | 4 ---- app/components/Article/index.tsx | 1 - app/components/Feedback/Form.tsx | 10 ---------- app/components/Feedback/feedback.css | 12 +++++++----- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 1f62278b..10c0662f 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -154,10 +154,6 @@ article .link-popup p { gap: var(--spacing-32); } -.form { - left: 845px; -} - article .footer-comtainer { display: flex; align-items: center; diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index ee39b676..6df65a93 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -36,7 +36,6 @@ const ArticleFooter = (question: Question) => { </CompositeButton> <Feedback showForm - formClassName="form" pageid={question.pageid} onSubmit={async (message: string, option?: string) => logFeedback({ diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index 218c6b34..37ea3089 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -16,16 +16,6 @@ const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps const [numClicks, setNumClicks] = useState(0) const clickCheckerRef = useOutsideOnClick(onClose) - useEffect(() => { - // Hide the form after 15 seconds if the user hasn't interacted with it - const timeoutId = setInterval(() => { - onClose && onClose() - }, 15000) - - // Clear the timeout to prevent it from running if the component unmounts - return () => clearInterval(timeoutId) - }, [numClicks, onClose]) - const selectFeedback = (option: string) => { setSelected(option) setEnabledSubmit(true) diff --git a/app/components/Feedback/feedback.css b/app/components/Feedback/feedback.css index 57514a4d..c7e1a8cf 100644 --- a/app/components/Feedback/feedback.css +++ b/app/components/Feedback/feedback.css @@ -1,6 +1,7 @@ .feedback { display: flex; align-items: center; + position: relative; } .thanks { @@ -19,12 +20,13 @@ .feedback-form { display: flex; flex-direction: column; - position: fixed; - top: 50px; - left: calc(13.333vw + 85px); + position: absolute; + z-index: 200; + left: 0px; + bottom: calc(100% + 4px); width: 384px; - padding: 30px; - border-radius: 6px; + padding: var(--spacing-32); + border-radius: var(--border-radius); } /* Comment to Nemo when he reviews: why didn't you just do this the way you did the settings buttons? */ From f8ee121cb622c587a9e56850547222bdf7304cc9 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Mon, 3 Jun 2024 21:45:45 -0400 Subject: [PATCH 073/132] linting --- app/components/Feedback/Form.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index 37ea3089..9ff683aa 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -1,4 +1,4 @@ -import {useEffect, useState} from 'react' +import {useState} from 'react' import Button from '~/components/Button' import useOutsideOnClick from '~/hooks/useOnOutsideClick' import './feedback.css' @@ -13,7 +13,6 @@ const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps const [selected, setSelected] = useState<string>() const [message, setMessage] = useState('') const [enabledSubmit, setEnabledSubmit] = useState(!options) - const [numClicks, setNumClicks] = useState(0) const clickCheckerRef = useOutsideOnClick(onClose) const selectFeedback = (option: string) => { @@ -27,11 +26,7 @@ const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps } return ( - <div - ref={clickCheckerRef} - onClick={() => setNumClicks((current) => current + 1)} - className={'feedback-form bordered ' + (className ?? '')} - > + <div ref={clickCheckerRef} className={'feedback-form bordered ' + (className ?? '')}> <span className="black small padding-bottom-32">What was the problem?</span> {options?.map((option) => ( <Button From bf8b9fc726dc4a11f73ed5f7136c816a79315afc Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Mon, 3 Jun 2024 23:14:02 -0400 Subject: [PATCH 074/132] White space for chat input, fixed positioning --- app/components/Chatbot/index.tsx | 8 +++++--- app/components/Chatbot/widgit.css | 12 +++++++++++- app/components/Input/input.css | 6 +++--- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index b3e61a96..bbd5fd3f 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -51,8 +51,9 @@ type QuestionInputProps = { initial?: string onChange?: (val: string) => void onAsk?: (val: string) => void + whiteSpace?: boolean } -const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { +const QuestionInput = ({initial, onChange, onAsk, whiteSpace}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') const {results, search, clear} = useSearch(1) @@ -91,6 +92,7 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { /> <SendIcon className="send pointer" onClick={() => handleAsk(question)} /> </div> + {whiteSpace && <div className="white-space"></div>} </div> ) } @@ -307,7 +309,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { <ChatEntry key={`chat-entry-${i}`} {...item} /> ))} - <div className="padding-bottom-56"> + <div className="padding-bottom-192"> {followups ? ( <Followups title="Continue the conversation" @@ -317,7 +319,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { ) : undefined} </div> - <QuestionInput onAsk={onQuestion} /> + <QuestionInput onAsk={onQuestion} whiteSpace /> <div className={'warning-floating'}> <p className={'xs'}> diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index de8fd4cf..556a5515 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -18,7 +18,7 @@ .widget-ask { position: fixed; - bottom: 10px; + bottom: 50px; } .right-icon { padding-right: var(--spacing-56); @@ -64,3 +64,13 @@ right: 4px; bottom: 4px; } + +.white-space { + position: absolute; + left: -1000px; + width: calc(100% + 2000px); + height: 100px; + top: 100%; + z-index: 1000; + background: #ffffff; +} diff --git a/app/components/Input/input.css b/app/components/Input/input.css index dbf4c2b8..a429dd9b 100644 --- a/app/components/Input/input.css +++ b/app/components/Input/input.css @@ -6,10 +6,10 @@ border-radius: var(--border-radius); border: 1px solid var(--colors-cool-grey-200, #dfe3e9); background: var(--colors-white, #fff); - box-shadow: 0px 16px 40px 0px rgba(175, 183, 194, 0.2); color: var(--colors-cool-grey-900, #1b2b3e); padding: var(--spacing-8) 0 var(--spacing-8) var(--spacing-12); - height: var(--spacing-48); + /* This can't be a variable because it shouldn't shrink when the screen gets small */ + height: 48px; font-size: 16px; font-weight: 300; line-height: 170%; /* 27.2px */ @@ -24,7 +24,7 @@ /* size */ .input.large { - height: var(--spacing-56); + height: 56px; font-size: 18px; letter-spacing: -0.18px; } From dffb835c674156cf6da86bbb953433afcf68d368 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Mon, 3 Jun 2024 23:22:32 -0400 Subject: [PATCH 075/132] added shadow --- app/components/Chatbot/index.tsx | 6 ++++-- app/components/Input/input.css | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index bbd5fd3f..f12e9a39 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -52,8 +52,9 @@ type QuestionInputProps = { onChange?: (val: string) => void onAsk?: (val: string) => void whiteSpace?: boolean + shadow?: boolean } -const QuestionInput = ({initial, onChange, onAsk, whiteSpace}: QuestionInputProps) => { +const QuestionInput = ({initial, onChange, onAsk, whiteSpace, shadow}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') const {results, search, clear} = useSearch(1) @@ -81,7 +82,7 @@ const QuestionInput = ({initial, onChange, onAsk, whiteSpace}: QuestionInputProp <div className="flex-container"> <Input placeHolder={placeholder} - className="large full-width" + className={'large full-width ' + (shadow ? 'shadow' : '')} value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { @@ -129,6 +130,7 @@ export const WidgetStampy = ({className}: {className?: string}) => { </div> <QuestionInput + shadow initial={question} onChange={setQuestion} onAsk={(question) => { diff --git a/app/components/Input/input.css b/app/components/Input/input.css index a429dd9b..02d08013 100644 --- a/app/components/Input/input.css +++ b/app/components/Input/input.css @@ -29,6 +29,10 @@ letter-spacing: -0.18px; } +.input.shadow { + box-shadow: 0px 16px 40px 0px rgba(175, 183, 194, 0.2); +} + /* states */ .input:hover { From ac4882e9d00e10d6135da96b42696d40537ef08a Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 4 Jun 2024 13:51:45 +0200 Subject: [PATCH 076/132] chat initialisation --- app/components/Article/index.tsx | 2 +- app/components/Chatbot/ChatEntry.tsx | 4 ++-- app/components/Chatbot/index.tsx | 7 ++++--- app/components/Chatbot/widgit.css | 2 +- app/root.css | 3 +++ 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 42606a24..acba19c9 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -91,7 +91,7 @@ const Banner = ({title, text, icon, backgroundColour, textColour}: BannerType) = return ( <div key={title} - className="banner rounded" + className="banner rounded shadowed" style={{ backgroundColor: backgroundColour || 'inherit', color: textColour || 'inherit', diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 7ee57dc2..3039e72b 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -33,7 +33,7 @@ const AnswerInfo = ({ {answerType === 'human' ? 'Human-written' : 'Bot-generated'} response </span> <QuestionMarkIcon className="hint" /> - <div className="hint-contents rounded">{hint}</div> + <div className="hint-contents bordered">{hint}</div> </span> ) } @@ -102,7 +102,7 @@ const ReferencePopup = (citation: Citation) => { const parsed = citation.text?.match(/^###.*?###\s+"""(.*?)"""$/ms) if (!parsed) return undefined return ( - <div className="reference-contents rounded"> + <div className="reference-contents bordered"> <ReferenceSummary {...citation} titleClass="large-bold" /> <div className="grey padding-bottom-16 padding-top-24">Referenced excerpt</div> <div diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index b3e61a96..95a0566c 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -51,8 +51,9 @@ type QuestionInputProps = { initial?: string onChange?: (val: string) => void onAsk?: (val: string) => void + sticky?: boolean } -const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { +const QuestionInput = ({initial, onChange, onAsk, sticky}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') const {results, search, clear} = useSearch(1) @@ -71,7 +72,7 @@ const QuestionInput = ({initial, onChange, onAsk}: QuestionInputProps) => { } return ( - <div className="widget-ask col-10"> + <div className={`widget-ask col-10 ${sticky ? 'sticky' : ''}`}> {results.length > 0 ? ( <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> <p className="default">{results[0].title}</p> @@ -317,7 +318,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { ) : undefined} </div> - <QuestionInput onAsk={onQuestion} /> + <QuestionInput onAsk={onQuestion} sticky /> <div className={'warning-floating'}> <p className={'xs'}> diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index a1b182cc..efaf2d69 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -16,7 +16,7 @@ } } -.widget-ask { +.sticky { position: sticky; bottom: 0; } diff --git a/app/root.css b/app/root.css index cac8d69f..169995fd 100644 --- a/app/root.css +++ b/app/root.css @@ -470,6 +470,9 @@ svg { /* all other classes */ .rounded { border-radius: var(--border-radius); +} + +.shadowed { box-shadow: 0px var(--spacing-16) var(--spacing-40) rgba(175, 183, 194, 0.2); box-sizing: border-box; } From 3321e81080a5e5ee82be9e804bad7a22d7be2257 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 4 Jun 2024 10:16:32 -0400 Subject: [PATCH 077/132] positioning fixed --- app/components/Chatbot/index.tsx | 14 ++++++-------- app/components/Chatbot/widgit.css | 4 ++++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index f12e9a39..1f9e4592 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -51,10 +51,9 @@ type QuestionInputProps = { initial?: string onChange?: (val: string) => void onAsk?: (val: string) => void - whiteSpace?: boolean - shadow?: boolean + fixed?: boolean } -const QuestionInput = ({initial, onChange, onAsk, whiteSpace, shadow}: QuestionInputProps) => { +const QuestionInput = ({initial, onChange, onAsk, fixed}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') const {results, search, clear} = useSearch(1) @@ -73,7 +72,7 @@ const QuestionInput = ({initial, onChange, onAsk, whiteSpace, shadow}: QuestionI } return ( - <div className="widget-ask col-10"> + <div className={'widget-ask ' + (fixed ? 'fixed col-10' : 'col-9')}> {results.length > 0 ? ( <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> <p className="default">{results[0].title}</p> @@ -82,7 +81,7 @@ const QuestionInput = ({initial, onChange, onAsk, whiteSpace, shadow}: QuestionI <div className="flex-container"> <Input placeHolder={placeholder} - className={'large full-width ' + (shadow ? 'shadow' : '')} + className={'large full-width ' + (fixed ? '' : 'shadow')} value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { @@ -93,7 +92,7 @@ const QuestionInput = ({initial, onChange, onAsk, whiteSpace, shadow}: QuestionI /> <SendIcon className="send pointer" onClick={() => handleAsk(question)} /> </div> - {whiteSpace && <div className="white-space"></div>} + {fixed && <div className="white-space"></div>} </div> ) } @@ -130,7 +129,6 @@ export const WidgetStampy = ({className}: {className?: string}) => { </div> <QuestionInput - shadow initial={question} onChange={setQuestion} onAsk={(question) => { @@ -321,7 +319,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { ) : undefined} </div> - <QuestionInput onAsk={onQuestion} whiteSpace /> + <QuestionInput onAsk={onQuestion} fixed /> <div className={'warning-floating'}> <p className={'xs'}> diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 556a5515..2844a24c 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -17,9 +17,13 @@ } .widget-ask { + position: relative; +} +.widget-ask.fixed { position: fixed; bottom: 50px; } + .right-icon { padding-right: var(--spacing-56); } From 5f3ca19e7af64c6e4be0bc7663555639d86ac27b Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 4 Jun 2024 17:33:00 +0200 Subject: [PATCH 078/132] various fixes --- app/components/Chatbot/ChatEntry.tsx | 6 ++-- app/components/Chatbot/chat_entry.css | 1 + app/components/Chatbot/index.tsx | 41 +++++++++++++++++++-------- app/components/Chatbot/widgit.css | 2 ++ app/components/Input/index.tsx | 23 +++------------ app/components/Menu/index.tsx | 7 +++-- app/components/Nav/index.tsx | 8 +++++- app/hooks/useSearch.tsx | 4 ++- app/root.css | 4 +++ 9 files changed, 58 insertions(+), 38 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 3039e72b..10717c1e 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -1,4 +1,4 @@ -import {ComponentType} from 'react' +import {ComponentType, ReactNode} from 'react' import {Link} from '@remix-run/react' import MarkdownIt from 'markdown-it' import Contents from '~/components/Article/Contents' @@ -40,13 +40,13 @@ const AnswerInfo = ({ type TitleProps = { title: string - Icon: ComponentType + Icon: ({width, height}: {width: string; height: string}) => ReactNode answerType?: 'human' | 'bot' | 'error' hint?: string } const Title = ({title, Icon, answerType, hint}: TitleProps) => ( <div className="flex-container title padding-bottom-16"> - <Icon /> + <Icon width="40" height="40" /> <span className="default-bold flex-double">{title}</span> <AnswerInfo answerType={answerType} hint={hint} /> </div> diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index eb5ddf98..7002314f 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -23,6 +23,7 @@ article.stampy { position: absolute; transform: translateY(var(--spacing-24)); visibility: hidden; + width: 256px; } .chat-entry .hint-contents:hover, diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 95a0566c..2f5e209c 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -5,6 +5,7 @@ import IconStampySmall from '~/components/icons-generated/StampySmall' import SendIcon from '~/components/icons-generated/PlaneSend' import Button from '~/components/Button' import {queryLLM, Entry, AssistantEntry, StampyEntry, Followup, ChatSettings} from '~/hooks/useChat' +import useOutsideOnClick from '~/hooks/useOnOutsideClick' import ChatEntry from './ChatEntry' import './widgit.css' import {questionUrl} from '~/routesMapper' @@ -52,27 +53,33 @@ type QuestionInputProps = { onChange?: (val: string) => void onAsk?: (val: string) => void sticky?: boolean + placeholder?: string } -const QuestionInput = ({initial, onChange, onAsk, sticky}: QuestionInputProps) => { +const QuestionInput = ({ + initial, + onChange, + onAsk, + sticky, + placeholder = 'Ask Stampy a question...', +}: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') - const [placeholder, setPlaceholder] = useState('Ask Stampy a question...') const {results, search, clear} = useSearch(1) + const clickDetectorRef = useOutsideOnClick(() => handleChange('')) const handleAsk = (val: string) => { clear() onAsk && onAsk(val) setQuestion('') - setPlaceholder('Message Stampy') } const handleChange = (val: string) => { - search(val, MIN_SIMILARITY) + search(val, 0.7) setQuestion(val) onChange && onChange(val) } return ( - <div className={`widget-ask col-10 ${sticky ? 'sticky' : ''}`}> + <div className={`widget-ask col-10 ${sticky ? 'sticky' : ''}`} ref={clickDetectorRef}> {results.length > 0 ? ( <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> <p className="default">{results[0].title}</p> @@ -80,12 +87,14 @@ const QuestionInput = ({initial, onChange, onAsk, sticky}: QuestionInputProps) = ) : undefined} <div className="flex-container"> <Input - placeHolder={placeholder} + placeholder={placeholder} className="large full-width" value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { - if (e.key === 'Enter' && question.trim() && onAsk) { + if (e.key === 'Escape') { + handleChange('') + } else if (e.key === 'Enter' && question.trim() && onAsk) { handleAsk(question) } }} @@ -153,7 +162,10 @@ const Followups = ({title, followups, onSelect, className}: FollowupsProps) => ( {followups?.map(({text, pageid}, i) => ( <div key={i} className="padding-bottom-16"> - <Button className="secondary-alt-large" action={() => onSelect({text, pageid})}> + <Button + className="secondary-alt-large text-align-left" + action={() => onSelect({text, pageid})} + > {text} </Button> </div> @@ -195,7 +207,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const [history, setHistory] = useState([] as Entry[]) const [controller, setController] = useState(() => new AbortController()) const fetcher = useFetcher({key: 'followup-fetcher'}) - const {search, resultsForRef, waitForResults} = useSearch(1) + const {search, resultsForRef, waitForResults, loadedQuestions} = useSearch(1) useEffect(() => { if (!fetcher.data || fetcher.state !== 'idle') return @@ -293,11 +305,12 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const fetchFlag = useRef(false) useEffect(() => { - if (question && !fetchFlag.current) { + if (loadedQuestions && question && !fetchFlag.current) { fetchFlag.current = true onQuestion(question) } - }) + // eslint-disable-next-line + }, [loadedQuestions, question]) return ( <div className="centered col-10 height-70"> @@ -318,7 +331,11 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { ) : undefined} </div> - <QuestionInput onAsk={onQuestion} sticky /> + <QuestionInput + onAsk={onQuestion} + placeholder={history.length > 0 ? 'Message Stampy' : undefined} + sticky + /> <div className={'warning-floating'}> <p className={'xs'}> diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index efaf2d69..e492a936 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -53,6 +53,8 @@ border: 1px solid var(--colors-cool-grey-200, #dfe3e9); justify-content: start; padding: var(--spacing-8) var(--spacing-12); + position: absolute; + top: calc(-1 * var(--spacing-56)); } .widget-ask .suggestion:hover { diff --git a/app/components/Input/index.tsx b/app/components/Input/index.tsx index 069d3dd3..aa1191ac 100644 --- a/app/components/Input/index.tsx +++ b/app/components/Input/index.tsx @@ -3,31 +3,16 @@ import './input.css' type InputProps = { className?: string disabled?: boolean - placeHolder?: string + placeholder?: string value?: string onChange?: (e: any) => void onKeyDown?: (e: any) => void + onBlur?: (e: any) => void } -const Input = ({ - className, - disabled = false, - placeHolder, - value, - onChange, - onKeyDown, -}: InputProps) => { +const Input = ({className, ...props}: InputProps) => { const classes = ['input', className].filter((i) => i).join(' ') - return ( - <input - className={classes} - disabled={disabled} - placeholder={placeHolder} - value={value} - onChange={onChange} - onKeyDown={onKeyDown} - /> - ) + return <input className={classes} {...props} /> } export default Input diff --git a/app/components/Menu/index.tsx b/app/components/Menu/index.tsx index 233e0124..196aeef1 100644 --- a/app/components/Menu/index.tsx +++ b/app/components/Menu/index.tsx @@ -13,6 +13,7 @@ interface MenuItemProps { onMouseEnter?: () => void onMouseLeave?: () => void id?: string + reload?: boolean } export const MenuItem = ({ primary = false, @@ -22,10 +23,12 @@ export const MenuItem = ({ onMouseEnter, onMouseLeave, id, + reload, }: MenuItemProps) => { + const Component = !reload ? Link : (props: {to: string}) => <a href={props.to} {...props} /> return ( <li className="top-menu-item" id={id} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}> - <Link to={link} className="top-menu-link"> + <Component to={link} className="top-menu-link"> {icon ? ( typeof icon === 'string' ? ( <img loading="lazy" src={icon} className="top-menu-icon" alt={text} /> @@ -35,7 +38,7 @@ export const MenuItem = ({ ) : null} <span className={['top-menu-text', primary ? '' : 'teal-500'].join(' ')}>{text}</span> - </Link> + </Component> </li> ) } diff --git a/app/components/Nav/index.tsx b/app/components/Nav/index.tsx index 25d572c5..bb32b568 100644 --- a/app/components/Nav/index.tsx +++ b/app/components/Nav/index.tsx @@ -29,7 +29,13 @@ export const Nav = ({toc, categories}: NavProps) => { id="showArticles" /> <ArticlesDropdown toc={toc} categories={categories || []} /> - <MenuItem primary={true} link="/chat/" icon={<BotIcon />} text="AI Safety Chatbot" /> + <MenuItem + primary={true} + link="/chat/" + icon={<BotIcon />} + text="AI Safety Chatbot" + reload + /> <li className="top-menu-item"> <div className="top-menu-divider"></div> </li> diff --git a/app/hooks/useSearch.tsx b/app/hooks/useSearch.tsx index d363e4b0..4d604c04 100644 --- a/app/hooks/useSearch.tsx +++ b/app/hooks/useSearch.tsx @@ -173,7 +173,7 @@ export const useSearch = (numResults = NUM_RESULTS) => { const search = (userQuery: string, minSimilarity?: number) => { isPendingSearch.current = true - const wordCount = userQuery.split(' ').length + const wordCount = userQuery.trim().split(' ').length if (wordCount > 2 && tfWorkerRef.current) { if (runningQueryRef.current || !tfWorkerRef.current) { searchLater(userQuery, minSimilarity) @@ -215,6 +215,8 @@ export const useSearch = (numResults = NUM_RESULTS) => { } return { + loadedQuestions: !!items, + loadedEmbeddings: !!runningQueryRef.current, search, clear, results, diff --git a/app/root.css b/app/root.css index 169995fd..f9e5f61e 100644 --- a/app/root.css +++ b/app/root.css @@ -420,6 +420,10 @@ svg { /* other one-off classes */ +.text-align-left { + text-align: left; +} + .text-align-center { text-align: center; } From 22fff915c2cafa84438aca291b241f5e7fb74807 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 4 Jun 2024 17:54:32 +0200 Subject: [PATCH 079/132] slightly better popups --- app/components/Article/article.css | 1 + app/server-utils/parsing-utils.ts | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 63dc3960..4c0723d7 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -92,6 +92,7 @@ article .link-popup { visibility: hidden; opacity: 0; position: absolute; + max-width: 400px; display: inline-block; font: var(--baseFont); font-style: normal; diff --git a/app/server-utils/parsing-utils.ts b/app/server-utils/parsing-utils.ts index c1d03b84..7b09e389 100644 --- a/app/server-utils/parsing-utils.ts +++ b/app/server-utils/parsing-utils.ts @@ -42,6 +42,12 @@ interface HostConfig { } const md = new MarkdownIt({html: true}).use(MarkdownItFootnote) +md.renderer.rules.footnote_caption = (tokens, idx) => { + let n = Number(tokens[idx].meta.id + 1).toString() + if (tokens[idx].meta.subId > 0) n += `:${tokens[idx].meta.subId}` + return n +} + export const convertToHtmlAndWrapInDetails = (markdown: string): string => { // Recursively wrap any [See more...] segments in HTML Details const seeMoreToken = 'SEE-MORE-BUTTON' From 20f6823a918d789f8224d7faf4718d9ade8624b0 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 4 Jun 2024 18:03:38 +0200 Subject: [PATCH 080/132] make sure there are always chat conitnuations --- app/components/Chatbot/index.tsx | 78 +++++++++++++++++--------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 2f5e209c..f6c718f2 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -15,35 +15,34 @@ import Input from '~/components/Input' // to be replaced with actual pool questions const poolQuestions = [ - {title: 'Do people seriously worry about existential risk from AI?', pageid: '6953'}, - {title: 'Is AI safety about systems becoming malevolent or conscious?', pageid: '6194'}, - {title: 'When do experts think human-level AI will be created?', pageid: '5633'}, - {title: 'Why is AI alignment a hard problem?', pageid: '8163'}, + {text: 'Do people seriously worry about existential risk from AI?', pageid: '6953'}, + {text: 'Is AI safety about systems becoming malevolent or conscious?', pageid: '6194'}, + {text: 'When do experts think human-level AI will be created?', pageid: '5633'}, + {text: 'Why is AI alignment a hard problem?', pageid: '8163'}, { - title: 'Why can’t we just “put the AI in a box” so that it can’t influence the outside world?', + text: 'Why can’t we just “put the AI in a box” so that it can’t influence the outside world?', pageid: '6176', }, { - title: 'What are the differences between AGI, transformative AI, and superintelligence?', + text: 'What are the differences between AGI, transformative AI, and superintelligence?', pageid: '5864', }, - {title: 'What are large language models?', pageid: '5864'}, - {title: "Why can't we just turn the AI off if it starts to misbehave?", pageid: '3119'}, - {title: 'What is instrumental convergence?', pageid: '897I'}, - {title: "What is Goodhart's law?", pageid: '8185'}, - {title: 'What is the orthogonality thesis?', pageid: '6568'}, - {title: 'How powerful would a superintelligence become?', pageid: '7755'}, - {title: 'Will AI be able to think faster than humans?', pageid: '8E41'}, - {title: "Isn't the real concern misuse?", pageid: '9B85'}, - {title: 'Are AIs conscious?', pageid: '8V5J'}, + {text: 'What are large language models?', pageid: '5864'}, + {text: "Why can't we just turn the AI off if it starts to misbehave?", pageid: '3119'}, + {text: 'What is instrumental convergence?', pageid: '897I'}, + {text: "What is Goodhart's law?", pageid: '8185'}, + {text: 'What is the orthogonality thesis?', pageid: '6568'}, + {text: 'How powerful would a superintelligence become?', pageid: '7755'}, + {text: 'Will AI be able to think faster than humans?', pageid: '8E41'}, + {text: "Isn't the real concern misuse?", pageid: '9B85'}, + {text: 'Are AIs conscious?', pageid: '8V5J'}, { - title: - 'What are the differences between a singularity, an intelligence explosion, and a hard takeoff?', + text: 'What are the differences between a singularity, an intelligence explosion, and a hard takeoff?', pageid: '8IHO', }, - {title: 'What is an intelligence explosion?', pageid: '6306'}, - {title: 'How might AGI kill people?', pageid: '5943'}, - {title: 'What is a "warning shot"?', pageid: '7748'}, + {text: 'What is an intelligence explosion?', pageid: '6306'}, + {text: 'How might AGI kill people?', pageid: '5943'}, + {text: 'What is a "warning shot"?', pageid: '7748'}, ] const MIN_SIMILARITY = 0.85 @@ -156,22 +155,28 @@ type FollowupsProps = { onSelect: (followup: Followup) => void className?: string } -const Followups = ({title, followups, onSelect, className}: FollowupsProps) => ( - <> - {title && <div className={'padding-bottom-24 grey' + (className || '')}>{title}</div>} +const Followups = ({title, followups, onSelect, className}: FollowupsProps) => { + const items = + (followups?.length || 0) >= 3 + ? followups + : [...(followups || []), ...poolQuestions.sort(() => Math.random() - 0.5)].slice(0, 3) + return ( + <> + {title && <div className={'padding-bottom-24 grey' + (className || '')}>{title}</div>} - {followups?.map(({text, pageid}, i) => ( - <div key={i} className="padding-bottom-16"> - <Button - className="secondary-alt-large text-align-left" - action={() => onSelect({text, pageid})} - > - {text} - </Button> - </div> - ))} - </> -) + {items?.map(({text, pageid}, i) => ( + <div key={i} className="padding-bottom-16"> + <Button + className="secondary-alt-large text-align-left" + action={() => onSelect({text, pageid})} + > + {text} + </Button> + </div> + ))} + </> + ) +} const SplashScreen = ({ questions, @@ -202,7 +207,6 @@ type ChatbotProps = { export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const [followups, setFollowups] = useState<Followup[]>() - // FIXME: Generate session id const [sessionId] = useState(crypto.randomUUID()) const [history, setHistory] = useState([] as Entry[]) const [controller, setController] = useState(() => new AbortController()) @@ -224,7 +228,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { // check proper insertion of pool questions // question.relatedQuestions = question.relatedQuestions.slice(0,2); setFollowups( - [...(question.relatedQuestions || []), ...poolQuestions.sort(() => Math.random() - 0.5)] + (question.relatedQuestions || []) .slice(0, 3) .map(({title, pageid}) => ({text: title, pageid})) ) From 423eb8ce059f5a48d40ab1eb9262224de903823f Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 4 Jun 2024 17:01:03 -0400 Subject: [PATCH 081/132] var added --- app/components/Chatbot/widgit.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 2844a24c..468d9f46 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -21,7 +21,7 @@ } .widget-ask.fixed { position: fixed; - bottom: 50px; + bottom: var(--spacing-48); } .right-icon { From 01e52fdedf01e0086ecf48142dd6dce3d9e41bef Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Tue, 4 Jun 2024 18:34:33 -0400 Subject: [PATCH 082/132] adjustments in part of clamp value for grid --- app/root.css | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/root.css b/app/root.css index f9e5f61e..945ea509 100644 --- a/app/root.css +++ b/app/root.css @@ -326,47 +326,47 @@ h2 { /* note I may change these to vars later */ .col-1 { - width: clamp(0px, 3.07vw, 53px); + width: clamp(0px, 3.54vw, 53px); } .col-2 { - width: clamp(0px, 8.54vw, 171px); + width: clamp(0px, 9.93vw, 171px); } .col-3 { - width: clamp(0px, 15vw, 288px); + width: clamp(0px, 16.25vw, 288px); } .col-4 { - width: clamp(0px, 21.46vw, 405px); + width: clamp(0px, 22.57vw, 405px); } .col-5 { - width: clamp(0px, 27.99vw, 523px); + width: clamp(0px, 28.96vw, 523px); } .col-6 { - width: clamp(0px, 34.44vw, 640px); + width: clamp(0px, 35.28vw, 640px); } .col-7 { - width: clamp(0px, 40.9vw, 757px); + width: clamp(0px, 41.60vw, 757px); } .col-8 { - width: clamp(0px, 47.43vw, 875px); + width: clamp(0px, 47.99vw, 875px); } .col-9 { - width: clamp(0px, 53.89vw, 992px); + width: clamp(0px, 54.31vw, 992px); } .col-10 { - width: clamp(0px, 60.35vw, 1109px); + width: clamp(0px, 60.62vw, 1109px); } .col-11 { - width: clamp(0px, 66.88vw, 1227px); + width: clamp(0px, 67.01vw, 1227px); } .col-12 { From 4d95106b416ea9483f4966a5f3172c6f5cc83897 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 4 Jun 2024 21:05:40 -0400 Subject: [PATCH 083/132] typo --- app/components/Chatbot/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 29b8ab03..b0d0b307 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -86,7 +86,7 @@ const QuestionInput = ({ ) : undefined} <div className="flex-container"> <Input - placeHolder={placeholder} + placeholder={placeholder} className={'large full-width ' + (fixed ? '' : 'shadow')} value={question} onChange={(e) => handleChange(e.target.value)} From 5c25327e4b3deae4d9fd44184983f516991d098b Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 4 Jun 2024 21:07:42 -0400 Subject: [PATCH 084/132] linting error --- app/components/Chatbot/widgit.css | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index c09c7a5f..ff56fffb 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -18,7 +18,6 @@ .widget-ask { position: relative; - } .widget-ask.fixed { position: fixed; From e29ec52633e0fd69aee48325b2da7d03bb787541 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 5 Jun 2024 20:11:03 +0200 Subject: [PATCH 085/132] references on mobile --- app/components/Article/Contents.tsx | 38 ++++++++++++++++++++------ app/components/Article/article.css | 42 ++++++++++++++++++++--------- app/root.css | 4 +++ 3 files changed, 64 insertions(+), 20 deletions(-) diff --git a/app/components/Article/Contents.tsx b/app/components/Article/Contents.tsx index a5416339..744e93ee 100644 --- a/app/components/Article/Contents.tsx +++ b/app/components/Article/Contents.tsx @@ -1,4 +1,5 @@ import {useRef, useEffect} from 'react' +import useIsMobile from '~/hooks/isMobile' import {questionUrl} from '~/routesMapper' import type {Glossary, PageId, GlossaryEntry} from '~/server-utils/stampy' @@ -18,7 +19,14 @@ const footnoteHTML = (el: HTMLDivElement, e: HTMLAnchorElement): string | null = return elem.innerHTML } -const addPopup = (e: HTMLElement, id: string, contents: string): HTMLElement => { +const scrollToElement = (e: HTMLElement, offset?: number) => { + const elementPosition = e.getBoundingClientRect().top + window.pageYOffset + const offsetPosition = elementPosition - (offset || 0) + + window.scrollTo({top: offsetPosition, behavior: 'smooth'}) +} + +const addPopup = (e: HTMLElement, id: string, contents: string, mobile?: boolean): HTMLElement => { const preexisting = document.getElementById(id) if (preexisting) return preexisting @@ -29,10 +37,21 @@ const addPopup = (e: HTMLElement, id: string, contents: string): HTMLElement => e.insertAdjacentElement('afterend', popup) - e.addEventListener('mouseover', () => popup.classList.add('shown')) - e.addEventListener('mouseout', () => popup.classList.remove('shown')) - popup.addEventListener('mouseover', () => popup.classList.add('shown')) - popup.addEventListener('mouseout', () => popup.classList.remove('shown')) + if (!mobile) { + e.addEventListener('mouseover', () => popup.classList.add('shown')) + e.addEventListener('mouseout', () => popup.classList.remove('shown')) + popup.addEventListener('mouseover', () => popup.classList.add('shown')) + popup.addEventListener('mouseout', () => popup.classList.remove('shown')) + } else { + const togglePopup = (event: Event) => { + event.preventDefault() + popup.classList.toggle('shown') + document.body.classList.toggle('noscroll') + scrollToElement(e, 16) + } + popup.addEventListener('click', togglePopup) + e.addEventListener('click', togglePopup) + } return popup } @@ -139,6 +158,7 @@ const insertGlossary = (pageid: string, glossary: Glossary) => { const Contents = ({pageid, html, glossary}: {pageid: PageId; html: string; glossary: Glossary}) => { const elementRef = useRef<HTMLDivElement>(null) + const mobile = useIsMobile() useEffect(() => { const el = elementRef.current @@ -161,14 +181,16 @@ const Contents = ({pageid, html, glossary}: {pageid: PageId; html: string; gloss el.querySelectorAll('.footnote-ref > a').forEach((e) => { const footnote = footnoteHTML(el, e as HTMLAnchorElement) const footnoteId = (e.getAttribute('href') || '').replace('#', '') - if (footnote) + if (footnote) { addPopup( e as HTMLAnchorElement, `footnote-${footnoteId}`, - `<div class="footnote">${footnote}</div>` + `<div class="footnote">${footnote}</div>`, + mobile ) + } }) - }, [html, glossary, pageid]) + }, [html, glossary, pageid, mobile]) return ( <div diff --git a/app/components/Article/article.css b/app/components/Article/article.css index f068b541..a6df4a19 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -91,20 +91,9 @@ article .glossary-entry { article .link-popup { visibility: hidden; opacity: 0; - position: absolute; - max-width: 400px; - display: inline-block; - font: var(--baseFont); - font-style: normal; - font-weight: 300; - line-height: 170%; /* 30.6px */ z-index: 2; - left: calc(50% - 200px); - transform: translateY(var(--spacing-40)); - transition: - visibility 0s 300ms, - opacity cubic-bezier(1, 0, 1, 1) 300ms; } + article .link-popup .footnote { padding: var(--spacing-24) var(--spacing-24) 0 var(--spacing-24); } @@ -187,6 +176,20 @@ article .banner h3 .title { padding-left: 10px; } +@media (min-width: 780px) { + article .link-popup { + position: absolute; + max-width: 400px; + display: inline-block; + z-index: 2; + left: calc(50% - 200px); + transform: translateY(var(--spacing-40)); + transition: + visibility 0s 300ms, + opacity cubic-bezier(1, 0, 1, 1) 300ms; + } +} + @media only screen and (max-width: 780px) { article { max-width: 100%; @@ -202,4 +205,19 @@ article .banner h3 .title { article { margin: 0; } + + article .link-popup { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: #ff000033; + overflow: scroll; + } + article .link-popup .footnote { + margin: auto; + background-color: white; + width: 80%; + } } diff --git a/app/root.css b/app/root.css index 78208c32..526a3f33 100644 --- a/app/root.css +++ b/app/root.css @@ -462,6 +462,10 @@ svg { transition-delay: 0s; } +.noscroll { + overflow: hidden; +} + /* for troubleshooting */ .pink { From 886cbe117fd787c2de77d909f4593d8dea3a8c62 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 5 Jun 2024 20:37:58 +0200 Subject: [PATCH 086/132] add full stop --- app/components/Chatbot/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index f6c718f2..573841b5 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -189,7 +189,7 @@ const SplashScreen = ({ <IconStampyLarge /> <div className="col-6 padding-bottom-40 padding-top-40"> <h2 className="teal-500">Hi there, I'm Stampy.</h2> - <h2>I can answer your questions about AI Safety</h2> + <h2>I can answer your questions about AI Safety.</h2> </div> <Followups title="Not sure where to start? Try these:" From 929486ba3e66b1451016c0d445eaa814ec96933c Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Wed, 5 Jun 2024 15:05:29 -0400 Subject: [PATCH 087/132] Replaced shadowed class --- app/components/Chatbot/index.tsx | 2 +- app/components/Input/input.css | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index b0d0b307..98dc0391 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -87,7 +87,7 @@ const QuestionInput = ({ <div className="flex-container"> <Input placeholder={placeholder} - className={'large full-width ' + (fixed ? '' : 'shadow')} + className={'large full-width ' + (fixed ? '' : 'shadowed')} value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { diff --git a/app/components/Input/input.css b/app/components/Input/input.css index 02d08013..a429dd9b 100644 --- a/app/components/Input/input.css +++ b/app/components/Input/input.css @@ -29,10 +29,6 @@ letter-spacing: -0.18px; } -.input.shadow { - box-shadow: 0px 16px 40px 0px rgba(175, 183, 194, 0.2); -} - /* states */ .input:hover { From 195edbdd4c5aecbe2a3455d1da7f26cd6d575186 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Wed, 5 Jun 2024 17:08:41 -0400 Subject: [PATCH 088/132] Updated grid --- app/root.css | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/root.css b/app/root.css index 945ea509..8b0e8fa0 100644 --- a/app/root.css +++ b/app/root.css @@ -326,51 +326,51 @@ h2 { /* note I may change these to vars later */ .col-1 { - width: clamp(0px, 3.54vw, 53px); + width: clamp(38px, 3.54vw, 57px); } .col-2 { - width: clamp(0px, 9.93vw, 171px); + width: clamp(106px, 9.93vw, 160px); } .col-3 { - width: clamp(0px, 16.25vw, 288px); + width: clamp(173px, 16.25vw, 261px); } .col-4 { - width: clamp(0px, 22.57vw, 405px); + width: clamp(240px, 22.57vw, 363px); } .col-5 { - width: clamp(0px, 28.96vw, 523px); + width: clamp(308px, 28.96vw, 466px); } .col-6 { - width: clamp(0px, 35.28vw, 640px); + width: clamp(375px, 35.28vw, 567px); } .col-7 { - width: clamp(0px, 41.60vw, 757px); + width: clamp(443px, 41.60vw, 669px); } .col-8 { - width: clamp(0px, 47.99vw, 875px); + width: clamp(511px, 47.99vw, 772px); } .col-9 { - width: clamp(0px, 54.31vw, 992px); + width: clamp(578px, 54.31vw, 873px); } .col-10 { - width: clamp(0px, 60.62vw, 1109px); + width: clamp(645px, 60.62vw, 975px); } .col-11 { - width: clamp(0px, 67.01vw, 1227px); + width: clamp(713px, 67.01vw, 1078px); } .col-12 { - width: clamp(0px, 73.33vw, 1344px); + width: clamp(780px, 73.33vw, 1179px); } .full-width { From 498e06d39f5ee34db20f782f98f176c9fbafec7c Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Wed, 5 Jun 2024 17:10:27 -0400 Subject: [PATCH 089/132] linted --- app/root.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/root.css b/app/root.css index 8b0e8fa0..2d00952a 100644 --- a/app/root.css +++ b/app/root.css @@ -350,7 +350,7 @@ h2 { } .col-7 { - width: clamp(443px, 41.60vw, 669px); + width: clamp(443px, 41.6vw, 669px); } .col-8 { From 11234204cc1567d12a255fe49fcebc28e4d9bf25 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Wed, 5 Jun 2024 17:14:11 -0400 Subject: [PATCH 090/132] formatting chat messages, typo fix --- app/components/Button/button.css | 2 +- app/components/Chatbot/ChatEntry.tsx | 15 ++++++++------- app/components/Chatbot/chat_entry.css | 10 ++++++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 87d5c020..bb87aa9a 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -172,7 +172,7 @@ } .active { - background-color: var(----colors-teal-50); + background-color: var(--colors-teal-50); } .inactive:hover { diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 10717c1e..5f2b010d 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -143,21 +143,22 @@ const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) citations.push(v) }) citations.sort((a, b) => a.index - b.index) + const phaseMessageClass = 'phase-message large-reading' const PhaseState = () => { switch (phase) { case 'started': - return <p>Loading: Sending query...</p> + return <p className={phaseMessageClass}>Loading: Sending query...</p> case 'semantic': - return <p>Loading: Performing semantic search...</p> + return <p className={phaseMessageClass}>Loading: Performing semantic search...</p> case 'history': - return <p>Loading: Processing history...</p> + return <p className={phaseMessageClass}>Loading: Processing history...</p> case 'context': - return <p>Loading: Creating context...</p> + return <p className={phaseMessageClass}>Loading: Creating context...</p> case 'prompt': - return <p>Loading: Creating prompt...</p> + return <p className={phaseMessageClass}>Loading: Creating prompt...</p> case 'llm': - return <p>Loading: Waiting for LLM...</p> + return <p className={phaseMessageClass}>Loading: Waiting for LLM...</p> case 'streaming': case 'followups': default: @@ -211,7 +212,7 @@ const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) ]} /> ) : undefined} - {phase === 'followups' ? <p>Checking for followups...</p> : undefined} + {phase === 'followups' ? <p className="followups">Checking for followups...</p> : undefined} </div> ) } diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 7002314f..41fc30d0 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -13,6 +13,16 @@ article.stampy { align-items: center; } +.phase-message { + margin-left: 57px; + color: var(--colors-cool-grey-600); +} + +.followups { + margin-top: var(--spacing-4); + color: var(--colors-cool-grey-600); +} + .chat-entry .info { display: flex; gap: var(--spacing-8); From deb1b56c2526f7887cada5256ed4481619823b8c Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Wed, 5 Jun 2024 17:26:54 -0400 Subject: [PATCH 091/132] Update root.css --- app/root.css | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/app/root.css b/app/root.css index 526a3f33..1a12d368 100644 --- a/app/root.css +++ b/app/root.css @@ -28,22 +28,26 @@ --colors-green-500: #40c075; - /* spacing */ + /* spacing - user everywhere for padding and margin */ --border-radius: 4px; --spacing-4: 4px; --spacing-8: 8px; --spacing-12: 12px; --spacing-16: 16px; - --spacing-24: clamp(16px, 2.6vw, 24px); - --spacing-32: clamp(24px, 3.4vw, 32px); - --spacing-40: clamp(24px, 4.2vw, 40px); - --spacing-48: clamp(24px, 5vw, 48px); - --spacing-56: clamp(24px, 6vw, 56px); - --spacing-80: clamp(40px, 7.4vw, 80px); - --spacing-104: clamp(56px, 10.6vw, 104px); - --spacing-128: clamp(56px, 13.8vw, 128px); - --spacing-192: clamp(80px, 17vw, 192px); + --spacing-24: clamp(16px, 1.67vw, 24px); + --spacing-32: clamp(24px, 2.22vw, 32px); + --spacing-40: clamp(24px, 2.78vw, 40px); + --spacing-48: clamp(24px, 3.33vw, 48px); + --spacing-56: clamp(24px, 3.89vw, 56px); + --spacing-80: clamp(40px, 5.56vw, 80px); + --spacing-104: clamp(56px, 7.22vw, 104px); + --spacing-128: clamp(56px, 8.89vw, 128px); + --spacing-192: clamp(80px, 13.33vw, 192px); --spacing-288: clamp(128px, 20vw, 288px); + + /* height */ + --height-48: 48px; + --height-64: 64px; } /* CSS Reset */ From 8e6e557e511233b69b8970d735556542cedd8ed3 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Wed, 5 Jun 2024 21:58:44 -0400 Subject: [PATCH 092/132] in progress --- app/components/Chatbot/ChatEntry.tsx | 2 +- app/components/Chatbot/chat_entry.css | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 10717c1e..0a8162e9 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -33,7 +33,7 @@ const AnswerInfo = ({ {answerType === 'human' ? 'Human-written' : 'Bot-generated'} response </span> <QuestionMarkIcon className="hint" /> - <div className="hint-contents bordered">{hint}</div> + <div className="hint-contents bordered xs">{hint}</div> </span> ) } diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 7002314f..3613b089 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -14,6 +14,7 @@ article.stampy { } .chat-entry .info { + position: relative; display: flex; gap: var(--spacing-8); align-items: center; @@ -21,17 +22,19 @@ article.stampy { .chat-entry .hint-contents { position: absolute; - transform: translateY(var(--spacing-24)); + top: -10px; + right: 0; + transform: translateX(-50%); visibility: hidden; width: 256px; + background: var(--colors-cool-grey-800); + color: white; + padding: var(--spacing-16); } .chat-entry .hint-contents:hover, .chat-entry .hint:hover + .hint-contents { visibility: visible; - background: var(--colors-cool-grey-800); - color: white; - padding: var(--spacing-16); } .chat-entry .reference-link { From 2b83ed01c2b47966f09be5a0711630681977ddfb Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Wed, 5 Jun 2024 21:59:56 -0400 Subject: [PATCH 093/132] styling fixes for reference hover (WIP) --- app/components/Chatbot/ChatEntry.tsx | 6 +++--- app/components/Chatbot/chat_entry.css | 3 ++- app/components/Chatbot/widgit.css | 1 - app/root.css | 17 +++++++++++++++++ 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 10717c1e..a244ca1a 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -84,7 +84,7 @@ const ReferenceSummary = ({title, authors, source, url}: Citation & {titleClass? return ( <div> - <div className="title padding-bottom-4">{title}</div> + <div className="large-bold black padding-bottom-8">{title}</div> <div className="small"> <Authors authors={authors} /> <span>{' · '}</span> @@ -104,8 +104,8 @@ const ReferencePopup = (citation: Citation) => { return ( <div className="reference-contents bordered"> <ReferenceSummary {...citation} titleClass="large-bold" /> - <div className="grey padding-bottom-16 padding-top-24">Referenced excerpt</div> - <div + <div className="grey padding-bottom-16 padding-top-32 xs">Referenced excerpt</div> + <div className="default" dangerouslySetInnerHTML={{ __html: md.render(parsed[1]), }} diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 7002314f..85a0409b 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -122,10 +122,11 @@ article.stampy { word-wrap: break-word; background-color: white; border: 1px solid var(--colors-cool-grey-200, #dfe3e9); - padding: var(--spacing-24) var(--spacing-32); + padding: var(--spacing-40); position: absolute; transform: translateX(50%); text-decoration: unset; + z-index: 3; } .reference-contents:hover, diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index e492a936..e6fdadad 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -26,7 +26,6 @@ .warning-floating { position: fixed; right: 4.44vw; - z-index: 100; bottom: 4.44vw; width: 10.13vw; } diff --git a/app/root.css b/app/root.css index 2d00952a..2b481217 100644 --- a/app/root.css +++ b/app/root.css @@ -382,6 +382,23 @@ h2 { min-height: 100%; } +/* z-index classes */ +.z-index-1 { + z-index: 1; +} + +.z-index-2 { + z-index: 2; +} + +.z-index-3 { + z-index: 3; +} + +.z-index-4 { + z-index: 4; +} + /* other tags */ a { From acce4ba840fa14a8be7bbd03bd91ffdf91cd2148 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Wed, 5 Jun 2024 22:01:23 -0400 Subject: [PATCH 094/132] lint --- app/components/Chatbot/ChatEntry.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index a244ca1a..eb63aa2f 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -105,7 +105,8 @@ const ReferencePopup = (citation: Citation) => { <div className="reference-contents bordered"> <ReferenceSummary {...citation} titleClass="large-bold" /> <div className="grey padding-bottom-16 padding-top-32 xs">Referenced excerpt</div> - <div className="default" + <div + className="default" dangerouslySetInnerHTML={{ __html: md.render(parsed[1]), }} From d7bb60e48ab6fe720b83e18f102e293622da7cd6 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Wed, 5 Jun 2024 22:38:27 -0400 Subject: [PATCH 095/132] vars for days, melissa feedback incorporated --- app/components/Button/button.css | 8 +++----- app/components/Button/index.tsx | 6 +++--- app/components/Chatbot/chat_entry.css | 2 +- app/components/Chatbot/index.tsx | 2 +- app/components/Chatbot/widgit.css | 2 +- app/root.css | 2 +- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index bb87aa9a..b44d9267 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -27,6 +27,7 @@ border-width: 0; line-height: 0; background: inherit; + cursor: pointer; } /* style */ @@ -181,7 +182,6 @@ /* #### Composite button #### */ .composite-button { - box-shadow: 0px var(--spacing-16) var(--spacing-40) 0px rgba(175, 183, 194, 0.2); cursor: pointer; } @@ -255,13 +255,11 @@ left: 50%; transform: translateX(-50%); background-color: #1b2b3e; - font-size: 14px; color: #f2f2f2; - padding: 5px 15px; - border-radius: var(--spacing-8); + padding: var(--spacing-8) var(--spacing-16); + border-radius: var(--border-radius); white-space: nowrap; pointer-events: none; - line-height: var(--spacing-32); } .button.full-width { diff --git a/app/components/Button/index.tsx b/app/components/Button/index.tsx index c1e4b2c2..c578dfcd 100644 --- a/app/components/Button/index.tsx +++ b/app/components/Button/index.tsx @@ -43,7 +43,7 @@ const Button = ({ {...props} > {children} - {secondary && tooltip && !disabled && <p className="tool-tip-secondary">{tooltip}</p>} + {secondary && tooltip && !disabled && <p className="tool-tip-secondary xs">{tooltip}</p>} </Link> ) } @@ -56,7 +56,7 @@ const Button = ({ {...props} > {children} - {secondary && tooltip && !disabled && <p className="tool-tip-secondary">{tooltip}</p>} + {secondary && tooltip && !disabled && <p className="tool-tip-secondary xs">{tooltip}</p>} </button> ) } @@ -68,7 +68,7 @@ export interface CompositeButtonProps { } export const CompositeButton = ({children, className = '', secondary}: CompositeButtonProps) => ( <div - className={`${(secondary ? 'composite-button-secondary' : 'composite-button') + ' ' + className}`} + className={`shadowed ${(secondary ? 'composite-button-secondary' : 'composite-button') + ' ' + className}`} > {children} </div> diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 41fc30d0..83a123ed 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -19,7 +19,7 @@ article.stampy { } .followups { - margin-top: var(--spacing-4); + margin-top: var(--spacing-16); color: var(--colors-cool-grey-600); } diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 5b909a23..73f94df6 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -87,7 +87,7 @@ const QuestionInput = ({ <div className="flex-container"> <Input placeholder={placeholder} - className={'large full-width ' + (fixed ? '' : 'shadowed')} + className="large full-width shadowed" value={question} onChange={(e) => handleChange(e.target.value)} onKeyDown={(e) => { diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index ff56fffb..8deb1b6c 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -77,6 +77,6 @@ width: calc(100% + 2000px); height: 100px; top: 100%; - z-index: 1000; + z-index: -1; background: #ffffff; } diff --git a/app/root.css b/app/root.css index 526a3f33..f995deb3 100644 --- a/app/root.css +++ b/app/root.css @@ -29,7 +29,7 @@ --colors-green-500: #40c075; /* spacing */ - --border-radius: 4px; + --border-radius: 6px; --spacing-4: 4px; --spacing-8: 8px; --spacing-12: 12px; From 38587806df1426b78b4dba0bf36e711eff4aae04 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Wed, 5 Jun 2024 22:43:53 -0400 Subject: [PATCH 096/132] lint --- app/root.css | 1 - 1 file changed, 1 deletion(-) diff --git a/app/root.css b/app/root.css index 474a0047..c0f112ff 100644 --- a/app/root.css +++ b/app/root.css @@ -28,7 +28,6 @@ --colors-green-500: #40c075; - /* spacing - user everywhere for padding and margin */ --border-radius: 6px; --spacing-4: 4px; From 1a6b91b8f1d7e4ccdc4854e19665b55a87394d84 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Thu, 6 Jun 2024 10:54:59 -0400 Subject: [PATCH 097/132] Made hint look very nice --- app/components/Chatbot/ChatEntry.tsx | 8 ++++++-- app/components/Chatbot/chat_entry.css | 22 ++++++++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 0a8162e9..3e783ca9 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -32,8 +32,12 @@ const AnswerInfo = ({ <span className="small grey"> {answerType === 'human' ? 'Human-written' : 'Bot-generated'} response </span> - <QuestionMarkIcon className="hint" /> - <div className="hint-contents bordered xs">{hint}</div> + <div className="icon-container leading-0"> + <QuestionMarkIcon className="hint" /> + <div className="hint-contents-container"> + <div className="hint-contents xs">{hint}</div> + </div> + </div> </span> ) } diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 3613b089..03391890 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -20,20 +20,30 @@ article.stampy { align-items: center; } -.chat-entry .hint-contents { +.chat-entry .icon-container { + position: relative; +} + +.chat-entry .hint-contents-container { position: absolute; - top: -10px; + top: 0; right: 0; - transform: translateX(-50%); + transform: translateX(50%); visibility: hidden; width: 256px; - background: var(--colors-cool-grey-800); + padding-top: 120%; + z-index: 100; +} + +.chat-entry .hint-contents { + background: var(--colors-cool-grey-900); color: white; padding: var(--spacing-16); + border-radius: var(--border-radius); } -.chat-entry .hint-contents:hover, -.chat-entry .hint:hover + .hint-contents { +.chat-entry .hint-contents-container:hover, +.chat-entry .hint:hover + .hint-contents-container { visibility: visible; } From e42d18b8cb78f372afa72570b374ec53cfb31c30 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Thu, 6 Jun 2024 14:30:56 -0400 Subject: [PATCH 098/132] article spacing fixed --- app/components/Article/Contents.tsx | 14 ++++++++++++-- app/components/Article/index.tsx | 7 ++++++- app/components/Chatbot/chat_entry.css | 4 ++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/app/components/Article/Contents.tsx b/app/components/Article/Contents.tsx index 744e93ee..4e47dff2 100644 --- a/app/components/Article/Contents.tsx +++ b/app/components/Article/Contents.tsx @@ -156,7 +156,17 @@ const insertGlossary = (pageid: string, glossary: Glossary) => { } } -const Contents = ({pageid, html, glossary}: {pageid: PageId; html: string; glossary: Glossary}) => { +const Contents = ({ + pageid, + html, + glossary, + className = '', +}: { + pageid: PageId + html: string + glossary: Glossary + className?: string +}) => { const elementRef = useRef<HTMLDivElement>(null) const mobile = useIsMobile() @@ -194,7 +204,7 @@ const Contents = ({pageid, html, glossary}: {pageid: PageId; html: string; gloss return ( <div - className="contents large-reading padding-bottom-80" + className={`contents large-reading ${className}`} dangerouslySetInnerHTML={{ __html: html, }} diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index 326df6b4..ec051960 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -148,7 +148,12 @@ export const Article = ({question, glossary, className}: ArticleProps) => { {question.banners?.filter((b) => b.title).map(Banner)} <ArticleMeta question={question} className="padding-bottom-56" /> - <Contents pageid={pageid} html={text || ''} glossary={glossary || {}} /> + <Contents + className="padding-bottom-80" + pageid={pageid} + html={text || ''} + glossary={glossary || {}} + /> <KeepGoing {...question} /> diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 03391890..587123b6 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -47,6 +47,10 @@ article.stampy { visibility: visible; } +.chat-entry .footnotes { + padding-top: var(--spacing-32); +} + .chat-entry .reference-link { font-size: 12px; line-height: 12px; From e5cb5675426704f2b31cae1bb8c00460a03e7274 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Thu, 6 Jun 2024 23:02:05 -0400 Subject: [PATCH 099/132] ignore feedback --- app/routes/questions.actions.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/app/routes/questions.actions.tsx b/app/routes/questions.actions.tsx index f50425a1..040625ae 100644 --- a/app/routes/questions.actions.tsx +++ b/app/routes/questions.actions.tsx @@ -150,6 +150,7 @@ export const Action = ({ onClick() } setActionTaken(!actionTaken) + if (pageid === 'chatbot') return // This sort of cheats - if more than 1 request is sent per second (or some other such time // period), one of them will be (sort of) picked at random. This should be ok in the long run. From 4f9e2d93d0d434601b3844c747ab967667632464 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Fri, 7 Jun 2024 11:52:11 -0400 Subject: [PATCH 100/132] reference hover bellow --- app/components/Chatbot/ChatEntry.tsx | 6 +++--- app/components/Chatbot/chat_entry.css | 20 ++++++++++++++++++-- app/components/Chatbot/index.tsx | 5 ++++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 6fe4f32e..825cb573 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -106,7 +106,7 @@ const ReferencePopup = (citation: Citation) => { const parsed = citation.text?.match(/^###.*?###\s+"""(.*?)"""$/ms) if (!parsed) return undefined return ( - <div className="reference-contents bordered"> + <div className="reference-contents bordered z-index-2"> <ReferenceSummary {...citation} titleClass="large-bold" /> <div className="grey padding-bottom-16 padding-top-32 xs">Referenced excerpt</div> <div @@ -124,12 +124,12 @@ const ReferenceLink = (citation: Citation) => { if (!index || index > MAX_REFERENCES) return '' return ( - <> + <span className="ref-container"> <Link id={`${id}-ref`} to={`#${id}`} className={`reference-link ref-${index}`}> <span>{index}</span> </Link> <ReferencePopup {...citation} /> - </> + </span> ) } diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index ca01b0d2..b6a003c7 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -75,6 +75,9 @@ article.stampy { display: inline-block; text-align: center; } +.ref-container { + position: relative; +} .ref-1 { background: #dbffed; @@ -145,15 +148,28 @@ article.stampy { .reference-contents { visibility: hidden; transition: visibility 0.2s; - max-width: 600px; + width: 512px; + height: 509px; word-wrap: break-word; + overflow: hidden; background-color: white; border: 1px solid var(--colors-cool-grey-200, #dfe3e9); padding: var(--spacing-40); position: absolute; transform: translateX(50%); text-decoration: unset; - z-index: 3; + right: 0px; + top: 40px; + + &::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: var(--spacing-40); + background-color: white; + } } .reference-contents:hover, diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 73f94df6..2261a790 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -78,7 +78,10 @@ const QuestionInput = ({ } return ( - <div className={'widget-ask ' + (fixed ? 'fixed col-10' : 'col-9')} ref={clickDetectorRef}> + <div + className={'widget-ask ' + (fixed ? 'fixed col-10 z-index-4' : 'col-9')} + ref={clickDetectorRef} + > {results.length > 0 ? ( <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> <p className="default">{results[0].title}</p> From 53c28eeed89c4614008ef8aff8885f220ff89643 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Fri, 7 Jun 2024 12:04:37 -0400 Subject: [PATCH 101/132] updated height --- app/components/Chatbot/ChatEntry.tsx | 2 +- app/components/Chatbot/chat_entry.css | 16 ++++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 825cb573..5a6a3af2 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -110,7 +110,7 @@ const ReferencePopup = (citation: Citation) => { <ReferenceSummary {...citation} titleClass="large-bold" /> <div className="grey padding-bottom-16 padding-top-32 xs">Referenced excerpt</div> <div - className="default" + className="default inner-html" dangerouslySetInnerHTML={{ __html: md.render(parsed[1]), }} diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index b6a003c7..f6a8ef75 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -149,9 +149,7 @@ article.stampy { visibility: hidden; transition: visibility 0.2s; width: 512px; - height: 509px; word-wrap: break-word; - overflow: hidden; background-color: white; border: 1px solid var(--colors-cool-grey-200, #dfe3e9); padding: var(--spacing-40); @@ -160,16 +158,10 @@ article.stampy { text-decoration: unset; right: 0px; top: 40px; - - &::after { - content: ''; - position: absolute; - bottom: 0; - left: 0; - width: 100%; - height: var(--spacing-40); - background-color: white; - } +} +.reference-contents .inner-html { + height: 275px; + overflow: hidden; } .reference-contents:hover, From 61d84dbc02f44cb66d2fb582961e82971ae6bd51 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Fri, 7 Jun 2024 15:23:37 -0400 Subject: [PATCH 102/132] Revert "Updated grid" This reverts commit 195edbdd4c5aecbe2a3455d1da7f26cd6d575186. --- app/root.css | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/root.css b/app/root.css index 3323caaf..209b275f 100644 --- a/app/root.css +++ b/app/root.css @@ -333,51 +333,51 @@ h2 { /* note I may change these to vars later */ .col-1 { - width: clamp(38px, 3.54vw, 57px); + width: clamp(0px, 3.54vw, 53px); } .col-2 { - width: clamp(106px, 9.93vw, 160px); + width: clamp(0px, 9.93vw, 171px); } .col-3 { - width: clamp(173px, 16.25vw, 261px); + width: clamp(0px, 16.25vw, 288px); } .col-4 { - width: clamp(240px, 22.57vw, 363px); + width: clamp(0px, 22.57vw, 405px); } .col-5 { - width: clamp(308px, 28.96vw, 466px); + width: clamp(0px, 28.96vw, 523px); } .col-6 { - width: clamp(375px, 35.28vw, 567px); + width: clamp(0px, 35.28vw, 640px); } .col-7 { - width: clamp(443px, 41.6vw, 669px); + width: clamp(0px, 41.6vw, 757px); } .col-8 { - width: clamp(511px, 47.99vw, 772px); + width: clamp(0px, 47.99vw, 875px); } .col-9 { - width: clamp(578px, 54.31vw, 873px); + width: clamp(0px, 54.31vw, 992px); } .col-10 { - width: clamp(645px, 60.62vw, 975px); + width: clamp(0px, 60.62vw, 1109px); } .col-11 { - width: clamp(713px, 67.01vw, 1078px); + width: clamp(0px, 67.01vw, 1227px); } .col-12 { - width: clamp(780px, 73.33vw, 1179px); + width: clamp(0px, 73.33vw, 1344px); } .full-width { From 69b30e54318d81cef00e8a07cac9c685a3f63106 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Fri, 7 Jun 2024 19:18:12 -0400 Subject: [PATCH 103/132] self-explanatory --- app/components/Article/Contents.tsx | 2 +- app/components/Article/article.css | 23 +++++++++++++++++++++-- app/components/Chatbot/ChatEntry.tsx | 4 ++-- app/components/Chatbot/chat_entry.css | 3 ++- app/components/Chatbot/index.tsx | 2 +- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/app/components/Article/Contents.tsx b/app/components/Article/Contents.tsx index 4e47dff2..cba8c768 100644 --- a/app/components/Article/Contents.tsx +++ b/app/components/Article/Contents.tsx @@ -31,7 +31,7 @@ const addPopup = (e: HTMLElement, id: string, contents: string, mobile?: boolean if (preexisting) return preexisting const popup = document.createElement('div') - popup.className = 'link-popup bordered' + popup.className = 'link-popup bordered small' popup.innerHTML = contents popup.id = id diff --git a/app/components/Article/article.css b/app/components/Article/article.css index a6df4a19..ed5b1d8f 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -79,6 +79,18 @@ article .contents p { padding-bottom: var(--spacing-32); } +article .contents p:last-child { + padding-bottom: 0; +} + +article .contents li { + padding-bottom: var(--spacing-16); +} + +article .contents li:last-child { + padding-bottom: 0; +} + article .contents img { max-width: 100%; } @@ -91,11 +103,18 @@ article .glossary-entry { article .link-popup { visibility: hidden; opacity: 0; - z-index: 2; + z-index: 4; + position: absolute; + top: 0; + width: 512px; } article .link-popup .footnote { - padding: var(--spacing-24) var(--spacing-24) 0 var(--spacing-24); + padding: var(--spacing-32) var(--spacing-32) 0 var(--spacing-32); +} + +article .footnote-ref { + position: relative; } article .glossary-popup { diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 5a6a3af2..f98e8847 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -63,7 +63,7 @@ const UserQuery = ({content}: Entry) => ( </div> ) -const ReferenceSummary = ({title, authors, source, url}: Citation & {titleClass?: string}) => { +const ReferenceSummary = ({title, authors, source, url, titleClass}: Citation & {titleClass?: string}) => { const referenceSources = { arxiv: 'Scientific paper', blogs: 'Blogpost', @@ -88,7 +88,7 @@ const ReferenceSummary = ({title, authors, source, url}: Citation & {titleClass? return ( <div> - <div className="large-bold black padding-bottom-8">{title}</div> + <div className={`black padding-bottom-8 ${titleClass}`}>{title}</div> <div className="small"> <Authors authors={authors} /> <span>{' · '}</span> diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index f6a8ef75..1f1ddcb1 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -3,8 +3,9 @@ article.stampy { padding: var(--spacing-40); border-radius: var(--spacing-6); max-width: unset; - margin: var(--spacing-16); margin-left: var(--spacing-56); + margin-bottom: var(--spacing-24); + border-radius: var(--border-radius) } .chat-entry .title { diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 2261a790..47efb755 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -329,7 +329,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { <ChatEntry key={`chat-entry-${i}`} {...item} /> ))} - <div className="padding-bottom-192"> + <div className="padding-bottom-128"> {followups ? ( <Followups title="Continue the conversation" From d90f67f7704a799ca2aebccff2373b50e153ea52 Mon Sep 17 00:00:00 2001 From: Melissa Samworth <melissasamworth@gmail.com> Date: Fri, 7 Jun 2024 19:24:41 -0400 Subject: [PATCH 104/132] lint --- app/components/Chatbot/ChatEntry.tsx | 8 +++++++- app/components/Chatbot/chat_entry.css | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index f98e8847..596de5d7 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -63,7 +63,13 @@ const UserQuery = ({content}: Entry) => ( </div> ) -const ReferenceSummary = ({title, authors, source, url, titleClass}: Citation & {titleClass?: string}) => { +const ReferenceSummary = ({ + title, + authors, + source, + url, + titleClass, +}: Citation & {titleClass?: string}) => { const referenceSources = { arxiv: 'Scientific paper', blogs: 'Blogpost', diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 1f1ddcb1..8521394f 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -5,7 +5,7 @@ article.stampy { max-width: unset; margin-left: var(--spacing-56); margin-bottom: var(--spacing-24); - border-radius: var(--border-radius) + border-radius: var(--border-radius); } .chat-entry .title { From d2d631032c7c370f6aca137b5bee0e49fc92bbb5 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Fri, 7 Jun 2024 22:45:14 -0400 Subject: [PATCH 105/132] search by pageid instead of question --- app/components/Chatbot/index.tsx | 31 +++++++++++++++++++++++-------- app/routes/chat.tsx | 6 +++--- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 2261a790..35c2e830 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -51,6 +51,7 @@ type QuestionInputProps = { initial?: string onChange?: (val: string) => void onAsk?: (val: string) => void + onSuggestedAsk?: (followup: Followup) => void fixed?: boolean placeholder?: string } @@ -58,6 +59,7 @@ const QuestionInput = ({ initial, onChange, onAsk, + onSuggestedAsk, fixed, placeholder = 'Ask Stampy a question...', }: QuestionInputProps) => { @@ -71,6 +73,12 @@ const QuestionInput = ({ setQuestion('') } + const handleSuggestedAsk = (followUp: Followup) => { + clear() + onSuggestedAsk && onSuggestedAsk(followUp) + setQuestion('') + } + const handleChange = (val: string) => { search(val, 0.7) setQuestion(val) @@ -83,7 +91,10 @@ const QuestionInput = ({ ref={clickDetectorRef} > {results.length > 0 ? ( - <Button className="full-width suggestion" action={() => handleAsk(results[0].title)}> + <Button + className="full-width suggestion" + action={() => handleSuggestedAsk({text: results[0].title, pageid: results[0].pageid})} + > <p className="default">{results[0].title}</p> </Button> ) : undefined} @@ -184,10 +195,10 @@ const Followups = ({title, followups, onSelect, className}: FollowupsProps) => { const SplashScreen = ({ questions, - onQuestion, + onSelection, }: { - questions?: string[] - onQuestion: (v: string) => void + questions?: Followup[] + onSelection: (followup: Followup) => void }) => ( <div className="padding-top-40"> <IconStampyLarge /> @@ -197,15 +208,15 @@ const SplashScreen = ({ </div> <Followups title="Not sure where to start? Try these:" - followups={questions?.map((text: string) => ({text}))} - onSelect={({text}: Followup) => onQuestion(text)} + followups={questions} + onSelect={onSelection} /> </div> ) type ChatbotProps = { question?: string - questions?: string[] + questions?: Followup[] settings?: ChatSettings } export const Chatbot = ({question, questions, settings}: ChatbotProps) => { @@ -217,6 +228,9 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const fetcher = useFetcher({key: 'followup-fetcher'}) const {search, resultsForRef, waitForResults, loadedQuestions} = useSearch(1) + // When a page needs to be loaded fetcher.load(url) is called and then this + // effect takes care of filling in the content of the StampyArticle ChatEntry + // once it has been loaded. useEffect(() => { if (!fetcher.data || fetcher.state !== 'idle') return @@ -323,7 +337,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { return ( <div className="centered col-10 height-70"> {history.length === 0 ? ( - <SplashScreen questions={questions} onQuestion={onQuestion} /> + <SplashScreen questions={questions} onSelection={showFollowup} /> ) : undefined} {history.map((item, i) => ( <ChatEntry key={`chat-entry-${i}`} {...item} /> @@ -341,6 +355,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { <QuestionInput onAsk={onQuestion} + onSuggestedAsk={showFollowup} placeholder={history.length > 0 ? 'Message Stampy' : undefined} fixed /> diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index abe2e440..74635b76 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -38,9 +38,9 @@ export default function App() { <Chatbot question={question} questions={[ - 'What is AI Safety?', - 'How would the AI even get out in the world?', - 'Do people seriously worry about existential risk from AI?', + {text: 'What is AI Safety?', pageid: '8486'}, + {text: 'How would the AI even get out in the world?', pageid: '8222'}, + {text: 'Do people seriously worry about existential risk from AI?', pageid: '6953'}, ]} settings={chatSettings} /> From a60d4410429cae5009132f01a5479cc35d78ffd5 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Fri, 7 Jun 2024 22:56:53 -0400 Subject: [PATCH 106/132] rename symbol --- app/components/Chatbot/index.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 35c2e830..b3c4a84b 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -262,7 +262,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { ) }, [fetcher.data, fetcher.state]) - const showFollowup = async ({text, pageid}: Followup) => { + const showArticleByID = async ({text, pageid}: Followup) => { if (pageid) fetcher.load(questionUrl({pageid})) setHistory((prev) => [ ...prev, @@ -337,7 +337,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { return ( <div className="centered col-10 height-70"> {history.length === 0 ? ( - <SplashScreen questions={questions} onSelection={showFollowup} /> + <SplashScreen questions={questions} onSelection={showArticleByID} /> ) : undefined} {history.map((item, i) => ( <ChatEntry key={`chat-entry-${i}`} {...item} /> @@ -348,14 +348,14 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { <Followups title="Continue the conversation" followups={followups} - onSelect={showFollowup} + onSelect={showArticleByID} /> ) : undefined} </div> <QuestionInput onAsk={onQuestion} - onSuggestedAsk={showFollowup} + onSuggestedAsk={showArticleByID} placeholder={history.length > 0 ? 'Message Stampy' : undefined} fixed /> From 8502d4d79ecf89190963296afd2993f779578555 Mon Sep 17 00:00:00 2001 From: Peter Hozak <peter.hozak@gmail.com> Date: Sat, 8 Jun 2024 09:05:31 +0200 Subject: [PATCH 107/132] fix mobile footer space #705 --- app/components/Footer/footer.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/components/Footer/footer.css b/app/components/Footer/footer.css index 10aaf0a1..235c53b7 100644 --- a/app/components/Footer/footer.css +++ b/app/components/Footer/footer.css @@ -18,4 +18,10 @@ gap: 32px; margin-bottom: 0; } + + .col-5, + .col-4, + .col-3 { + width: 100%; + } } From b10dcdfe5db1d30056454d42659cf1fee1f45814 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Sat, 8 Jun 2024 01:19:32 +0200 Subject: [PATCH 108/132] clean up mobile nav --- app/components/ArticlesDropdown/dropdown.css | 1 - app/components/ArticlesDropdown/index.tsx | 100 ++++++------ app/components/Button/index.tsx | 6 +- app/components/Nav/Mobile/index.tsx | 160 ++++++++++--------- app/components/Nav/Mobile/navMobile.css | 109 ++++--------- app/components/SearchResults/Dropdown.tsx | 4 +- app/components/search.tsx | 5 +- app/root.css | 27 ++++ 8 files changed, 209 insertions(+), 203 deletions(-) diff --git a/app/components/ArticlesDropdown/dropdown.css b/app/components/ArticlesDropdown/dropdown.css index bb39a400..745f3af1 100644 --- a/app/components/ArticlesDropdown/dropdown.css +++ b/app/components/ArticlesDropdown/dropdown.css @@ -5,7 +5,6 @@ } .articles-dropdown-container { - z-index: 100; top: 80px; position: absolute; justify-content: space-between; diff --git a/app/components/ArticlesDropdown/index.tsx b/app/components/ArticlesDropdown/index.tsx index a98ba688..fb8d46b6 100644 --- a/app/components/ArticlesDropdown/index.tsx +++ b/app/components/ArticlesDropdown/index.tsx @@ -8,11 +8,50 @@ import Button from '~/components/Button' import './dropdown.css' import useIsMobile from '~/hooks/isMobile' +type LinkProps = { + to: string + text: string + pageid?: string + className?: string + onClick: () => void +} +const Link = ({to, text, pageid, className, onClick}: LinkProps) => ( + <div className={'articles-dropdown-entry ' + (className || '')}> + <LinkElem to={to} onClick={onClick} state={{section: pageid}}> + {text} + </LinkElem> + </div> +) + +type ArticlesSectionProps = { + category: Category + toc: TOCItem[] + className?: string + hide: () => void +} +const ArticlesSection = ({category, toc, className, hide}: ArticlesSectionProps) => ( + <div className={className || ''}> + <div className="default-bold">{category} sections</div> + {toc + .filter((item) => item.category === category) + .map((item: TOCItem) => ( + <Link + key={`${item.pageid}-${item.title}`} + to={questionUrl(item)} + text={item.title} + pageid={item.pageid} + onClick={hide} + /> + ))} + </div> +) + export type ArticlesDropdownProps = { toc: TOCItem[] categories: Tag[] + fullWidth?: boolean } -export const ArticlesDropdown = ({toc, categories}: ArticlesDropdownProps) => { +export const ArticlesDropdown = ({toc, categories, fullWidth}: ArticlesDropdownProps) => { // The dropdown works by using the onHover pseudoclass, so will only hide once // the mouse leaves it. When using client side changes, the mouse doesn't leave // it, so it's always shown (until the mouse is moved out, of course). To get around @@ -22,63 +61,26 @@ export const ArticlesDropdown = ({toc, categories}: ArticlesDropdownProps) => { const hide = () => setHidden(true) useEffect(() => setHidden(false), [hidden]) const mobile = useIsMobile() - const Link = ({ - to, - text, - pageid, - className, - }: { - to: string - text: string - pageid?: string - className?: string - }) => ( - <div className={'articles-dropdown-entry ' + (className || '')}> - <LinkElem to={to} onClick={hide} state={{section: pageid}}> - {text} - </LinkElem> - </div> - ) - - const ArticlesSection = ({ - category, - toc, - className, - }: { - category: Category - toc: TOCItem[] - className?: string - }) => ( - <div className={className || ''}> - <div className="default-bold">{category} sections</div> - {toc - .filter((item) => item.category === category) - .map((item: TOCItem) => ( - <Link - key={`${item.pageid}-${item.title}`} - to={questionUrl(item)} - text={item.title} - pageid={item.pageid} - /> - ))} - </div> - ) return hidden ? null : ( - <div className="articles-dropdown-container bordered col-8"> - <div className="col-5 toc"> + <div + className={`articles-dropdown-container bordered ${fullWidth ? 'full-width' : 'col-8'} z-index-4`} + > + <div className={(fullWidth ? '' : 'col-5 ') + 'toc'}> <ArticlesSection category={INTRODUCTORY} toc={toc} className={mobile ? 'padding-bottom-40' : 'padding-bottom-32'} + hide={hide} /> <ArticlesSection category={ADVANCED} toc={toc} className={mobile ? 'padding-bottom-40' : ''} + hide={hide} /> </div> - <div className="col-4"> + <div className={fullWidth ? '' : 'col-4'}> {/*sorted right side*/} <div className="default-bold">Browse by category</div> @@ -87,7 +89,13 @@ export const ArticlesDropdown = ({toc, categories}: ArticlesDropdownProps) => { ?.sort(sortFuncs['by number of questions']) .slice(0, 12) .map((tag) => ( - <Link key={tag.rowId} className="teal-500" to={tagUrl(tag)} text={tag.name} /> + <Link + key={tag.rowId} + className="teal-500" + to={tagUrl(tag)} + text={tag.name} + onClick={hide} + /> ))} </div> diff --git a/app/components/Button/index.tsx b/app/components/Button/index.tsx index c578dfcd..2183cfdd 100644 --- a/app/components/Button/index.tsx +++ b/app/components/Button/index.tsx @@ -26,6 +26,8 @@ const Button = ({ (secondary && 'button-secondary') || 'button', className, tooltip && !secondary && 'tooltip', + secondary && active && 'active', + secondary && !active && !disabled && 'inactive', ] .filter((i) => i) .join(' ') @@ -33,7 +35,7 @@ const Button = ({ return ( <Link to={action} - className={classes + ' ' + (secondary && (active ? 'active' : disabled ? '' : 'inactive'))} + className={classes} data-tooltip={tooltip} onClick={(e) => { if (disabled) { @@ -49,7 +51,7 @@ const Button = ({ } return ( <button - className={classes + ' ' + (secondary && (active ? 'active' : disabled ? '' : 'inactive'))} + className={classes} onClick={action} data-tooltip={tooltip} disabled={disabled} diff --git a/app/components/Nav/Mobile/index.tsx b/app/components/Nav/Mobile/index.tsx index 9465eada..c97e9d4e 100644 --- a/app/components/Nav/Mobile/index.tsx +++ b/app/components/Nav/Mobile/index.tsx @@ -1,9 +1,10 @@ -import React from 'react' +import {ElementType, useState} from 'react' import {Link} from '@remix-run/react' import AISafetyIcon from '~/components/icons-generated/Aisafety' -import {ListLarge} from '~/components/icons-generated' -import {XLarge} from '~/components/icons-generated' -import {CarrotLarge} from '~/components/icons-generated' +import ListLarge from '~/components/icons-generated/ListLarge' +import XLarge from '~/components/icons-generated/XLarge' +import CarrotLarge from '~/components/icons-generated/CarrotLarge' +import BotIcon from '~/components/icons-generated/Bot' import OpenBookIcon from '~/components/icons-generated/OpenBook' import MagnifyingLarge from '~/components/icons-generated/MagnifyingLarge' import {NavProps} from '~/components/Nav' @@ -12,80 +13,91 @@ import '../nav.css' import './navMobile.css' import ArticlesDropdown from '~/components/ArticlesDropdown' import Search from '~/components/search' -export const MobileNav = ({toc, categories}: NavProps) => { - const [showMenu, setShowMenu] = React.useState(false) - const [showSearch, setShowSearch] = React.useState(false) - const [showArticles, setShowArticles] = React.useState(false) - const toggleMenu = () => { - setShowMenu(false) - setShowArticles(false) - setShowSearch(false) - } - const toggleSearch = () => { - setShowSearch(!showSearch) - } - return ( - <header className={['top-header', showArticles || showMenu ? 'expanded' : ''].join(' ')}> - {!showArticles && ( - <> - <nav className="top-nav"> - {!showSearch && ( - <> - <Link to="/" className="top-logo"> - <AISafetyIcon /> - </Link> - {!showMenu ? ( - <div> - <MagnifyingLarge className="search-icon pointer" onClick={toggleSearch} /> - <ListLarge className="pointer" onClick={() => setShowMenu(true)} /> - </div> - ) : ( - <XLarge className="pointer" onClick={toggleMenu} /> - )} - </> - )} +type State = 'initial' | 'search' | 'menu' | 'articles' - {showSearch ? ( - <div className={'mobile-searchbar'}> - <XLarge className="pointer" onClick={toggleMenu} /> - <Search /> - </div> - ) : null} - </nav> - {showMenu && ( - <div className="mobile-menu"> - <Button - action={() => setShowArticles(!showArticles)} - className="secondary full-width space-between" - > - <p className={'composite-elements small'}> - <OpenBookIcon className={'icon-margin'} /> - <span className="black">Articles</span> - </p> - <CarrotLarge /> - </Button> - </div> +type MenuItemProps = { + action: string | (() => void) + label: string + Icon: ElementType + hasChildren?: boolean +} +const MenuItem = ({action, label, Icon, hasChildren}: MenuItemProps) => ( + <Button action={action} className="menu-item flex-row secondary full-width space-between"> + <p className="flex-row"> + <Icon className={'icon-margin'} /> + <span className="black">{label}</span> + </p> + {hasChildren && <CarrotLarge />} + </Button> +) + +const SearchBar = ({onClose}: {show?: boolean; onClose: () => void}) => ( + <div className="flex-row full-width search-bar"> + <Search className="full-width" /> + <XLarge className="pointer" onClick={onClose} /> + </div> +) + +type MenuProps = { + state: State + setState: (state: State) => void +} +const Menu = ({state, setState}: MenuProps) => { + const isMenu = state === 'menu' + const isInitial = state === 'initial' + const MenuIcon = isMenu ? XLarge : ListLarge + return ( + (isInitial || isMenu) && ( + <header + className={['top-header', 'z-index-3', isMenu && 'background'].filter(Boolean).join(' ')} + > + <div className="menu-item flex-row"> + <Link to="/" className="top-logo flex-double"> + <AISafetyIcon /> + </Link> + + {isInitial && ( + <MagnifyingLarge className="search-icon pointer" onClick={() => setState('search')} /> )} - </> - )} - {showArticles && ( - <> - <nav className="articles-header"> - <CarrotLarge className={'back-icon'} onClick={() => setShowArticles(false)} /> - <p className={'composite-elements'}> - <OpenBookIcon className={'icon-margin'} /> - Articles - </p> - <XLarge className="pointer" onClick={toggleMenu} /> - </nav> + <MenuIcon className="pointer" onClick={() => setState(isInitial ? 'menu' : 'initial')} /> + </div> - <div className={'articles-mobile'} onClick={toggleMenu}> - <ArticlesDropdown toc={toc} categories={categories || []} /> - </div> - </> - )} - </header> + {isMenu && ( + <MenuItem + label="Articles" + hasChildren + Icon={OpenBookIcon} + action={() => setState('articles')} + /> + )} + {isMenu && <MenuItem label="Stampy chatbot" Icon={BotIcon} action="/chat" />} + </header> + ) ) } + +export const MobileNav = ({toc, categories}: NavProps) => { + const [current, setCurrent] = useState<State>('initial') + if (['initial', 'menu'].includes(current)) { + return <Menu state={current} setState={setCurrent} /> + } else if (current === 'search') { + return <SearchBar onClose={() => setCurrent('initial')} /> + } else { + return ( + <header className="top-header z-index-3 background"> + <nav className="articles-header menu-item flex-row"> + <CarrotLarge className="reverse-icon" onClick={() => setCurrent('menu')} /> + <OpenBookIcon className="auto-left" /> + <span className="auto-right">Articles</span> + <XLarge className="pointer" onClick={() => setCurrent('initial')} /> + </nav> + + <div className="articles-mobile" onClick={() => setCurrent('initial')}> + <ArticlesDropdown fullWidth toc={toc} categories={categories || []} /> + </div> + </header> + ) + } +} export default MobileNav diff --git a/app/components/Nav/Mobile/navMobile.css b/app/components/Nav/Mobile/navMobile.css index 2d2fd9bc..3d8c3b17 100644 --- a/app/components/Nav/Mobile/navMobile.css +++ b/app/components/Nav/Mobile/navMobile.css @@ -1,96 +1,53 @@ @media only screen and (max-width: 780px) { - .top-header { - padding: 0; - } - .top-nav { - justify-content: space-between; - padding: var(--spacing-16); - } - .top-logo { - padding: 0; - } - .composite-elements { + .flex-row { display: flex; + flex-direction: row; align-items: center; - } - .space-between { justify-content: space-between; + gap: var(--spacing-8); } - .flex-start { - justify-content: flex-start; - } - .mobile-menu > .button { - border-radius: 0; - padding: var(--spacing-80) var(--spacing-16); - } - .mobile-menu > .button:first-child { - border-bottom: 0; - } - .icon-margin { - margin-right: var(--spacing-8); - } - .articles-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: var(--spacing-16); - border-bottom: 1px solid var(--colors-cool-grey-200); - } - .back-icon { - cursor: pointer; - transform: rotate(180deg); - } - .articles-mobile { - padding: var(--spacing-24); + + .top-header { + padding: var(--spacing-8) 0; } - .articles-dropdown-container { - visibility: visible !important; - flex-direction: column; - border: 0; + + .top-header .menu-item { box-shadow: none; - position: static !important; - padding: 0 !important; - width: 100% !important; - } - .search-icon { - margin-right: var(--spacing-16); - } - .search-content > svg:nth-of-type(2) { - visibility: hidden; + height: 80px; + border-bottom: solid 1px var(--colors-cool-grey-200); + border-radius: 0; + padding: 0 24px; + gap: var(--spacing-16); } - .mobile-searchbar { + + .top-header.background { + background-color: var(--colors-white); display: flex; - flex-direction: row-reverse; - flex-wrap: nowrap; - align-content: center; justify-content: flex-start; align-items: flex-start; + flex-direction: column; + } + .top-header.background > * { + margin: inherit; width: 100%; } - .mobile-searchbar > svg { - margin-top: var(--spacing-12); - margin-left: var(--spacing-16); + + .search-bar { + padding: var(--spacing-24) var(--spacing-40); + gap: var(--spacing-16); } - .mobile-searchbar > * .search-box.expandable:focus-within, - .mobile-searchbar > * .search-box.expandable { + .search-bar .search-box:focus-within, + .search-bar .search-box { width: 100%; } - .container-search-results-mobile { - height: 50vh; - width: 100%; - position: inherit; - margin-top: var(--spacing-8); - overflow: scroll; + + .container-search-results { + width: calc(100% - 48px); } - .mobile-searchbar > div { + + .articles-mobile .articles-dropdown-container { + visibility: visible; + flex-direction: column; width: 100%; } - .expanded { - position: fixed; - z-index: 100; - height: 100vh; - width: 100vw; - background: var(--colors-cool-grey-100); - overflow: scroll; - } } diff --git a/app/components/SearchResults/Dropdown.tsx b/app/components/SearchResults/Dropdown.tsx index 16231c87..0de0bd1f 100644 --- a/app/components/SearchResults/Dropdown.tsx +++ b/app/components/SearchResults/Dropdown.tsx @@ -27,14 +27,14 @@ export const SearchResults = ({results}: {results: SearchResultsProps[]}) => { const noResults = results.length === 0 if (noResults) { return ( - <div className="full-width container-search-results bordered col-5 container-search-results-mobile"> + <div className="full-width container-search-results bordered col-5"> <div className="search-result">No results found</div> </div> ) } return ( - <div className="container-search-results bordered col-5 container-search-results-mobile"> + <div className="container-search-results bordered col-5"> {results.map((result, i) => ( <Link key={i} className="search-result" to={result.url}> <Paper /> diff --git a/app/components/search.tsx b/app/components/search.tsx index ca776976..f409962a 100644 --- a/app/components/search.tsx +++ b/app/components/search.tsx @@ -8,9 +8,10 @@ import useOutsideOnClick from '~/hooks/useOnOutsideClick' type Props = { limitFromUrl?: number + className?: string } -export default function Search({limitFromUrl}: Props) { +export default function Search({limitFromUrl, className}: Props) { const [showResults, setShowResults] = useState(false) const [searchPhrase, setSearchPhrase] = useState('') @@ -33,7 +34,7 @@ export default function Search({limitFromUrl}: Props) { const handleChange = debounce(searchFn, 100) return ( - <div onFocus={() => setShowResults(true)} ref={clickDetectorRef}> + <div className={className} onFocus={() => setShowResults(true)} ref={clickDetectorRef}> <SearchInput expandable onChange={handleChange} /> <div className={`search-loader ${isPendingSearch ? 'loader' : ''}`}> </div> {isPendingSearch && results.length == 0 && ( diff --git a/app/root.css b/app/root.css index 209b275f..a2b14600 100644 --- a/app/root.css +++ b/app/root.css @@ -459,6 +459,12 @@ svg { .flex-double { flex-grow: 2; } +.auto-left { + margin-left: auto; +} +.auto-right { + margin-right: auto; +} .centered { margin: auto; @@ -470,6 +476,11 @@ svg { margin: 0 auto; } +.reverse-icon { + cursor: pointer; + transform: rotate(180deg); +} + .pointer { cursor: pointer; } @@ -603,6 +614,22 @@ svg { padding: var(--spacing-32); flex-direction: column; } + + .background { + position: fixed; + top: 0; + left: 0; + background-color: #1b2b3e99; + width: 100vw; + height: 100vh; + overflow: scroll; + } + + .background > * { + margin: 198px auto; + background-color: var(--colors-white); + width: 80%; + } } /* end mobile */ p, textarea, From 7e92c56be653e0fef0e4e1711cfac40f2a61b77a Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Sat, 8 Jun 2024 01:19:55 +0200 Subject: [PATCH 109/132] mobile chatbot referencs --- app/components/Article/Contents.tsx | 21 +++-------- app/components/Article/article.css | 15 -------- app/components/Chatbot/ChatEntry.tsx | 53 +++++++++++++++++++-------- app/components/Chatbot/chat_entry.css | 26 ++++++++----- app/components/Chatbot/index.tsx | 2 +- app/components/popups.ts | 14 +++++++ 6 files changed, 74 insertions(+), 57 deletions(-) create mode 100644 app/components/popups.ts diff --git a/app/components/Article/Contents.tsx b/app/components/Article/Contents.tsx index cba8c768..33ca943e 100644 --- a/app/components/Article/Contents.tsx +++ b/app/components/Article/Contents.tsx @@ -2,6 +2,7 @@ import {useRef, useEffect} from 'react' import useIsMobile from '~/hooks/isMobile' import {questionUrl} from '~/routesMapper' import type {Glossary, PageId, GlossaryEntry} from '~/server-utils/stampy' +import {togglePopup} from '../popups' const footnoteHTML = (el: HTMLDivElement, e: HTMLAnchorElement): string | null => { const id = e.getAttribute('href') || '' @@ -19,19 +20,12 @@ const footnoteHTML = (el: HTMLDivElement, e: HTMLAnchorElement): string | null = return elem.innerHTML } -const scrollToElement = (e: HTMLElement, offset?: number) => { - const elementPosition = e.getBoundingClientRect().top + window.pageYOffset - const offsetPosition = elementPosition - (offset || 0) - - window.scrollTo({top: offsetPosition, behavior: 'smooth'}) -} - const addPopup = (e: HTMLElement, id: string, contents: string, mobile?: boolean): HTMLElement => { const preexisting = document.getElementById(id) if (preexisting) return preexisting const popup = document.createElement('div') - popup.className = 'link-popup bordered small' + popup.className = 'link-popup bordered small background' popup.innerHTML = contents popup.id = id @@ -43,14 +37,9 @@ const addPopup = (e: HTMLElement, id: string, contents: string, mobile?: boolean popup.addEventListener('mouseover', () => popup.classList.add('shown')) popup.addEventListener('mouseout', () => popup.classList.remove('shown')) } else { - const togglePopup = (event: Event) => { - event.preventDefault() - popup.classList.toggle('shown') - document.body.classList.toggle('noscroll') - scrollToElement(e, 16) - } - popup.addEventListener('click', togglePopup) - e.addEventListener('click', togglePopup) + const toggle = () => popup.classList.toggle('shown') + popup.addEventListener('click', togglePopup(toggle, e)) + e.addEventListener('click', togglePopup(toggle, e)) } return popup diff --git a/app/components/Article/article.css b/app/components/Article/article.css index ed5b1d8f..6465bbc9 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -224,19 +224,4 @@ article .banner h3 .title { article { margin: 0; } - - article .link-popup { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: #ff000033; - overflow: scroll; - } - article .link-popup .footnote { - margin: auto; - background-color: white; - width: 80%; - } } diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 596de5d7..8f40e4e4 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -1,4 +1,4 @@ -import {ComponentType, ReactNode} from 'react' +import {ComponentType, ReactNode, MouseEvent, useState, useRef} from 'react' import {Link} from '@remix-run/react' import MarkdownIt from 'markdown-it' import Contents from '~/components/Article/Contents' @@ -15,6 +15,8 @@ import StampyIcon from '~/components/icons-generated/Stampy' import PersonInCircleIcon from '~/components/icons-generated/PersonInCircle' import IconStampySmall from '~/components/icons-generated/StampySmall' import QuestionMarkIcon from '~/components/icons-generated/QuestionMark' +import useIsMobile from '~/hooks/isMobile' +import {togglePopup} from '../popups' const MAX_REFERENCES = 10 @@ -108,33 +110,53 @@ const ReferenceSummary = ({ } const md = new MarkdownIt({html: true}) -const ReferencePopup = (citation: Citation) => { +const ReferencePopup = ( + citation: Citation & {className?: string; onClose?: (event: MouseEvent) => void} +) => { const parsed = citation.text?.match(/^###.*?###\s+"""(.*?)"""$/ms) if (!parsed) return undefined + return ( - <div className="reference-contents bordered z-index-2"> - <ReferenceSummary {...citation} titleClass="large-bold" /> - <div className="grey padding-bottom-16 padding-top-32 xs">Referenced excerpt</div> - <div - className="default inner-html" - dangerouslySetInnerHTML={{ - __html: md.render(parsed[1]), - }} - /> + <div + className={`reference-popup background z-index-2 ${citation.className || ''}`} + onClick={citation.onClose} + > + <div className="reference-contents bordered"> + <ReferenceSummary {...citation} titleClass="large-bold" /> + <div className="grey padding-bottom-16 padding-top-32 xs">Referenced excerpt</div> + <div + className="default inner-html" + dangerouslySetInnerHTML={{ + __html: md.render(parsed[1]), + }} + /> + </div> </div> ) } -const ReferenceLink = (citation: Citation) => { +const ReferenceLink = (citation: Citation & {mobile?: boolean}) => { + const ref = useRef<HTMLAnchorElement>(null) + const [shown, setShown] = useState(false) + const clickHandler = !citation.mobile + ? undefined + : togglePopup(() => setShown((current) => !current), ref.current || undefined) + const {id, index} = citation if (!index || index > MAX_REFERENCES) return '' return ( <span className="ref-container"> - <Link id={`${id}-ref`} to={`#${id}`} className={`reference-link ref-${index}`}> + <Link + ref={ref} + id={`${id}-ref`} + to={`#${id}`} + className={`reference-link ref-${index}`} + onClick={clickHandler} + > <span>{index}</span> </Link> - <ReferencePopup {...citation} /> + <ReferencePopup {...citation} className={shown ? 'shown' : 'hidden'} onClose={clickHandler} /> </span> ) } @@ -149,6 +171,7 @@ const Reference = (citation: Citation) => { } const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) => { + const mobile = useIsMobile() const citations = [] as Citation[] citationsMap?.forEach((v) => { citations.push(v) @@ -191,7 +214,7 @@ const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) if (chunk?.match(/(\[\d+\])/)) { const refId = chunk.slice(1, chunk.length - 1) const ref = citationsMap?.get(refId) - return ref && <ReferenceLink key={i} {...ref} /> + return ref && <ReferenceLink key={i} mobile={mobile} {...ref} /> } else if (chunk === '\n') { return <br key={i} /> } else { diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 8521394f..e8d7a2c1 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -147,26 +147,32 @@ article.stampy { } .reference-contents { - visibility: hidden; transition: visibility 0.2s; - width: 512px; word-wrap: break-word; - background-color: white; + text-decoration: unset; + width: 512px; border: 1px solid var(--colors-cool-grey-200, #dfe3e9); padding: var(--spacing-40); - position: absolute; - transform: translateX(50%); - text-decoration: unset; - right: 0px; - top: 40px; + background-color: var(--colors-white); + padding: var(--spacing-40); + position: relative; } .reference-contents .inner-html { height: 275px; overflow: hidden; } -.reference-contents:hover, -.reference-link:hover + .reference-contents { +@media (min-width: 780px) { + .reference-popup { + display: inline-block; + position: absolute; + transform: translate(-50%, 35px); + min-width: 30vw; + } +} + +.reference-popup:hover, +.reference-link:hover + .reference-popup { visibility: visible; transition-delay: 0s; } diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index c181b66d..062d1dcf 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -87,7 +87,7 @@ const QuestionInput = ({ return ( <div - className={'widget-ask ' + (fixed ? 'fixed col-10 z-index-4' : 'col-9')} + className={'widget-ask ' + (fixed ? 'fixed col-10 z-index-1' : 'col-9')} ref={clickDetectorRef} > {results.length > 0 ? ( diff --git a/app/components/popups.ts b/app/components/popups.ts new file mode 100644 index 00000000..3a8fdc52 --- /dev/null +++ b/app/components/popups.ts @@ -0,0 +1,14 @@ +export const scrollToElement = (e: HTMLElement, offset?: number) => { + const elementPosition = e.getBoundingClientRect().top + window.pageYOffset + const offsetPosition = elementPosition - (offset || 0) + + window.scrollTo({top: offsetPosition, behavior: 'smooth'}) +} + +export const togglePopup = + (onToggle: () => void, reference?: HTMLElement) => (event: MouseEvent | React.MouseEvent) => { + event.preventDefault() + onToggle() + document.body.classList.toggle('noscroll') + reference && scrollToElement(reference, 16) + } From ad6a1c8c84d731bd7ded72b3cf066901f2183039 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Sat, 8 Jun 2024 10:29:06 +0200 Subject: [PATCH 110/132] resolve conflicts --- app/components/Article/Contents.tsx | 2 +- app/components/Article/article.css | 7 ++++--- app/components/Button/button.css | 1 + app/components/SearchResults/Dropdown.tsx | 10 ++++++++-- app/components/search.tsx | 1 + 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/components/Article/Contents.tsx b/app/components/Article/Contents.tsx index 33ca943e..c0ae2d26 100644 --- a/app/components/Article/Contents.tsx +++ b/app/components/Article/Contents.tsx @@ -25,7 +25,7 @@ const addPopup = (e: HTMLElement, id: string, contents: string, mobile?: boolean if (preexisting) return preexisting const popup = document.createElement('div') - popup.className = 'link-popup bordered small background' + popup.className = 'link-popup bordered small background' popup.innerHTML = contents popup.id = id diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 6465bbc9..2163894d 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -102,10 +102,7 @@ article .glossary-entry { article .link-popup { visibility: hidden; - opacity: 0; z-index: 4; - position: absolute; - top: 0; width: 512px; } @@ -218,6 +215,10 @@ article .banner h3 .title { flex-direction: row; flex-wrap: wrap; } + + article .link-popup { + width: 100%; + } article .footer-comtainer > div:nth-child(-n + 2) { flex: 1 1; } diff --git a/app/components/Button/button.css b/app/components/Button/button.css index b44d9267..0f4a5060 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -183,6 +183,7 @@ /* #### Composite button #### */ .composite-button { cursor: pointer; + display: flex; } .composite-button > form .button, diff --git a/app/components/SearchResults/Dropdown.tsx b/app/components/SearchResults/Dropdown.tsx index 0de0bd1f..3ab2bc48 100644 --- a/app/components/SearchResults/Dropdown.tsx +++ b/app/components/SearchResults/Dropdown.tsx @@ -22,7 +22,13 @@ export interface SearchResultsProps { url: string } -export const SearchResults = ({results}: {results: SearchResultsProps[]}) => { +export const SearchResults = ({ + results, + onSelect, +}: { + results: SearchResultsProps[] + onSelect?: () => void +}) => { const isMobile = useIsMobile() const noResults = results.length === 0 if (noResults) { @@ -34,7 +40,7 @@ export const SearchResults = ({results}: {results: SearchResultsProps[]}) => { } return ( - <div className="container-search-results bordered col-5"> + <div className="container-search-results bordered col-5" onClick={onSelect}> {results.map((result, i) => ( <Link key={i} className="search-result" to={result.url}> <Paper /> diff --git a/app/components/search.tsx b/app/components/search.tsx index f409962a..8a795612 100644 --- a/app/components/search.tsx +++ b/app/components/search.tsx @@ -42,6 +42,7 @@ export default function Search({limitFromUrl, className}: Props) { )} {!isPendingSearch && searchPhrase && showResults && ( <SearchResults + onSelect={() => setShowResults(false)} results={results.map((r) => ({ title: r.title, url: questionUrl(r), From 2d19858b035bf988b1dce4745eeb9fa7734cf4a9 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sat, 8 Jun 2024 11:01:34 -0400 Subject: [PATCH 111/132] logging thumb feedback fixed --- app/components/Feedback/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index daca3a06..018a1a0a 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -63,6 +63,7 @@ const Feedback = ({ hint={upHint} setVoted={setVoted} onClick={() => { + if (pageid === 'chatbot') onSubmit('Helpful', undefined) setShowThanks(true) }} /> @@ -74,6 +75,7 @@ const Feedback = ({ disabled={voted} setVoted={setVoted} onClick={() => { + if (pageid === 'chatbot') onSubmit('Unhelpful', undefined) if (!showForm) setShowThanks(true) setShowFeedbackForm(!!showForm) }} From 5f9a1615692cccd5f1bb3a1097ac53565eb47270 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sun, 9 Jun 2024 13:42:31 -0400 Subject: [PATCH 112/132] miscellaneous mobile fixes --- app/components/Chatbot/ChatEntry.tsx | 8 +++++--- app/components/Chatbot/chat_entry.css | 16 +++++++++++++++- app/components/Feedback/Form.tsx | 4 ++++ app/components/Feedback/feedback.css | 18 ++++++++++++++++-- app/routes/chat.tsx | 2 +- 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 8f40e4e4..3a9657d6 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -51,10 +51,12 @@ type TitleProps = { hint?: string } const Title = ({title, Icon, answerType, hint}: TitleProps) => ( - <div className="flex-container title padding-bottom-16"> + <div className="title-container padding-bottom-16"> <Icon width="40" height="40" /> - <span className="default-bold flex-double">{title}</span> - <AnswerInfo answerType={answerType} hint={hint} /> + <div className="title-inner-container"> + <span className="default-bold">{title}</span> + <AnswerInfo answerType={answerType} hint={hint} /> + </div> </div> ) diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index e8d7a2c1..45bfc7c6 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -8,12 +8,18 @@ article.stampy { border-radius: var(--border-radius); } -.chat-entry .title { +.chat-entry .title-container { display: flex; gap: var(--spacing-16); align-items: center; } +.title-inner-container { + display: flex; + justify-content: space-between; + flex-grow: 1; +} + .phase-message { margin-left: 57px; color: var(--colors-cool-grey-600); @@ -176,3 +182,11 @@ article.stampy { visibility: visible; transition-delay: 0s; } + +@media (max-width: 780px) { + .title-inner-container { + flex-direction: column; + align-items: start; + justify-content: flex-start; + } +} diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index 9ff683aa..d2b25836 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -2,6 +2,7 @@ import {useState} from 'react' import Button from '~/components/Button' import useOutsideOnClick from '~/hooks/useOnOutsideClick' import './feedback.css' +import {XLarge} from '../icons-generated' export type FeedbackFormProps = { onSubmit?: (msg: string, option?: string) => Promise<any> @@ -27,6 +28,9 @@ const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps return ( <div ref={clickCheckerRef} className={'feedback-form bordered ' + (className ?? '')}> + <button onClick={onClose} className="mobile-only escape-feedback"> + <XLarge></XLarge> + </button> <span className="black small padding-bottom-32">What was the problem?</span> {options?.map((option) => ( <Button diff --git a/app/components/Feedback/feedback.css b/app/components/Feedback/feedback.css index c7e1a8cf..19700d07 100644 --- a/app/components/Feedback/feedback.css +++ b/app/components/Feedback/feedback.css @@ -29,9 +29,8 @@ border-radius: var(--border-radius); } -/* Comment to Nemo when he reviews: why didn't you just do this the way you did the settings buttons? */ .select-option { - height: var(--spacing-48); + height: var(--height-48); border-radius: var(--border-radius); margin-bottom: var(--spacing-16); cursor: pointer; @@ -70,3 +69,18 @@ transform: translate(-9vw, var(--spacing-56)); margin: var(--spacing-24); } + +.escape-feedback { + position: absolute; + top: 15px; + right: 15px; + line-height: 0; + border: none; + background: #fff; +} + +@media (max-width: 780px) { + .feedback-form { + left: -20px; + } +} diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 74635b76..98dfc451 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -44,7 +44,7 @@ export default function App() { ]} settings={chatSettings} /> - <div className="settings-container" ref={clickDetectorRef}> + <div className="settings-container z-index-1" ref={clickDetectorRef}> {showSettings && ( <div className="settings bordered flex-container"> <div>Answer detail</div> From fb922e7d3724c43da90d22cd51364ef8f056769c Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sun, 9 Jun 2024 18:33:50 -0400 Subject: [PATCH 113/132] small --- app/components/Feedback/Form.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Feedback/Form.tsx b/app/components/Feedback/Form.tsx index d2b25836..55e5f6ef 100644 --- a/app/components/Feedback/Form.tsx +++ b/app/components/Feedback/Form.tsx @@ -29,7 +29,7 @@ const FeedbackForm = ({onSubmit, onClose, options, className}: FeedbackFormProps return ( <div ref={clickCheckerRef} className={'feedback-form bordered ' + (className ?? '')}> <button onClick={onClose} className="mobile-only escape-feedback"> - <XLarge></XLarge> + <XLarge /> </button> <span className="black small padding-bottom-32">What was the problem?</span> {options?.map((option) => ( From 348ac61ccac6a2d2584bfc4b64b2ced5df25d2da Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Sat, 8 Jun 2024 14:02:24 +0200 Subject: [PATCH 114/132] properly display popup content --- app/assets/icons/exclamation.svg | 5 +++++ app/components/Article/Contents.tsx | 18 +++++++++------- app/components/Article/article.css | 2 +- app/components/Chatbot/ChatEntry.tsx | 21 ++++++++++++++----- app/components/Chatbot/chat_entry.css | 14 ++++++++----- app/components/Chatbot/index.tsx | 15 ++++++++----- .../icons-generated/Exclamation.tsx | 16 ++++++++++++++ app/components/icons-generated/index.ts | 1 + app/hooks/useChat.ts | 2 +- 9 files changed, 70 insertions(+), 24 deletions(-) create mode 100644 app/assets/icons/exclamation.svg create mode 100644 app/components/icons-generated/Exclamation.tsx diff --git a/app/assets/icons/exclamation.svg b/app/assets/icons/exclamation.svg new file mode 100644 index 00000000..3f736b9a --- /dev/null +++ b/app/assets/icons/exclamation.svg @@ -0,0 +1,5 @@ +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M8.5 11C8.5 11.2761 8.27614 11.5 8 11.5C7.72386 11.5 7.5 11.2761 7.5 11C7.5 10.7239 7.72386 10.5 8 10.5C8.27614 10.5 8.5 10.7239 8.5 11Z" fill="#D40000"/> +<path d="M7.5 5L7.5 9C7.5 9.27614 7.72386 9.5 8 9.5C8.27614 9.5 8.5 9.27614 8.5 9L8.5 5C8.5 4.72386 8.27614 4.5 8 4.5C7.72386 4.5 7.5 4.72386 7.5 5Z" fill="#D40000"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M8 14C11.3137 14 14 11.3137 14 8C14 4.68629 11.3137 2 8 2C4.68629 2 2 4.68629 2 8C2 11.3137 4.68629 14 8 14ZM8 13C10.7614 13 13 10.7614 13 8C13 5.23858 10.7614 3 8 3C5.23858 3 3 5.23858 3 8C3 10.7614 5.23858 13 8 13Z" fill="#D40000"/> +</svg> diff --git a/app/components/Article/Contents.tsx b/app/components/Article/Contents.tsx index c0ae2d26..500edb86 100644 --- a/app/components/Article/Contents.tsx +++ b/app/components/Article/Contents.tsx @@ -10,14 +10,14 @@ const footnoteHTML = (el: HTMLDivElement, e: HTMLAnchorElement): string | null = if (!footnote) return null - const elem = document.createElement('div') - elem.innerHTML = footnote.innerHTML + const elem = footnote.cloneNode(true) as Element // remove the back link, as it's useless in the popup - if (elem?.firstElementChild?.lastChild) - elem.firstElementChild.removeChild(elem.firstElementChild.lastChild) + Array.from(elem.getElementsByClassName('footnote-backref')).forEach((e) => { + e.parentElement?.removeChild(e) + }) - return elem.innerHTML + return elem.firstElementChild?.innerHTML || null } const addPopup = (e: HTMLElement, id: string, contents: string, mobile?: boolean): HTMLElement => { @@ -81,6 +81,10 @@ const glossaryInjecter = (pageid: string, glossary: Glossary) => { } const insertGlossary = (pageid: string, glossary: Glossary) => { + // Generate a random ID for these glossary items. This is needed when mulitple articles are displayed - + // gloassary items should be only displayed once per article, but this is checked by popup id, so if + // there are 2 articles that have the same glossary item, then only the first articles popups would work + const randomId = Math.floor(1000 + Math.random() * 9000).toString() const injecter = glossaryInjecter(pageid, glossary) return (textNode: Node) => { @@ -129,11 +133,11 @@ const insertGlossary = (pageid: string, glossary: Glossary) => { const image = entry.image && `<img src="${entry.image}"/>` addPopup( e as HTMLSpanElement, - `glossary-${entry.term}`, + `glossary-${entry.term}-${randomId}`, `<div class="glossary-popup flex-container black small"> <div class="contents ${image ? '' : 'full-width'}"> <div class="small-bold">${entry.term}</div> - <div class="defintion small">${entry.contents}</div> + <div class="definition small">${entry.contents}</div> ${link || ''} </div> ${image || ''} diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 2163894d..c0e60b3f 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -125,7 +125,7 @@ article .contents a.button { article .link-popup .glossary-popup > .contents { padding: var(--spacing-24) var(--spacing-40) var(--spacing-24); } -article .defintion { +article .definition { height: 140px; display: -webkit-box; /* These are webkit specific things, so might not work in all browsers (firefox handles them fine) */ diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 3a9657d6..a716daaa 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -172,11 +172,17 @@ const Reference = (citation: Citation) => { ) } -const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) => { +const ChatbotReply = ({ + question, + phase, + content, + citationsMap, + no, +}: AssistantEntry & {no: number}) => { const mobile = useIsMobile() const citations = [] as Citation[] citationsMap?.forEach((v) => { - citations.push(v) + citations.push({...v, id: `${v.id}-${no}`}) }) citations.sort((a, b) => a.index - b.index) const phaseMessageClass = 'phase-message large-reading' @@ -216,7 +222,7 @@ const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) if (chunk?.match(/(\[\d+\])/)) { const refId = chunk.slice(1, chunk.length - 1) const ref = citationsMap?.get(refId) - return ref && <ReferenceLink key={i} mobile={mobile} {...ref} /> + return ref && <ReferenceLink key={i} mobile={mobile} {...ref} id={`${ref.id}-${no}`} /> } else if (chunk === '\n') { return <br key={i} /> } else { @@ -253,10 +259,15 @@ const ChatbotReply = ({question, phase, content, citationsMap}: AssistantEntry) ) } -const StampyArticle = ({pageid, content, title}: StampyEntry) => { +const StampyArticle = ({pageid, content, title, no}: StampyEntry & {no: number}) => { const glossary = useGlossary() const hint = `This response is pulled from our article "${title}" which was written by members of AISafety.info` + const uniqueReferences = (content: string, idFinder: string) => + content + .replaceAll(new RegExp(`id="(${idFinder})"`, 'g'), `id="$1-${no}"`) + .replaceAll(new RegExp(`href="#(${idFinder})"`, 'g'), `href="#$1-${no}"`) + return ( <div> <Title title="Stampy" Icon={StampyIcon} answerType="human" hint={hint} /> @@ -264,7 +275,7 @@ const StampyArticle = ({pageid, content, title}: StampyEntry) => { <article className="stampy"> <Contents pageid={pageid || ''} - html={content || 'Loading...'} + html={uniqueReferences(content || 'Loading...', 'fn\\d+-.*?')} glossary={glossary || {}} /> </article> diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 45bfc7c6..c2114bd8 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -183,10 +183,14 @@ article.stampy { transition-delay: 0s; } +.chat-entry article { + min-height: inherit; +} + @media (max-width: 780px) { - .title-inner-container { - flex-direction: column; - align-items: start; - justify-content: flex-start; - } + .title-inner-container { + flex-direction: column; + align-items: start; + justify-content: flex-start; + } } diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 062d1dcf..abe3b852 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -12,6 +12,7 @@ import {questionUrl} from '~/routesMapper' import {Question} from '~/server-utils/stampy' import {useSearch} from '~/hooks/useSearch' import Input from '~/components/Input' +import {Exclamation} from '../icons-generated' // to be replaced with actual pool questions const poolQuestions = [ @@ -98,7 +99,7 @@ const QuestionInput = ({ <p className="default">{results[0].title}</p> </Button> ) : undefined} - <div className="flex-container"> + <div className="relative"> <Input placeholder={placeholder} className="large full-width shadowed" @@ -115,6 +116,10 @@ const QuestionInput = ({ <SendIcon className="send pointer" onClick={() => handleAsk(question)} /> </div> {fixed && <div className="white-space"></div>} + + <div className="mobile-only grey padding-top-8"> + <Exclamation /> <span>Stampy can be inaccurate. Always verify its sources.</span> + </div> </div> ) } @@ -340,7 +345,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { <SplashScreen questions={questions} onSelection={showArticleByID} /> ) : undefined} {history.map((item, i) => ( - <ChatEntry key={`chat-entry-${i}`} {...item} /> + <ChatEntry key={`chat-entry-${i}`} {...item} no={i} /> ))} <div className="padding-bottom-128"> @@ -360,9 +365,9 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { fixed /> - <div className={'warning-floating'}> - <p className={'xs'}> - <span className={'red xs-bold'}>Caution! </span> + <div className="desktop-only warning-floating"> + <p className="xs"> + <span className="red xs-bold">Caution! </span> This is an early prototype. Don’t automatically trust what it says, and make sure to follow its sources. </p> diff --git a/app/components/icons-generated/Exclamation.tsx b/app/components/icons-generated/Exclamation.tsx new file mode 100644 index 00000000..fb2afffd --- /dev/null +++ b/app/components/icons-generated/Exclamation.tsx @@ -0,0 +1,16 @@ +import type {SVGProps} from 'react' +const SvgExclamation = (props: SVGProps<SVGSVGElement>) => ( + <svg xmlns="http://www.w3.org/2000/svg" width={16} height={16} fill="none" {...props}> + <path + fill="#D40000" + d="M8.5 11a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0M7.5 5v4a.5.5 0 0 0 1 0V5a.5.5 0 0 0-1 0" + /> + <path + fill="#D40000" + fillRule="evenodd" + d="M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12m0-1A5 5 0 1 0 8 3a5 5 0 0 0 0 10" + clipRule="evenodd" + /> + </svg> +) +export default SvgExclamation diff --git a/app/components/icons-generated/index.ts b/app/components/icons-generated/index.ts index 7c2e13b4..51d2f9a6 100644 --- a/app/components/icons-generated/index.ts +++ b/app/components/icons-generated/index.ts @@ -23,6 +23,7 @@ export {default as EclipseIndividual} from './EclipseIndividual' export {default as EclipseTeam} from './EclipseTeam' export {default as Edit} from './Edit' export {default as Ellipsis} from './Ellipsis' +export {default as Exclamation} from './Exclamation' export {default as Flag} from './Flag' export {default as Followup} from './Followup' export {default as GetInvolvedMobile} from './GetInvolvedMobile' diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index 69747950..975ef5cd 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -12,7 +12,7 @@ export type Citation = { id?: string } -export type Entry = UserEntry | AssistantEntry | ErrorMessage | StampyEntry +export type Entry = (UserEntry | AssistantEntry | ErrorMessage | StampyEntry) & {no?: number} export type ChatPhase = | 'started' | 'semantic' From 6adbda65d8285e79a298c795db1b613791a9b4dc Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Sat, 8 Jun 2024 15:06:33 +0200 Subject: [PATCH 115/132] Use sample of preselected articles --- app/components/Chatbot/index.tsx | 64 ++++++++------------------ app/hooks/useOnSiteQuestions.ts | 44 ++++++++++++++++++ app/hooks/useSearch.tsx | 2 +- app/hooks/useTags.ts | 0 app/routes/chat.tsx | 6 +-- app/routes/questions.$questionId.$.tsx | 3 +- 6 files changed, 68 insertions(+), 51 deletions(-) create mode 100644 app/hooks/useOnSiteQuestions.ts delete mode 100644 app/hooks/useTags.ts diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index abe3b852..88cc5a7d 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -1,50 +1,19 @@ import {useEffect, useRef, useState} from 'react' import {useFetcher, useNavigate} from '@remix-run/react' +import ExclamationIcon from '../icons-generated/Exclamation' import IconStampyLarge from '~/components/icons-generated/StampyLarge' import IconStampySmall from '~/components/icons-generated/StampySmall' import SendIcon from '~/components/icons-generated/PlaneSend' import Button from '~/components/Button' import {queryLLM, Entry, AssistantEntry, StampyEntry, Followup, ChatSettings} from '~/hooks/useChat' import useOutsideOnClick from '~/hooks/useOnOutsideClick' +import useOnSiteQuestions from '~/hooks/useOnSiteQuestions' import ChatEntry from './ChatEntry' import './widgit.css' import {questionUrl} from '~/routesMapper' import {Question} from '~/server-utils/stampy' import {useSearch} from '~/hooks/useSearch' import Input from '~/components/Input' -import {Exclamation} from '../icons-generated' - -// to be replaced with actual pool questions -const poolQuestions = [ - {text: 'Do people seriously worry about existential risk from AI?', pageid: '6953'}, - {text: 'Is AI safety about systems becoming malevolent or conscious?', pageid: '6194'}, - {text: 'When do experts think human-level AI will be created?', pageid: '5633'}, - {text: 'Why is AI alignment a hard problem?', pageid: '8163'}, - { - text: 'Why can’t we just “put the AI in a box” so that it can’t influence the outside world?', - pageid: '6176', - }, - { - text: 'What are the differences between AGI, transformative AI, and superintelligence?', - pageid: '5864', - }, - {text: 'What are large language models?', pageid: '5864'}, - {text: "Why can't we just turn the AI off if it starts to misbehave?", pageid: '3119'}, - {text: 'What is instrumental convergence?', pageid: '897I'}, - {text: "What is Goodhart's law?", pageid: '8185'}, - {text: 'What is the orthogonality thesis?', pageid: '6568'}, - {text: 'How powerful would a superintelligence become?', pageid: '7755'}, - {text: 'Will AI be able to think faster than humans?', pageid: '8E41'}, - {text: "Isn't the real concern misuse?", pageid: '9B85'}, - {text: 'Are AIs conscious?', pageid: '8V5J'}, - { - text: 'What are the differences between a singularity, an intelligence explosion, and a hard takeoff?', - pageid: '8IHO', - }, - {text: 'What is an intelligence explosion?', pageid: '6306'}, - {text: 'How might AGI kill people?', pageid: '5943'}, - {text: 'What is a "warning shot"?', pageid: '7748'}, -] const MIN_SIMILARITY = 0.85 @@ -118,7 +87,7 @@ const QuestionInput = ({ {fixed && <div className="white-space"></div>} <div className="mobile-only grey padding-top-8"> - <Exclamation /> <span>Stampy can be inaccurate. Always verify its sources.</span> + <ExclamationIcon /> <span>Stampy can be inaccurate. Always verify its sources.</span> </div> </div> ) @@ -126,12 +95,8 @@ const QuestionInput = ({ export const WidgetStampy = ({className}: {className?: string}) => { const [question, setQuestion] = useState('') + const {selected: questions} = useOnSiteQuestions() const navigate = useNavigate() - const questions = [ - 'What is AI Safety?', - 'How would the AI even get out in the world?', - 'Do people seriously worry about existential risk from AI?', - ] const stampyUrl = (question: string) => `/chat/?question=${question.trim()}` return ( @@ -145,10 +110,10 @@ export const WidgetStampy = ({className}: {className?: string}) => { <IconStampySmall /> <div className="sample-messages rounded"> <div className="padding-bottom-24">Try asking me...</div> - {questions.map((question, i) => ( + {questions.map(({title}, i) => ( <div key={i} className="padding-bottom-16"> - <Button className="secondary-alt-large" action={stampyUrl(question)}> - {question} + <Button className="secondary-alt-large" action={stampyUrl(title)}> + {title} </Button> </div> ))} @@ -176,10 +141,14 @@ type FollowupsProps = { className?: string } const Followups = ({title, followups, onSelect, className}: FollowupsProps) => { + const {randomQuestions} = useOnSiteQuestions() const items = (followups?.length || 0) >= 3 ? followups - : [...(followups || []), ...poolQuestions.sort(() => Math.random() - 0.5)].slice(0, 3) + : [ + ...(followups || []), + ...randomQuestions().map(({title, pageid}) => ({text: title, pageid})), + ].slice(0, 3) return ( <> {title && <div className={'padding-bottom-24 grey' + (className || '')}>{title}</div>} @@ -221,11 +190,11 @@ const SplashScreen = ({ type ChatbotProps = { question?: string - questions?: Followup[] settings?: ChatSettings } -export const Chatbot = ({question, questions, settings}: ChatbotProps) => { +export const Chatbot = ({question, settings}: ChatbotProps) => { const [followups, setFollowups] = useState<Followup[]>() + const {selected: questions} = useOnSiteQuestions() const [sessionId] = useState(crypto.randomUUID()) const [history, setHistory] = useState([] as Entry[]) @@ -342,7 +311,10 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { return ( <div className="centered col-10 height-70"> {history.length === 0 ? ( - <SplashScreen questions={questions} onSelection={showArticleByID} /> + <SplashScreen + questions={questions.map(({title, pageid}) => ({pageid, text: title}))} + onSelection={showArticleByID} + /> ) : undefined} {history.map((item, i) => ( <ChatEntry key={`chat-entry-${i}`} {...item} no={i} /> diff --git a/app/hooks/useOnSiteQuestions.ts b/app/hooks/useOnSiteQuestions.ts new file mode 100644 index 00000000..b2504492 --- /dev/null +++ b/app/hooks/useOnSiteQuestions.ts @@ -0,0 +1,44 @@ +import {Question} from '~/server-utils/stampy' +import {useOnSiteQuestions as getQuestions} from './useCachedObjects' +import {useEffect, useState} from 'react' + +const topQuestions = [ + '6953', // Do people seriously worry about existential risk from AI? debugger eval code:1:26 + '6194', // Is AI safety about systems becoming malevolent or conscious? debugger eval code:1:26 + '5633', // When do experts think human-level AI will be created? debugger eval code:1:26 + '8163', // Why is AI alignment a hard problem? debugger eval code:1:26 + '6176', // Why can’t we just “put the AI in a box” so that it can’t influence the outside world? debugger eval code:1:26 + '5864', // What are the differences between AGI, transformative AI, and superintelligence? debugger eval code:1:26 + '5864', // What are large language models? debugger eval code:1:26 + '3119', // Why can't we just turn the AI off if it starts to misbehave? debugger eval code:1:26 + '897I', // What is instrumental convergence? debugger eval code:1:26 + '8185', // What is Goodhart's law? debugger eval code:1:26 + '6568', // What is the orthogonality thesis? debugger eval code:1:26 + '7755', // How powerful would a superintelligence become? debugger eval code:1:26 + '8E41', // Will AI be able to think faster than humans? debugger eval code:1:26 + '9B85', // Isn't the real concern misuse? debugger eval code:1:26 + '8V5J', // Are AIs conscious? debugger eval code:1:26 + '8IHO', // What are the differences between a singularity, an intelligence explosion, and a hard takeoff? debugger eval code:1:26 + '6306', // What is an intelligence explosion? debugger eval code:1:26 + '5943', // How might AGI kill people? debugger eval code:1:26 + '7748', // What is a "warning shot"? +] + +const useOnSiteQuestions = () => { + const onSite = getQuestions() + const [selected, setSelected] = useState([] as Question[]) + + const top = onSite.items?.filter((i) => topQuestions.includes(i.pageid)) + const randomQuestions = (n?: number) => + top?.sort(() => 0.5 - Math.random()).slice(0, n || 3) || [] + + useEffect(() => { + if (!selected?.length) { + setSelected(randomQuestions()) + } + // eslint-disable-next-line + }, [onSite.items]) + + return {...onSite, topQuestions: top, selected, randomQuestions} +} +export default useOnSiteQuestions diff --git a/app/hooks/useSearch.tsx b/app/hooks/useSearch.tsx index 4d604c04..02a39701 100644 --- a/app/hooks/useSearch.tsx +++ b/app/hooks/useSearch.tsx @@ -1,6 +1,6 @@ import {useState, useEffect, useRef} from 'react' import {Question} from '~/server-utils/stampy' -import {useOnSiteQuestions} from './useCachedObjects' +import useOnSiteQuestions from './useOnSiteQuestions' const NUM_RESULTS = 8 diff --git a/app/hooks/useTags.ts b/app/hooks/useTags.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 98dfc451..7cc9331e 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -40,9 +40,9 @@ export default function App() { questions={[ {text: 'What is AI Safety?', pageid: '8486'}, {text: 'How would the AI even get out in the world?', pageid: '8222'}, - {text: 'Do people seriously worry about existential risk from AI?', pageid: '6953'}, - ]} - settings={chatSettings} + {text: 'Do people seriously worry about existential risk from AI?', pageid: '6953'}, + ]} + settings={chatSettings} /> <div className="settings-container z-index-1" ref={clickDetectorRef}> {showSettings && ( diff --git a/app/routes/questions.$questionId.$.tsx b/app/routes/questions.$questionId.$.tsx index f497fab5..8776ca96 100644 --- a/app/routes/questions.$questionId.$.tsx +++ b/app/routes/questions.$questionId.$.tsx @@ -12,9 +12,10 @@ import {ArticlesNav} from '~/components/ArticlesNav/ArticleNav' import {QuestionStatus, loadQuestionDetail} from '~/server-utils/stampy' import useToC from '~/hooks/useToC' import useGlossary from '~/hooks/useGlossary' +import useOnSiteQuestions from '~/hooks/useOnSiteQuestions' +import {useTags} from '~/hooks/useCachedObjects' import type {Question, Tag} from '~/server-utils/stampy' import {reloadInBackgroundIfNeeded} from '~/server-utils/kv-cache' -import {useOnSiteQuestions, useTags} from '~/hooks/useCachedObjects' export const LINK_WITHOUT_DETAILS_CLS = 'link-without-details' From a01aa2644c77b050b5b0a540174ff68ec6affd04 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Mon, 10 Jun 2024 23:27:16 +0200 Subject: [PATCH 116/132] fix bug --- app/components/Chatbot/chat_entry.css | 10 +++++----- app/components/Chatbot/index.tsx | 7 +++---- app/routes/chat.tsx | 12 +++--------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index c2114bd8..8ef1b6f0 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -188,9 +188,9 @@ article.stampy { } @media (max-width: 780px) { - .title-inner-container { - flex-direction: column; - align-items: start; - justify-content: flex-start; - } + .title-inner-container { + flex-direction: column; + align-items: start; + justify-content: flex-start; + } } diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 88cc5a7d..25fa4c48 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -190,12 +190,11 @@ const SplashScreen = ({ type ChatbotProps = { question?: string + questions?: Question[] settings?: ChatSettings } -export const Chatbot = ({question, settings}: ChatbotProps) => { +export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const [followups, setFollowups] = useState<Followup[]>() - const {selected: questions} = useOnSiteQuestions() - const [sessionId] = useState(crypto.randomUUID()) const [history, setHistory] = useState([] as Entry[]) const [controller, setController] = useState(() => new AbortController()) @@ -312,7 +311,7 @@ export const Chatbot = ({question, settings}: ChatbotProps) => { <div className="centered col-10 height-70"> {history.length === 0 ? ( <SplashScreen - questions={questions.map(({title, pageid}) => ({pageid, text: title}))} + questions={questions?.map(({title, pageid}) => ({pageid, text: title}))} onSelection={showArticleByID} /> ) : undefined} diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 7cc9331e..a908c502 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -6,6 +6,7 @@ import Chatbot from '~/components/Chatbot' import {ChatSettings, Mode} from '~/hooks/useChat' import Button from '~/components/Button' import useOutsideOnClick from '~/hooks/useOnOutsideClick' +import useOnSiteQuestions from '~/hooks/useOnSiteQuestions' export const shouldRevalidate: ShouldRevalidateFunction = () => false @@ -15,6 +16,7 @@ export default function App() { const clickDetectorRef = useOutsideOnClick(() => setShowSettings(false)) const [chatSettings, setChatSettings] = useState({mode: 'default'} as ChatSettings) const question = params.get('question') || undefined + const {selected: questions} = useOnSiteQuestions() useEffect(() => { setChatSettings( @@ -35,15 +37,7 @@ export default function App() { return ( <Page noFooter> <div className="page-body full-height padding-top-32"> - <Chatbot - question={question} - questions={[ - {text: 'What is AI Safety?', pageid: '8486'}, - {text: 'How would the AI even get out in the world?', pageid: '8222'}, - {text: 'Do people seriously worry about existential risk from AI?', pageid: '6953'}, - ]} - settings={chatSettings} - /> + <Chatbot question={question} questions={questions} settings={chatSettings} /> <div className="settings-container z-index-1" ref={clickDetectorRef}> {showSettings && ( <div className="settings bordered flex-container"> From d7cdd878cbafaa1e8908a586b42e7d2aa2c50430 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 11 Jun 2024 11:48:58 -0400 Subject: [PATCH 117/132] mobile fixes --- app/components/Chatbot/chat_entry.css | 6 ++++-- app/components/Chatbot/index.tsx | 11 +++++----- app/components/Chatbot/widgit.css | 29 +++++++++++++++++++++------ app/components/Input/input.css | 7 ++++--- app/root.css | 11 ++++++++-- app/routes/chat.tsx | 2 +- 6 files changed, 47 insertions(+), 19 deletions(-) diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 8ef1b6f0..14fb09d6 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -144,8 +144,10 @@ article.stampy { width: var(--spacing-32); height: var(--spacing-32); border-radius: var(--border-radius); - text-align: center; - line-height: 32px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; } .reference .source-link { diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 25fa4c48..19aa754b 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -84,10 +84,11 @@ const QuestionInput = ({ /> <SendIcon className="send pointer" onClick={() => handleAsk(question)} /> </div> - {fixed && <div className="white-space"></div>} + {fixed && <div className="white-space" />} - <div className="mobile-only grey padding-top-8"> - <ExclamationIcon /> <span>Stampy can be inaccurate. Always verify its sources.</span> + <div className="mobile-only grey mobile-caution xxs"> + <ExclamationIcon />{' '} + <span className="padding-left-4">Stampy can be inaccurate. Always verify its sources.</span> </div> </div> ) @@ -319,7 +320,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { <ChatEntry key={`chat-entry-${i}`} {...item} no={i} /> ))} - <div className="padding-bottom-128"> + <div className="followups-container"> {followups ? ( <Followups title="Continue the conversation" @@ -336,7 +337,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { fixed /> - <div className="desktop-only warning-floating"> + <div className="desktop-only warning-floating z-index-1"> <p className="xs"> <span className="red xs-bold">Caution! </span> This is an early prototype. Don’t automatically trust what it says, and make sure to diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index e22b32bf..7e801810 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -21,7 +21,7 @@ } .widget-ask.fixed { position: fixed; - bottom: var(--spacing-48); + bottom: 42px; } .right-icon { @@ -44,6 +44,12 @@ left: var(--spacing-32); } +.mobile-caution { + position: absolute; + top: calc(100% + var(--spacing-8)); + display: flex; +} + .settings { padding: var(--spacing-32); margin-bottom: var(--spacing-8); @@ -57,7 +63,8 @@ justify-content: start; padding: var(--spacing-8) var(--spacing-12); position: absolute; - top: calc(-1 * var(--spacing-56)); + bottom: 100%; + height: auto; } .widget-ask .suggestion:hover { @@ -66,16 +73,26 @@ .widget-ask .send { position: absolute; - right: 4px; - bottom: 4px; + right: var(--spacing-8); + bottom: var(--spacing-8); } .white-space { position: absolute; left: -1000px; width: calc(100% + 2000px); - height: 100px; - top: 100%; + height: 120px; + top: 0; z-index: -1; background: #ffffff; } + +.followups-container { + padding-bottom: calc(106px + var(--spacing-48)); +} + +@media (max-width: 780px) { + .widget-ask.fixed { + bottom: 56px; + } +} diff --git a/app/components/Input/input.css b/app/components/Input/input.css index a429dd9b..c491eb62 100644 --- a/app/components/Input/input.css +++ b/app/components/Input/input.css @@ -7,9 +7,9 @@ border: 1px solid var(--colors-cool-grey-200, #dfe3e9); background: var(--colors-white, #fff); color: var(--colors-cool-grey-900, #1b2b3e); - padding: var(--spacing-8) 0 var(--spacing-8) var(--spacing-12); + padding: var(--spacing-8) var(--height-48) var(--spacing-8) var(--spacing-12); /* This can't be a variable because it shouldn't shrink when the screen gets small */ - height: 48px; + height: var(--height-48); font-size: 16px; font-weight: 300; line-height: 170%; /* 27.2px */ @@ -24,9 +24,10 @@ /* size */ .input.large { - height: 56px; + height: var(--height-64); font-size: 18px; letter-spacing: -0.18px; + padding-right: var(--height-64); } /* states */ diff --git a/app/root.css b/app/root.css index a2b14600..14330e1f 100644 --- a/app/root.css +++ b/app/root.css @@ -164,6 +164,13 @@ h2 { letter-spacing: -0.14px; } +.xxs { + font-size: 12px; + font-weight: 300; + line-height: 150%; /* 23.8px */ + letter-spacing: -0.1px; +} + .leading-0 { line-height: 0 !important; } @@ -353,7 +360,7 @@ h2 { } .col-6 { - width: clamp(0px, 35.28vw, 640px); + width: clamp(270px, 35.28vw, 640px); } .col-7 { @@ -369,7 +376,7 @@ h2 { } .col-10 { - width: clamp(0px, 60.62vw, 1109px); + width: clamp(300px, 60.62vw, 1109px); } .col-11 { diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index a908c502..db619cfe 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -38,7 +38,7 @@ export default function App() { <Page noFooter> <div className="page-body full-height padding-top-32"> <Chatbot question={question} questions={questions} settings={chatSettings} /> - <div className="settings-container z-index-1" ref={clickDetectorRef}> + <div className="settings-container z-index-1 desktop-only" ref={clickDetectorRef}> {showSettings && ( <div className="settings bordered flex-container"> <div>Answer detail</div> From 24b6e7ed5210c7b66908c82717ef6410c32d24be Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 11 Jun 2024 15:15:03 -0400 Subject: [PATCH 118/132] Improved column spacing, Mobile feedback, & sundry fixes --- app/components/Article/article.css | 18 ++++++-- app/components/Article/index.tsx | 62 ++++++++++++++++------------ app/components/Button/button.css | 4 +- app/components/Button/index.tsx | 11 ++++- app/components/Chatbot/index.tsx | 14 +++++-- app/components/Chatbot/widgit.css | 23 ++++++----- app/components/Feedback/feedback.css | 5 ++- app/root.tsx | 2 +- app/routes/categories.$.tsx | 7 +++- 9 files changed, 95 insertions(+), 51 deletions(-) diff --git a/app/components/Article/article.css b/app/components/Article/article.css index c0e60b3f..5e93cded 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -192,6 +192,18 @@ article .banner h3 .title { padding-left: 10px; } +.footer-comtainer .edited-container { + display: flex; + align-items: center; + gap: var(--spacing-16); +} + +.footer-comtainer .feeback-container { + display: flex; + flex-direction: column; + gap: var(--spacing-12); +} + @media (min-width: 780px) { article .link-popup { position: absolute; @@ -212,15 +224,15 @@ article .banner h3 .title { padding: 0; } article .footer-comtainer { - flex-direction: row; - flex-wrap: wrap; + flex-direction: column; + align-items: start; } article .link-popup { width: 100%; } article .footer-comtainer > div:nth-child(-n + 2) { - flex: 1 1; + margin-right: var(--spacing-12s); } article { margin: 0; diff --git a/app/components/Article/index.tsx b/app/components/Article/index.tsx index ec051960..cf7fa41e 100644 --- a/app/components/Article/index.tsx +++ b/app/components/Article/index.tsx @@ -9,10 +9,13 @@ import {tagUrl} from '~/routesMapper' import type {Glossary, Question, Banner as BannerType} from '~/server-utils/stampy' import Contents from './Contents' import './article.css' +import useIsMobile from '~/hooks/isMobile' const isLoading = ({text}: Question) => !text || text === 'Loading...' const ArticleFooter = (question: Question) => { + const mobile = useIsMobile() + const date = question.updatedAt && new Date(question.updatedAt).toLocaleDateString('en-GB', { @@ -23,33 +26,38 @@ const ArticleFooter = (question: Question) => { return ( !isLoading(question) && ( <div className="footer-comtainer padding-bottom-40"> - {date && <div className="grey"> {`Updated ${date}`}</div>} - <CompositeButton secondary> - <Button - secondary - action={question.answerEditLink || ''} - tooltip="Google Doc" - props={{target: '_blank', rel: 'noopener noreferrer'}} - > - <EditIcon /> - </Button> - </CompositeButton> - <Feedback - showForm - pageid={question.pageid} - onSubmit={async (message: string, option?: string) => - logFeedback({ - message, - option, - type: 'bot', - question: question.title || '', - answer: question.text || '', - }) - } - options={['Unclear', 'Too wordy', 'Confusing', 'Incorrect', 'Other']} - upHint="This page was helpful" - downHint="This page was unhelpful" - /> + <div className="edited-container"> + {date && <div className="grey"> {`Updated ${date}`}</div>} + <CompositeButton secondary> + <Button + secondary + action={question.answerEditLink || ''} + tooltip="Google Doc" + props={{target: '_blank', rel: 'noopener noreferrer'}} + > + <EditIcon /> + </Button> + </CompositeButton> + </div> + <div className="feeback-container"> + {mobile && <p>Was this page helpful?</p>} + <Feedback + showForm + pageid={question.pageid} + onSubmit={async (message: string, option?: string) => + logFeedback({ + message, + option, + type: 'bot', + question: question.title || '', + answer: question.text || '', + }) + } + options={['Unclear', 'Too wordy', 'Confusing', 'Incorrect', 'Other']} + upHint="This page was helpful" + downHint="This page was unhelpful" + /> + </div> </div> ) ) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 0f4a5060..783d45da 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -232,8 +232,8 @@ align-items: center; padding: 7px; gap: var(--spacing-4); - min-width: min-content; - min-height: min-content; + max-width: min-content; + height: min-content; } .tooltip::after { diff --git a/app/components/Button/index.tsx b/app/components/Button/index.tsx index 2183cfdd..dbba0dbc 100644 --- a/app/components/Button/index.tsx +++ b/app/components/Button/index.tsx @@ -1,6 +1,7 @@ import {ReactNode} from 'react' import {Link} from '@remix-run/react' import './button.css' +import useIsMobile from '~/hooks/isMobile' type ButtonProps = { action?: string | (() => void) @@ -22,6 +23,8 @@ const Button = ({ active = false, props, }: ButtonProps) => { + const mobile = useIsMobile() + const classes = [ (secondary && 'button-secondary') || 'button', className, @@ -45,7 +48,9 @@ const Button = ({ {...props} > {children} - {secondary && tooltip && !disabled && <p className="tool-tip-secondary xs">{tooltip}</p>} + {secondary && tooltip && !disabled && !mobile && ( + <p className="tool-tip-secondary xs">{tooltip}</p> + )} </Link> ) } @@ -58,7 +63,9 @@ const Button = ({ {...props} > {children} - {secondary && tooltip && !disabled && <p className="tool-tip-secondary xs">{tooltip}</p>} + {secondary && tooltip && !disabled && !mobile && ( + <p className="tool-tip-secondary xs">{tooltip}</p> + )} </button> ) } diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 19aa754b..994ae7e8 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -14,6 +14,7 @@ import {questionUrl} from '~/routesMapper' import {Question} from '~/server-utils/stampy' import {useSearch} from '~/hooks/useSearch' import Input from '~/components/Input' +import useIsMobile from '~/hooks/isMobile' const MIN_SIMILARITY = 0.85 @@ -36,6 +37,7 @@ const QuestionInput = ({ const [question, setQuestion] = useState(initial || '') const {results, search, clear} = useSearch(1) const clickDetectorRef = useOutsideOnClick(() => handleChange('')) + const mobile = useIsMobile() const handleAsk = (val: string) => { clear() @@ -57,7 +59,10 @@ const QuestionInput = ({ return ( <div - className={'widget-ask ' + (fixed ? 'fixed col-10 z-index-1' : 'col-9')} + className={ + 'widget-ask ' + + (fixed ? `fixed z-index-1 ${mobile ? 'mobile-chat-width' : 'col-10'}` : 'col-9') + } ref={clickDetectorRef} > {results.length > 0 ? ( @@ -86,7 +91,7 @@ const QuestionInput = ({ </div> {fixed && <div className="white-space" />} - <div className="mobile-only grey mobile-caution xxs"> + <div className="mobile-only grey mobile-caution xxs padding-top-8"> <ExclamationIcon />{' '} <span className="padding-left-4">Stampy can be inaccurate. Always verify its sources.</span> </div> @@ -157,7 +162,7 @@ const Followups = ({title, followups, onSelect, className}: FollowupsProps) => { {items?.map(({text, pageid}, i) => ( <div key={i} className="padding-bottom-16"> <Button - className="secondary-alt-large text-align-left" + className="secondary-alt-large text-align-left followup-button" action={() => onSelect({text, pageid})} > {text} @@ -201,6 +206,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { const [controller, setController] = useState(() => new AbortController()) const fetcher = useFetcher({key: 'followup-fetcher'}) const {search, resultsForRef, waitForResults, loadedQuestions} = useSearch(1) + const mobile = useIsMobile() // When a page needs to be loaded fetcher.load(url) is called and then this // effect takes care of filling in the content of the StampyArticle ChatEntry @@ -309,7 +315,7 @@ export const Chatbot = ({question, questions, settings}: ChatbotProps) => { }, [loadedQuestions, question]) return ( - <div className="centered col-10 height-70"> + <div className={`centered height-70 ${mobile ? 'mobile-chat-width' : 'col-10'}`}> {history.length === 0 ? ( <SplashScreen questions={questions?.map(({title, pageid}) => ({pageid, text: title}))} diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 7e801810..0e5be7a6 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -10,12 +10,6 @@ background: var(--colors-cool-grey-100); } -@media (max-width: 780px) { - .button { - width: 100%; - } -} - .widget-ask { position: relative; } @@ -45,8 +39,6 @@ } .mobile-caution { - position: absolute; - top: calc(100% + var(--spacing-8)); display: flex; } @@ -88,11 +80,22 @@ } .followups-container { - padding-bottom: calc(106px + var(--spacing-48)); + padding-bottom: calc(106px + var(--spacing-80)); +} + +.followup-button { + justify-content: left !important; +} + +.mobile-chat-width { + width: 87.2vw; } @media (max-width: 780px) { + .button { + width: 100%; + } .widget-ask.fixed { - bottom: 56px; + bottom: var(--spacing-16); } } diff --git a/app/components/Feedback/feedback.css b/app/components/Feedback/feedback.css index 19700d07..93efef72 100644 --- a/app/components/Feedback/feedback.css +++ b/app/components/Feedback/feedback.css @@ -81,6 +81,9 @@ @media (max-width: 780px) { .feedback-form { - left: -20px; + position: fixed; + left: 6.4vw; + bottom: var(--spacing-80); + width: 87.2vw; } } diff --git a/app/root.tsx b/app/root.tsx index e1300672..bd6bc8ef 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -133,7 +133,7 @@ function Head() { return ( <head> <meta charSet="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> + <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" /> {/* don't use color-scheme because supporting transparent iframes https://fvsch.com/transparent-iframes is more important than dark reader https://github.com/darkreader/darkreader/issues/1285#issuecomment-761893024 <meta name="color-scheme" content="light dark" /> diff --git a/app/routes/categories.$.tsx b/app/routes/categories.$.tsx index f06f5775..26de0a41 100644 --- a/app/routes/categories.$.tsx +++ b/app/routes/categories.$.tsx @@ -56,7 +56,12 @@ export default function Tags() { ? 'No pages found' : `${selectedTag.questions.length} pages tagged "${selectedTag.name}"`} </div> - {selectedTag && <ListTable className="col-8" elements={selectedTag.questions} />} + {selectedTag && ( + <ListTable + className={mobile ? 'full-width' : 'col-8'} + elements={selectedTag.questions} + /> + )} </article> )} </> From 32f9cb21c2bb85bd23d9403e541560c8c72f5ea6 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 11 Jun 2024 15:17:55 -0400 Subject: [PATCH 119/132] typo --- app/components/Article/article.css | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 5e93cded..0195b481 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -231,9 +231,7 @@ article .banner h3 .title { article .link-popup { width: 100%; } - article .footer-comtainer > div:nth-child(-n + 2) { - margin-right: var(--spacing-12s); - } + article { margin: 0; } From f575ae233590f376af407ac5e7db86c11408cdc4 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 11 Jun 2024 15:35:57 -0400 Subject: [PATCH 120/132] apostrophe --- app/components/Chatbot/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 994ae7e8..128e5d9f 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -183,7 +183,7 @@ const SplashScreen = ({ <div className="padding-top-40"> <IconStampyLarge /> <div className="col-6 padding-bottom-40 padding-top-40"> - <h2 className="teal-500">Hi there, I'm Stampy.</h2> + <h2 className="teal-500">Hi there, I’m Stampy.</h2> <h2>I can answer your questions about AI Safety.</h2> </div> <Followups From 62830936d466353a9ca26754fc794586de89c481 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 11 Jun 2024 15:51:17 -0400 Subject: [PATCH 121/132] cheeky spacing --- app/components/Chatbot/widgit.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 0e5be7a6..90f4f579 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -73,7 +73,7 @@ position: absolute; left: -1000px; width: calc(100% + 2000px); - height: 120px; + height: 250px; top: 0; z-index: -1; background: #ffffff; From 809b78311972b01c989b1a9fbd0281c4bad5a2bc Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 11 Jun 2024 23:18:46 -0400 Subject: [PATCH 122/132] misc fixes --- app/assets/icons/settings.svg | 4 ++-- app/components/Button/button.css | 22 +++++++++------------ app/components/Button/index.tsx | 18 +++++------------ app/components/Chatbot/ChatEntry.tsx | 2 +- app/components/Chatbot/chat_entry.css | 20 +++++++++++++------ app/components/Chatbot/index.tsx | 2 +- app/components/icons-generated/Settings.tsx | 2 +- app/components/popups.ts | 2 +- app/root.css | 3 +++ app/routes/chat.tsx | 5 ++++- 10 files changed, 41 insertions(+), 39 deletions(-) diff --git a/app/assets/icons/settings.svg b/app/assets/icons/settings.svg index e5a29e46..53361438 100644 --- a/app/assets/icons/settings.svg +++ b/app/assets/icons/settings.svg @@ -1,4 +1,4 @@ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <circle cx="12" cy="12" r="4.5" stroke="#1D9089" stroke-linecap="square" stroke-linejoin="round"/> -<path d="M20.8829 15.122C21.0154 15.2796 21.0377 15.5023 20.9392 15.6831L19.5019 18.3193C19.3958 18.5139 19.1744 18.6154 18.9578 18.5688L17.6328 18.2838L17.6323 18.2837C16.9511 18.1365 16.2411 18.2581 15.6352 18.6295C15.0284 19.0016 14.5653 19.6007 14.3414 20.3188L14.3402 20.3227L14.3402 20.3227L13.9135 21.6527C13.8471 21.8597 13.6547 22 13.4374 22H10.5629C10.3419 22 10.147 21.8549 10.0838 21.6431L9.68048 20.2923C9.45632 19.5754 8.99359 18.9773 8.38756 18.6058C7.78166 18.2343 7.07165 18.1127 6.39048 18.26L6.38998 18.2601L5.06501 18.5451C4.84992 18.5913 4.62985 18.4916 4.52291 18.2993L3.0632 15.6749C2.96238 15.4936 2.98394 15.269 3.1174 15.1102L4.01568 14.0414L4.01666 14.0402C4.49071 13.4797 4.75622 12.7494 4.75622 11.9881C4.75622 11.2269 4.49071 10.4965 4.01667 9.936L4.01568 9.93483L3.1174 8.86608C2.98449 8.70795 2.9625 8.48436 3.06208 8.30337L4.49933 5.69087C4.60579 5.49735 4.82662 5.39661 5.04255 5.44306L6.36752 5.72806L6.36803 5.72816C7.04919 5.87542 7.7592 5.75381 8.3651 5.38234C8.9719 5.01032 9.43503 4.4112 9.65887 3.69309L9.65972 3.69036L9.65973 3.69036L10.0864 2.34849C10.1524 2.14095 10.3451 2 10.5629 2H13.4374C13.6556 2 13.8487 2.14155 13.9143 2.3497L14.341 3.70345L14.3414 3.70496C14.5653 4.42308 15.0284 5.0222 15.6352 5.39422C16.2411 5.76568 16.9511 5.8873 17.6323 5.74004L17.6328 5.73993L18.9578 5.45493C19.1744 5.40833 19.3958 5.50987 19.5019 5.70441L20.9392 8.34066C21.0377 8.52142 21.0154 8.74411 20.8829 8.90171L19.9851 9.96993L20.8829 15.122ZM20.8829 15.122L19.9851 14.0538M20.8829 15.122L19.9851 14.0538M19.9851 14.0538L19.9846 14.0533C19.5161 13.4941 19.2541 12.7681 19.2541 12.0119C19.2541 11.2557 19.5161 10.5297 19.9846 9.97046L19.9851 14.0538Z" stroke="#1D9089" stroke-linecap="square" stroke-linejoin="round"/> -</svg> +<path d="M20.8829 15.122C21.0154 15.2796 21.0377 15.5023 20.9392 15.6831L19.5019 18.3193C19.3958 18.5139 19.1744 18.6154 18.9578 18.5688L17.6328 18.2838L17.6323 18.2837C16.9511 18.1365 16.2411 18.2581 15.6352 18.6295C15.0284 19.0016 14.5653 19.6007 14.3414 20.3188L14.3402 20.3227L14.3402 20.3227L13.9135 21.6527C13.8471 21.8597 13.6547 22 13.4374 22H10.5629C10.3419 22 10.147 21.8549 10.0838 21.6431L9.68046 20.2923C9.4563 19.5754 8.99358 18.9773 8.38756 18.6058C7.78166 18.2343 7.07165 18.1127 6.39048 18.26L6.38998 18.2601L5.06501 18.5451C4.84992 18.5913 4.62985 18.4916 4.52291 18.2993L3.0632 15.6749C2.96238 15.4936 2.98394 15.269 3.1174 15.1102L4.01568 14.0414L4.01666 14.0402C4.49071 13.4797 4.75622 12.7494 4.75622 11.9881C4.75622 11.2269 4.49071 10.4965 4.01667 9.936L4.01568 9.93483L3.1174 8.86608C2.98449 8.70795 2.9625 8.48436 3.06208 8.30337L4.49933 5.69087C4.60579 5.49735 4.82662 5.39661 5.04255 5.44306L6.36752 5.72806L6.36803 5.72816C7.04919 5.87542 7.7592 5.75381 8.3651 5.38234C8.9719 5.01032 9.43503 4.4112 9.65887 3.69309L9.65972 3.69036L9.65973 3.69036L10.0864 2.34849C10.1524 2.14095 10.3451 2 10.5629 2H13.4374C13.6556 2 13.8487 2.14155 13.9143 2.3497L14.341 3.70345L14.3414 3.70496C14.5653 4.42308 15.0284 5.0222 15.6352 5.39422C16.2411 5.76568 16.9511 5.8873 17.6323 5.74004L17.6328 5.73993L18.9578 5.45493C19.1744 5.40833 19.3958 5.50987 19.5019 5.70441L20.9392 8.34066C21.0377 8.52142 21.0154 8.74411 20.8829 8.90171L19.9851 9.96993C19.985 9.97007 19.9849 9.9702 19.9847 9.97033C19.5162 10.5296 19.2541 11.2556 19.2541 12.0119C19.2541 12.7681 19.5161 13.4941 19.9846 14.0533L20.8829 15.122ZM20.8829 15.122L19.9851 14.0538L20.8829 15.122Z" stroke="#1D9089" stroke-linecap="square" stroke-linejoin="round"/> +</svg> \ No newline at end of file diff --git a/app/components/Button/button.css b/app/components/Button/button.css index 783d45da..f3c7ff28 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -9,6 +9,7 @@ box-shadow: 0px var(--spacing-16) var(--spacing-40) 0px rgba(32, 44, 89, 0.05); border-radius: var(--border-radius); box-sizing: border-box; + position: relative; background: var(--colors-white, #ffffff); border: 1px solid var(--colors-cool-grey-200, #dfe3e9); @@ -167,6 +168,9 @@ .button-secondary:hover .tool-tip-secondary { opacity: 1; } +.button:hover .tool-tip-secondary { + opacity: 1; +} .active path { stroke: var(--colors-teal-600); @@ -236,19 +240,6 @@ height: min-content; } -.tooltip::after { - content: attr(data-tooltip); - position: absolute; - transform: translateY(var(--spacing-56, 56px)); - padding: var(--spacing-16); - color: var(--colors-white); - background: var(--colors-black); - border-radius: 5px; - display: none; - z-index: 1; - font-size: 16px; /* hard to set via classes, what with this being a pseudoclass */ -} - .tool-tip-secondary { opacity: 0; position: absolute; @@ -273,3 +264,8 @@ opacity: 0.6; cursor: inherit; } +.button-secondary:disabled, +.button-secondary[disabled] { + opacity: 0.8; + cursor: inherit; +} diff --git a/app/components/Button/index.tsx b/app/components/Button/index.tsx index dbba0dbc..da6ef7c1 100644 --- a/app/components/Button/index.tsx +++ b/app/components/Button/index.tsx @@ -28,7 +28,6 @@ const Button = ({ const classes = [ (secondary && 'button-secondary') || 'button', className, - tooltip && !secondary && 'tooltip', secondary && active && 'active', secondary && !active && !disabled && 'inactive', ] @@ -39,7 +38,6 @@ const Button = ({ <Link to={action} className={classes} - data-tooltip={tooltip} onClick={(e) => { if (disabled) { e.preventDefault() @@ -48,23 +46,17 @@ const Button = ({ {...props} > {children} - {secondary && tooltip && !disabled && !mobile && ( - <p className="tool-tip-secondary xs">{tooltip}</p> + {tooltip && !disabled && !mobile && ( + <p className="tool-tip-secondary xs z-index-1">{tooltip}</p> )} </Link> ) } return ( - <button - className={classes} - onClick={action} - data-tooltip={tooltip} - disabled={disabled} - {...props} - > + <button className={classes} onClick={action} disabled={disabled} {...props}> {children} - {secondary && tooltip && !disabled && !mobile && ( - <p className="tool-tip-secondary xs">{tooltip}</p> + {tooltip && !disabled && !mobile && ( + <p className="tool-tip-secondary xs z-index-1">{tooltip}</p> )} </button> ) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index a716daaa..2293b192 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -123,7 +123,7 @@ const ReferencePopup = ( className={`reference-popup background z-index-2 ${citation.className || ''}`} onClick={citation.onClose} > - <div className="reference-contents bordered"> + <div onClick={(e) => e.stopPropagation()} className="reference-contents bordered"> <ReferenceSummary {...citation} titleClass="large-bold" /> <div className="grey padding-bottom-16 padding-top-32 xs">Referenced excerpt</div> <div diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index 14fb09d6..cba79647 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -177,12 +177,11 @@ article.stampy { transform: translate(-50%, 35px); min-width: 30vw; } -} - -.reference-popup:hover, -.reference-link:hover + .reference-popup { - visibility: visible; - transition-delay: 0s; + .reference-popup:hover, + .reference-link:hover + .reference-popup { + visibility: visible; + transition-delay: 0s; + } } .chat-entry article { @@ -195,4 +194,13 @@ article.stampy { align-items: start; justify-content: flex-start; } + .reference-contents { + flex-shrink: 0; + width: 87.2vw; + margin-top: 48px; + } + .reference-popup { + display: flex; + flex-direction: column; + } } diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 128e5d9f..491bdd22 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -157,7 +157,7 @@ const Followups = ({title, followups, onSelect, className}: FollowupsProps) => { ].slice(0, 3) return ( <> - {title && <div className={'padding-bottom-24 grey' + (className || '')}>{title}</div>} + {title && <div className={'padding-bottom-24' + (className || '')}>{title}</div>} {items?.map(({text, pageid}, i) => ( <div key={i} className="padding-bottom-16"> diff --git a/app/components/icons-generated/Settings.tsx b/app/components/icons-generated/Settings.tsx index b0f93ef4..df61d616 100644 --- a/app/components/icons-generated/Settings.tsx +++ b/app/components/icons-generated/Settings.tsx @@ -13,7 +13,7 @@ const SvgSettings = (props: SVGProps<SVGSVGElement>) => ( stroke="#1D9089" strokeLinecap="square" strokeLinejoin="round" - d="M20.883 15.122a.5.5 0 0 1 .056.561l-1.437 2.636a.5.5 0 0 1-.544.25l-1.325-.285h0a2.7 2.7 0 0 0-1.998.346 3.03 3.03 0 0 0-1.294 1.689v.004h0l-.427 1.33a.5.5 0 0 1-.477.347h-2.874a.5.5 0 0 1-.48-.357l-.403-1.35a3.03 3.03 0 0 0-1.292-1.687 2.7 2.7 0 0 0-1.998-.346h0l-1.325.285a.5.5 0 0 1-.542-.246l-1.46-2.624a.5.5 0 0 1 .054-.565l.899-1.069h0c.475-.561.74-1.292.74-2.053s-.265-1.492-.74-2.052v-.001l-.899-1.069a.5.5 0 0 1-.055-.563L4.5 5.691a.5.5 0 0 1 .544-.248l1.325.285h0a2.7 2.7 0 0 0 1.997-.346A3.03 3.03 0 0 0 9.66 3.693V3.69h0l.427-1.342A.5.5 0 0 1 10.563 2h2.874a.5.5 0 0 1 .477.35l.427 1.353v.002a3.03 3.03 0 0 0 1.294 1.69 2.7 2.7 0 0 0 1.997.345h0l1.326-.285a.5.5 0 0 1 .544.25l1.437 2.636a.5.5 0 0 1-.056.56l-.898 1.069zm0 0-.898-1.068m.898 1.068-.898-1.068m0 0h0a3.18 3.18 0 0 1-.73-2.042c0-.756.261-1.482.73-2.042z" + d="M20.883 15.122a.5.5 0 0 1 .056.561l-1.437 2.636a.5.5 0 0 1-.544.25l-1.325-.285h0a2.7 2.7 0 0 0-1.998.346 3.03 3.03 0 0 0-1.294 1.689v.004h0l-.427 1.33a.5.5 0 0 1-.477.347h-2.874a.5.5 0 0 1-.48-.357l-.403-1.35a3.03 3.03 0 0 0-1.292-1.687 2.7 2.7 0 0 0-1.998-.346h0l-1.325.285a.5.5 0 0 1-.542-.246l-1.46-2.624a.5.5 0 0 1 .054-.565l.899-1.069h0c.475-.561.74-1.292.74-2.053s-.265-1.492-.74-2.052v-.001l-.899-1.069a.5.5 0 0 1-.055-.563L4.5 5.691a.5.5 0 0 1 .544-.248l1.325.285h0a2.7 2.7 0 0 0 1.997-.346A3.03 3.03 0 0 0 9.66 3.693V3.69h0l.427-1.342A.5.5 0 0 1 10.563 2h2.874a.5.5 0 0 1 .477.35l.427 1.353v.002a3.03 3.03 0 0 0 1.294 1.69 2.7 2.7 0 0 0 1.997.345h0l1.326-.285a.5.5 0 0 1 .544.25l1.437 2.636a.5.5 0 0 1-.056.56l-.898 1.069q0 0 0 0a3.18 3.18 0 0 0-.73 2.042c0 .756.261 1.482.73 2.041zm0 0-.898-1.068z" /> </svg> ) diff --git a/app/components/popups.ts b/app/components/popups.ts index 3a8fdc52..d682ee4f 100644 --- a/app/components/popups.ts +++ b/app/components/popups.ts @@ -1,5 +1,5 @@ export const scrollToElement = (e: HTMLElement, offset?: number) => { - const elementPosition = e.getBoundingClientRect().top + window.pageYOffset + const elementPosition = e.getBoundingClientRect().top + window.scrollY const offsetPosition = elementPosition - (offset || 0) window.scrollTo({top: offsetPosition, behavior: 'smooth'}) diff --git a/app/root.css b/app/root.css index 14330e1f..688cf9ae 100644 --- a/app/root.css +++ b/app/root.css @@ -561,6 +561,9 @@ svg { /* mobile */ @media (max-width: 780px) { + body { + overflow-x: hidden; + } .page-body { padding: 0px var(--spacing-48); } diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index db619cfe..b1203edd 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -28,7 +28,10 @@ export default function App() { const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( <Button className={chatSettings.mode === mode ? 'secondary-selected' : 'secondary'} - action={() => setChatSettings({...chatSettings, mode})} + action={() => { + setShowSettings(false) + setChatSettings({...chatSettings, mode}) + }} > {name} </Button> From 5e6f13acdb47b59e6f45fde1d50c4e0849e2c997 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Tue, 11 Jun 2024 23:21:49 -0400 Subject: [PATCH 123/132] rename --- app/components/Button/button.css | 6 +++--- app/components/Button/index.tsx | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/components/Button/button.css b/app/components/Button/button.css index f3c7ff28..14da2b39 100644 --- a/app/components/Button/button.css +++ b/app/components/Button/button.css @@ -165,10 +165,10 @@ border: 1px solid var(--colors-teal-200, #a6d9d7); } -.button-secondary:hover .tool-tip-secondary { +.button-secondary:hover .tool-tip { opacity: 1; } -.button:hover .tool-tip-secondary { +.button:hover .tool-tip { opacity: 1; } @@ -240,7 +240,7 @@ height: min-content; } -.tool-tip-secondary { +.tool-tip { opacity: 0; position: absolute; top: -42px; diff --git a/app/components/Button/index.tsx b/app/components/Button/index.tsx index da6ef7c1..788708f6 100644 --- a/app/components/Button/index.tsx +++ b/app/components/Button/index.tsx @@ -46,18 +46,14 @@ const Button = ({ {...props} > {children} - {tooltip && !disabled && !mobile && ( - <p className="tool-tip-secondary xs z-index-1">{tooltip}</p> - )} + {tooltip && !disabled && !mobile && <p className="tool-tip xs z-index-1">{tooltip}</p>} </Link> ) } return ( <button className={classes} onClick={action} disabled={disabled} {...props}> {children} - {tooltip && !disabled && !mobile && ( - <p className="tool-tip-secondary xs z-index-1">{tooltip}</p> - )} + {tooltip && !disabled && !mobile && <p className="tool-tip xs z-index-1">{tooltip}</p>} </button> ) } From 138e3013ceed53826e8f3953014f028efb3be280 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Wed, 12 Jun 2024 21:53:25 -0400 Subject: [PATCH 124/132] misc fixes --- app/components/Article/Contents.tsx | 8 +++++++- app/components/Article/article.css | 9 +++++++-- app/components/Chatbot/chat_entry.css | 9 +++++++-- app/root.css | 3 --- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/components/Article/Contents.tsx b/app/components/Article/Contents.tsx index 500edb86..ba16a848 100644 --- a/app/components/Article/Contents.tsx +++ b/app/components/Article/Contents.tsx @@ -20,7 +20,12 @@ const footnoteHTML = (el: HTMLDivElement, e: HTMLAnchorElement): string | null = return elem.firstElementChild?.innerHTML || null } -const addPopup = (e: HTMLElement, id: string, contents: string, mobile?: boolean): HTMLElement => { +const addPopup = ( + e: HTMLElement, + id: string, + contents: string, + mobile: boolean = window?.innerWidth <= 780 +): HTMLElement => { const preexisting = document.getElementById(id) if (preexisting) return preexisting @@ -40,6 +45,7 @@ const addPopup = (e: HTMLElement, id: string, contents: string, mobile?: boolean const toggle = () => popup.classList.toggle('shown') popup.addEventListener('click', togglePopup(toggle, e)) e.addEventListener('click', togglePopup(toggle, e)) + popup.children[0].addEventListener('click', (e) => e.stopPropagation()) } return popup diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 0195b481..51d84783 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -107,7 +107,7 @@ article .link-popup { } article .link-popup .footnote { - padding: var(--spacing-32) var(--spacing-32) 0 var(--spacing-32); + padding: var(--spacing-32) var(--spacing-32) var(--spacing-32) var(--spacing-32); } article .footnote-ref { @@ -115,7 +115,6 @@ article .footnote-ref { } article .glossary-popup { - width: 522px; height: 304px; } @@ -227,6 +226,12 @@ article .banner h3 .title { flex-direction: column; align-items: start; } + article .link-popup .footnote { + margin-top: 42px; + } + article .glossary-popup { + margin-top: 50px; + } article .link-popup { width: 100%; diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index cba79647..bd565141 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -47,7 +47,7 @@ article.stampy { right: 0; transform: translateX(50%); visibility: hidden; - width: 256px; + max-width: 256px; padding-top: 120%; z-index: 100; } @@ -57,6 +57,8 @@ article.stampy { color: white; padding: var(--spacing-16); border-radius: var(--border-radius); + width: max-content; /* Make the width adapt to its content */ + max-width: 100%; } .chat-entry .hint-contents-container:hover, @@ -197,10 +199,13 @@ article.stampy { .reference-contents { flex-shrink: 0; width: 87.2vw; - margin-top: 48px; + margin-top: 46px; } .reference-popup { display: flex; flex-direction: column; } + .chat-entry .hint-contents-container { + transform: translateX(10%); + } } diff --git a/app/root.css b/app/root.css index 688cf9ae..14330e1f 100644 --- a/app/root.css +++ b/app/root.css @@ -561,9 +561,6 @@ svg { /* mobile */ @media (max-width: 780px) { - body { - overflow-x: hidden; - } .page-body { padding: 0px var(--spacing-48); } From d62b1f200f00c9066ac687012a69906b0b6efe01 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Thu, 13 Jun 2024 19:18:10 -0400 Subject: [PATCH 125/132] fixed setting squish --- app/assets/icons/settings.svg | 5 +---- app/components/Chatbot/widgit.css | 4 ++++ app/components/icons-generated/Settings.tsx | 20 ++++++++------------ app/routes/chat.tsx | 3 ++- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/app/assets/icons/settings.svg b/app/assets/icons/settings.svg index 53361438..9b62cba9 100644 --- a/app/assets/icons/settings.svg +++ b/app/assets/icons/settings.svg @@ -1,4 +1 @@ -<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> -<circle cx="12" cy="12" r="4.5" stroke="#1D9089" stroke-linecap="square" stroke-linejoin="round"/> -<path d="M20.8829 15.122C21.0154 15.2796 21.0377 15.5023 20.9392 15.6831L19.5019 18.3193C19.3958 18.5139 19.1744 18.6154 18.9578 18.5688L17.6328 18.2838L17.6323 18.2837C16.9511 18.1365 16.2411 18.2581 15.6352 18.6295C15.0284 19.0016 14.5653 19.6007 14.3414 20.3188L14.3402 20.3227L14.3402 20.3227L13.9135 21.6527C13.8471 21.8597 13.6547 22 13.4374 22H10.5629C10.3419 22 10.147 21.8549 10.0838 21.6431L9.68046 20.2923C9.4563 19.5754 8.99358 18.9773 8.38756 18.6058C7.78166 18.2343 7.07165 18.1127 6.39048 18.26L6.38998 18.2601L5.06501 18.5451C4.84992 18.5913 4.62985 18.4916 4.52291 18.2993L3.0632 15.6749C2.96238 15.4936 2.98394 15.269 3.1174 15.1102L4.01568 14.0414L4.01666 14.0402C4.49071 13.4797 4.75622 12.7494 4.75622 11.9881C4.75622 11.2269 4.49071 10.4965 4.01667 9.936L4.01568 9.93483L3.1174 8.86608C2.98449 8.70795 2.9625 8.48436 3.06208 8.30337L4.49933 5.69087C4.60579 5.49735 4.82662 5.39661 5.04255 5.44306L6.36752 5.72806L6.36803 5.72816C7.04919 5.87542 7.7592 5.75381 8.3651 5.38234C8.9719 5.01032 9.43503 4.4112 9.65887 3.69309L9.65972 3.69036L9.65973 3.69036L10.0864 2.34849C10.1524 2.14095 10.3451 2 10.5629 2H13.4374C13.6556 2 13.8487 2.14155 13.9143 2.3497L14.341 3.70345L14.3414 3.70496C14.5653 4.42308 15.0284 5.0222 15.6352 5.39422C16.2411 5.76568 16.9511 5.8873 17.6323 5.74004L17.6328 5.73993L18.9578 5.45493C19.1744 5.40833 19.3958 5.50987 19.5019 5.70441L20.9392 8.34066C21.0377 8.52142 21.0154 8.74411 20.8829 8.90171L19.9851 9.96993C19.985 9.97007 19.9849 9.9702 19.9847 9.97033C19.5162 10.5296 19.2541 11.2556 19.2541 12.0119C19.2541 12.7681 19.5161 13.4941 19.9846 14.0533L20.8829 15.122ZM20.8829 15.122L19.9851 14.0538L20.8829 15.122Z" stroke="#1D9089" stroke-linecap="square" stroke-linejoin="round"/> -</svg> \ No newline at end of file +<svg width="24px" height="24px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <g id="style=linear"> <g id="setting"> <path id="vector" d="M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z" stroke="#1D9089" stroke-width="1.152" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> <path id="vector_2" d="M2 12.88V11.12C2 10.08 2.85 9.22 3.9 9.22C5.71 9.22 6.45 7.94 5.54 6.37C5.02 5.47 5.33 4.3 6.24 3.78L7.97 2.79C8.76 2.32 9.78 2.6 10.25 3.39L10.36 3.58C11.26 5.15 12.74 5.15 13.65 3.58L13.76 3.39C14.23 2.6 15.25 2.32 16.04 2.79L17.77 3.78C18.68 4.3 18.99 5.47 18.47 6.37C17.56 7.94 18.3 9.22 20.11 9.22C21.15 9.22 22.01 10.07 22.01 11.12V12.88C22.01 13.92 21.16 14.78 20.11 14.78C18.3 14.78 17.56 16.06 18.47 17.63C18.99 18.54 18.68 19.7 17.77 20.22L16.04 21.21C15.25 21.68 14.23 21.4 13.76 20.61L13.65 20.42C12.75 18.85 11.27 18.85 10.36 20.42L10.25 20.61C9.78 21.4 8.76 21.68 7.97 21.21L6.24 20.22C5.33 19.7 5.02 18.53 5.54 17.63C6.45 16.06 5.71 14.78 3.9 14.78C2.85 14.78 2 13.92 2 12.88Z" stroke="#1D9089" stroke-width="1.152" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> </g> </g> </g></svg> \ No newline at end of file diff --git a/app/components/Chatbot/widgit.css b/app/components/Chatbot/widgit.css index 90f4f579..a300aec7 100644 --- a/app/components/Chatbot/widgit.css +++ b/app/components/Chatbot/widgit.css @@ -50,6 +50,10 @@ width: 384px; } +.settings-icon { + rotate: 30deg; +} + .widget-ask .suggestion { border: 1px solid var(--colors-cool-grey-200, #dfe3e9); justify-content: start; diff --git a/app/components/icons-generated/Settings.tsx b/app/components/icons-generated/Settings.tsx index df61d616..2d4bab48 100644 --- a/app/components/icons-generated/Settings.tsx +++ b/app/components/icons-generated/Settings.tsx @@ -1,20 +1,16 @@ import type {SVGProps} from 'react' const SvgSettings = (props: SVGProps<SVGSVGElement>) => ( <svg xmlns="http://www.w3.org/2000/svg" width={24} height={24} fill="none" {...props}> - <circle - cx={12} - cy={12} - r={4.5} + <g stroke="#1D9089" - strokeLinecap="square" + strokeLinecap="round" strokeLinejoin="round" - /> - <path - stroke="#1D9089" - strokeLinecap="square" - strokeLinejoin="round" - d="M20.883 15.122a.5.5 0 0 1 .056.561l-1.437 2.636a.5.5 0 0 1-.544.25l-1.325-.285h0a2.7 2.7 0 0 0-1.998.346 3.03 3.03 0 0 0-1.294 1.689v.004h0l-.427 1.33a.5.5 0 0 1-.477.347h-2.874a.5.5 0 0 1-.48-.357l-.403-1.35a3.03 3.03 0 0 0-1.292-1.687 2.7 2.7 0 0 0-1.998-.346h0l-1.325.285a.5.5 0 0 1-.542-.246l-1.46-2.624a.5.5 0 0 1 .054-.565l.899-1.069h0c.475-.561.74-1.292.74-2.053s-.265-1.492-.74-2.052v-.001l-.899-1.069a.5.5 0 0 1-.055-.563L4.5 5.691a.5.5 0 0 1 .544-.248l1.325.285h0a2.7 2.7 0 0 0 1.997-.346A3.03 3.03 0 0 0 9.66 3.693V3.69h0l.427-1.342A.5.5 0 0 1 10.563 2h2.874a.5.5 0 0 1 .477.35l.427 1.353v.002a3.03 3.03 0 0 0 1.294 1.69 2.7 2.7 0 0 0 1.997.345h0l1.326-.285a.5.5 0 0 1 .544.25l1.437 2.636a.5.5 0 0 1-.056.56l-.898 1.069q0 0 0 0a3.18 3.18 0 0 0-.73 2.042c0 .756.261 1.482.73 2.041zm0 0-.898-1.068z" - /> + strokeMiterlimit={10} + strokeWidth={1.152} + > + <path d="M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6" /> + <path d="M2 12.88v-1.76c0-1.04.85-1.9 1.9-1.9 1.81 0 2.55-1.28 1.64-2.85-.52-.9-.21-2.07.7-2.59l1.73-.99c.79-.47 1.81-.19 2.28.6l.11.19c.9 1.57 2.38 1.57 3.29 0l.11-.19c.47-.79 1.49-1.07 2.28-.6l1.73.99c.91.52 1.22 1.69.7 2.59-.91 1.57-.17 2.85 1.64 2.85 1.04 0 1.9.85 1.9 1.9v1.76c0 1.04-.85 1.9-1.9 1.9-1.81 0-2.55 1.28-1.64 2.85.52.91.21 2.07-.7 2.59l-1.73.99c-.79.47-1.81.19-2.28-.6l-.11-.19c-.9-1.57-2.38-1.57-3.29 0l-.11.19c-.47.79-1.49 1.07-2.28.6l-1.73-.99a1.9 1.9 0 0 1-.7-2.59c.91-1.57.17-2.85-1.64-2.85-1.05 0-1.9-.86-1.9-1.9" /> + </g> </svg> ) export default SvgSettings diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index b1203edd..57a1b57c 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -7,6 +7,7 @@ import {ChatSettings, Mode} from '~/hooks/useChat' import Button from '~/components/Button' import useOutsideOnClick from '~/hooks/useOnOutsideClick' import useOnSiteQuestions from '~/hooks/useOnSiteQuestions' +import '~/components/Chatbot/widgit.css' export const shouldRevalidate: ShouldRevalidateFunction = () => false @@ -53,7 +54,7 @@ export default function App() { <SettingsIcon width="24" height="24" - className="pointer" + className="pointer settings-icon" onClick={() => setShowSettings((current) => !current)} /> </div> From 8f1d784aeb92ce3f5736ce2fecf021606c266b28 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sun, 16 Jun 2024 19:46:38 -0400 Subject: [PATCH 126/132] Mobile issues fixed, bugs fixed, improved search --- app/components/Article/Contents.tsx | 2 +- app/components/Article/article.css | 3 ++- app/components/Button/index.tsx | 7 +++--- app/components/Chatbot/ChatEntry.tsx | 14 ++++++++---- app/components/Chatbot/chat_entry.css | 6 +++++- app/components/Chatbot/index.tsx | 3 --- app/components/Feedback/index.tsx | 4 +++- app/components/Nav/Mobile/index.tsx | 2 +- app/components/Nav/Mobile/navMobile.css | 4 ---- app/components/SearchResults/Dropdown.tsx | 4 ++-- app/components/SearchResults/dropdown.css | 5 ++++- app/components/search.tsx | 6 +++++- app/root.css | 6 +++++- app/routes/chat.tsx | 26 +++++++++++++---------- app/routes/questions.actions.tsx | 4 ++-- 15 files changed, 58 insertions(+), 38 deletions(-) diff --git a/app/components/Article/Contents.tsx b/app/components/Article/Contents.tsx index ba16a848..e3f51663 100644 --- a/app/components/Article/Contents.tsx +++ b/app/components/Article/Contents.tsx @@ -142,7 +142,7 @@ const insertGlossary = (pageid: string, glossary: Glossary) => { `glossary-${entry.term}-${randomId}`, `<div class="glossary-popup flex-container black small"> <div class="contents ${image ? '' : 'full-width'}"> - <div class="small-bold">${entry.term}</div> + <div class="small-bold text-no-wrap">${entry.term}</div> <div class="definition small">${entry.contents}</div> ${link || ''} </div> diff --git a/app/components/Article/article.css b/app/components/Article/article.css index 51d84783..4ed087e1 100644 --- a/app/components/Article/article.css +++ b/app/components/Article/article.css @@ -115,6 +115,8 @@ article .footnote-ref { } article .glossary-popup { + border-radius: var(--border-radius); + overflow: hidden; height: 304px; } @@ -136,7 +138,6 @@ article .definition { } article .link-popup .glossary-popup > img { width: 100%; - height: 303px; border-top-right-radius: var(--border-radius); border-bottom-right-radius: var(--border-radius); } diff --git a/app/components/Button/index.tsx b/app/components/Button/index.tsx index 788708f6..a4a9e988 100644 --- a/app/components/Button/index.tsx +++ b/app/components/Button/index.tsx @@ -1,5 +1,4 @@ import {ReactNode} from 'react' -import {Link} from '@remix-run/react' import './button.css' import useIsMobile from '~/hooks/isMobile' @@ -35,8 +34,8 @@ const Button = ({ .join(' ') if (typeof action === 'string') { return ( - <Link - to={action} + <a + href={action} className={classes} onClick={(e) => { if (disabled) { @@ -47,7 +46,7 @@ const Button = ({ > {children} {tooltip && !disabled && !mobile && <p className="tool-tip xs z-index-1">{tooltip}</p>} - </Link> + </a> ) } return ( diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 2293b192..6daf9cf6 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -51,7 +51,7 @@ type TitleProps = { hint?: string } const Title = ({title, Icon, answerType, hint}: TitleProps) => ( - <div className="title-container padding-bottom-16"> + <div className="title-container padding-bottom-8"> <Icon width="40" height="40" /> <div className="title-inner-container"> <span className="default-bold">{title}</span> @@ -63,7 +63,7 @@ const Title = ({title, Icon, answerType, hint}: TitleProps) => ( const UserQuery = ({content}: Entry) => ( <div> <Title title="You" Icon={PersonInCircleIcon} /> - <div className="padding-left-56 large-reading">{content}</div> + <div className="padding-left-56-rigid large-reading">{content}</div> </div> ) @@ -96,9 +96,13 @@ const ReferenceSummary = ({ ) } + function convertAscii(str: string) { + return str.replace(/&#(\d+);/g, (match, dec) => String.fromCharCode(dec)) + } + return ( <div> - <div className={`black padding-bottom-8 ${titleClass}`}>{title}</div> + <div className={`black padding-bottom-8 ${titleClass}`}>{convertAscii(title)}</div> <div className="small"> <Authors authors={authors} /> <span>{' · '}</span> @@ -217,7 +221,7 @@ const ChatbotReply = ({ hint="Generated by an AI model" /> <PhaseState /> - <div className="padding-bottom-56 padding-left-56 large-reading"> + <div className="padding-bottom-56 padding-left-56-rigid large-reading"> {content?.split(/(\[\d+\])|(\n)/).map((chunk, i) => { if (chunk?.match(/(\[\d+\])/)) { const refId = chunk.slice(1, chunk.length - 1) @@ -239,6 +243,7 @@ const ChatbotReply = ({ {['followups', 'done'].includes(phase || '') ? ( <Feedback showForm + className={citations && citations.length > 0 ? '' : 'padding-left-56-rigid'} pageid="chatbot" upHint="This response was helpful" downHint="This response was unhelpful" @@ -280,6 +285,7 @@ const StampyArticle = ({pageid, content, title, no}: StampyEntry & {no: number}) /> </article> <Feedback + className="padding-left-56-rigid" showForm pageid={pageid} upHint="This response was helpful" diff --git a/app/components/Chatbot/chat_entry.css b/app/components/Chatbot/chat_entry.css index bd565141..8b371bdb 100644 --- a/app/components/Chatbot/chat_entry.css +++ b/app/components/Chatbot/chat_entry.css @@ -3,7 +3,7 @@ article.stampy { padding: var(--spacing-40); border-radius: var(--spacing-6); max-width: unset; - margin-left: var(--spacing-56); + margin-left: 56px; margin-bottom: var(--spacing-24); border-radius: var(--border-radius); } @@ -172,6 +172,10 @@ article.stampy { overflow: hidden; } +.padding-left-56-rigid { + padding-left: 56px; +} + @media (min-width: 780px) { .reference-popup { display: inline-block; diff --git a/app/components/Chatbot/index.tsx b/app/components/Chatbot/index.tsx index 491bdd22..286c72a9 100644 --- a/app/components/Chatbot/index.tsx +++ b/app/components/Chatbot/index.tsx @@ -6,7 +6,6 @@ import IconStampySmall from '~/components/icons-generated/StampySmall' import SendIcon from '~/components/icons-generated/PlaneSend' import Button from '~/components/Button' import {queryLLM, Entry, AssistantEntry, StampyEntry, Followup, ChatSettings} from '~/hooks/useChat' -import useOutsideOnClick from '~/hooks/useOnOutsideClick' import useOnSiteQuestions from '~/hooks/useOnSiteQuestions' import ChatEntry from './ChatEntry' import './widgit.css' @@ -36,7 +35,6 @@ const QuestionInput = ({ }: QuestionInputProps) => { const [question, setQuestion] = useState(initial || '') const {results, search, clear} = useSearch(1) - const clickDetectorRef = useOutsideOnClick(() => handleChange('')) const mobile = useIsMobile() const handleAsk = (val: string) => { @@ -63,7 +61,6 @@ const QuestionInput = ({ 'widget-ask ' + (fixed ? `fixed z-index-1 ${mobile ? 'mobile-chat-width' : 'col-10'}` : 'col-9') } - ref={clickDetectorRef} > {results.length > 0 ? ( <Button diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 018a1a0a..42788522 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -29,6 +29,7 @@ type FeedbackProps = { labels?: boolean upHint?: string downHint?: string + className?: string formClassName?: string options?: string[] onSubmit: (message: string, option?: string) => Promise<any> @@ -40,6 +41,7 @@ const Feedback = ({ upHint, downHint, options, + className = '', formClassName, onSubmit, }: FeedbackProps) => { @@ -53,7 +55,7 @@ const Feedback = ({ }, [showThanks]) return ( - <div className="feedback"> + <div className={`feedback ${className}`}> <CompositeButton secondary> <Action pageid={pageid} diff --git a/app/components/Nav/Mobile/index.tsx b/app/components/Nav/Mobile/index.tsx index c97e9d4e..a9918ead 100644 --- a/app/components/Nav/Mobile/index.tsx +++ b/app/components/Nav/Mobile/index.tsx @@ -71,7 +71,7 @@ const Menu = ({state, setState}: MenuProps) => { action={() => setState('articles')} /> )} - {isMenu && <MenuItem label="Stampy chatbot" Icon={BotIcon} action="/chat" />} + {isMenu && <MenuItem label="AI Safety Chatbot" Icon={BotIcon} action="/chat/" />} </header> ) ) diff --git a/app/components/Nav/Mobile/navMobile.css b/app/components/Nav/Mobile/navMobile.css index 3d8c3b17..d05db36f 100644 --- a/app/components/Nav/Mobile/navMobile.css +++ b/app/components/Nav/Mobile/navMobile.css @@ -41,10 +41,6 @@ width: 100%; } - .container-search-results { - width: calc(100% - 48px); - } - .articles-mobile .articles-dropdown-container { visibility: visible; flex-direction: column; diff --git a/app/components/SearchResults/Dropdown.tsx b/app/components/SearchResults/Dropdown.tsx index 3ab2bc48..c07f176f 100644 --- a/app/components/SearchResults/Dropdown.tsx +++ b/app/components/SearchResults/Dropdown.tsx @@ -33,14 +33,14 @@ export const SearchResults = ({ const noResults = results.length === 0 if (noResults) { return ( - <div className="full-width container-search-results bordered col-5"> + <div className="full-width container-search-results bordered"> <div className="search-result">No results found</div> </div> ) } return ( - <div className="container-search-results bordered col-5" onClick={onSelect}> + <div className="container-search-results bordered" onClick={onSelect}> {results.map((result, i) => ( <Link key={i} className="search-result" to={result.url}> <Paper /> diff --git a/app/components/SearchResults/dropdown.css b/app/components/SearchResults/dropdown.css index c0a24b2e..5800a762 100644 --- a/app/components/SearchResults/dropdown.css +++ b/app/components/SearchResults/dropdown.css @@ -1,7 +1,10 @@ .container-search-results { position: absolute; z-index: 2; - height: 100%; + left: 0; + width: 100%; + overflow: auto; + height: 450px; } .search-result { diff --git a/app/components/search.tsx b/app/components/search.tsx index 8a795612..c65daf31 100644 --- a/app/components/search.tsx +++ b/app/components/search.tsx @@ -34,7 +34,11 @@ export default function Search({limitFromUrl, className}: Props) { const handleChange = debounce(searchFn, 100) return ( - <div className={className} onFocus={() => setShowResults(true)} ref={clickDetectorRef}> + <div + className={`relative ${className}`} + onFocus={() => setShowResults(true)} + ref={clickDetectorRef} + > <SearchInput expandable onChange={handleChange} /> <div className={`search-loader ${isPendingSearch ? 'loader' : ''}`}> </div> {isPendingSearch && results.length == 0 && ( diff --git a/app/root.css b/app/root.css index 14330e1f..70f39cee 100644 --- a/app/root.css +++ b/app/root.css @@ -459,6 +459,10 @@ svg { text-align: center; } +.text-no-wrap { + white-space: nowrap; +} + .flex-container { display: flex; } @@ -635,7 +639,7 @@ svg { .background > * { margin: 198px auto; background-color: var(--colors-white); - width: 80%; + width: 85%; } } /* end mobile */ p, diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 57a1b57c..2344066c 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -26,17 +26,21 @@ export default function App() { ) }, [params]) - const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( - <Button - className={chatSettings.mode === mode ? 'secondary-selected' : 'secondary'} - action={() => { - setShowSettings(false) - setChatSettings({...chatSettings, mode}) - }} - > - {name} - </Button> - ) + const ModeButton = ({name, mode}: {name: string; mode: Mode}) => { + return ( + <Button + className={chatSettings.mode === mode ? 'secondary-selected' : 'secondary'} + action={() => { + if (chatSettings.mode !== mode) { + setTimeout(() => setShowSettings(false), 300) + setChatSettings({...chatSettings, mode}) + } + }} + > + {name} + </Button> + ) + } return ( <Page noFooter> diff --git a/app/routes/questions.actions.tsx b/app/routes/questions.actions.tsx index 040625ae..f652883b 100644 --- a/app/routes/questions.actions.tsx +++ b/app/routes/questions.actions.tsx @@ -137,12 +137,12 @@ export const Action = ({ if (actionTaken && setVoted) setVoted(true) if (loadActionTaken() || actionTaken) { try { - localStorage.setItem(actionId, actionTaken.toString()) + if (pageid !== 'chatbot') localStorage.setItem(actionId, actionTaken.toString()) } catch (e) { // This will happen when local storage is disabled } } - }, [actionTaken, loadActionTaken, actionId, setVoted]) + }, [actionTaken, loadActionTaken, actionId, setVoted, pageid]) const handleAction = async (e: MouseEvent<HTMLElement>) => { e.preventDefault() From 063236a696333c4726f6a7d252fe7ce1b55cedbf Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Sun, 16 Jun 2024 21:45:35 -0400 Subject: [PATCH 127/132] flashy settings --- app/routes/chat.tsx | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/app/routes/chat.tsx b/app/routes/chat.tsx index 2344066c..100dec39 100644 --- a/app/routes/chat.tsx +++ b/app/routes/chat.tsx @@ -18,6 +18,7 @@ export default function App() { const [chatSettings, setChatSettings] = useState({mode: 'default'} as ChatSettings) const question = params.get('question') || undefined const {selected: questions} = useOnSiteQuestions() + const [flash, setFlash] = useState(true) useEffect(() => { setChatSettings( @@ -26,21 +27,25 @@ export default function App() { ) }, [params]) - const ModeButton = ({name, mode}: {name: string; mode: Mode}) => { - return ( - <Button - className={chatSettings.mode === mode ? 'secondary-selected' : 'secondary'} - action={() => { - if (chatSettings.mode !== mode) { - setTimeout(() => setShowSettings(false), 300) - setChatSettings({...chatSettings, mode}) - } - }} - > - {name} - </Button> - ) - } + const ModeButton = ({name, mode}: {name: string; mode: Mode}) => ( + <Button + className={chatSettings.mode === mode && flash ? 'secondary-selected' : 'secondary'} + action={() => { + if (chatSettings.mode === mode) return + setChatSettings({...chatSettings, mode}) + const interval = setInterval(() => { + setFlash((v) => !v) + }, 85) + setTimeout(() => { + clearInterval(interval) + setFlash(true) + setTimeout(() => setShowSettings(false), 235) + }, 370) + }} + > + {name} + </Button> + ) return ( <Page noFooter> From 5eae04b1876c2c09d69798acef37ef4efa73f00a Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Mon, 17 Jun 2024 10:19:52 -0400 Subject: [PATCH 128/132] incorperated feedback --- app/components/Button/index.tsx | 7 ++++--- app/components/Nav/Mobile/index.tsx | 8 +++++++- app/components/SearchResults/Dropdown.tsx | 4 ++-- app/components/SearchResults/dropdown.css | 1 - 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/components/Button/index.tsx b/app/components/Button/index.tsx index a4a9e988..788708f6 100644 --- a/app/components/Button/index.tsx +++ b/app/components/Button/index.tsx @@ -1,4 +1,5 @@ import {ReactNode} from 'react' +import {Link} from '@remix-run/react' import './button.css' import useIsMobile from '~/hooks/isMobile' @@ -34,8 +35,8 @@ const Button = ({ .join(' ') if (typeof action === 'string') { return ( - <a - href={action} + <Link + to={action} className={classes} onClick={(e) => { if (disabled) { @@ -46,7 +47,7 @@ const Button = ({ > {children} {tooltip && !disabled && !mobile && <p className="tool-tip xs z-index-1">{tooltip}</p>} - </a> + </Link> ) } return ( diff --git a/app/components/Nav/Mobile/index.tsx b/app/components/Nav/Mobile/index.tsx index a9918ead..9bb1b103 100644 --- a/app/components/Nav/Mobile/index.tsx +++ b/app/components/Nav/Mobile/index.tsx @@ -71,7 +71,13 @@ const Menu = ({state, setState}: MenuProps) => { action={() => setState('articles')} /> )} - {isMenu && <MenuItem label="AI Safety Chatbot" Icon={BotIcon} action="/chat/" />} + {isMenu && ( + <MenuItem + label="AI Safety Chatbot" + Icon={BotIcon} + action={() => (window.location.href = '/chat/')} + /> + )} </header> ) ) diff --git a/app/components/SearchResults/Dropdown.tsx b/app/components/SearchResults/Dropdown.tsx index c07f176f..d4dfd4a3 100644 --- a/app/components/SearchResults/Dropdown.tsx +++ b/app/components/SearchResults/Dropdown.tsx @@ -33,14 +33,14 @@ export const SearchResults = ({ const noResults = results.length === 0 if (noResults) { return ( - <div className="full-width container-search-results bordered"> + <div className="full-width z-index-2 container-search-results bordered"> <div className="search-result">No results found</div> </div> ) } return ( - <div className="container-search-results bordered" onClick={onSelect}> + <div className="container-search-results z-index-2 bordered" onClick={onSelect}> {results.map((result, i) => ( <Link key={i} className="search-result" to={result.url}> <Paper /> diff --git a/app/components/SearchResults/dropdown.css b/app/components/SearchResults/dropdown.css index 5800a762..6cca5007 100644 --- a/app/components/SearchResults/dropdown.css +++ b/app/components/SearchResults/dropdown.css @@ -1,6 +1,5 @@ .container-search-results { position: absolute; - z-index: 2; left: 0; width: 100%; overflow: auto; From e89c4e5b4ae7a96cea627557ed8bf5ee8bab50c3 Mon Sep 17 00:00:00 2001 From: Myles <mylesheller@icloud.com> Date: Mon, 17 Jun 2024 10:38:04 -0400 Subject: [PATCH 129/132] No more youtube authors, and autocomplete for search off. --- app/components/Chatbot/ChatEntry.tsx | 8 ++++++-- app/components/SearchInput/Input.tsx | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/components/Chatbot/ChatEntry.tsx b/app/components/Chatbot/ChatEntry.tsx index 6daf9cf6..67e1b8ce 100644 --- a/app/components/Chatbot/ChatEntry.tsx +++ b/app/components/Chatbot/ChatEntry.tsx @@ -104,8 +104,12 @@ const ReferenceSummary = ({ <div> <div className={`black padding-bottom-8 ${titleClass}`}>{convertAscii(title)}</div> <div className="small"> - <Authors authors={authors} /> - <span>{' · '}</span> + {source !== 'youtube' && ( + <> + <Authors authors={authors} /> + <span>{' · '}</span> + </> + )} <Link className="source-link teal-500" to={url} target="_blank" rel="noopener noreferrer"> {referenceSources[source as keyof typeof referenceSources] || new URL(url).host}{' '} <LinkIcon width="16" height="16" /> diff --git a/app/components/SearchInput/Input.tsx b/app/components/SearchInput/Input.tsx index 6da9db8d..b408f177 100644 --- a/app/components/SearchInput/Input.tsx +++ b/app/components/SearchInput/Input.tsx @@ -33,6 +33,7 @@ export const SearchInput = ({onChange, expandable, placeholderText}: SearchInput <MagnifyingIcon className="iconsMagnifyingGlass" /> <input name="searchbar" + autoComplete="off" placeholder={placeholderText ?? 'Search articles'} className="search-input black" onKeyDown={(e) => { From 49a698f8e7c7dc053ac754d53ffd4dc814922a76 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Tue, 18 Jun 2024 17:49:26 +0200 Subject: [PATCH 130/132] fix linter --- .storybook/preview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index f246269d..c68adc8a 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -14,7 +14,7 @@ export const decorators = [ ]) return ( <CachedObjectsProvider> - <RemixStub /> + <RemixStub /> </CachedObjectsProvider> ) }, From 3efd8578e37091b00546499f3ab8574ce42d8540 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 19 Jun 2024 15:12:30 +0200 Subject: [PATCH 131/132] fix references --- app/components/Feedback/index.tsx | 4 ++-- app/hooks/useChat.ts | 24 ++++++++++-------------- app/routes/questions.editors.tsx | 0 public/favicon-min-512.png | Bin 49303 -> 0 bytes public/favicon-min.ico | Bin 16863 -> 0 bytes 5 files changed, 12 insertions(+), 16 deletions(-) delete mode 100644 app/routes/questions.editors.tsx delete mode 100644 public/favicon-min-512.png delete mode 100644 public/favicon-min.ico diff --git a/app/components/Feedback/index.tsx b/app/components/Feedback/index.tsx index 42788522..3989214c 100644 --- a/app/components/Feedback/index.tsx +++ b/app/components/Feedback/index.tsx @@ -59,7 +59,7 @@ const Feedback = ({ <CompositeButton secondary> <Action pageid={pageid} - showText={!!labels} + showtext={(!!labels).toString()} actionType={ActionType.HELPFUL} disabled={voted} hint={upHint} @@ -71,7 +71,7 @@ const Feedback = ({ /> <Action pageid={pageid} - showText={!!labels} + showtext={(!!labels).toString()} hint={downHint} actionType={ActionType.UNHELPFUL} disabled={voted} diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index 975ef5cd..f87c9ab3 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -128,23 +128,19 @@ export const findCitations: (text: string, citations: Citation[]) => Map<string, ) => { // figure out what citations are in the response, and map them appropriately const cite_map = new Map<string, Citation>() + const byRef = citations.reduce((acc, c) => ({...acc, [c.reference]: c}), {}) as { + [k: string]: Citation + } let index = 1 + const refs = [...text.matchAll(/\[(\d+)\]/g)] + refs.forEach(([_, num]) => { + if (!num || cite_map.has(num)) return + const citation = byRef[num as keyof typeof byRef] + if (!citation) return - // scan a regex for [x] over the response. If x isn't in the map, add it. - // (note: we're actually doing this twice - once on parsing, once on render. - // if that looks like a problem, we could swap from strings to custom ropes). - const regex = /\[(\d+)\]/g - let match - while ((match = regex.exec(text)) !== null) { - const ref = match[1] - if (!ref || cite_map.has(ref!)) continue - - const citation = citations[parseInt(ref, 10)] - if (!citation) continue + cite_map.set(num, {...citation, index: index++}) + }) - cite_map.set(ref!, {...citation, index}) - index++ - } return cite_map } diff --git a/app/routes/questions.editors.tsx b/app/routes/questions.editors.tsx deleted file mode 100644 index e69de29b..00000000 diff --git a/public/favicon-min-512.png b/public/favicon-min-512.png deleted file mode 100644 index 71a5b4352628049d0ae52113882217bfac3d5037..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49303 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 diff --git a/public/favicon-min.ico b/public/favicon-min.ico deleted file mode 100644 index 93922649a656e65a8de214eeb7e09749fa506e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16863 zcmbt+i$Bxv|Nb_^oHysQne$-|le3ufF(z_|oN_3wx8+<;+vI!<IaF9uNh;@rm~xB| zDnf>&Bu2_HelLB#|G_Vn?Xm5(d-wgkpV#%guID`v2n_rj{{e%LpaEkLh#$C}hO@Wi zU=?NsZgN;#nVmj<^!Oi)3Haq1S`~PFFC^6789Y)EbqfSCPP8^Nc8>n^vy>&=xvykB z<E@}brtu})ENJQ(VlEseStp{_tNht*b#jt;Ia6KB>cZUieOK$$Q*5^v{qqK-uc}^= zEy>?`Ip9CsZI6+=oquQ2+Td;8WcR*?4%6EH$CtCGqaJ(2h0NVwzga!JTdLIV<G!{1 zqk6CU@Dxl0U)#m>|M{P~S??FN%N=*P><d!D4t4f*RS(X-Ma=%-{kGAoP876>QoCai zoIUBJr5#Dim(=l<y8>?cvBc9IK2-f_Tj-;&<iNRy)(7eyMq;Q7&k^|oESDj{+0ch) zsPjoD;r!ls2FI{s4-adU8gqpV^esclf(06!36b@&xXUc_=Cy9fozK#=^_=%spnJHT zE7VLsE-Uu?`p7i-L;WTMF#?)y#LD;|=KxEa?te(0b;AU*bhw){A91()%Gn(rQprOp z=ugOl_zLdQW`r;c&7L<NrS@x*!S{RLS5r~J`!_(n3nieTxW-h<lmKrBOXg`OP~(m_ za}klPN4!9uYq|Z(X%(_|SLkoXQH!)B=ph571?nlkL+r-2#<jpcgWJB_`D|WHNrzC@ z51REi4475!^`Dc}^^NNJ9meQ<zhg%+&1enh2yzJxibL~ZHCrH_24a#I1h5<4Ov|`~ zs9Vmw*u2@bs~_h$K7$2F8GYig3{|Z`8Txtn<0KH3l`h)?^E@8jiyT{8gd(^h9irBj zQT}T_)~CYY&ab|!90qobgzc*j(;>7VkOq~Hy0H~afJ!Hi{WP^!E`;&uJqc#>!IT}b zv>4haGbOFhv&WxIR^gfu4u2yNH54gQ76e{4O@V#78V_Nys~Chd^|D)vq(!+^fo#A6 z@HQj<1eM#XPZYx4DYtMQXK@F`XWW%@XjeJRM;I%C^@{Th9bt0j1;wRo3t(XgJ5FVC zdvU{0|5r*Y?LPNfr%yuMm<?BXs2~J8ioqBpcRuFly>EsjMOE@I{*g}!!aEr`pvr#Q z^}m+kLX>6@b(YoyhQL+HMv0HYLy+?m3hy5rrP=?G=iPfmfxr~WhC;Eh51adtVg86e z?{D4e=T+)(&5)7c#@5B~B*U%?fzOFo;c%~d%cf5D2(apVB4C*4t7B8m)3W84oGd{P z^{uwt_4%+}#04(JM4|@y2=dMu#4{}Bbg-X!@rT)lzPyLyw{j*v>;;4;^w&38-x-z^ z)}9c#jZ&>Qu>^%GkjWs;sa8gOFip@SYqKYZjL}tS7Bom;6(SgnnG@K0%FBIvLMvWc z-~1@gTJC+cxEnxq^iQWQeU`x8rCcwK)#xnTR$XNq3n0!dURKLU57>MW8PNGrBYIh& zg)NqgASp8{;tVN1sq?`JZ1>{=?oY~I)3Y0sDspK*BC<12{=C2}I-<ZVkPQ2en5h0x z?Ud2ocIU<EZ|iJ&msN=(xuB0J;fThb$mX2PA5{GP*0WPf6BqT>n>M&7L57e!15)7c zsAxVrS{tKQK#?-b9~WZ~{~(^;Yzg{&o!9vB0|;$8DsbDPOf9QOj(nR!7;{C#vCJh~ znoAE7-_3I7fV9Y5SHaP6G(<uu{M1_LXa1zQqKe6_qeebeH|8|mpH_?^zgegv7g5pZ zwaTnWZmS^$#!iPJ`31e71s8aaj=-LGo`WhgXgNMAo$NXfX10aqhC6@p<iCy-N$;3; zI{0kG+r>=tiZ`v>x*mGFpm^^#lK5SdGw(tZ@7>7|CT=WEsEg77;bSCxuvTXfpg~!- zGO&&8u}3fF$S=Z$;O{Rvt<IKXcJb3@2AyI{=MLsGXeVp4%cP1Y-rH2fe0j!lem01m zJ|~p5@Ekmx$d2%2-apmnVLfEcoMt3*6eOJSD#wWPZg^vE%VP5~Zs+4k2uvQbVas59 zXIx!RyaCku92s+R_OpFOot-rWa-rceRhjk@3&~Z6r2M|^Q?aZ}!ZawvmTM`Y4`0wu zQ8(PkQm3J0(AoEJBF^nEgnonAkPzmumr2oHS<2qXS8e>2lKSQCY0>s7*|P9V>MvM} zJtIw0&r=A7+L5%%Ttjf`_Jl_!cdqp{8u4S&Om6gs>xzS1!OLh81p|{IJN=nUG!JLW z1ufVo%>|_0pPOUxb&y=Ueo|wt<u4a;aU&lqh-qOJSBr47j(wO|toOQ{Wz;CcKj@@2 z#py`vwouQJ6m=JF!_>t{5EHeoZO&BlRlwe8T6>t}z$G~KWYKZ!Wn9mCmdtf_at3wD z(2`<ed#d>KZAUAW4$ANzq67AnRBydJ{on0yaMJH3y4LiJ25+dVtA3mz`{By3zXJkY zXc$GV^`m-Pq<~+xgq$-|UPAWC$oVbbqAdOdtsM^UgU{FVu;1dy5<aqOrI7*^+2?h` zPhSf{{(=78z7zfNp;JO%xWUnrXFGAZGUU1Ls82;b&!7A8gAmuRq$<?CwaA<PbUh;B z_GRv}le7;Y@O8Lxs!*4AmsFT~113qACp9EQ+WPI~*bTW)`12demUZ52@}N4DV2cB# z9(1iV(BRxVuO41cXx<+dL-5Ufum8&75qFQ|>x$J`*7u@HpKta!IQ*UO+?Ve-EC<gO zVNg4e@VoR=CK+{E-D4bf2od)y^3lHrWbO8UO4r>>Tyv^1sXOw+ZYar-U5$fd1!lQw z^DEbQ{1-Mx+osa`vTs;F6xn&D{q9sJ&mU)cFl}Kw54(ffVRYl0jmz_9HIsNOb*0ZN z6=W3FngIX!-*S%d`LmZXP1E+bKRxk=qT>}%g7S$+;5P16txsOk18%Lw(>18M-;P_6 z8T2)Wx!sE!)5_(b|8QU{0Wj1@eY}A&Sgcx|!PVQih0S6!6Ily;ny3-(KpS?|o7v{L zBfYW2&mGofNQp8$j8#pGoYPL#we^U%=Q)gdPg6XaJ1IieK>5S*vZFr^yzHK7Xt!=p zTFoz$-3OCgFyCwD&K54#CO=IyIJwQK_Itg4j&J<uB-i0Y)MS+{RI-Q(Y);pxMSrb~ zQ=Y|F>VFAe2hW)jzjtuB?Zz-|U9ubOtDsAOjDG3iyE#<IG}}ZtW``%5zk$@Y6Df6) z5H5OY_rux4pl=N^Yqh!3wi&oBF)i*TLbe$&f&@lwFf$9RA8wrM-gO3dlh)YXH@%x^ zA^mR3hWqigx|z*59<}F9d0%+m#znFFO`rXyq1hFvoAIi1SfJAgV-A9X-6puPIpv^h zacr^_*su+M*KG=X=sKv^E_9s(irO&QhaGx#y=Z<&&Dr?PF(;G?L)_tru^=ECD|R$0 zhIM*-{xmYT#D1YYJa8;+m#)CAPE((EX?Bh$2dC5GMiV<bxQ`C5PcC{DWq%WccF<1> zWQhWJL;tO45aURf*x~KuMOc+1VwpM^o5@wukKb>PIR+gqNqxGJ8q$#U`lC>|1_IL} zI3mzt<g$T*cUlq{4)mkB2T9i}vs)1?oVVBSOFbL3O#AaeUH-tG0z2S@&<v!Rq+$^* zL|sQdFid-SXszMbtKLZ;l#bMui!`Og+cb2%1>x>b-Gi4+NIpB}2Fc`^0f9Sh8xbP$ z<ww2iQM2n+>JRV2R7lSfr5s;g7TK`N_<p6*Eb95&ZVfi0$6^%lfnY3mE&V;bi^}o3 zGjW}S(Nm&nvpP%%cHe1yi|tZ1*$8>vz#hwWFdNsJo57RliP(8V<Ds7)1w|5TcFuor z-w8TRj}T^!m+EH#xE4fI)5R5PU;ei1h{=AtG|@AER!>Bu;QP)saW^)w0rN2NIrUWe zy<RQvSKOpCrr?%mePbe_Dszb#aJpZuJ85gUi-Rt?qjY#ELtt#@GL#^+5~x=e)yxR8 zt8tLl6FY(jSw$u}zc4N7<?n(}>!R`~$c<8lYYX&qhYL3dyWh^yANA`qr>A4PYlx9- zDh${5=pnT8y!&WG6elE=DjR<hdD(@oyQAL%QF)=wVe}=4?GJpLv!EE^rpb?;V{^`i z4J(eB@LmO5f6l~`_$vwqE$0WY@ypoNQU)PzTxA&Y@UyWzqESf&V&A(YC1Zw!QLB?d ztvh8+LM=N2cYsS+1KepHcVqH)YJDK%CKsP>N(#*Wn-x^-mI}wKm$B0EE^5V~niV!$ z`Uu<be$S(?nN%1Gc2rfjiTZY$hI?l{;F`yw2sxwAyprZaVSiesNSsvZGi%RP+=$TL zaiz-<PBp`Z<)z7Ntf{n`YLR3=6$x`J^i4mO2N53Jc;bTgbs&)&-K8Dzg(upm0kM;L zB^*esdIMrI_S|9Bm&3O%?nB#)AM}OmM$Mc5v6;K_fnv*GNkipgq;%xGq4_uOAnu$= zu%JvP&wsDgW1fG@+PE&-e+%&~>MGnBx_+15$sS3%7#Q>8y7Z+V-!7ix&zqRR=A9KT z5Wt!|%PJmmV>#6a5D4jaukx_PLgCXPeQd$#jzg^-gG$&n>2&18l9aA3!xJs`-zc)m zPcw@3GOgG`BpIX6%$i1%kUtDb)MWYdVLIu24<zt0;iV3#_wLlhTaPV05t=lQYWSuY z+08dijYYNgG~Jkb5^{f=Wq5F1)J&)@Z1l;y<avdFLgp(rc)>`{tYH#6A{GR8rs)pk zd)>jGG+yV+P0f)Xf>}*l$7{jg_jrfI4O>El@q&sUbm0vrbRIUr{NE5GI4e~-$Zx2^ zEQodoE<PDO<$D)5<|665>h4d>q7uErvJ8JxK6*Zarc)yh&H3ygq(Y{X^Xb$9J?79N zrn8p?%X~^1STHS2ta<nkj%jNnn9<*<2=4#B_2jcecg4zl*k{yCg-Msoj5;l2!w|K@ zq{{oo4@sPS9K2mhJKM5!<A>K&<41}|uinY2e3gM@^W18`07=KL+^z8HQI)u;L~am9 zbFhEVRkLGroE`@MHAqxGyQA=%)34Zfr8%#~Ny|?!KrBmun${s;GKnI{cb?FBRz7Te z;)iI}XWi6~jbW5xShif_wB@*iWBQL;xM|i-8Pj%z(|+8}>!Zo-9^@&g`X?_#zfy)J z)#KnwUKfqUhknu;dz4UrKU?s>(K}l6*)P!Gk-4qE^Vd4z?OrFUGl=I5{fcrjWys!g zI+tZ{g(}M>U@BgVow&lhQv^<^HAL0gavO(N@gyf+=I2b(XMU--A}aVG>4L`DWtzx_ z{j}HvEhY6;ii9*GVMdQTL8o+!EA>#4Q<3Z>83;W+!o9^=I%w%=y0CepL!bG|9=CCj za&SsKIqwSN=tY@#-aj9J^R<qQq^(gpXh-O2ZFbEcqB<$@%fPTs2frQ-{_nz9sZn<Q zZz(orVhvf{Ty5ja%&KRhicy@y@)Nphr`fJlMR1~cJRT&$vP&+|9*qZn5ds}u8H=Lr zjvR1lra~d<w90gp+O=g`X0{f4%Jh=dPc8ON&R+0&{-X(v_hlpbIelC|T@8&!yUYkC zGnv>e7Sj*9KBb8SJ?0w%U8=?gNR3a^S#rdI5BBkY$r7)a=!m1&gd^IXInvjKV6%|y zTWpzi&kZk>fzF_nGN=m0LO+a;7!}Wa4z6wL9JgM;9jJ?aaNLo&Btd^Ih=jB?E|CgM z&0n{KQT+xpMLfRp8++Ut*UGa&u3abDLu8{)aJNQwX?MVmOxL&m<}mJ%x)qcm@Aa5p z>osRK!KHXT{@8oAp%Yn=@BYhe12xhWST29i_pJ>J*W;ll5JrW%Xc$~m7&0n{*i%?H zi3!kW4m#CW6SX;b@#S+U&opjF{;(zg!;J@8KYZyWwf7WiE-g&Uq+=hJCQ6EU^y)ER zTNRCE^7>K)c~y3cb2?6pKkxMUWg{;1Zt>;Hfs1k6Jx66DT}%on9a%@HO^9IqBxW(3 zGuaY96+=@PztUH=!>ONk`I1~Q-#4F!oi9r(PkiLb*MHRgrFN7?jwQTb4$QYhTz}~s zZL_c>#qZJUH@GF@5y>a2DHdi&;ik;|lwUR)KG!xI#~T|SBv-EYCgH;i{TnBSeI+<p zlwY&c9<RZqB;QIGL-+iB0I<;1XXYN^uARj2dpyV=wEReQrDB{?!ZK@BeFO~EOV(Q> zHZ`k<_dcilJwH28@PQw*v7@vlc9adhErY;Y*Lv8KZR1!Te7<2}pN7H_EZ|DdkJrTw zU*b}fQ~8!vC2?)%{2!nQt9bM}vaj?fzu&9Vo=tB}j6sEMR7V<gj@ou~n>KDX!py(5 zRKyG?Nnuw8i1$gFu?VYKwSsXI|GI$J^<k9P{0k3hr|2BCN?RzQNDor$mb!m0<r(zA z$7H*YFAZV*$_E8&av&&oC(mCA$QHgdrmG|1_d56A5(1gumFUg~E|vr}AVEd@4gHJ| zE9AQ$4MWa6#wlh9tCP0>8}o)9v&wJiC@Z+J`PN1_SfvUINkdL#Qtwv4Oo04W(BfNl z<#=oP)dg?^Ac)OsfP5`<Vg2`tP-h5(na_=u6ScN?5dELk3hEpPpH!ZNQGn3?Aqq_J zI}`zYlW`ORZo~l<sF_dmbqyt$3i*1jNOCjXL9lvC*QYLEb=dfe9<w4FWy%)xIeL&< zLEpqy!WLfZ+KxV29JEw!&g?0)UKg#BBPzUo!mA-ogNQm{S)d3~K<<6gXMJYi2@#x` z2oG5p#fbxaqUrPyl@UR3GT?^EKpu%CUt0l2QtvC`!GC^e&{Bm$0^LFqWsM=m=A)>8 z>7!}&c&I>*wOFPy4qd5+Q4o*|c=g38RgjFC52DS|2k}uCw|D(+%_OExu`b}<Yu)CW zqMkwy6hxD8bb%k6!A5|CwXx7stm#PSWvb-HuyG7jRYF0`BQp7TG3tpZIF#VY2$t4t z#0^o=Ag(720i&zhN*7pU8Tihoa{nipepdLKLbKiTqMSR*&2|!{3<5;Zsv?Zikz~S1 zKoANPI6k8;u%M4W&)G=MOkNM!?O|{Rdi-eV9*-}YOQjl3G^6vke7`}IN2GcQ!%$WQ zZN623%m3TYabAY4ET181)i9(G1hj}dn5H&R_<N2{(FF+i9GFmM$ZO?P?zMku$^AGh zY1reZIOqcOQ#iJ=o*(~-cm*vI^)!h7zWh{;rn@)nE?#)a;61`<i92|<pGx&+^39-} zxwZ`4$OclNVo%}sgG~f5y0~SUEbBo;dm(4yi|DvnUz4srNBXeDkN9f62NNEtFFxDk z37=(@JhAX&&qbr-soBQS+n}q+(AT){!=x%xb55}+PJ7$i2=-XVhRJ$KL61KwRg6vx z4tjg(hF`Dab`V0=5pRoyPHdp8s_;T3&U5X2-bb8-u5A`GWsY0S0>+g9r@1UxJ*g{b zQx_2Aj-NuJcEl!yBW4V_9eCTb1c?9j7PRsYvDcm;!f^+WyCkAncG8dv6JrzwGd9OH z$MgIi{9ebQY*rsek7*Zo=_{+v734KCFFMb9QfYM3X6Q_oGlYx0y(bN~fo5?75#^hM z4Jl=i>M1Pc__cYXOpm#@BX&zXT5YW{sk<zkyB+cEAPg)?{Ichg=RA$kd-U`^%gp8t zD#bPt7S8z(5ysEsOKMNFFbbcycek8p0SkWl1<qIcVI6u|!}{r^Qcm!JFu~wA7#3wg z`BcgPjIeIda(PRhocdXJCt~Je-<A$<f@e?$$x!0XqE+ZAwvw^WR_3^T&yPbgG171= zrn`kqKnSgJkEbV}#=CO?%Vdi$@nAahZmYC&aNuLXT_!$|5nI(|FQ%secWySn1>2g@ z%@y|efasdUym$_G$Gc0fiFziDHf%`mgh?lh4rsnDxIk}3f>fD!NMpxC0upp4zenV! zjq&2~Ki>rJ@f#&rfFM@YmpjBD(ToHGuvxC?Qy5TSv)`YrUqt-de`q~s@9eeaoUFBa z5m%7Y<J$v6)ejKS&2p}7jBq<>(}KC0`9*}FZu6>623n+|F5ogx>nBUI@!y?}ec?l( zUeU`GRPCwz5PA_7DKyd4Kdt6mABNmkHkLj=XwUf*$N+@h{=$Rbdfai<Z>bu@H-VU@ zii=wl)nA>6_qgeB9Fy-b?A0f=g0S8GH-3X=Vv54)7tKEb3z@kVnhCMs$MOUiq#w1l zgAC*qAdiAr8Z*%iO0m0Dud#IjHDO3s=v>;*x}2QvTHnO6HW3UZOklgm_%c?Oc1GO6 zDbF2LE|6iu@g)<(q%yz3YXDl96y+Sk9zcLOosEVR2R%lOE8dcCLy|86Z?TgBY$lW$ z#qD?pn?E?l7n1>+@TAaqfZU?jn)>8dZz0ys_8WHS5K(6E0S_%&kuf#^?gnvsJ*DPM zNxI-tef*l_K>U=@DS*>yR!^&|2saRm#S@ho14V=76ndV(K{v7EvUD(QPnssf@D5c~ z*m7dDK1}TnFkuaon49Kw@Z|MQ2kut9zeU>`Q1e+os_tc{+{n{;QuAH2W9KD{0)%BB z+9c_ZQ{6BCvJua}bS~^=xaSz2b5gSUqp|F7x8E^x$fc^J$_ba;f-xq{%a)6;w#IrF zbE#-$=9Y`%(rJ{E47X*f6|kUs>1ciQm5ac*yN6i+BiSGP-Ut^`+jZ7R`#Al8wp9^` zd0CrOS#aXCti9^RMiWpuL-xZ=ZY+dkh6B)QrQk)jK~HL3fMkv^F#Nc5;*st-<`2bQ zeY4Trt<sc{{>~o)^RpdrUd=oqnWnAM1g-QV$PP1Y4~n#aE&<f@=B7vLz}a(#V_|sr zlv{NHk+1s-zwZop8BrMzYQA=dKmWy@x)Mph(D1?)xBh@MB+qLFZonPnVohuu7fA&R zz24w#)%Xx#7o^_rI&mWg>Zi?qrY+XLa<cxsseZHFGl}R5A}pS<EMq0|)`GX;2W=5L zJki_9nHxKsTEh5yF^E^wjtt5}5;=+)C+_adfsQCW>xouCMi;k27-waxNC05c-(AQt zI}9%6Xa@&x{NQ-^GP|-$yifYzS}fjS8g>&picMn@peC4r5+D+$5K(DbQaN;nT~A3q zzu7_UjQz3?)twv|kRyDl#HHJBurUWc?#;F#MVC9c6A$^uEqV6lU$7U*Qe-IFi^)?W z38Ekl04b9Ey$6_}`<Oszs5bl3XOjtce2Mk@NleTaAeK{rJC#pKzcBF@fe}!`1e$n{ zLxs9)g)D%j^LhyvT$((lG@rT)2TnS7t4KI{?o1VLID3IKB#9-vUJyFc2AVj;TB*!Y zSte68v33j{=j#IWQqf`Ho6uZu2S7A711{$S7XoB}N2Q6Z05050al}ut00i#JGByDG z<th|6!jcLn9c5B*LJ0XW-KsHwwftj3--~hp$EM5!bQO*jPd6HoA|WyIusVa>PrC9q zKk63C23^GQbRoy@ih4x)UFa(`r-UJ4v`k@$&S?kr#CR|}+}M=nPLfAlf8pz<*FT2+ zF-!`q3*i5k<{)WQ#t8&f8Rk=H39`hkS{_K#<j6w1+}p6qNKP9QWsWzfNucJymzXZd z0jq~OnSnJ2i#~l=OkyK605dC1ZZ|GuvWeof35euW<TY>x)&$56V<O38euJJ=(fjEj zuj+?eY*aK@0wKyGOH$Kjzqu-EWoYX|o2;*WDg}i4h6ZG|w~z&*^Ee%}A|FU2!&(ek zq6e^zFth&zEh@v*3j79@0b1c&lrym|+Cof+M8A_F>OJLBK+*HNGHdmjvoM9sr_!VT z4}j8O6Fk&afgkdL1Qrx6de00VZJ}mc05c2cWCccPBQ2_UdT;Z_#AH3wze#wNjc%)K z2HDY;X^J~1C@>Q=7w-kh^mD>iWr%+)J8)>S-l6LZJuH?>_9hhPAf&n6v-e2;Fmozp zrFp@f)hh}5bWfQL@|N|Wh{-bixJbjhGyIDJ1Noii^@UDH)@EYnx3J+yjzMDgDu#6@ zZh<Fa0wD$sUKgkhk&q5Ame#KQ4h=FDg$sX;bND|Hn&^z(GK|krIq*`d7}1k6^S&Up z^Y<kIeg>+Bg{i*J(@nV)jTo9w!s+vSkGpq?G%zc3tN@BY<uI(VJ=S^HZ!rAbzp+#` zR{W}vrt3{&c4PN1mytX7GZXDx&c9LJW59B`<|i?WTty5SbdRuqC9dOGt^>T&mf^lO zdj!8nA+Vmwk@%7wedf8YxpLFFSxFFgL~D}W-Y12>W{D$LA7u~4rIoYf0#osTBmuIo zhB^Nb<z3NfuCaJKS<fG_E;<Rs15;5>2iJr7XZhCNYsh?+Z(BU%K(T5$4e#!HkOS`# ziXIcfvNb@v4=+uWdUL#vC5L{4+{wXs_Z$E!J54u&%zU3DXrEi}T$OGWZ>R!&3!J}e zqe%Ko(^Dm3QS_p&d4e{3kGJ8iyC0VB-R1T8@XBw{`Mao9XKc6_WYTE&K;3S??z2%y zZVt<G5J;7n$l=)FT@}MYh~oxgNLd{Pk1Iq%N)wM?It0uczsDcpGRNpVK&R}+NiFp- zVYYqHX1FN$3{6HY6?WpgsGve~O?pq^MQ)Es&*yak-jtp4^6)PEg=^V}*IDi<EB&G{ z&=7;bvS>IPmIKlMRu(7~fFMq&3lK0?Jo#QA>_MquXbU4jJDP)Fpt_SrV|-!;e>7Py z8`oX<9@uG#J%xW^sN$+Ov+-}C^jLIB3?-1gEC}>b4*0-={uXK;L#4;1AaG4UZcuK< zt0A^5$|JJVv>HKWk7XNNFW*HG=ny&$4N>O!$}USbl{6#h91L0_){pCj_v7j8q8@?E zIwrEe8%5ke%++b%)nPOclt8rwfz6SC`bW5klZ&&UEG^yRUhFND(X^RSo4ANC8Hlb6 zAcI;tl!+4znv`opGYm~ZUr&RhaaPcZKP+zesoGSu2FJ_E`p;G3%HV74?NF<@r^%t) zGt0r=45BxQDMVDXmpMYzWtSiIZ;!l*<c#N?{dq@l_NQ9l#>i)HOW<;=&q`93WvCm+ zDTd*0AhZdi$E=ruR`LakOT%V6&t)2_nAyrM>h=ayZE=?gb5x>;iAs2DOkf}wh_mbr zU<+VCIv#bxyVteW1=MS?14&-|{NS;Nc}|OaI-oWY8&=lacBG+MP&E;B$&10W9AuK} z^Ry}sl2)2n1Qh66aXLMPn!rk=)df8BWr3Rqf!{sks25P%{w|CO@<v-Hblj;lbZU_B zd<dcUx<WNEX2>h$SRiJ_Gtg{G&2}ryWkBTy=qf*aIv)+%RM;Cs9^$X59tLAXAjQn5 z%b&glDh6>vTy%y{0t{iG4dmwkaqlz0o1XF;%vJ)TFs4?%dC=O={*(2LLg_H{>reCf z^~VhF<quab=2AQF8)lg#d;%8COwH$Ft@lDEc5s+<!*5WLHyb@(ALerm-M6|6|AOpt zbT7*}_WhI=MvabKONf%PPI#IsfL#GfnAT_4RHW(WsBdG=Vl!cob)NojqGp?$?{Mkp z$KtO58e!T~_>%SXVw<S+*Md^%h;nJ39BuQb^zlCvc}X!V0|yU-`wvb=f1LBsi2VF{ zg_$}6>SLoasFH<+P=bIE9c6Jm3~m7HtnejoYwH4x7^eN~^?Lm*uzu=NsXu!gY!iiy zKRMkrU@NOZ{hF;@Q+Ws}27zlJFXa!ob{4j4Rj<R!TyRiklMJ8i{s!ocbhIrH2FlIK zTQz{?!2qtw)csiukD0NcUqZpU&`INwH=(r;{kF&ts~=SC2#_xSDz8>ym}5vt0qJo4 z`V(!9%!U0)audFuN4f<RJAH*WIqyx@fAy8{_!C7xiL(e|ls`0wznUl>Z+@p93?p{@ zQk^^(@ah+U4^X-S?W@t!-LpP9s)i`IhLWJ&F{SuxrsnbHSlfA!1MFa+sPVZ-S7>2n zIS?)WW{15BUj54G!&C%%PUP>@4o;^gXdxpk2-w%h8z5uoI7~2aWPBdjLL#7as47T6 z6~yJRH$Zzt!xTT<%A~np31Tr*<>0iSZ@zO3I6rtA*kpuEbl3(2ckfi{f&lO$;BWdN ziz*A0yDJ}HIx)_?q+?wIP~2skYi{%u3h6cvd4S~3aAQ9$p5gsP?t2M^TS40r-@>XH z-XOnZ`jn@mbSN`-QT!f(-IJJ%J%G>N>Mh)Wqyjw*H+eM(U``ZGIt|%v*abpB4Q!Ej z!)m<;j%#>;>HvZ`z>Z!Jg{qK5)icNXg^nUv(+nQ!LT_y3FukwOT<<r?`2)a&@T%^@ zCeGza3<o1k2227S3qTZKz_m!0%s}T~Wdla4(BLchc??i8u#8{>mw%2sP@Y;rb5hC> zsk3Ul)4En?g3JHMjexWSysNw_F)7F8^d2K^-j)<l3j}c_pyvPrGLUf*M^v7ZeT7Xc zhRvA**!EixkO~#ORY*mmU^-H`*05S_GGLelu>}4=H`iFrPS!t4?=5U%2Uy8tLBP=x zs*)z2;{!Z&lRL04ctMxJZ=&)EyH@#=^{@BR(6&PMbpdbnve9fWeZRdLXLp8EpRyW* z+7vyB9xa2e5Xm5@VkBp`m*FkBP>bVo#ux8Co|}qxas=rs0qn#bPE3KLqLsTdX&bOe z&M##$z=&@p&{%*9F}$3HQ6)z5L3265#0vy4_YO<62xLdT3if4<XSJ}!0A>n(6g+EU zK)DB0WakIJL>{xBB`LZVl+Hr{o8A8O{x&!hwAfYID7IuB{nT>fBUzie9EX8<KyThH zVrol7b5y_54+g+4*&JUI_#EDphTa!#=L}w$uK6KJlvW#<2ownk4$D+)nmWUSmAJST zv~pf1JcJ4@W9SscTjW0QU#3}?XppUX3&liP>jJX&a?p>@V47<*>+1skqIP5^xe&z_ zIr=cxxvaNYrBx^*b&zZ$9-m0C)Gb?TKqmd7Nf@Fg@6*O;EG4!KKuP*P{Q!_vji|fO zw#$*^dug=Ua%ml9C@M7;qozu<RGL9m6~n-8)ClS>UeHi6?6n#I+VgxKE+YVF3wkgi zJX4@&c}hQ|!9nSB*$W>XPw0pVP1{=SEpkYUaraNU>lwxcnai~d*aGYx0Epac6K(^8 zmLvao-h+$ysZ&-oH*!-%Y{iqC(kI-l7V0ei#_QpFpPtR@xR>X@T4iT7=eQwdMYP?v zqIyH`0#!e2ok6t8{Jmb~=AmeyLfT5c3)Eg{-&x%q--`R1;06$P$Ysgvi(7v;d`d<P zZ81@W#t=T~xR{=}=ngKO9M~8`I(B}T^sNC3KzY{jmU2>VUX3G2Kmo7niN9Awle!_2 zcm1#(#Q&eFM9Q+!281qK1$$*=TZ;vZqo?NwS1Qq5Ksm1@YEc)k63N+-?%t(?<$mJg zSEYW`p*W)KBiF(Nu|ZbB8dpX8&k399G%Fu)m;%Y_>@qeUKc!il$e(b_@$+t+9s}2} z9)}Xv&kKw+Up0jMOW%GVJmT^0ySbU@eW^f@lO#BAX3T_L7bC8~9I&`?phAn4rm2#} zxXs~R$1Fq{Pz7v~ZSd|H#gp~x(#>wYi`MM=V-gBdY!V70Sqnzyj5Omyn7^l?aA;is zvm4&MC5rRG%5MgTJ##{6dXHAHO-4@(gfd9nfBw=8Bd!9p%y>Xfn^F3c?*h2?XYilc z65uyjjS}_<yzM?|!+w&XKe{TjGDJb}#s==HK9D=(QT=p*u1G#}N(P_<s7RcA_7ULv zyLAC)o8dPNoq4_R?$ZTd^Q9h~aL-aAn!~9TDK;VATew}NTu`4zF-#nggeM<m!cL^2 zr~CW{dB2PDJ_h)}DI<X9*#`%U-JZBW6QWiy56ZvG5LZr!yI~0;nZbjv)=FJxkNkc& zj53Ng17>%4Noo-wap5-S!%mbjp%0laY!ofJcd(B<CN5sJLMkKhMe-0pYCHKB(3=n* zA1cq_r_SVZSk)tBu#CA)O{s>LKz)lhh(+wq2tb%h^yT%?y4_Ql_CwS;nA^ie%yo(# z+_-YYN!)hZ^wAuMC3fr=-6zg%u>kO9@)jokp*D;zQ&P%+2DIEbwvAnwm*JbBx&UJ{ z`j5)w58thS=VBvXs;3);*($g<HWm2)hZZY+@uY@j1~OA|Ii4GaB2zG<*2`FD{8aw6 z4D{oGx&WqBG~2Pbck4l8V|FskDztQ18!8Z@AX#!dL;d%&>!3H{Os-%{M%r5nDjHV- z<6S%En!sED0_bDfU4?Ld+?-7nY|H&%yC|>cwrzg}`V8Fo`>i2#Kmte<SUO2_9Di&M zO|rx`QB1Ej7N|Zlg*;r2HNpg|>X38!&Y#U5Ogzt3h|v4Q>skNky8mTGK4|SD|A~dS z_qnj3PG;aD3CAedJc`2MUlSe<{bR^Yll3JPTI^DU-704RK(_*kr#`zZmgJpZDXh#A zEOkP}t-dZ(`Go*pISFKA-TMI3zF%}plB8%b$LJ}MnCA1iTZmNnPZ#|O;N5HK=GAk! z+nyiw0)kC>=FLGvzX28Y?0c0x?z^<_zYGZph`+zZ;MkRgQ}?gRA8J!Ms2lh{uRWk1 zfT`@fOq1mBNVUjD#{>%Y74lhVHRG#8MUu50cS49#KL4GL8x$K41`0A<-jAe*tPo0% zw;m^Ck_o)Z9AUer^p`)HnY)FhrRVkx&>|&@NS#sR)t7=@eWeCawO=<4juSfXi`dG= z$$Al*m=(=Ken+oX0-p%#b!4eJ!60u94Iz2JL2@|7+DGL*e*U#dr)A^Iu{O)dZg(>K z3&3y4Mo&LpoWwBdF`H^P*I56DpF+cE=-jF|>_|2U=xa@kt;)gxdV^4|-2s58(xm7G z7fRl-T#za1(QG+a7tjDuZ6-kCP&I*m{c=_lN(f;|Vg)#XcnAW&#X~x(p~b6fK(2@+ zXP7m^BgT(mdZoKi44`!JfZqb6xHE$B@^_1kJ3%wbH&EnL+~&yN%3TbK>Hp^j^c7x| zCUVHfa(%|&P6MVE;5WOIQ^I3+Qvp-s?<7Vy2HK^~evZmsAV3}aEkl{S(<BaYTbKD? zVD!@Vp$q0XVXtLc7hH~=?-rtp+v5-PACbu`WL6ns9g40-5+i#4XVs{ZaHtm7g-oCP zP_)?;un8qRT<!t(0{CTb;d>?EPR&(($))NQpz9P|qx7{3N>2Al1pKL4wM?I7AFIB? zpTM@c70x-40mwlbIBU>$Gz<0hH6tN>Zi~UF`?8N)cj3wV1pJf+z$0R;ffS=q-B+mj zNS+uo18HG~wDbY&-k(wl>sH}#o>c>csQHNF`uIa#fQk>(8#bf}q~Gg@3@8Lh@Tst^ z3Ek20rF-WvA(F?GRu@Rf#q7~w+9NXP1M4yOaqLb-R<Q%lSn!l?ZcHI<9^f4v(i+XH z*1ISxvGlrtP@q9Uwt0xrnVWhGm986esuN_EhFuxMzDmCPwJ3+3$3u4Qn6`=l>6;9C zbA}K54(I^xM|54g33L>A8J?DJwyS|TXQ5+&;#f$hd6gCT%#SnVqe!v5oeT#WJLnx~ z1H>Cq!zTwZ*J8i#W%#LrZb-^2O)UNAlqIF2fAMw6<x)c=NzY6noVhs*owldIa9(Xm zPcirA=4jFQQWzM|B-dr0fbgG_3Mj|U^H-#Lq?TOELQkt_`VE$8y5LJ{?)AR8Ea+vi z5k-1CZY#o#Bwg{>mmF6VW<kfFfnqKH`%lunW3>v&(5hfn#Q2!a`oqe?yB$4|SVm7a z1#*O>9`g?wKqhMaKW8-l{NPiPE0TDB{LM-)76gSL;UH^;5J@LCv7M$<ZFuVa?KAnS zJtL;j9)ATRQ~5g}@E6iH<R{N{PhkK>TdaHj;qAcEy%+n(${(#XaT|AF`9MH3r>~x9 zXFC5-0x$P<Wu;$^LDk#UY^<JbR|uRQEnU{u)dnaO<%s^DqCiMZw1?sN4@((J`wG#x z_T#ac&6vartd`yUh{4>iO0zTalTrxKJE%n7b;8-Xs5}!*3wV`5Ylvr&M;<GWS(~a7 z9M31~PoM!P{SGV+<17GBMpm@Z#=O=W3Q5H)0-7uP<D|kTDu3{TpI_i3-U%7#mT4Yd zS0bxvu>*zRtg3o5o(-TV0T<!(K!ELKqV*Zph%np%NAFH7_2%P2D^6(;21)8v{$+*C zW&f~J6$a>|tbmY*X<l^%kRW!M;?<k%OP#Fm98$i}PXzU6N-^ycaEA;guFLrWN^Aq0 ze3q6f9%m+)bjsdCD$FQL?vN)yRAQR(0)X2C<X#zbzrjy|yeG2nTxq;9B!5vlS@`k# zTPgW#c`vIkoGg?0Z4HpS0>fi1vH(FM`3-(GyhIta?AnGIl3^d_tpj;o0gdMBuWEHR z`HJpDZ!pkW10<QBn~s7S5C$N<eER3OF^7wJ{IP|Pu+eb(>R<ZZ9j!tO1wPl|&EFaQ zg3xOfYuR}b##O^zK%pEH-O^WhhHGiE{@F<XGm#WI^;PUf{>)6p4S1J2aY6M<tXb{p zH<{R_LCetdgQ#7STn;<1KjU7@Hm|ykz58@S;c7%LA9Zty(f=_0tRh5&kC+mmRKRC! zrhP12Wa}}%@it5c>SrY6(#l<7%&$~Z5a`9=MLCL(G<1|jr;M+IT@jKXbX~_5z6mG* z=Lf}stO^c*D>mDW6y-3ji-r#mToTpYw@M^2=6YaXNXb2?d+$Lh*I_QUyvNUP2Bdjk zVUIr?Ly$G<cyUkXwFu3G7&YzZ@<8(p79u*b3ED}es8z!1Z+?;+HOIRHHY)&yBs2Q$ zl9V4jNCr$>ZBI0$|7>{fmoL1;SEpX+CY56$o=+_yB!76YMeXSx{)&I@8vo}dsoB25 z_ZP0RZJZ}aAREdasZF*eM5?=YWCk+x<_w>6A)vG$5)+|&K=$Y3E@FBd5xaW<)?JwP zQ?$~2bJG#9#5m;zJecf<^k&qqX$68CvYkaNL2O0hDBZ!@LvNQBUPuc}M;y?Hy@hLF zbtl|p>XHB^>-_DQjl2^{UQm%Z2X$}YdY`ZBpvOM8=W&*r-_}Tfx-`Y;J@D4zT~He% zB^g$5OkV2gDiS}10c;&H+hTC&!2IfIWr^la@5nIvAwTk_=H5L?k{^twM=NB`!y*wo zgGeBg;WQxsgyqIGbQ@>-*AAS~+2`DDNfmR&PFNRON&ZbECT<-NI2P1mSidiX1lH|K zGMrRV%8-_l{;vj#u>cxHc14oc6PE*D!dTjImc2&qc7ftGS+Voa+-^A(KGU;vQP#C_ zQT{r&D`yJ138$tEHsDs>y&!;GMr<G-Yw{t2ic`93o_O~iTZWf?g>PLqtLozY1`VO_ zb4@2!1y%-D6C<Q|OY|_mu4V;7FKKKJ=+&~;xLx-fSp{H63;>^zBaTBbkfvT3vh?#A zXAklFN&l}cz$gRlK{3Zqd5QHD{#NDc03BWW(A644{TZ%B{pBZCVt(~5snXEf;j6gw zJbm<_XIGjdx872cNPee;VOu*}Qc_+Yy78_Lci;^M*kZ<9in5WA6+bDH!xUkgXspkC zEgd~wd2i6tRJR$Q({X-q2Gzpa0TE{$mn5<@cvXv>JHkj>Gipjd!X+ILZ)R*N@EG%b zbAR#e+xEuVQ4k@{T$Z)8ev<7G%B{KrR_SGk3B{MN7Uclq2LHgnifPY`z;ST(&)wGb zL~$IWY<0b33%65(50fhrWKXNYKEPrT%AAs9<una4Xdikjg7XXD8P$i?_E75rPU|zj z)@dGk7Diy~332fNKy^cT(*kHWdCOXF+K-eoTSmIJ@mH*J832qX-TPmmvjB9d_&nH$ zym`Ji_Ddm<2JtM1#`+UZ&}#sl^3{x5!IeUvk`JW}J${2WDRFrBTf^rEzbf!~$X<Ru z%7`dlz90!I%Y>u)+0~Wca%2&jDcu!D<8Fbl9EioLJPLzvDjVOJx!3!g+D8kaai<>v z?e~V`zWAw!aB3S3GvX5avT4;xthX>Od7%?%@UbmM9B}j;skht*c=<@zoa2EjRfg_L z2NYt{ra?=R3=Q&CH~0?1tx2uik4c64+nPAcG{#`<lN(1K)ga$?6Fxw2e*=_A=1VTh zXe;v#2k)|TIwB*Ybf`29)Cn9la(xm8-{W5}r)v@fHOMiJ2W<5p`A_wQ$+9M}q{r!( z{igNN@?pJ&=gc=cS#7#L^xPiA;8rzeMxQ+=pQbCeR7V0v-_pH!L@fKE7^I4MT9PEg z7IkyPZrWX4jN1*gW<D<g_GTzT33^0|9YAz&2M$Bi9{CyxA#Yc&?gu|ebcXqGM00ML zKoYt$X%CoyjubTpKujrg_%1+92{#h*hvt)D$7gkTc(D+TBGmzr#TOpb{GYae77h^6 zvRH@%Il*#cZnQRx20`ay_v$sxpR1l*JnZ&Y#nBCvT)w<p_OIoO%_!%)!0VAbMctP_ z{I8bV+rh2zNijeW8bD;!w(q;bP_jum@tG@GoK8wEO&p<WJ05t9MY-4yPkLD(LG`)y zgSTz+njhb)T(53FdD%69DZP`i<pfY{Lm)ey@&~iOwkL}DPkz!tMR;qHpwK_>Te?0v zxaKp)Jnp0YD51bR<HJVrkX^tT<DsrJ8l+!6bGD2PFue-6Nyx+>6oH`uud}Ztl)O5m z%V!c_d8a*#GXyGr#6i>PJX=+<fM3r!zkl4=X=QDfdk~h(6Av`JK<SG81Lw-L^N!?C z@E)Z%$w&*B8zBXJ&#}1IcQiUMxnIgyd-cnm-po`N5Q2qx6wP>J3RU;^ZLL4_hSq=S zs0Yt2FI*1rAJ7U>D9G*!6WJ*_er942AOe)v5-gK|ZoKeRAL@3=hG0jZ9BUP*|CQzA zezKU1l;f5z?F_*QK+$b1qcpszwJjM7@jrCZl%DU;@Sloo8`(~KCHLK7e%%Q{WE?5t zN%d3dFl1oybX5QtD*`ZOtwC&?L(#1uXs$L60`^Cqh5{JGCx5u1^!>(y%vGef=c?dM z(4o5``Oa#EV=-bCw64sxyy^H~zfhL|jW^w>EdJX-{h1{H-LqGGIc#wUY?6t}isYD# zDs~rQ`D37kM@&sFj0f7tl62(5IN<5ZySeX4NKhZRT6H>?%Fqt~N?xx9o)yM>^d{4C z#d_~gXkNp;JmpU+YeBa*%ubp)+K(a0jpz6_a(ge*lWK;I2}11*EURW4IS~JMVSLh; zz3;b-^iO)2p5C6=)F5AtxzuM0S)%dq0d8v8BT$)>DTr+b;sydM_b*mKW6j`x7Vy~D zYDdCmxaQ!2chkU`miOP24)oi<9CYD*OKJ(G>cFWO@PX#HrF(a3wb(;QPw(7Jidudu zkIGnAkk(bokWMJK{XRzY7B8T=7i8Uk6~dc^=7G}V)HpOi^}PPZpgg0`mo*9*ZcApN z0}3wEm=ys(LD)ZtLK~OpEjYS?8JG*wgVyfUNv#Q)?n*23w05BfEVGyey7*wU`Q80n z0|&Fk5e5o>D`)S_W=UU8(Csv^nsp5mN$+I$bOI9Taj9`&kS+v+&>tK(bEy$t*9P@e zNJTvz8j{<Z_5QF_SpzA%X=`JFg;)~TBmA#MamE+7waZ_b3T^$;FLzPo)sfdDP~j6a z6;HXN-1ab9M4E7>YqEaM7$OwySM6<Ah*##^-yfQBF)lPnjq+EPz&tMqGy!$GeyOTM zlDCnhCneL52VODTB8i)|og<BM*?GHM<L+49Svf1Hku!a`D*{HNH$G&w9GW|4&A<Az z;J5J7HnW;k@pEPk(#!WJS^El&L7H%E)*DE14!L|Cu;?1dU4=|!SbWCvotxh+2W}-X zrZeW%z>8C#b>1Icx)&u$jM&Q0c3CReBs~o6t8Yq@-WOM9)Z)#u*zn+M1zgLdBRo_5 z9KQY6c^2gUzGpp$1_@nUhktTkBxS$rch6}P8*&CU@5Q~~6K2>k3FVuA<5d2h22`L% zi^&r+?sekr4{`V@?QwC{&P!d3H~kNJ-rT7x|8*h|><o!{yiA-^jNa`BME0xTnvx<* z^=D<w;Gr-!A2_0h6%8E2^VzKs7*K@yd>=DSk9#&)xb`cYQ>%3Z-v2Uo;%2E+xQD&H zWO;bagj@TAJId!wwGkOk4Ig=5-lsC(>uCP+IZu9Xtuy?5n%|rpAE+~}<;4ls_6Jls z=_3TBIDZ#(c=TLBAlkYJ%oepdQ`pf^;XxYF-2vg<cJA9?{-nK5k1K!m)rX^G-%Q~q zR<h+04lkribk<}90mAy?vEl2c_AQfk8R%LdP`_1G%>4+x<wU#>0**5}OniSulVdl6 z{s;?8w_39aNT{8D9%8v6kXNI*D<w(PDgiV+|0k;PhL_GE20pn}@01@cJW2B3_`Bo` zVeZPRJwFHqH{K6<ELZ{t=LQG7RtY-kX*QN*4>UpF0QxWIdc1Fg`rG?%p89&<7Tl3h z`|z4pv<DvVo;ploD<-i*tWKJ!Gkm<|Yz#6sSM#12qrJM7wEO&tSFyu{;A4%8D)Ww? z><wBCetbi#KZhq)^8FQn!Z}`jy2GwnuT{8lxqJ1!xkuMSjNhP&3Fr|Vd{+b1!&v*G zI7BM&v$q!4h%NAlA)^QA!(a3Cgz}Oc7dFVGBZ4Dd_`{Oa-JKB90i)Yl|5atjB~85q z2ad~9*-0QT7kOZl9os2GCrz%f(O_~wi^tW|X1PVrLyZlma(`DS8qM6aWxZZmArp%m zNXc6l-D0EpuhmyLZq<;46Kw*fR#0zFz-X$#d&f71pBpeUIK!6Y-u@^vR6G4hQ|O|3 z0+Z9O)?#7snU0aIpEso!Z>%_epH{LTXo=mDbYt7GPZX9~#A=p2zg^DwMJasOiUAl( zC=1~)H$loA%C`BGlydRXMp>r8d#~F6z(XL{S1bxwR5@%y8*=jQEUm=pBoZD_E?{;X zgvxVcW%tX*)Ei$`eV{C}Pz4Dty-WAXiPp}b>bUY8{u@a-6vA`Yf;TO(;X)cDUPVxo z#i#Ktq$6L+k^g(CXfG#Z^D4I*!&2u|6C9*Q`Z&u?*r>erdYx;lD@1U3`@HdIbGodX zJtO5SWtkPLyu(Fc=~>@o;s!DPRsKC+v5$TC-?dd8xrb)wz%?ozJR@N=4B<tNa9jP! znvDmONekOwS)n-1o?RyQ)(+>Ub&X3-EbdL}<u(*yPw>;8g8jdft9^y11)#K0Z$rK3 z(U*2hgISSbmbwFz!wn)mN1VXfYXkj*Nrl?c*D7VUw7!dNihiW(XO6r^0gTZ++`z+d zB30ZQchIr=Yo6PTuBY~n!SW58&oJVRJXXfXYw=XI#H+x&Q?r_CZPO`#mHTboG>sB! zEFgl63&fJ3G}T;?{I{S-T*s%`AAu%BbsuL~uieT+$REi2tetPdHm7KQ=DqE>^V!bM zdz(96;y0_(rE`n}(W`3iq2Axkcsr+F`@Q)akN<Pt_K{GJL)zK;CO@b&Wo0D%-5<=G zQlXpzxeEGQ!&UnEhg1`;wrJoez`aH|wO#IU-|?|`IPrEc>0}3m9yhhjfIf5#X2oLN zIJfdwPL(}8PhA9#B;*h(a<L#YDez8xx4?V@J1ex1i5j<Ibs3DCu_eV{e+h0imapw) z>&&n$NV>$8cc)2_)yGuVI%WmVM-0-XHbmzWMyM%o<3|TAUp+E0$?%o}!(l`f#@MO( zzTx!43`?(~oUxe;NYIEK){UF)%(l95e|_vmN?g1Fn)?6y)dk1jeZYQm;|Pp1|4+wO UX>JPmZU&IGxxLv_6Cd*b1K6}HIRF3v From 343f4dd9254f77528bca1cb90f8ce239c6635774 Mon Sep 17 00:00:00 2001 From: Daniel O'Connell <github@ahiru.pl> Date: Wed, 19 Jun 2024 19:57:14 +0200 Subject: [PATCH 132/132] fix chrome bug --- app/hooks/useChat.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/hooks/useChat.ts b/app/hooks/useChat.ts index f87c9ab3..e6ebc525 100644 --- a/app/hooks/useChat.ts +++ b/app/hooks/useChat.ts @@ -148,6 +148,7 @@ const ignoreAbort = (error: Error) => { if (error.name !== 'AbortError') { throw error } + console.log(error) } export async function* iterateData(res: Response) { @@ -240,6 +241,17 @@ export const extractAnswer = async ( return {result, followups} } +const makePayload = ( + sessionId: string | undefined, + history: HistoryEntry[], + settings?: ChatSettings +): string => { + const payload = JSON.stringify({sessionId, history, settings}) + if (payload.length < 70000) return payload + if (history.length === 1) throw 'You question is too long - please shorten it' + return makePayload(sessionId, history.slice(1), settings) +} + const fetchLLM = async ( sessionId: string | undefined, history: HistoryEntry[], @@ -255,7 +267,7 @@ const fetchLLM = async ( 'Content-Type': 'application/json', Accept: 'text/event-stream', }, - body: JSON.stringify({sessionId, history, settings}), + body: makePayload(sessionId, history, settings), }).catch(ignoreAbort) export const queryLLM = async (