From 956b99b29a4a21179863a7e6ed0760f9f43b5c60 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Fri, 13 Sep 2024 16:12:20 +0200 Subject: [PATCH 01/33] implement search bar and video chapters --- .eslintrc.json | 5 +- app/(dashboard)/student.tsx | 6 +- .../media/[mediaId]/ContentMediaDisplay.tsx | 90 ++ .../[courseId]/media/[mediaId]/lecturer.tsx | 5 +- .../[courseId]/media/[mediaId]/student.tsx | 589 ++++++++----- app/courses/[courseId]/skills/student.tsx | 165 ++-- components/ItemFormSection.tsx | 348 ++++---- components/Navbar.tsx | 139 ++- components/PdfViewer.tsx | 57 +- components/RichTextEditor.tsx | 4 +- package.json | 5 +- pnpm-lock.yaml | 107 ++- src/schema.graphql | 790 +++++++++++------- 13 files changed, 1483 insertions(+), 827 deletions(-) create mode 100644 app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay.tsx diff --git a/.eslintrc.json b/.eslintrc.json index 4d765f2..ed20e77 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,6 @@ { - "extends": ["next/core-web-vitals", "prettier"] + "extends": ["next/core-web-vitals", "prettier"], + "rules": { + "@next/next/no-img-element": "off" + } } diff --git a/app/(dashboard)/student.tsx b/app/(dashboard)/student.tsx index 15fac50..04cd9f1 100644 --- a/app/(dashboard)/student.tsx +++ b/app/(dashboard)/student.tsx @@ -13,7 +13,7 @@ import { import dayjs from "dayjs"; import { chain } from "lodash"; import Link from "next/link"; -import { useState } from "react"; +import { Fragment, useState } from "react"; import { useLazyLoadQuery } from "react-relay"; import { graphql } from "relay-runtime"; @@ -103,7 +103,7 @@ export default function StudentPage() { ) .map(([key, courses]) => { return ( - <> + {key} @@ -118,7 +118,7 @@ export default function StudentPage() { /> ))} - + ); }) diff --git a/app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay.tsx b/app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay.tsx new file mode 100644 index 0000000..a8de06c --- /dev/null +++ b/app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay.tsx @@ -0,0 +1,90 @@ +"use client"; +import { ContentMediaDisplayFragment$key } from "@/__generated__/ContentMediaDisplayFragment.graphql"; +import { ContentMediaDisplayVideoFragment$key } from "@/__generated__/ContentMediaDisplayVideoFragment.graphql"; +import { PdfViewer } from "@/components/PdfViewer"; +import { MediaPlayer, MediaProvider } from "@vidstack/react"; +import { + defaultLayoutIcons, + DefaultVideoLayout, +} from "@vidstack/react/player/layouts/default"; +import "@vidstack/react/player/styles/default/layouts/video.css"; +import "@vidstack/react/player/styles/default/theme.css"; +import { useFragment } from "react-relay"; +import { graphql } from "relay-runtime"; + +export function ContentMediaDisplay({ + _record, + onProgressChange, +}: { + _record: ContentMediaDisplayFragment$key; + onProgressChange: (fraction: number) => void; +}) { + const mediaRecord = useFragment( + graphql` + fragment ContentMediaDisplayFragment on MediaRecord { + type + name + downloadUrl + ...ContentMediaDisplayVideoFragment + } + `, + _record + ); + + switch (mediaRecord.type) { + case "VIDEO": + return ; + case "PRESENTATION": + case "DOCUMENT": + return ( + + ); + case "IMAGE": + // eslint-disable-next-line @next/next/no-img-element + return ( + {mediaRecord.name} + ); + default: + return <>Unsupported media type; + } +} + +export function VideoPlayer({ + _video, +}: { + _video: ContentMediaDisplayVideoFragment$key; +}) { + const mediaRecord = useFragment( + graphql` + fragment ContentMediaDisplayVideoFragment on MediaRecord { + type + name + downloadUrl + segments { + id + ... on VideoRecordSegment { + startTime + transcript + thumbnail + title + } + } + } + `, + _video + ); + + return ( + + + + + ); +} diff --git a/app/courses/[courseId]/media/[mediaId]/lecturer.tsx b/app/courses/[courseId]/media/[mediaId]/lecturer.tsx index c9838d7..0275ca5 100644 --- a/app/courses/[courseId]/media/[mediaId]/lecturer.tsx +++ b/app/courses/[courseId]/media/[mediaId]/lecturer.tsx @@ -12,7 +12,8 @@ import { Alert, Button, CircularProgress, Typography } from "@mui/material"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useState } from "react"; import { graphql, useLazyLoadQuery, useMutation } from "react-relay"; -import { ContentMediaDisplay, DownloadButton } from "./student"; +import { ContentMediaDisplay } from "./ContentMediaDisplay"; +import { DownloadButton } from "./student"; export default function LecturerMediaPage() { const { mediaId, courseId } = useParams(); @@ -33,7 +34,7 @@ export default function LecturerMediaPage() { mediaRecords { id name - ...studentContentMediaDisplayFragment + ...ContentMediaDisplayFragment ...studentContentDownloadButtonFragment } } diff --git a/app/courses/[courseId]/media/[mediaId]/student.tsx b/app/courses/[courseId]/media/[mediaId]/student.tsx index 2efd0fb..116d4bf 100644 --- a/app/courses/[courseId]/media/[mediaId]/student.tsx +++ b/app/courses/[courseId]/media/[mediaId]/student.tsx @@ -1,40 +1,54 @@ "use client"; +/* eslint-disable @next/next/no-img-element */ +import { + MediaPlayer, + MediaPlayerInstance, + MediaProvider, + Track, +} from "@vidstack/react"; +import { + defaultLayoutIcons, + DefaultVideoLayout, +} from "@vidstack/react/player/layouts/default"; +import "@vidstack/react/player/styles/default/layouts/video.css"; +import "@vidstack/react/player/styles/default/theme.css"; import { studentContentDownloadButtonFragment$key } from "@/__generated__/studentContentDownloadButtonFragment.graphql"; -import { studentContentMediaDisplayFragment$key } from "@/__generated__/studentContentMediaDisplayFragment.graphql"; +import { studentContentSideFragment$key } from "@/__generated__/studentContentSideFragment.graphql"; import { studentMediaLogProgressMutation } from "@/__generated__/studentMediaLogProgressMutation.graphql"; import { studentMediaQuery } from "@/__generated__/studentMediaQuery.graphql"; -import { MediaContentLink } from "@/components/content-link/MediaContentLink"; import { ContentTags } from "@/components/ContentTags"; import { Heading } from "@/components/Heading"; -import { DisplayError, PageError } from "@/components/PageError"; -import { PdfViewer } from "@/components/PdfViewer"; +import { PageError } from "@/components/PageError"; import { Check, Download } from "@mui/icons-material"; -import { - Alert, - Button, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - Typography, -} from "@mui/material"; +import { Alert, Button, MenuItem, Select } from "@mui/material"; +import "@vidstack/react/player/styles/default/layouts/video.css"; +import "@vidstack/react/player/styles/default/theme.css"; import { differenceInHours } from "date-fns"; -import { first } from "lodash"; -import { useParams, useSearchParams } from "next/navigation"; -import { useEffect, useState } from "react"; -import ReactPlayer from "react-player"; +import dayjs from "dayjs"; +import duration from "dayjs/plugin/duration"; +import { clamp } from "lodash"; + +dayjs.extend(duration); + +import { studentContentSideVideoFragment$key } from "@/__generated__/studentContentSideVideoFragment.graphql"; +import { studentMediaLogProgressVideoMutation } from "@/__generated__/studentMediaLogProgressVideoMutation.graphql"; +import { useParams } from "next/navigation"; + +import { MutableRefObject, RefObject, useRef, useState } from "react"; import { graphql, useFragment, useLazyLoadQuery, useMutation, } from "react-relay"; +import { ContentMediaDisplay } from "./ContentMediaDisplay"; export default function StudentMediaPage() { - const { mediaId, courseId } = useParams(); - const searchParams = useSearchParams(); - const media = useLazyLoadQuery( + const { mediaId } = useParams(); + const { + contentsByIds: [content], + } = useLazyLoadQuery( graphql` query studentMediaQuery($mediaId: UUID!) { contentsByIds(ids: [$mediaId]) { @@ -45,13 +59,10 @@ export default function StudentMediaPage() { } ... on MediaContent { mediaRecords { + ...studentContentSideFragment + ...studentContentSideVideoFragment + type id - name - ...studentContentMediaDisplayFragment - ...studentContentDownloadButtonFragment - userProgressData { - dateWorkedOn - } } } @@ -61,47 +72,19 @@ export default function StudentMediaPage() { `, { mediaId } ); - - const recordId = searchParams.get("recordId"); - - const content = media.contentsByIds[0]; - - const mainRecord = recordId - ? content?.mediaRecords?.find((record) => record.id === recordId) - : first(content?.mediaRecords ?? []); - - const [mediaRecordWorkedOn] = - useMutation(graphql` - mutation studentMediaLogProgressMutation($id: UUID!) { - logMediaRecordWorkedOn(mediaRecordId: $id) { - id - userProgressData { - dateWorkedOn - } - } - } - `); - - const workedOnToday = - Math.abs( - differenceInHours( - new Date(), - new Date(mainRecord?.userProgressData.dateWorkedOn ?? "") - ) - ) < 24; + const videoRef = useRef(null); const [nagDismissed, setNagDismissed] = useState(false); - useEffect(() => { - setNagDismissed(false); - setProgress(0); - }, [mainRecord?.id]); - const [progress, setProgress] = useState(0); const [error, setError] = useState(null); + const ref = useRef(null); + + const [selected, setSelected] = useState({ left: 0, right: 0 }); + const [splitPercentage, setSplitPercentage] = useState(50); // Initial split at 50% - if (media.contentsByIds.length == 0) { - return ; + if (!content) { + return ; } if (content.metadata.type !== "MEDIA") { @@ -109,7 +92,7 @@ export default function StudentMediaPage() { ); } - if (!content.mediaRecords) { + if (!content.mediaRecords?.length) { return ( - ); - } - - const relatedRecords = content.mediaRecords.filter( - (record) => record.id !== mainRecord?.id - ); + const videos = content.mediaRecords.filter((x) => x.type === "VIDEO"); + const documents = content.mediaRecords.filter((x) => x.type !== "VIDEO"); return (
: undefined - } + title={content.metadata.name} + overline={content.metadata.name} backButton /> @@ -155,134 +125,101 @@ export default function StudentMediaPage() { ))} - {mainRecord && ( - <> - 0.8 && !workedOnToday && !nagDismissed}> - Do you want to mark this as understood? - - You've completed more than 80% of this content - this could - be a good time to mark it as completed. - - - - - - -
- -
- + {/* TODO progress tracking */} + {/* 0.8 && !workedOnToday && !nagDismissed}> + Do you want to mark this as understood? + + You've completed more than 80% of this content - this could be a + good time to mark it as completed. + + + + + + */} + +
+ {videos.length > 0 && ( + + setSelected({ ...selected, left: val }) + } + /> + )} + {videos.length > 0 && documents.length > 0 && ( +
{ + const l = (e: MouseEvent) => { + const dimensions = ref.current?.getBoundingClientRect(); + if (!dimensions) return; + + e.stopPropagation(); + + setSplitPercentage( + clamp( + (100 * (e.screenX - dimensions.x)) / dimensions.width, + 20, + 70 + ) + ); + }; + + window.addEventListener("mousemove", l); + + window.onmouseup = () => + window.removeEventListener("mousemove", l); + }} + className="group w-full flex items-center justify-center cursor-col-resize" + > +
+
- - )} - {!mainRecord && } - - {relatedRecords.length > 0 && ( - <> - Related media -
- {relatedRecords.map((record) => ( - - ))} -
- - )} + )} + {documents.length > 0 && ( + + setSelected({ ...selected, left: val }) + } + /> + )} +
); } -export function ContentMediaDisplay({ - _record, - onProgressChange, -}: { - _record: studentContentMediaDisplayFragment$key; - onProgressChange: (fraction: number) => void; -}) { - const mediaRecord = useFragment( - graphql` - fragment studentContentMediaDisplayFragment on MediaRecord { - type - name - downloadUrl - } - `, - _record - ); - - const [duration, setDuration] = useState(); - - switch (mediaRecord.type) { - case "VIDEO": - return ( - { - setDuration(duration); - }} - onProgress={(progress) => { - if (duration) { - onProgressChange(progress.playedSeconds / duration); - } - }} - /> - ); - case "PRESENTATION": - case "DOCUMENT": - return ( - - ); - case "IMAGE": - // eslint-disable-next-line @next/next/no-img-element - return ( - {mediaRecord.name} - ); - default: - return <>Unsupported media type; - } -} - export function DownloadButton({ _record, }: { @@ -327,3 +264,253 @@ export function DownloadButton({ ); } + +function DocumentSide({ + _records, + selected, + setSelected, + setError, + videoRef, +}: { + _records: studentContentSideFragment$key; + selected: number; + setSelected: (val: number) => void; + setError: (err: any) => void; + videoRef: RefObject; +}) { + const [progress, setProgress] = useState(0); + + const mediaRecords = useFragment( + graphql` + fragment studentContentSideFragment on MediaRecord @relay(plural: true) { + id + name + downloadUrl + ...ContentMediaDisplayFragment + userProgressData { + dateWorkedOn + } + } + `, + _records + ); + const currentRecord = mediaRecords[selected]; + + const [mediaRecordWorkedOn] = + useMutation(graphql` + mutation studentMediaLogProgressMutation($id: UUID!) { + logMediaRecordWorkedOn(mediaRecordId: $id) { + id + } + } + `); + + const workedOnToday = + Math.abs( + differenceInHours( + new Date(), + new Date(currentRecord?.userProgressData.dateWorkedOn ?? "") + ) + ) < 24; + + return ( +
+ {(mediaRecords?.length ?? 0) > 1 && ( + + )} + + {currentRecord && ( + + )} + +
+ +
+
+ ); +} + +function VideoSide({ + _records, + selected, + setSelected, + setError, + videoRef, +}: { + _records: studentContentSideVideoFragment$key; + selected: number; + setSelected: (val: number) => void; + setError: (err: any) => void; + videoRef: MutableRefObject; +}) { + const mediaRecords = useFragment( + graphql` + fragment studentContentSideVideoFragment on MediaRecord + @relay(plural: true) { + id + name + downloadUrl + userProgressData { + dateWorkedOn + } + closedCaptions + segments { + id + ... on VideoRecordSegment { + startTime + + transcript + thumbnail + title + } + } + } + `, + _records + ); + const currentRecord = mediaRecords[selected]; + + const [mediaRecordWorkedOn] = + useMutation(graphql` + mutation studentMediaLogProgressVideoMutation($id: UUID!) { + logMediaRecordWorkedOn(mediaRecordId: $id) { + id + } + } + `); + + const workedOnToday = + Math.abs( + differenceInHours( + new Date(), + new Date(currentRecord?.userProgressData.dateWorkedOn ?? "") + ) + ) < 24; + + const [duration, setDuration] = useState(0); + + return ( +
+ {(mediaRecords?.length ?? 0) > 1 && ( + + )} + + setDuration(e)} + > + {currentRecord.closedCaptions && ( + + )} + + ({ + startTime: x.startTime ?? 0, + text: x.title ?? "", + endTime: currentRecord.segments[idx + 1]?.startTime ?? duration, + })), + }} + label="Chapters" + kind="chapters" + type="json" + default + /> + + + ({ + startTime: x.startTime ?? 0, + url: "data:image/jpeg;base64," + x.thumbnail, + }))} + /> + + +
+ {currentRecord.segments.map((segment) => ( +
{ + if (videoRef.current && segment.startTime !== undefined) + videoRef.current.currentTime = segment.startTime; + }} + key={segment.id} + className="bg-slate-50 border borders-slate-200 shadow hover:bg-slate-100 text-xs rounded-md p-2 transition duration-100 cursor-pointer flex gap-2" + > + {segment.title!} +
+
+ {dayjs + .duration(segment.startTime ?? 0, "seconds") + .format("HH:mm:ss")} +
+ {segment.title} +
+
+ ))} +
+ +
+ +
+
+ ); +} diff --git a/app/courses/[courseId]/skills/student.tsx b/app/courses/[courseId]/skills/student.tsx index 6342495..a9678f1 100644 --- a/app/courses/[courseId]/skills/student.tsx +++ b/app/courses/[courseId]/skills/student.tsx @@ -1,87 +1,102 @@ +import { studentCourseSkillsQuery } from "@/__generated__/studentCourseSkillsQuery.graphql"; import { Heading } from "@/components/Heading"; import { SkillLevels } from "@/components/SkillLevels"; import { Grid, Typography } from "@mui/material"; import { useParams } from "next/navigation"; import { graphql, useLazyLoadQuery } from "react-relay"; -import { studentCourseSkillsQuery } from "@/__generated__/studentCourseSkillsQuery.graphql"; export default function StudentSkills() { - // Get course id from url - const { courseId:id } = useParams(); - const { coursesByIds } = useLazyLoadQuery( - graphql` - query studentCourseSkillsQuery($id: UUID!) { - coursesByIds(ids: [$id]) { - id - title - skills { - skillName - skillLevels { - remember { - value - } - understand { - value - } - apply { - value - } - analyze { - value - } - evaluate{ - value - } - create{ - value - } - } - ...SkillLevelsFragment + // Get course id from url + const { courseId: id } = useParams(); + const { coursesByIds } = useLazyLoadQuery( + graphql` + query studentCourseSkillsQuery($id: UUID!) { + coursesByIds(ids: [$id]) { + id + title + skills { + skillName + skillLevels { + remember { + value + } + understand { + value + } + apply { + value + } + analyze { + value + } + evaluate { + value + } + create { + value } } + ...SkillLevelsFragment } - `, - { id } - ); - // Extract course - const course = coursesByIds[0]; - const skills=course.skills; - const title="Knowledge Status for Course "+course.title; - return (
- -

- This pages shows your current knowledge status. Your knowledge status is calculated based on your performances on flashcardsets and quizzes. - For the calculation a method called M-Elo is used. Elo was originally used to rank chess players, but due to adaptions it can also be used to calculate students - knowledge status. After the completion of a flashcardset or a quiz, M-Elo will automatically recalulate your knowledge status of the skills, that were covered by - the flashcardset or quiz you worked on. Each flashcard and each question has a list with the skills and levels of Blooms Taxonomy, that belong to the flashcard or quiz. - After the completion of a quiz only the values for the involved skills and the corresponding levels are recalulated. Due to this, this overview only shows the skills and - the level of Blooms Taxonomy you have already worked on. - - - -{skills.map((skill, index) => ( - - skill.skillLevels && (skill.skillLevels.remember.value>0 ||skill.skillLevels.understand.value>0 -||skill.skillLevels.analyze.value>0||skill.skillLevels.apply.value>0||skill.skillLevels.evaluate.value>0||skill.skillLevels.create.value>0)&& -

- - - - {skill.skillName} - - - - - - - - - -
+ } + } + `, + { id } + ); + // Extract course + const course = coursesByIds[0]; + const skills = course.skills; + const title = "Knowledge Status for Course " + course.title; + return ( +
+ +

+ + This pages shows your current knowledge status. Your knowledge status is + calculated based on your performances on flashcardsets and quizzes. For + the calculation a method called M-Elo is used. Elo was originally used + to rank chess players, but due to adaptions it can also be used to + calculate students knowledge status. After the completion of a + flashcardset or a quiz, M-Elo will automatically recalulate your + knowledge status of the skills, that were covered by the flashcardset or + quiz you worked on. Each flashcard and each question has a list with the + skills and levels of Blooms Taxonomy, that belong to the flashcard or + quiz. After the completion of a quiz only the values for the involved + skills and the corresponding levels are recalulated. Due to this, this + overview only shows the skills and the level of Blooms Taxonomy you have + already worked on. + + + {skills.map( + (skill, index) => + skill.skillLevels && + ((skill.skillLevels.remember?.value ?? 0) > 0 || + (skill.skillLevels.understand?.value ?? 0) > 0 || + (skill.skillLevels.analyze?.value ?? 0) > 0 || + (skill.skillLevels.apply?.value ?? 0) > 0 || + (skill.skillLevels.evaluate?.value ?? 0) > 0 || + (skill.skillLevels.create?.value ?? 0) > 0) && ( +

+ + + {skill.skillName} + + -
+ + + - ))} - -
); -} \ No newline at end of file +
+
+ ) + )} + +
+ ); +} diff --git a/components/ItemFormSection.tsx b/components/ItemFormSection.tsx index eb6cdcf..354d119 100644 --- a/components/ItemFormSection.tsx +++ b/components/ItemFormSection.tsx @@ -1,179 +1,209 @@ -import { Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, FormControl, FormControlLabel, FormGroup, InputLabel, ListItemText, MenuItem, Select, TextField, Typography } from "@mui/material"; -import { Form, FormSection } from "./Form"; -import { useState,useEffect } from "react"; -import { graphql, useLazyLoadQuery } from "react-relay"; +import { + BloomLevel, + SkillInput, +} from "@/__generated__/AddFlashcardSetModalMutation.graphql"; import { ItemFormSectionCourseSkillsQuery } from "@/__generated__/ItemFormSectionCourseSkillsQuery.graphql"; -import { BloomLevel,SkillInput } from "@/__generated__/AddFlashcardSetModalMutation.graphql"; import { Add } from "@mui/icons-material"; +import { + Button, + Checkbox, + FormControl, + FormControlLabel, + FormGroup, + InputLabel, + ListItemText, + MenuItem, + Select, + TextField, +} from "@mui/material"; +import { useEffect, useState } from "react"; +import { graphql, useLazyLoadQuery } from "react-relay"; +import { FormSection } from "./Form"; const bloomLevelLabel: Record = { - CREATE:"Create", - EVALUATE:"Evaluate", - ANALYZE: "Analyze", - APPLY: "Apply", - REMEMBER: "Remember", - UNDERSTAND: "Understand", - "%future added value": "Unknown", + CREATE: "Create", + EVALUATE: "Evaluate", + ANALYZE: "Analyze", + APPLY: "Apply", + REMEMBER: "Remember", + UNDERSTAND: "Understand", + "%future added value": "Unknown", }; export function ItemFormSection({ - onChange , - item, - courseId, - useEffectNecessary, - }: { - onChange: (item: ItemData| null,newSkillAdded?:boolean) => void; - item: ItemData ; - courseId: string; - useEffectNecessary?:boolean; - }) { - const [bloomLevels, setBloomLevels] = useState(item?.associatedBloomLevels ?? []);; - const[skills,setSkills]=useState(item?.associatedSkills??[]); - const[itemId,setItemId]=useState(item?.id) - const valid =bloomLevels.length>0 && skills.length>0; - const[newSkillAdded,setNewSkillAdded]=useState(false); - const { coursesByIds } = useLazyLoadQuery( - graphql` - query ItemFormSectionCourseSkillsQuery($id: UUID!) { - coursesByIds(ids: [$id]) { - id + onChange, + item, + courseId, +}: { + onChange: (item: ItemData | null, newSkillAdded?: boolean) => void; + item: ItemData; + courseId: string; +}) { + const [bloomLevels, setBloomLevels] = useState( + item?.associatedBloomLevels ?? [] + ); + const [skills, setSkills] = useState(item?.associatedSkills ?? []); + const [itemId, setItemId] = useState(item?.id); + const valid = bloomLevels.length > 0 && skills.length > 0; + const [newSkillAdded, setNewSkillAdded] = useState(false); + const { coursesByIds } = useLazyLoadQuery( + graphql` + query ItemFormSectionCourseSkillsQuery($id: UUID!) { + coursesByIds(ids: [$id]) { + id title - skills { - id - skillName - } + skills { + id + skillName } } - `, - {id:courseId } - ); + } + `, + { id: courseId } + ); - const[availableSkills,setAvailableSkills]=useState(coursesByIds[0].skills); - const [newSkill, setNewSkill] = useState(""); // new state variable for the new skill - function handleAddSkill() { - if (newSkill) { - const isAlreadyAvailable=availableSkills.some(skill=>skill.skillName===newSkill) - if(!isAlreadyAvailable){ - setAvailableSkills([...availableSkills, { skillName: newSkill,id:null}]); - setNewSkill(""); - setNewSkillAdded(true); - } - else{ - alert("The skill is already available!"); - } + const [availableSkills, setAvailableSkills] = useState( + coursesByIds[0].skills + ); + const [newSkill, setNewSkill] = useState(""); // new state variable for the new skill + function handleAddSkill() { + if (newSkill) { + const isAlreadyAvailable = availableSkills.some( + (skill) => skill.skillName === newSkill + ); + if (!isAlreadyAvailable) { + setAvailableSkills([ + ...availableSkills, + { skillName: newSkill, id: null }, + ]); + setNewSkill(""); + setNewSkillAdded(true); + } else { + alert("The skill is already available!"); } - } - function checkIfAvailableSkillIsPartOfSkills(skillToTest:SkillInput){ -console.log(skills); - if(skills.length>0){ - for(let i=0;i< skills.length;i++){ - if(skills[i].skillName==skillToTest.skillName){ - return true; - } + } + function checkIfAvailableSkillIsPartOfSkills(skillToTest: SkillInput) { + console.log(skills); + if (skills.length > 0) { + for (let i = 0; i < skills.length; i++) { + if (skills[i].skillName == skillToTest.skillName) { + return true; } } - return false; } - function handleSkillChange(e: React.ChangeEvent, skill:Skill) { - if (e.target.checked) { - setSkills([...skills,skill]); - } else { - let newSkillSet=skills.filter(s => s.id !== skill.id); - setSkills(newSkillSet); - - } - } - - + return false; + } + function handleSkillChange( + e: React.ChangeEvent, + skill: Skill + ) { + if (e.target.checked) { + setSkills([...skills, skill]); + } else { + let newSkillSet = skills.filter((s) => s.id !== skill.id); + setSkills(newSkillSet); + } + } - useEffect(() => { - onChange( - valid - ? { - id: itemId, - associatedBloomLevels: bloomLevels, - associatedSkills: skills, - } - : null, - newSkillAdded - ); - }, [bloomLevels, skills]); - return( - - - Levels of Blooms Taxonomy + useEffect(() => { + onChange( + valid + ? { + id: itemId, + associatedBloomLevels: bloomLevels, + associatedSkills: skills, + } + : null, + newSkillAdded + ); + }, [bloomLevels, skills]); + return ( + + + + Levels of Blooms Taxonomy + - + setBloomLevels( + (typeof value === "string" + ? value.split(",") + : value) as BloomLevel[] + ) + } + renderValue={(selected) => + selected.map((x) => bloomLevelLabel[x]).join(", ") + } + inputProps={{ id: "assessmentBloomLevelsInput" }} + required + multiple + > + {( + [ + "REMEMBER", + "UNDERSTAND", + "APPLY", + "ANALYZE", + "EVALUATE", + "CREATE", + ] as const + ).map((val, i) => ( + + -1} /> - {bloomLevelLabel[val]} - - ) - )} - - - - Associated Skills: - {availableSkills.map((availableSkill:SkillInput) => ( -
- ) => handleSkillChange(e, availableSkill)} - key={availableSkill.id} - /> - } - label={ - availableSkill.skillName - } - /> -
- ),)} -
- - - setNewSkill(e.target.value)} + {bloomLevelLabel[val]} + + ))} + +
+ + Associated Skills: + {availableSkills.map((availableSkill: SkillInput) => ( +
+ ) => + handleSkillChange(e, availableSkill) + } + key={availableSkill.id} + /> + } + label={availableSkill.skillName} /> -

- - - ); - } +

+ ))} +
+ + + setNewSkill(e.target.value)} + /> +

+ + + ); +} - export type ItemData = { - associatedBloomLevels: BloomLevel[]; - associatedSkills: SkillInput[]; - id?:string; - }; - export type Skill={ - skillName: string, - id?: string | null; - }; \ No newline at end of file +export type ItemData = { + associatedBloomLevels: BloomLevel[]; + associatedSkills: SkillInput[]; + id?: string; +}; +export type Skill = { + skillName: string; + id?: string | null; +}; diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 5c89da9..79fe9d0 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,13 +1,22 @@ "use client"; import { NavbarIsTutor$key } from "@/__generated__/NavbarIsTutor.graphql"; +import { NavbarSemanticSearchQuery } from "@/__generated__/NavbarSemanticSearchQuery.graphql"; import { NavbarStudentQuery } from "@/__generated__/NavbarStudentQuery.graphql"; import logo from "@/assets/logo.svg"; import { PageView, usePageView } from "@/src/currentView"; -import { CollectionsBookmark, Dashboard, Logout } from "@mui/icons-material"; import { + CollectionsBookmark, + Dashboard, + Logout, + Search, +} from "@mui/icons-material"; +import { + Autocomplete, Avatar, + CircularProgress, Divider, IconButton, + InputAdornment, List, ListItem, ListItemAvatar, @@ -15,11 +24,13 @@ import { ListItemIcon, ListItemText, ListSubheader, + TextField, Tooltip, } from "@mui/material"; import dayjs from "dayjs"; +import { chain, debounce } from "lodash"; import { usePathname, useRouter } from "next/navigation"; -import { ReactElement } from "react"; +import { ReactElement, useCallback, useState, useTransition } from "react"; import { useAuth } from "react-oidc-context"; import { graphql, useFragment, useLazyLoadQuery } from "react-relay"; @@ -51,13 +62,137 @@ function NavbarBase({ children: React.ReactElement; _isTutor: NavbarIsTutor$key; }) { + const [term, setTerm] = useState(""); + const router = useRouter(); + + const searchResults = useLazyLoadQuery( + graphql` + query NavbarSemanticSearchQuery($term: String!, $skip: Boolean!) { + semanticSearch(queryText: $term, count: 10) @skip(if: $skip) { + score + mediaRecordSegment { + __typename + ... on VideoRecordSegment { + startTime + mediaRecord { + id + name + + contents { + id + metadata { + name + course { + id + title + } + } + } + } + } + ... on DocumentRecordSegment { + page + mediaRecord { + id + name + contents { + id + metadata { + name + course { + id + title + } + } + } + } + } + } + } + } + `, + { term: term, skip: term.length < 3 } + ); + + const [isPending, startTransition] = useTransition(); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const debouncedSetter = useCallback( + debounce((value: string) => startTransition(() => setTerm(value)), 150), + [setTerm, startTransition] + ); + + const results = chain(searchResults.semanticSearch) + .orderBy((x) => x?.score) + .slice(0, 15) + .flatMap((x) => { + const seg = x.mediaRecordSegment; + + return seg.__typename !== "%other" + ? seg?.mediaRecord?.contents.map((content) => ({ + content, + ...x, + mediaRecordSegment: seg, + })) + : []; + }) + .value(); + return (

{/* eslint-disable-next-line @next/next/no-img-element */} GITS logo
+ + { + if (typeof newVal == "string") return; + router.push( + `/courses/${newVal?.content?.metadata.course.id}/media/${newVal?.content?.id}?recordId=${newVal?.mediaRecordSegment.mediaRecord?.id}` + ); + }} + filterOptions={(x) => x} + groupBy={(x) => + `${x?.content?.metadata.course.title} › ${x?.content?.metadata.name}` + } + renderOption={(props, option) => ( +
  • +
    + {option?.mediaRecordSegment.mediaRecord?.name} +
    + {option.mediaRecordSegment.__typename === + "DocumentRecordSegment" + ? `Page ${option.mediaRecordSegment.page}` + : `Page ${option.mediaRecordSegment.startTime}`} +
    +
    +
  • + )} + options={term.length >= 3 ? results ?? [] : []} + onInputChange={(_, value) => value && debouncedSetter(value)} + renderInput={(params) => ( + + {isPending ? : } + + ), + }} + /> + )} + /> } href="/" exact /> void; }) { + const ref = useRef(null); + const { width = 0 } = useResizeObserver({ + ref, + box: "border-box", + }); + + const [debouncedWidth] = useDebounceValue(width, 200); + const [numPages, setNumPages] = useState(); const [pageNumber, setPageNumber] = useState(1); const [_, setViewedPages] = useState([] as number[]); @@ -45,26 +55,37 @@ export function PdfViewer({ } return ( -
    +
    } > - } - pageNumber={pageNumber} - height={600} - /> +
    + } + pageNumber={pageNumber} + /> +
    +
    + {numPages != null && + times(numPages, () => null).map((_, idx) => ( + setPageNumber(idx + 1)} + pageNumber={idx + 1} + key={idx} + > + ))} +
    -
    - setPageNumber(val)} - color="primary" - /> -
    ); } diff --git a/components/RichTextEditor.tsx b/components/RichTextEditor.tsx index af1e520..24cd329 100644 --- a/components/RichTextEditor.tsx +++ b/components/RichTextEditor.tsx @@ -1,6 +1,6 @@ import { MediaRecordSelector$key } from "@/__generated__/MediaRecordSelector.graphql"; import { RichTextEditorMediaRecordQuery } from "@/__generated__/RichTextEditorMediaRecordQuery.graphql"; -import { ContentMediaDisplay } from "@/app/courses/[courseId]/media/[mediaId]/student"; +import { ContentMediaDisplay } from "@/app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay"; import { Code, Delete, @@ -631,7 +631,7 @@ function DisplayMediaRecord({ id }: { id: string }) { graphql` query RichTextEditorMediaRecordQuery($id: UUID!) { mediaRecordsByIds(ids: [$id]) { - ...studentContentMediaDisplayFragment + ...ContentMediaDisplayFragment } } `, diff --git a/package.json b/package.json index b79725d..72c83ac 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "format": "prettier --write .", "check-format": "prettier --check .", "prepare": "husky install", - "update-schema": "fetch-graphql-schema http://orange.informatik.uni-stuttgart.de/graphql -o src/schema.graphql -r && ( [[ \"$OSTYPE\" == \"darwin\"* ]] && sed -i '' 's/Assessment,/Assessment \\&/' src/schema.graphql || sed -i 's/Assessment,/Assessment \\&/' src/schema.graphql )" + "update-schema": "fetch-graphql-schema http://localhost:8080/graphql -o src/schema.graphql -r && ( [[ \"$OSTYPE\" == \"darwin\"* ]] && sed -i '' 's/Assessment,/Assessment \\&/' src/schema.graphql || sed -i 's/Assessment,/Assessment \\&/' src/schema.graphql )" }, "lint-staged": { "*.{ts,tsx,css,json}": "prettier --write" @@ -34,6 +34,7 @@ "@types/pdfobject": "^2.2.5", "@types/react": "18.0.37", "@types/react-dom": "18.0.11", + "@vidstack/react": "^1.12.9", "autoprefixer": "10.4.14", "clsx": "^2.1.0", "date-fns": "^2.30.0", @@ -57,7 +58,6 @@ "react-error-boundary": "^4.0.13", "react-oidc-context": "^2.3.1", "react-pdf": "^7.7.1", - "react-player": "^2.16.0", "react-relay": "15.0.0", "recharts": "^2.12.5", "relay-runtime": "15.0.0", @@ -66,6 +66,7 @@ "slate-react": "^0.98.4", "tailwindcss": "3.3.1", "typescript": "5.0.4", + "usehooks-ts": "^3.1.0", "victory": "^36.9.2", "yup": "^1.4.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 037e77e..0a0a657 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ dependencies: '@types/react-dom': specifier: 18.0.11 version: 18.0.11 + '@vidstack/react': + specifier: ^1.12.9 + version: 1.12.9(@types/react@18.0.37)(react@18.2.0) autoprefixer: specifier: 10.4.14 version: 10.4.14(postcss@8.4.23) @@ -118,10 +121,7 @@ dependencies: version: 2.3.1(oidc-client-ts@2.4.0)(react@18.2.0) react-pdf: specifier: ^7.7.1 - version: 7.7.1(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) - react-player: - specifier: ^2.16.0 - version: 2.16.0(react@18.2.0) + version: 7.7.3(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) react-relay: specifier: 15.0.0 version: 15.0.0(react@18.2.0) @@ -146,6 +146,9 @@ dependencies: typescript: specifier: 5.0.4 version: 5.0.4 + usehooks-ts: + specifier: ^3.1.0 + version: 3.1.0(react@18.2.0) victory: specifier: ^36.9.2 version: 36.9.2(react@18.2.0) @@ -420,6 +423,13 @@ packages: '@floating-ui/utils': 0.2.1 dev: false + /@floating-ui/dom@1.6.10: + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.7 + dev: false + /@floating-ui/dom@1.6.3: resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} dependencies: @@ -442,6 +452,10 @@ packages: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} dev: false + /@floating-ui/utils@0.2.7: + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + dev: false + /@fontsource/roboto@4.5.8: resolution: {integrity: sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==} dev: false @@ -1185,6 +1199,19 @@ packages: eslint-visitor-keys: 3.4.3 dev: false + /@vidstack/react@1.12.9(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-2YBkMN590u20P9JVw6EoaAegVz4YP7utxeRXuDkzvn60UG8Ky6v4CdywFaBAHBrxyRefiCJTLB5noDmIRyVplg==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^18.0.0 + react: ^18.0.0 + dependencies: + '@floating-ui/dom': 1.6.10 + '@types/react': 18.0.37 + media-captions: 1.0.4 + react: 18.2.0 + dev: false + /@webassemblyjs/ast@1.12.1: resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: @@ -1415,6 +1442,7 @@ packages: /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} + deprecated: This package is no longer supported. requiresBuild: true dependencies: delegates: 1.0.0 @@ -1691,7 +1719,7 @@ packages: requiresBuild: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.19.0 + nan: 2.20.0 simple-get: 3.1.1 transitivePeerDependencies: - encoding @@ -2079,11 +2107,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: false - /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -2186,6 +2209,7 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + requiresBuild: true /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -2866,6 +2890,7 @@ packages: /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} + deprecated: This package is no longer supported. requiresBuild: true dependencies: aproba: 2.0.0 @@ -2962,6 +2987,8 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + requiresBuild: true dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -3244,6 +3271,7 @@ packages: /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + requiresBuild: true /is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} @@ -3554,10 +3582,6 @@ packages: strip-bom: 2.0.0 dev: true - /load-script@1.0.0: - resolution: {integrity: sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==} - dev: false - /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -3582,6 +3606,10 @@ packages: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -3622,6 +3650,7 @@ packages: /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + requiresBuild: true dependencies: yallist: 4.0.0 dev: false @@ -3648,8 +3677,9 @@ packages: engines: {node: '>=0.10.0'} dev: true - /memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + /media-captions@1.0.4: + resolution: {integrity: sha512-cyDNmuZvvO4H27rcBq2Eudxo9IZRDCOX/I7VEyqbxsEiD2Ei7UYUhG/Sc5fvMZjmathgz3fEK7iAKqvpY+Ux1w==} + engines: {node: '>=16'} dev: false /meow@3.7.0: @@ -3668,10 +3698,10 @@ packages: trim-newlines: 1.0.0 dev: true - /merge-refs@1.2.2(@types/react@18.0.37): - resolution: {integrity: sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==} + /merge-refs@1.3.0(@types/react@18.0.37): + resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -3800,8 +3830,8 @@ packages: thenify-all: 1.6.0 dev: false - /nan@2.19.0: - resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + /nan@2.20.0: + resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} requiresBuild: true dev: false optional: true @@ -3922,6 +3952,7 @@ packages: /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. requiresBuild: true dependencies: are-we-there-yet: 2.0.0 @@ -4427,8 +4458,8 @@ packages: react: 18.2.0 dev: false - /react-pdf@7.7.1(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-cbbf/PuRtGcPPw+HLhMI1f6NSka8OJgg+j/yPWTe95Owf0fK6gmVY7OXpTxMeh92O3T3K3EzfE0ML0eXPGwR5g==} + /react-pdf@7.7.3(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==} peerDependencies: '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4442,7 +4473,7 @@ packages: dequal: 2.0.3 make-cancellable-promise: 1.3.2 make-event-props: 1.6.2 - merge-refs: 1.2.2(@types/react@18.0.37) + merge-refs: 1.3.0(@types/react@18.0.37) pdfjs-dist: 3.11.174 prop-types: 15.8.1 react: 18.2.0 @@ -4454,19 +4485,6 @@ packages: - supports-color dev: false - /react-player@2.16.0(react@18.2.0): - resolution: {integrity: sha512-mAIPHfioD7yxO0GNYVFD1303QFtI3lyyQZLY229UEAp/a10cSW+hPcakg0Keq8uWJxT2OiT/4Gt+Lc9bD6bJmQ==} - peerDependencies: - react: '>=16.6.0' - dependencies: - deepmerge: 4.3.1 - load-script: 1.0.0 - memoize-one: 5.2.1 - prop-types: 15.8.1 - react: 18.2.0 - react-fast-compare: 3.2.2 - dev: false - /react-relay@15.0.0(react@18.2.0): resolution: {integrity: sha512-KWdeMMKMJanOL9LsGZYkyAekayYIi+Y4mbDM8VYbHVPgTWJWAQP6yJKS+V4D17qIMo1L84QJQjGaQWEG139p9Q==} peerDependencies: @@ -4692,6 +4710,7 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -5285,6 +5304,7 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + requiresBuild: true dev: false /tree-kill@1.2.2: @@ -5429,6 +5449,16 @@ packages: dependencies: punycode: 2.3.1 + /usehooks-ts@3.1.0(react@18.2.0): + resolution: {integrity: sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + dependencies: + lodash.debounce: 4.0.8 + react: 18.2.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -5819,6 +5849,7 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + requiresBuild: true dev: false /webpack-sources@3.2.3: @@ -5868,6 +5899,7 @@ packages: /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + requiresBuild: true dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 @@ -5963,6 +5995,7 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + requiresBuild: true dev: false /yaml@1.10.2: diff --git a/src/schema.graphql b/src/schema.graphql index ff8f909..a965b7c 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -35,6 +35,13 @@ directive @Size(min: Int = 0, max: Int = 2147483647, message: String = "graphql. directive @ContainerSize(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.ContainerSize.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION +# The @OnDemand directive is used to mark fields that are only internally resolved when requested. +# Implementation Note: This will cause the code generator to omit the field from the generated DTOs. +directive @OnDemand on FIELD_DEFINITION + +# Indicates an Input Object is a OneOf Input Object. +directive @oneOf on INPUT_OBJECT + directive @resolveTo(requiredSelectionSet: String, sourceName: String!, sourceTypeName: String!, sourceFieldName: String!, sourceSelectionSet: String, sourceArgs: ResolveToSourceArgs, keyField: String, keysArg: String, pubsubTopic: String, filterBy: String, additionalArgs: ResolveToSourceArgs, result: String, resultType: String) on FIELD_DEFINITION interface Assessment { @@ -52,6 +59,9 @@ interface Assessment { # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! + + # the items that belong to the Assessment + items: [Item!]! } type AssessmentMetadata { @@ -85,6 +95,9 @@ input AssessmentMetadataInput { } input AssociationInput { + # id of the corresponding item + itemId: UUID + # Text of the left side of the association, in SlateJS JSON format. left: String! @@ -109,7 +122,7 @@ type AssociationQuestion implements Question { # Computed list of all the right sides of the associations, shuffled. rightSide: [String!]! - # Unique identifier of the question. + # Unique identifier of the question and the id of the corresponding item itemId: UUID! # Number of the question, i.e., the position of the question in the list of questions. @@ -123,7 +136,7 @@ type AssociationQuestion implements Question { hint: JSON } -#Level of Blooms Taxonomy +# Level of Blooms Taxonomy enum BloomLevel { REMEMBER UNDERSTAND @@ -173,18 +186,13 @@ type Chapter { # Sections of this chapter. sections: [Section!]! - # The skill levels of the current user in this chapter. - skillLevels: SkillLevels! - # The skill types which are achievable in this chapter. # A skill type is achievable if there is at least one assessment in this chapter with this skill type. achievableSkillTypes: [SkillType]! # The progress of the current user in this chapter. userProgress: CompositeProgressInformation! - - #The skills, that belong to the given chapter - skills: [Skill!]! + skills: [Skill]! } input ChapterFilter { @@ -217,6 +225,9 @@ type ClozeBlankElement { union ClozeElement = ClozeTextElement | ClozeBlankElement input ClozeElementInput { + # id of the corresponding item + itemId: UUID + # Type of the element. type: ClozeElementType! @@ -248,7 +259,7 @@ type ClozeQuestion implements Question { # Whether the blanks must be answered in free text or by selecting the correct answer from a list. showBlanksList: Boolean! - # Unique identifier of the question. + # Unique identifier of the question and the id of the corresponding item itemId: UUID! # Number of the question, i.e., the position of the question in the list of questions. @@ -313,6 +324,7 @@ type ContentMetadata { # TagNames this content is tagged with tagNames: [String!]! + course: Course! } type ContentMutation { @@ -423,8 +435,6 @@ type Course { # The progress of the current user in this course. userProgress: CompositeProgressInformation! - - #The skills, that belong to the given course skills: [Skill!]! } @@ -484,13 +494,15 @@ input CreateAssessmentInput { # Assessment metadata assessmentMetadata: AssessmentMetadataInput! - """ - items of the new assessments - """ - items: [CreateItemInput!] + + # items of the new assessments + items: [ItemInput!] } input CreateAssociationQuestionInput { + # id of the corresponding item + itemId: UUID + # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int @@ -503,8 +515,6 @@ input CreateAssociationQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID } # Input type for creating chapters. @@ -540,6 +550,9 @@ input CreateChapterInput { } input CreateClozeQuestionInput { + # id of the corresponding item + itemId: UUID + # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int @@ -555,8 +568,6 @@ input CreateClozeQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID } input CreateContentMetadataInput { @@ -606,6 +617,9 @@ input CreateCourseInput { } input CreateExactAnswerQuestionInput { + # id of the corresponding item + itemId: UUID + # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int @@ -624,32 +638,21 @@ input CreateExactAnswerQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID! } input CreateFlashcardInput { + # id of the item the flashcard belongs to + itemId: UUID + # List of sides of this flashcard. Must be at least two sides. sides: [FlashcardSideInput!]! - #id of the item - itemId:UUID } input CreateFlashcardSetInput { # List of flashcards in this set. flashcards: [CreateFlashcardInput!]! } -input CreateItemInput{ - """ - The skills or the competencies the item belongs to. - """ - associatedSkills:[SkillInput!]! - """ - The Level of Blooms Taxonomy the item belongs to - """ - associatedBloomLevels:[BloomLevel!]! -} # Input for creating new media content. Media specific fields are stored in the Media Service. input CreateMediaContentInput { # Metadata for the new Content @@ -668,6 +671,9 @@ input CreateMediaRecordInput { } input CreateMultipleChoiceQuestionInput { + # UUID of the question to update and the id of the corresponding item. + itemId: UUID + # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int @@ -680,11 +686,12 @@ input CreateMultipleChoiceQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID } input CreateNumericQuestionInput { + # id of the corresponding item + itemId: UUID + # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int @@ -703,8 +710,6 @@ input CreateNumericQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID } input CreateQuizInput { @@ -725,7 +730,6 @@ input CreateQuizInput { # # If this is null or not set, the behavior is the same as if it was equal to the number of questions. numberOfRandomlySelectedQuestions: Int - } input CreateSectionInput { @@ -737,6 +741,9 @@ input CreateSectionInput { } input CreateSelfAssessmentQuestionInput { + # id of the corresponding item + itemId: UUID + # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int @@ -749,8 +756,6 @@ input CreateSelfAssessmentQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID } input CreateStageInput { @@ -777,6 +782,27 @@ input DateTimeFilter { before: DateTime } +type DocumentRecordSegment implements MediaRecordSegment { + # UUID of this segment. + id: UUID! + + # UUID of the media record this search result references. + mediaRecordId: UUID! + + # Page of the document this search result references. + page: Int! + + # The text snippet of the document this search result references. + text: String! + + # Base64-encoded image thumbnail for this segment. + thumbnail: String! + + # Title of this segment. + title: String + mediaRecord: MediaRecord! +} + # A question with a clear, correct answer that can be automatically checked. # Differs from self-assessment questions in that the user has to enter one of the correct answers and # the answer is checked automatically. @@ -793,7 +819,7 @@ type ExactAnswerQuestion implements Question { # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON - # Unique identifier of the question. + # Unique identifier of the question and the id of the corresponding item itemId: UUID! # Number of the question, i.e., the position of the question in the list of questions. @@ -811,7 +837,7 @@ type ExactAnswerQuestion implements Question { # The label is used to specify which side of the flashcard is being shown to the user first for learning # and which sides he has to guess. type Flashcard { - # Unique identifier of this flashcard. + # Unique identifier of this flashcard, which is the id of the corresponding item itemId: UUID! # List of sides of this flashcard. @@ -834,6 +860,13 @@ type FlashcardLearnedFeedback { flashcardSetProgress: FlashcardSetProgress! } +# #when a flashcard is created or changed, also the item information are changed, +# these type combines the flashcard and the changed information +type FlashcardOutput { + flashcard: Flashcard! + item: Item! +} + type FlashcardProgressData { # The date the user learned the flashcard. # This is null it the user has not learned the content item once. @@ -858,14 +891,7 @@ type FlashcardProgressDataLog { # Whether the user knew the flashcard or not. success: Boolean! } - -type FlashcardOutput{ - - flashcard:Flashcard! - - item:Item! -} # A set of flashcards. A flashcard set belongs to exactly one assessment. Therefore, the uuid of the assessment # also serves as the identifier of a flashcard set. type FlashcardSet { @@ -900,26 +926,35 @@ type FlashcardSetAssessment implements Assessment & Content { # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! + # the items that belong to the Flashcard + items: [Item!]! + # The FlashcardSet of the assessment. flashcardSet: FlashcardSet - - """ - the items that belong to the Flashcard - """ - items:[Item!] } type FlashcardSetMutation { # ID of the flashcard set that is being modified. assessmentId: UUID! - #creates a new flashcard - createFlashcard(item:ItemInput!,assessmentId:UUID!,flashcardInput:CreateFlashcardInput!):FlashcardOutput! + + # Creates a new flashcard. Throws an error if the flashcard set does not exist. + # ⚠️ This mutation is only accessible internally in the system and allows the caller to create Flashcards without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_createFlashcard(input: CreateFlashcardInput!): Flashcard! # Updates a flashcard. Throws an error if the flashcard does not exist. - updateFlashcard(item:ItemInput!,assessmentId:UUID!,flashcardInput:UpdateFlashcardInput!): FlashcardOutput! + # ⚠️ This mutation is only accessible internally in the system and allows the caller to update Flashcards without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_updateFlashcard(input: UpdateFlashcardInput!): Flashcard! # Deletes the flashcard with the specified ID. Throws an error if the flashcard does not exist. deleteFlashcard(id: UUID!): UUID! + + # Creates a new flashcard and the linked item + createFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: CreateFlashcardInput!): FlashcardOutput! + + # Creates a new flashcard and the linked item + updateFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: UpdateFlashcardInput!): FlashcardOutput! } type FlashcardSetProgress { @@ -960,11 +995,21 @@ input FlashcardSideInput { isAnswer: Boolean! } +input GenerateMediaRecordLinksInput { + contentId: UUID! + mediaRecordIds: [UUID!]! +} + enum GlobalUserRole { SUPER_USER COURSE_CREATOR } +input IngestMediaRecordInput { + # UUID of the media record of this document. + id: UUID! +} + # Filter for integer values. # If multiple filters are specified, they are combined with AND. input IntFilter { @@ -978,36 +1023,40 @@ input IntFilter { lessThan: Int } -type Item{ - """ - the id of the item - """ - id:UUID! - """ - The skills or the competencies the item belongs to. - """ - associatedSkills:[Skill!]! - """ - The Level of Blooms Taxonomy the item belongs to - """ - associatedBloomLevels:[BloomLevel!]! -} - -input ItemInput{ - """ - the id of the item - """ - id:UUID - """ - The skills or the competencies the item belongs to. - """ - associatedSkills:[SkillInput!]! - """ - The Level of Blooms Taxonomy the item belongs to - """ - associatedBloomLevels:[BloomLevel!]! -} -"" +# An item is a part of an assessment. Based on students' performances on items the +# SkillLevel Service estimates a students knowledge. +# An item is something like a question in a quiz, a flashcard of a flashcard set. +type Item { + # the id of the item + id: UUID! + + # The skills or the competencies the item belongs to. + associatedSkills: [Skill!]! + + # The Level of Blooms Taxonomy the item belongs to + associatedBloomLevels: [BloomLevel!]! +} + +input ItemInput { + # the id of the item + id: UUID + + # The skills or the competencies the item belongs to. + associatedSkills: [SkillInput!]! + + # The Level of Blooms Taxonomy the item belongs to + associatedBloomLevels: [BloomLevel!]! +} + +type ItemProgress { + # the id of the corresponding item + itemId: UUID! + + # the correctness of the users response. + # Value between 0 and 1 representing the user's correctness on the content item. + responseCorrectness: Float! +} + # A JSON scalar scalar JSON @@ -1048,6 +1097,7 @@ type MediaContent implements Content { # The media records linked to this media content. mediaRecords: [MediaRecord!]! + segmentLinks: [MediaRecordSegmentLink!]! } # schema file of the microservice @@ -1079,8 +1129,29 @@ type MediaRecord { # Temporary download url for the media record downloadUrl: String! + # Temporary upload url for the media record which can only be used from within the system. + # (This is necessary because the MinIO pre-signed URLs cannot be changed, meaning we cannot use the same URL for both + # internal and external access because the hostname changes.) + internalUploadUrl: String! + + # Temporary download url for the media record which can only be used from within the system. + # (This is necessary because the MinIO pre-signed URLs cannot be changed, meaning we cannot use the same URL for both + # internal and external access because the hostname changes.) + internalDownloadUrl: String! + # The progress data of the given user for this medium. userProgressData: MediaRecordProgressData! + + # Returns the contents this media record is linked to. If the user does not have access to a particular + # content, null will be returned in its place. + contents: [Content]! + + # Returns the segments this media record consists of. + segments: [MediaRecordSegment!]! + + # Returns a closed captions string formatted in WebVTT format for the media record if it is of type video, + # returns null otherwise. + closedCaptions: String } type MediaRecordProgressData { @@ -1092,6 +1163,25 @@ type MediaRecordProgressData { dateWorkedOn: DateTime } +interface MediaRecordSegment { + # UUID of this segment. + id: UUID! + + # UUID of the media record this segment is part of. + mediaRecordId: UUID! + + # Base64-encoded image thumbnail for this segment. + thumbnail: String! + + # Title of this segment. + title: String +} + +type MediaRecordSegmentLink { + segment1: MediaRecordSegment! + segment2: MediaRecordSegment! +} + # The type of the media record enum MediaType { VIDEO @@ -1135,7 +1225,7 @@ type MultipleChoiceQuestion implements Question { # How many answers the user has to select. This is computed from the list of answers. numberOfCorrectAnswers: Int! - # Unique identifier of the question. + # Unique identifier of the question and the id of the corresponding item itemId: UUID! # Number of the question, i.e., the position of the question in the list of questions. @@ -1149,15 +1239,9 @@ type MultipleChoiceQuestion implements Question { hint: JSON } +# Mutations for the flashcard service. Provides mutations for creating, updating, and deleting flashcard as well as +# creating and deleting flashcard sets. To update a flashcard set, update, delete, and create flashcards individually. type Mutation { - # Modify Content - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateContent(contentId: UUID!): ContentMutation! - - # Modify the section with the given id. - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateSection(sectionId: UUID!): SectionMutation! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. # # Triggers the recalculation of the reward score of the user. @@ -1186,7 +1270,7 @@ type Mutation { setLinkedMediaRecordsForContent(contentId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! # Logs that a media has been worked on by the current user. - # See https://meitrex.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html + # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html # # Possible side effects: # When all media records of a content have been worked on by a user, @@ -1198,6 +1282,23 @@ type Mutation { # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. setMediaRecordsForCourse(courseId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! + # Modify Content + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateContent(contentId: UUID!): ContentMutation! + + # Modify the section with the given id. + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateSection(sectionId: UUID!): SectionMutation! + + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the skill level of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. + # 🔒 The user must be a super-user, otherwise an exception is thrown. + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") + # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1242,14 +1343,16 @@ type Mutation { # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the skill level of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. - # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") + # Modify a quiz. + # 🔒 The user must be an admin the course the quiz is in to perform this action. + mutateQuiz(assessmentId: UUID!): QuizMutation! + + # Delete a quiz. + deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") + + # Log that a multiple choice quiz is completed. + # 🔒 The user must be enrolled in the course the quiz is in to perform this action. + logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! # Deletes a flashcard set. Throws an error if the flashcard set does not exist. # The contained flashcards are deleted as well. @@ -1263,17 +1366,6 @@ type Mutation { # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! - # Modify a quiz. - # 🔒 The user must be an admin the course the quiz is in to perform this action. - mutateQuiz(assessmentId: UUID!): QuizMutation! - - # Delete a quiz. - deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") - - # Log that a multiple choice quiz is completed. - # 🔒 The user must be enrolled in the course the quiz is in to perform this action. - logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! - # Creates a new media content and links the given media records to it. createMediaContentAndLinkRecords(contentInput: CreateMediaContentInput!, mediaRecordIds: [UUID!]!): MediaContent! @@ -1285,8 +1377,6 @@ type Mutation { # Creates a new section in a chapter. createSection(input: CreateSectionInput!): Section! - - } type NumericQuestion implements Question { @@ -1302,7 +1392,7 @@ type NumericQuestion implements Question { # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON - # Unique identifier of the question. + # Unique identifier of the question and the id of the corresponding item itemId: UUID! # Number of the question, i.e., the position of the question in the list of questions. @@ -1363,6 +1453,11 @@ type ProgressLogItem { # Time in milliseconds it took the user to complete the content item. # Can be null for contents that do not measure completion time. timeToComplete: Int + + # !OPTIONAL + # the items the user has completed and the students' performance on these items + # Can be null as some contents don't contains items for assessments + progressPerItem: ItemProgress! } type PublicUserInfo { @@ -1371,56 +1466,6 @@ type PublicUserInfo { } type Query { - # Retrieves all existing contents for a given course. - # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. - contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] - - # Get contents by ids. Throws an error if any of the ids are not found. - # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, - # otherwise an error is thrown. - contentsByIds(ids: [UUID!]!): [Content!]! - - # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. - # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned - # for the respective contents. - findContentsByIds(ids: [UUID!]!): [Content]! - - # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents - # associated with that chapter - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. - contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! - - # Generates user specific suggestions for multiple chapters. - # - # Only content that the user can access will be considered. - # The contents will be ranked by suggested date, with the most overdue or most urgent content first. - # - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. - suggestionsByChapterIds( - # The ids of the chapters for which suggestions should be generated. - chapterIds: [UUID!]! - - # The amount of suggestions to generate in total. - amount: Int! - - # Only suggestions for these skill types will be generated. - # If no skill types are given, suggestions for all skill types will be generated, - # also containing suggestions for media content (which do not have a skill type). - skillTypes: [SkillType!]! = [] - ): [Suggestion!]! - - # Gets the publicly available information for a list of users with the specified IDs. - # If a user does not exist, null is returned for that user. - findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - - # Gets the user information of the currently authorized user. - currentUserInfo: UserInfo! - - # Gets all of the users' information for a list of users with the specified IDs. - # Only available to privileged users. - # If a user does not exist, null is returned for that user. - findUserInfos(ids: [UUID!]!): [UserInfo]! - # Get the reward score of the current user for the specified course. # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. userCourseRewardScores(courseId: UUID!): RewardScores! @@ -1435,34 +1480,90 @@ type Query { # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID # cannot be found. + # # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. mediaRecordsByIds(ids: [UUID!]!): [MediaRecord!]! # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID # cannot be found, it instead returns NULL for that media record. + # # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. findMediaRecordsByIds(ids: [UUID!]!): [MediaRecord]! # Returns all media records of the system. + # # 🔒 The user must be a super-user, otherwise an exception is thrown. mediaRecords: [MediaRecord!]! @deprecated(reason: "In production there should probably be no way to get all media records of the system.") # Returns all media records which the current user created. + # # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. userMediaRecords: [MediaRecord!]! # Returns the media records associated the given content IDs as a list of lists where each sublist contains # the media records associated with the content ID at the same index in the input list + # # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! # Returns all media records for the given CourseIds + # # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. mediaRecordsForCourses(courseIds: [UUID!]!): [[MediaRecord!]!]! # Returns all media records which were created by the users. mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! + # Gets the publicly available information for a list of users with the specified IDs. + # If a user does not exist, null is returned for that user. + findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! + + # Gets the user information of the currently authorized user. + currentUserInfo: UserInfo! + + # Gets all of the users' information for a list of users with the specified IDs. + # Only available to privileged users. + # If a user does not exist, null is returned for that user. + findUserInfos(ids: [UUID!]!): [UserInfo]! + + # Retrieves all existing contents for a given course. + # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. + contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] + + # Get contents by ids. Throws an error if any of the ids are not found. + # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, + # otherwise an error is thrown. + contentsByIds(ids: [UUID!]!): [Content!]! + + # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. + # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned + # for the respective contents. + findContentsByIds(ids: [UUID!]!): [Content]! + + # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents + # associated with that chapter + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! + + # Generates user specific suggestions for multiple chapters. + # + # Only content that the user can access will be considered. + # The contents will be ranked by suggested date, with the most overdue or most urgent content first. + # + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + suggestionsByChapterIds( + # The ids of the chapters for which suggestions should be generated. + chapterIds: [UUID!]! + + # The amount of suggestions to generate in total. + amount: Int! + + # Only suggestions for these skill types will be generated. + # If no skill types are given, suggestions for all skill types will be generated, + # also containing suggestions for media content (which do not have a skill type). + skillTypes: [SkillType!]! = [] + ): [Suggestion!]! + # Get a list of courses. Can be filtered, sorted and paginated. # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. courses( @@ -1481,9 +1582,15 @@ type Query { # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. coursesByIds(ids: [UUID!]!): [Course!]! + # Get quiz by assessment ID. + # If any of the assessment IDs are not found, the corresponding quiz will be null. + # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for + # an quiz if the user has no access to it. + findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! + # Get flashcards by their ids. # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - flashcardsByIds(ids: [UUID!]!): [Flashcard!]! + flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! # Get flashcard sets by their assessment ids. # Returns a list of flashcard sets in the same order as the provided ids. @@ -1494,17 +1601,12 @@ type Query { # Get flashcards of a course that are due to be reviewed. # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! - - # Get quiz by assessment ID. - # If any of the assessment IDs are not found, the corresponding quiz will be null. - # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for - # an quiz if the user has no access to it. - findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! + semanticSearch(queryText: String!, count: Int! = 10): [SemanticSearchResult!]! } # Generic question interface. interface Question { - # Unique identifier of the question. + # Unique identifier of the question and the id of the corresponding item itemId: UUID! # Number of the question, i.e., the position of the question in the list of questions. @@ -1585,8 +1687,6 @@ type Quiz { content: Content } - - # A quiz, quiz related fields are stored in the quiz service. type QuizAssessment implements Assessment & Content { # Assessment metadata @@ -1604,14 +1704,12 @@ type QuizAssessment implements Assessment & Content { # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! + # the items that belong to the Quiz + items: [Item!]! + # The quiz of the assessment. # If this is null the system is in an inconsistent state and the assessment should be deleted. quiz: Quiz - - """ - the items that belong to the Quiz - """ - items:[Item!]! } input QuizCompletedInput { @@ -1638,59 +1736,65 @@ type QuizMutation { # Id of the quiz to modify. assessmentId: UUID! - """ - Add a multiple choice question to the quiz questions, at the end of the list. - """ - addMultipleChoiceQuestion(questionInput: CreateMultipleChoiceQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - - """ - Update a multiple choice question in the quiz questions. - """ - updateMultipleChoiceQuestion(questionInput: UpdateMultipleChoiceQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - - """ - Add a cloze question to the quiz questions, at the end of the list. - """ - addClozeQuestion(questionInput: CreateClozeQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - """ - Update a cloze question in the quiz questions. - """ - updateClozeQuestion(questionInput: UpdateClozeQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - - """ - Add an association question to the quiz questions, at the end of the list. - """ - addAssociationQuestion(questionInput: CreateAssociationQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - """ - Update an association question in the quiz questions. - """ - updateAssociationQuestion(questionInput: UpdateAssociationQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - - """ - Add an free text question with exact answer to the quiz questions, at the end of the list. - """ - addExactAnswerQuestion(questionInput: CreateExactAnswerQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - """ - Update an free text question with exact answer in the quiz questions. - """ - updateExactAnswerQuestion(questionInput: UpdateExactAnswerQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - """ - Add a numeric question to the quiz questions, at the end of the list. - """ - addNumericQuestion(questionInput: CreateNumericQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - """ - Update a numeric question in the quiz questions. - """ - updateNumericQuestion(questionInput: UpdateNumericQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - - """ - Add a self assessment question to the quiz questions, at the end of the list. - """ - addSelfAssessmentQuestion(questionInput: CreateSelfAssessmentQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! - """ - Update a self assessment question in the quiz questions. - """ - updateSelfAssessmentQuestion(questionInput: UpdateSelfAssessmentQuestionInput!, assessmentId:UUID!, item:ItemInput!):QuizOutput! + # Add a multiple choice question to the quiz questions, at the end of the list. + # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_addMultipleChoiceQuestion(input: CreateMultipleChoiceQuestionInput!): Quiz! + + # Update a multiple choice question in the quiz questions. + # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_updateMultipleChoiceQuestion(input: UpdateMultipleChoiceQuestionInput!): Quiz! + + # Add a cloze question to the quiz questions, at the end of the list. + # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_addClozeQuestion(input: CreateClozeQuestionInput!): Quiz! + + # Update a cloze question in the quiz questions. + # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_updateClozeQuestion(input: UpdateClozeQuestionInput!): Quiz! + + # Add an association question to the quiz questions, at the end of the list. + # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_addAssociationQuestion(input: CreateAssociationQuestionInput!): Quiz! + + # Update an association question in the quiz questions. + # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_updateAssociationQuestion(input: UpdateAssociationQuestionInput!): Quiz! + + # Add an free text question with exact answer to the quiz questions, at the end of the list. + # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_addExactAnswerQuestion(input: CreateExactAnswerQuestionInput!): Quiz! + + # Update an free text question with exact answer in the quiz questions. + # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_updateExactAnswerQuestion(input: UpdateExactAnswerQuestionInput!): Quiz! + + # Add a numeric question to the quiz questions, at the end of the list. + # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_addNumericQuestion(input: CreateNumericQuestionInput!): Quiz! + + # Update a numeric question in the quiz questions. + # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_updateNumericQuestion(input: UpdateNumericQuestionInput!): Quiz! + + # Add a self assessment question to the quiz questions, at the end of the list. + # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_addSelfAssessmentQuestion(input: CreateSelfAssessmentQuestionInput!): Quiz! + + # Update a self assessment question in the quiz questions. + # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without + # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ + _internal_noauth_updateSelfAssessmentQuestion(input: UpdateSelfAssessmentQuestionInput!): Quiz! # Removes the question with the given number from the quiz. # This will also update the numbers of the following questions. @@ -1708,14 +1812,50 @@ type QuizMutation { # Set the number of questions that are randomly selected from the list of questions. # Will only be considered if questionPoolingMode is RANDOM. setNumberOfRandomlySelectedQuestions(numberOfRandomlySelectedQuestions: Int!): Quiz! + + # Add a multiple choice question to the quiz questions, at the end of the list. + addMultipleChoiceQuestion(questionInput: CreateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Update a multiple choice question in the quiz questions. + updateMultipleChoiceQuestion(questionInput: UpdateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Add a cloze question to the quiz questions, at the end of the list. + addClozeQuestion(questionInput: CreateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Update a cloze question in the quiz questions. + updateClozeQuestion(questionInput: UpdateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Add an association question to the quiz questions, at the end of the list. + addAssociationQuestion(questionInput: CreateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Update an association question in the quiz questions. + updateAssociationQuestion(questionInput: UpdateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Add an free text question with exact answer to the quiz questions, at the end of the list. + addExactAnswerQuestion(questionInput: CreateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Update an free text question with exact answer in the quiz questions. + updateExactAnswerQuestion(questionInput: UpdateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Add a numeric question to the quiz questions, at the end of the list. + addNumericQuestion(questionInput: CreateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Update a numeric question in the quiz questions. + updateNumericQuestion(questionInput: UpdateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Add a self assessment question to the quiz questions, at the end of the list. + addSelfAssessmentQuestion(questionInput: CreateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + + # Update a self assessment question in the quiz questions. + updateSelfAssessmentQuestion(questionInput: UpdateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! } -type QuizOutput{ - assessmentId:UUID! - - questionPool: [Question!]! - item:Item! +type QuizOutput { + assessmentId: UUID! + questionPool: [Question!]! + item: Item! } + scalar ResolveToSourceArgs # The reason why the reward score has changed. @@ -1859,7 +1999,7 @@ type SelfAssessmentQuestion implements Question { # A possible correct answer to the question. solutionSuggestion: JSON! - # Unique identifier of the question. + # Unique identifier of the question and the id of the corresponding item itemId: UUID! # Number of the question, i.e., the position of the question in the list of questions. @@ -1873,6 +2013,12 @@ type SelfAssessmentQuestion implements Question { hint: JSON } +type SemanticSearchResult { + # The similarity score of the search result. + score: Float! + mediaRecordSegment: MediaRecordSegment! +} + type SingleAssociation { # The left side of the association, in SlateJS JSON format. left: JSON! @@ -1884,33 +2030,33 @@ type SingleAssociation { feedback: JSON } -#Skill or Competency -type Skill{ - #id of the skill - id:UUID - #Skill name +# a skill or compentency. +# Something like loops or data structures. +type Skill { + # the id of a skill + id: UUID! + + # the name of the skill skillName: String! - #the skill levels of a user + # The skill levels of the current user in this chapter. skillLevels: SkillLevels - } -input SkillInput{ - """ - the id of a skill. Field is optional, because not all required skills may exist, if a new item is created. If the id is empty a new skill, - will be created - """ - id:UUID - """ - the name of the skill - """ - skillName:String! +input SkillInput { + # the id of a skill. Field is optional, because not all required skills may + # exist, if a new item is created. If the id is empty a new skill, + # will be created + id: UUID + + # the name of the skill + skillName: String! } + # The skill level of a user. type SkillLevel { # The value of the skill level. - # levels are between 0 and 100. + # levels are between 0 and 1. value: Float! # A log of the changes to the skill level @@ -1930,42 +2076,37 @@ type SkillLevelLogItem { # The new skill level. newValue: Float! - """ - The ids of the contents that are associated with the change. - """ + + # The ids of the contents that are associated with the change. associatedItemId: UUID! - """ - the response of the user to the item - """ - userResponse:Float! - """ - the probability of a correct response, that M-Elo predicts - """ - predictedCorrectness:Float! + # the response of the user to the item + userResponse: Float! + + # the probability of a correct response, that M-Elo predicts + predictedCorrectness: Float! + associatedContents: [Content]! } # The four skill level of a user. type SkillLevels { # remember represents how much user remember the concept - remember: SkillLevel! + remember: SkillLevel # understand represents how well the user understands learned content. - understand: SkillLevel! + understand: SkillLevel # apply represents the how well user applies the learned concept during assessment. - apply: SkillLevel! + apply: SkillLevel # apply is how much user can evaluate information and draw conclusions - analyze: SkillLevel! - """ - evaluate represent how well a user can use the learned content to evaluate - """ - evaluate:SkillLevel! - """ - create represents how well a user can create new things based on the learned content - """ - create:SkillLevel! + analyze: SkillLevel + + # evaluate represent how well a user can use the learned content to evaluate + evaluate: SkillLevel + + # create represents how well a user can create new things based on the learned content + create: SkillLevel } # Type of the assessment @@ -1974,8 +2115,6 @@ enum SkillType { UNDERSTAND APPLY ANALYZE - EVALUATE - CREATE } # Specifies the sort direction, either ascending or descending. @@ -2041,14 +2180,13 @@ input UpdateAssessmentInput { # Assessment metadata assessmentMetadata: AssessmentMetadataInput! - """ - items of the new assessments - """ - items: [UpdateItemInput!] + + # items of the new assessments + items: [ItemInput!] } input UpdateAssociationQuestionInput { - # UUID of the question to update. + # UUID of the question to update and the id of the corresponding item. itemId: UUID! # Text of the question, in SlateJS JSON format. @@ -2094,7 +2232,8 @@ input UpdateChapterInput { } input UpdateClozeQuestionInput { - + # UUID of the question to update and the id of the corresponding item. + itemId: UUID! # List of cloze elements. clozeElements: [ClozeElementInput!]! @@ -2107,8 +2246,6 @@ input UpdateClozeQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID! } input UpdateContentMetadataInput { @@ -2158,8 +2295,8 @@ input UpdateCourseInput { } input UpdateExactAnswerQuestionInput { - # UUID of the question to update. - id: UUID! + # UUID of the question to update and the id of the corresponding item. + itemId: UUID! # Text of the question, in SlateJS JSON format. text: JSON! @@ -2175,32 +2312,16 @@ input UpdateExactAnswerQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID! } input UpdateFlashcardInput { - # Id of the flashcard to update. + # Id of the flashcard to update, which is the id of the corresponding item. itemId: UUID! # List of sides of this flashcard. Must be at least two sides. sides: [FlashcardSideInput!]! } -input UpdateItemInput{ - """ - the id of the item - """ - id:UUID - """ - The skills or the competencies the item belongs to. - """ - associatedSkills:[SkillInput!]! - """ - The Level of Blooms Taxonomy the item belongs to - """ - associatedBloomLevels:[BloomLevel!]! -} input UpdateMediaContentInput { # Metadata for the new Content metadata: UpdateContentMetadataInput! @@ -2221,7 +2342,8 @@ input UpdateMediaRecordInput { } input UpdateMultipleChoiceQuestionInput { - + # UUID of the question to update and the id of the corresponding item. + itemId: UUID! # Text of the question, in SlateJS JSON format. text: JSON! @@ -2231,13 +2353,11 @@ input UpdateMultipleChoiceQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID! } input UpdateNumericQuestionInput { - # UUID of the question to update. - id: UUID! + # UUID of the question to update and the id of the corresponding item. + itemId: UUID! # Text of the question, in SlateJS JSON format. text: JSON! @@ -2253,13 +2373,11 @@ input UpdateNumericQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID! } input UpdateSelfAssessmentQuestionInput { - # UUID of the question to update. - id: UUID! + # UUID of the question to update and the id of the corresponding item. + itemId: UUID! # Text of the question, in SlateJS JSON format. text: JSON! @@ -2269,8 +2387,6 @@ input UpdateSelfAssessmentQuestionInput { # Optional hint for the question, in SlateJS JSON format. hint: JSON - - itemId:UUID! } input UpdateStageInput { @@ -2304,7 +2420,7 @@ type UserInfo { } # Represents a user's progress on a content item. -# See https://meitrex.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html +# See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html type UserProgressData { # The user's id. userId: UUID! @@ -2346,6 +2462,30 @@ enum UserRoleInCourse { # A universally unique identifier compliant UUID Scalar scalar UUID +type VideoRecordSegment implements MediaRecordSegment { + # UUID of this segment. + id: UUID! + + # UUID of the media record this search result references. + mediaRecordId: UUID! + + # Start time in seconds of the snippet of the video this search result references. + startTime: Int! + + # Text on the screen during this video snippet. + screenText: String! + + # Textual transcript of the spoken text during the video snippet this search result references. + transcript: String! + + # Base64-encoded image thumbnail for this segment. + thumbnail: String! + + # Title of this segment. + title: String + mediaRecord: MediaRecord! +} + # The division of the academic year. enum YearDivision { FIRST_SEMESTER From 50c1dfd177d78391713a8bfbd1ac7e763ab88473 Mon Sep 17 00:00:00 2001 From: myluki2000 Date: Tue, 17 Sep 2024 15:30:09 +0200 Subject: [PATCH 02/33] search page --- app/search/[query]/SearchResult.tsx | 63 + app/search/[query]/SearchResultGroup.tsx | 99 + app/search/[query]/page.tsx | 120 + components/ExpandableText.tsx | 55 + components/Navbar.tsx | 26 +- pnpm-lock.yaml | 7327 ++++++++++++---------- src/schema.graphql | 775 ++- 7 files changed, 5117 insertions(+), 3348 deletions(-) create mode 100644 app/search/[query]/SearchResult.tsx create mode 100644 app/search/[query]/SearchResultGroup.tsx create mode 100644 app/search/[query]/page.tsx create mode 100644 components/ExpandableText.tsx diff --git a/app/search/[query]/SearchResult.tsx b/app/search/[query]/SearchResult.tsx new file mode 100644 index 0000000..122b2e1 --- /dev/null +++ b/app/search/[query]/SearchResult.tsx @@ -0,0 +1,63 @@ +"use client"; + +import ExpandableText from '@/components/ExpandableText'; +import { Box, styled, Typography } from '@mui/material'; +import Tooltip, { TooltipProps, tooltipClasses } from '@mui/material/Tooltip'; +import Paper from '@mui/material/Paper'; + +function getSegmentContents(mediaRecordSegment: any) { + switch (mediaRecordSegment.__typename) { + case "VideoRecordSegment": + return mediaRecordSegment.transcript; + case "DocumentRecordSegment": + return mediaRecordSegment.text; + default: + return "Unknown media type"; + } +} + +function getSegmentTitle(mediaRecordSegment: any) { + switch (mediaRecordSegment.__typename) { + case "VideoRecordSegment": + return Time {mediaRecordSegment.screenText}; + case "DocumentRecordSegment": + return Page {mediaRecordSegment.page + 1}; + default: + return Unknown media type; + } +} + +const NoMaxWidthTooltip = styled(({ className, ...props }: TooltipProps) => ( + + ))({ + [`& .${tooltipClasses.tooltip}`]: { + maxWidth: 'none', + }, + }); + +export default function SearchResult({ searchResult }: { searchResult: any }) { + return + + }> + + + + + {getSegmentTitle(searchResult.mediaRecordSegment)} + + + + +} \ No newline at end of file diff --git a/app/search/[query]/SearchResultGroup.tsx b/app/search/[query]/SearchResultGroup.tsx new file mode 100644 index 0000000..789e3f5 --- /dev/null +++ b/app/search/[query]/SearchResultGroup.tsx @@ -0,0 +1,99 @@ +"use client"; + +import { Box, Breadcrumbs, Button, Card, Divider, IconButton, Link, Paper, Tooltip } from "@mui/material"; +import SearchResult from "./SearchResult"; +import { ExpandMore, ExpandLess } from "@mui/icons-material"; +import { useState } from "react"; +import { MediaRecordIcon } from "@/components/MediaRecordIcon"; + +function renderDividerIfNotFirst(index: number) { + if (index === 0) { + return null; + } + return ; +} + +export default function SearchResultGroup({ searchResults, collapsedResultCount }: { searchResults: any, collapsedResultCount: number }) { + // media record is the same for all results in the group, just get the first segment's media record + const mediaRecord = searchResults[0].mediaRecordSegment.mediaRecord; + const userAccessibleContent = mediaRecord.contents.find((x: any) => x !== undefined && x !== null); + + const [isExpanded, setIsExpanded] = useState(true); + function toggleExpanded() { + setIsExpanded(!isExpanded); + }; + + const [doShowMoreResults, setDoShowMoreResults] = useState(false); + function toggleShowMoreResults() { + setDoShowMoreResults(!doShowMoreResults); + }; + + function renderResultsIfExpanded() { + if(isExpanded) { + return
    + {searchResults.slice(0, collapsedResultCount).map((result: any, index: number) => { + return (
    + {renderDividerIfNotFirst(index)} + +
    ) + })} + + + + {/* Show the rest of the results if user has expanded the result group */} + {doShowMoreResults + && searchResults.slice(collapsedResultCount, searchResults.length).map((result: any, index: number) => { + return (
    + {renderDividerIfNotFirst(index)} + +
    ) + })} + + +
    + } + } + + return + + + + + {isExpanded ? : } + + + + {userAccessibleContent.metadata.course.title} + + + {userAccessibleContent.metadata.chapter.title} + + + {userAccessibleContent.metadata.name} + + + {mediaRecord.name} + + + + + + + + + + + {renderResultsIfExpanded()} + + +} \ No newline at end of file diff --git a/app/search/[query]/page.tsx b/app/search/[query]/page.tsx new file mode 100644 index 0000000..2fba09a --- /dev/null +++ b/app/search/[query]/page.tsx @@ -0,0 +1,120 @@ +"use client"; + +import { pageSemanticSearchQuery } from "@/__generated__/pageSemanticSearchQuery.graphql"; +import { Box, Button, Collapse, TextField, Typography } from "@mui/material"; +import { useParams } from "next/navigation"; +import { graphql, useLazyLoadQuery } from "react-relay"; +import SearchResult from "./SearchResult"; +import SearchResultGroup from "./SearchResultGroup"; +import {ManageSearch, ExpandMore, ExpandLess} from '@mui/icons-material'; +import { useState } from "react"; + +export default function SearchPage() { + const params = useParams(); + const query: string = decodeURIComponent(params.query as string); + + const { semanticSearch } = useLazyLoadQuery( + graphql` + query pageSemanticSearchQuery($query: String!) { + semanticSearch(queryText: $query, count: 40) { + score + mediaRecordSegment { + __typename + id + thumbnail + mediaRecordId + ...on VideoRecordSegment { + startTime + screenText + transcript + mediaRecord { + id + name + type + contents { + metadata { + name + chapter { + title + } + course { + title + } + } + } + } + } + ...on DocumentRecordSegment { + page + text + mediaRecord { + id + name + type + contents { + metadata { + name + chapter { + title + } + course { + title + } + } + } + } + } + } + } + } + `, + { query } + ); + + const semanticSearchResultGroups = Object.values(Object.groupBy(semanticSearch, (result) => result.mediaRecordSegment.mediaRecord?.id ?? "unknown")); + + // sort the elements in each group by score from lowest to highest + semanticSearchResultGroups.forEach((group) => { + if (group !== undefined) + group.sort((a, b) => a.score - b.score); + }); + + // sort the groups themselves by the score of the first element in each group + semanticSearchResultGroups.sort((a, b) => { + let aScore = a === undefined ? 99999 : a[0].score; + let bScore = b === undefined ? 99999 : b[0].score; + return aScore - bScore; + }); + + const [isAdvancedSearchOpen, setIsAdvancedSearchOpen] = useState(false); + function toggleAdvancedSearch() { + setIsAdvancedSearchOpen(!isAdvancedSearchOpen); + } + + return ( +
    + Search + + + + + + + + + + { + Object.values(semanticSearchResultGroups).map((resultGroup) => { + return ( + + ); + }) + } +
    + ); +} \ No newline at end of file diff --git a/components/ExpandableText.tsx b/components/ExpandableText.tsx new file mode 100644 index 0000000..63cdc8b --- /dev/null +++ b/components/ExpandableText.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { Box, Button, Collapse, Typography } from "@mui/material"; +import { ExpandMore, ExpandLess } from "@mui/icons-material"; +import { useEffect, useRef, useState } from "react"; + +export default function ExpandableText({ text, collapsedSize }: { text: string, collapsedSize: number }) { + const unexpandedStyle = { + whiteSpace: "pre-line", + background: `linear-gradient(black ${collapsedSize * 0.5}px, white ${collapsedSize}px)`, + backgroundClip: "text", + color: "transparent", + }; + const expandedStyle = { + whiteSpace: "pre-line", + }; + + const [expanded, setExpanded] = useState(false); + function toggleExpanded() { + setExpanded(!expanded); + }; + + const typographyRef = useRef(null); + const [isOverflowing, setIsOverflowing] = useState(false); + useEffect(() => { + if (typographyRef.current) { + // Check if the content overflows + const { scrollHeight } = typographyRef.current; + if (scrollHeight > collapsedSize) { + setIsOverflowing(true); + setExpanded(false); + } else { + setIsOverflowing(false); + setExpanded(true); + } + } + }, [text]); + + function renderButtonIfIsOverflowing() { + if (isOverflowing) { + return + } + } + + return ( + + + {text.replaceAll("\n\n", "\n")} + + + {renderButtonIfIsOverflowing()} + ) +} \ No newline at end of file diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 79fe9d0..67ee128 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -8,12 +8,16 @@ import { CollectionsBookmark, Dashboard, Logout, + ManageSearch, Search, } from "@mui/icons-material"; import { Autocomplete, Avatar, + Box, + Button, CircularProgress, + ClickAwayListener, Divider, IconButton, InputAdornment, @@ -24,11 +28,13 @@ import { ListItemIcon, ListItemText, ListSubheader, + Paper, TextField, Tooltip, } from "@mui/material"; import dayjs from "dayjs"; import { chain, debounce } from "lodash"; +import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import { ReactElement, useCallback, useState, useTransition } from "react"; import { useAuth } from "react-oidc-context"; @@ -68,7 +74,7 @@ function NavbarBase({ const searchResults = useLazyLoadQuery( graphql` query NavbarSemanticSearchQuery($term: String!, $skip: Boolean!) { - semanticSearch(queryText: $term, count: 10) @skip(if: $skip) { + semanticSearch(queryText: $term, count: 5) @skip(if: $skip) { score mediaRecordSegment { __typename @@ -138,6 +144,21 @@ function NavbarBase({ }) .value(); + const [isSearchPopupOpen, setSearchPopupOpen] = useState(false); + + function SearchPopupPaper({children}: {children?: any}) { + return setSearchPopupOpen(false)}> + {children} + + + + } + return (
    @@ -153,6 +174,7 @@ function NavbarBase({ clearOnBlur blurOnSelect autoHighlight + open={isSearchPopupOpen} value={null} onChange={(x, newVal) => { if (typeof newVal == "string") return; @@ -182,6 +204,7 @@ function NavbarBase({ renderInput={(params) => ( setSearchPopupOpen(true)} InputProps={{ ...params.InputProps, startAdornment: ( @@ -192,6 +215,7 @@ function NavbarBase({ }} /> )} + PaperComponent={SearchPopupPaper} /> } href="/" exact /> =0.10.0'} + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.24.4': + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@emotion/babel-plugin@11.11.0': + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/css@11.11.2': + resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + + '@emotion/is-prop-valid@1.2.2': + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/react@11.11.4': + resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.1.4': + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + + '@emotion/sheet@1.2.2': + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + + '@emotion/styled@11.11.5': + resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.2.1': + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.38.0': + resolution: {integrity: sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.6.0': + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + + '@floating-ui/dom@1.6.3': + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + + '@floating-ui/react-dom@2.0.8': + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.1': + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + + '@fontsource/roboto@4.5.8': + resolution: {integrity: sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@mui/base@5.0.0-beta.12': + resolution: {integrity: sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/base@5.0.0-beta.40': + resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@5.15.15': + resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==} + + '@mui/icons-material@5.15.15': + resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/lab@5.0.0-alpha.141': + resolution: {integrity: sha512-PsW55xX2ieNLldca2hLxL1SYtZgRQv++lj1W/Jyi5Z2MHuFDcdqI7yKGrOzyIWw7ctQrmHa1FTShBiCa2wkEoQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/material@5.15.15': + resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/private-theming@5.15.14': + resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@5.15.14': + resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@5.15.15': + resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.14': + resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@5.15.14': + resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/x-date-pickers@6.19.9': + resolution: {integrity: sha512-B2m4Fv/fOme5qmV6zuE3QnWQSvj3zKtI2OvikPz5prpiCcIxqpeytkQ7VfrWH3/Aqd5yhG1Yr4IgbqG0ymIXGg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.9.0 + '@emotion/styled': ^11.8.1 + '@mui/material': ^5.8.6 + '@mui/system': ^5.8.0 + date-fns: ^2.25.0 || ^3.2.0 + date-fns-jalali: ^2.13.0-0 + dayjs: ^1.10.7 + luxon: ^3.0.2 + moment: ^2.29.4 + moment-hijri: ^2.1.2 + moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + date-fns: + optional: true + date-fns-jalali: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + moment-hijri: + optional: true + moment-jalaali: + optional: true + + '@next/env@13.4.7': + resolution: {integrity: sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==} + + '@next/eslint-plugin-next@13.3.0': + resolution: {integrity: sha512-wuGN5qSEjSgcq9fVkH0Y/qIPFjnZtW3ZPwfjJOn7l/rrf6y8J24h/lo61kwqunTyzZJm/ETGfGVU9PUs8cnzEA==} + + '@next/swc-darwin-arm64@13.4.7': + resolution: {integrity: sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@13.4.7': + resolution: {integrity: sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@13.4.7': + resolution: {integrity: sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@13.4.7': + resolution: {integrity: sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@13.4.7': + resolution: {integrity: sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@13.4.7': + resolution: {integrity: sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@13.4.7': + resolution: {integrity: sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@13.4.7': + resolution: {integrity: sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@13.4.7': + resolution: {integrity: sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@react-dnd/asap@5.0.2': + resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} + + '@react-dnd/invariant@4.0.2': + resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} + + '@react-dnd/shallowequal@4.0.2': + resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} + + '@react-hook/latest@1.0.3': + resolution: {integrity: sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==} + peerDependencies: + react: '>=16.8' + + '@react-hook/passive-layout-effect@1.2.1': + resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} + peerDependencies: + react: '>=16.8' + + '@react-hook/resize-observer@1.2.6': + resolution: {integrity: sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==} + peerDependencies: + react: '>=16.8' + + '@rushstack/eslint-patch@1.10.2': + resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} + + '@swc/helpers@0.5.1': + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + + '@types/d3-array@3.2.1': + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.9': + resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/is-hotkey@0.1.10': + resolution: {integrity: sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/lodash@4.17.0': + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + + '@types/node@18.15.12': + resolution: {integrity: sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/pdfobject@2.2.5': + resolution: {integrity: sha512-7gD5tqc/RUDq0PyoLemL0vEHxBYi+zY0WVaFAx/Y0jBsXFgot1vB9No1GhDZGwRGJMCIZbgAb74QG9MTyTNU/g==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.0.11': + resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} + + '@types/react-relay@14.1.3': + resolution: {integrity: sha512-tsu+3jN0zeOYKV485fwUy3yMEZWkDVzC2JG0tJgEH6p9tcPQkBAUoXqEZFwSBtHtNo1etfa1Eityg3fC55qDvQ==} + + '@types/react-transition-group@4.4.10': + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + + '@types/react@18.0.37': + resolution: {integrity: sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==} + + '@types/relay-runtime@14.1.10': + resolution: {integrity: sha512-px/vskDhwlsh+fRiF9s9TBB84U6FbCfFzdgusnVtN8iQ3lLebHlt/v1v6YzpqUZFDXZxvC6GWUbhXcCfSZwN9A==} + + '@types/scheduler@0.23.0': + resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@vidstack/react@1.12.9': + resolution: {integrity: sha512-2YBkMN590u20P9JVw6EoaAegVz4YP7utxeRXuDkzvn60UG8Ky6v4CdywFaBAHBrxyRefiCJTLB5noDmIRyVplg==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^18.0.0 + react: ^18.0.0 + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + attr-accept@2.2.2: + resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} + engines: {node: '>=4'} + + autoprefixer@10.4.14: + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase-keys@2.1.0: + resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} + engines: {node: '>=0.10.0'} + + camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + + caniuse-lite@1.0.30001611: + resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} + + canvas@2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-voronoi@1.1.4: + resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@2.2.1: + resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delaunator@4.0.1: + resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==} + + delaunay-find@0.0.6: + resolution: {integrity: sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dnd-core@16.0.1: + resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.4.740: + resolution: {integrity: sha512-Yvg5i+iyv7Xm18BRdVPVm8lc7kgxM3r6iwqCH2zB7QZy1kZRNmd0Zqm0zcD9XoFREE5/5rwIuIAOT+/mzGcnZg==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@13.3.0: + resolution: {integrity: sha512-6YEwmFBX0VjBd3ODGW9df0Is0FLaRFdMN8eAahQG9CN6LjQ28J8AFr19ngxqMSg7Qv6Uca/3VeeBosJh1bzu0w==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-config-prettier@8.10.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.34.1: + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.38.0: + resolution: {integrity: sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + + fetch-graphql-schema@0.2.1: + resolution: {integrity: sha512-XtP692mntCOZRVOnAkZcco3W+2LprOl5Jk3Y0lKG5PJfnnj5Ict/vhMevQT15Dfdt7SZMjLGdr4fD7PbDQXEoQ==} + engines: {node: '>=0.12.0'} + hasBin: true + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + formik@2.4.5: + resolution: {integrity: sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==} + peerDependencies: + react: '>=16.8.0' + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@10.18.0: + resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stdin@4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphql@0.8.2: + resolution: {integrity: sha512-4wpUsDXiewqUCxr0bt5wOk5dV/EIsWRVaB5RmWKhZrAT9ewpOwql2GrhMq1l6WyOrBV/n5GqvXSzKsCwubqwoA==} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@2.1.0: + resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} + engines: {node: '>=0.10.0'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hotkey@0.1.8: + resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} + + is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterall@1.0.2: + resolution: {integrity: sha512-RaKa8RHmSay1GvkTLOYRT8Ju9/Cf0DRK9z7YzS14sID4e2hkP4eknzDhTtzTboO8shZIysbVEEnmjJEHxOVIMQ==} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + js-sdsl@4.4.2: + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + jwt-decode@3.1.2: + resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@13.3.0: + resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + listr2@6.6.1: + resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: '>=16.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loud-rejection@1.6.0: + resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} + engines: {node: '>=0.10.0'} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + make-cancellable-promise@1.3.2: + resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-event-props@1.6.2: + resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + media-captions@1.0.4: + resolution: {integrity: sha512-cyDNmuZvvO4H27rcBq2Eudxo9IZRDCOX/I7VEyqbxsEiD2Ei7UYUhG/Sc5fvMZjmathgz3fEK7iAKqvpY+Ux1w==} + engines: {node: '>=16'} + + meow@3.7.0: + resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} + engines: {node: '>=0.10.0'} + + merge-refs@1.3.0: + resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nan@2.20.0: + resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next@13.4.7: + resolution: {integrity: sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==} + engines: {node: '>=16.8.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + fibers: '>= 3.1.0' + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + fibers: + optional: true + sass: + optional: true + + node-fetch@1.7.3: + resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + oidc-client-ts@2.4.0: + resolution: {integrity: sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==} + engines: {node: '>=12.13.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path2d-polyfill@2.0.1: + resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} + engines: {node: '>=8'} + + pdfjs-dist@3.11.174: + resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} + engines: {node: '>=18'} + + pdfobject@2.3.0: + resolution: {integrity: sha512-w/9pXDXTDs3IDmOri/w8lM/w6LHR0/F4fcBLLzH+4csSoyshQ5su0TE7k0FLHZO7aOjVLDGecqd1M89+PVpVAA==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-import@14.1.0: + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.0.0: + resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + raw-loader@4.0.2: + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + react-confetti@6.1.0: + resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==} + engines: {node: '>=10.18'} + peerDependencies: + react: ^16.3.0 || ^17.0.1 || ^18.0.0 + + react-dnd-html5-backend@16.0.1: + resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} + + react-dnd@16.0.1: + resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} + peerDependencies: + '@types/hoist-non-react-statics': '>= 3.3.1' + '@types/node': '>= 12' + '@types/react': '>= 16' + react: '>= 16.14' + peerDependenciesMeta: + '@types/hoist-non-react-statics': + optional: true + '@types/node': + optional: true + '@types/react': + optional: true + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-dropzone@14.2.3: + resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + + react-error-boundary@4.0.13: + resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + peerDependencies: + react: '>=16.13.1' + + react-fast-compare@2.0.4: + resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==} + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + react-oidc-context@2.3.1: + resolution: {integrity: sha512-WdhmEU6odNzMk9pvOScxUkf6/1aduiI/nQryr7+iCl2VDnYLASDTIV/zy58KuK4VXG3fBaRKukc/mRpMjF9a3Q==} + engines: {node: '>=12.13.0'} + peerDependencies: + oidc-client-ts: ^2.2.1 + react: '>=16.8.0' + + react-pdf@7.7.3: + resolution: {integrity: sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-relay@15.0.0: + resolution: {integrity: sha512-KWdeMMKMJanOL9LsGZYkyAekayYIi+Y4mbDM8VYbHVPgTWJWAQP6yJKS+V4D17qIMo1L84QJQjGaQWEG139p9Q==} + peerDependencies: + react: ^16.9.0 || ^17 || ^18 + + react-smooth@4.0.1: + resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + + recharts@2.12.5: + resolution: {integrity: sha512-Cy+BkqrFIYTHJCyKHJEPvbHE2kVQEP6PKbOHJ8ztRGTAhvHuUnCwDaKVb13OwRFZ0QNUk1QvGTDdgWSMbuMtKw==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + + redent@1.0.0: + resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} + engines: {node: '>=0.10.0'} + + redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + relay-compiler@15.0.0: + resolution: {integrity: sha512-19gIIdrVe/lk7Dkz/hqxpBd54bBDWAKG+kR5ael+xznJPdjlr/rlAmh5Tqi6Mgf/wiEQGdtKiZqeNdOW2/wVRw==} + hasBin: true + + relay-runtime@15.0.0: + resolution: {integrity: sha512-7AXkXLQo6gpJNBhk4Kii5b+Yat62HSDD1TgJBi021iSjT1muI8iYd4UZG4f/If209LmaVjkZt2HTNAlk6xtslw==} + + repeating@2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slate-history@0.93.0: + resolution: {integrity: sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g==} + peerDependencies: + slate: '>=0.65.3' + + slate-react@0.98.4: + resolution: {integrity: sha512-8Of3v9hFuX8rIRc86LuuBhU9t8ps+9ARKL4yyhCrKQYZ93Ep/LFA3GvPGvtf3zYuVadZ8tkhRH8tbHOGNAndLw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + slate: '>=0.65.3' + + slate@0.94.1: + resolution: {integrity: sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA==} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@1.0.1: + resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} + engines: {node: '>=0.10.0'} + hasBin: true + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwindcss@3.3.1: + resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} + engines: {node: '>=12.13.0'} + hasBin: true + peerDependencies: + postcss: ^8.0.9 + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + + tiny-invariant@1.0.6: + resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@1.0.0: + resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} + engines: {node: '>=0.10.0'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + tween-functions@1.2.0: + resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + + ua-parser-js@1.0.37: + resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + usehooks-ts@3.1.0: + resolution: {integrity: sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + victory-area@36.9.2: + resolution: {integrity: sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==} + peerDependencies: + react: '>=16.6.0' + + victory-axis@36.9.2: + resolution: {integrity: sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==} + peerDependencies: + react: '>=16.6.0' + + victory-bar@36.9.2: + resolution: {integrity: sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==} + peerDependencies: + react: '>=16.6.0' + + victory-box-plot@36.9.2: + resolution: {integrity: sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==} + peerDependencies: + react: '>=16.6.0' + + victory-brush-container@36.9.2: + resolution: {integrity: sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==} + peerDependencies: + react: '>=16.6.0' + + victory-brush-line@36.9.2: + resolution: {integrity: sha512-/ncj8HEyl73fh8bhU4Iqe79DL62QP2rWWoogINxsGvndrhpFbL9tj7IPSEawi+riOh/CmohgI/ETu/V7QU9cJw==} + peerDependencies: + react: '>=16.6.0' + + victory-candlestick@36.9.2: + resolution: {integrity: sha512-hbStzF61GHkkflJWFgLTZSR8SOm8siJn65rwApLJBIA283yWOlyPjdr/kIQtO/h5QkIiXIuLb7RyiUAJEnH9WA==} + peerDependencies: + react: '>=16.6.0' + + victory-canvas@36.9.2: + resolution: {integrity: sha512-ImHJ7JQCpQ9aGCsh37EeVAmqJc7R0gl2CLM99gP9GfuJuZeoZ/GVfX6QFamfr19rYQOD2m9pVbecySBzdYI1zQ==} + peerDependencies: + react: '>=16.6.0' + + victory-chart@36.9.2: + resolution: {integrity: sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==} + peerDependencies: + react: '>=16.6.0' + + victory-core@36.9.2: + resolution: {integrity: sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==} + peerDependencies: + react: '>=16.6.0' + + victory-create-container@36.9.2: + resolution: {integrity: sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==} + peerDependencies: + react: '>=16.6.0' - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} + victory-cursor-container@36.9.2: + resolution: {integrity: sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==} + peerDependencies: + react: '>=16.6.0' + + victory-errorbar@36.9.2: + resolution: {integrity: sha512-i/WPMN6/7F55FpEpN9WcwiWwaFJ+2ymfTgfBDLkUD3XJ52HGen4BxUt1ouwDA3FXz9kLa/h6Wbp/fnRhX70row==} + peerDependencies: + react: '>=16.6.0' + + victory-group@36.9.2: + resolution: {integrity: sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==} + peerDependencies: + react: '>=16.6.0' + + victory-histogram@36.9.2: + resolution: {integrity: sha512-w0ipFwWZ533qyqduRacr5cf+H4PGAUTdWNyGvZbWyu4+GtYYjGdoOolfUcO1ee8VJ1kZodpG8Z7ud6I/GWIzjQ==} + peerDependencies: + react: '>=16.6.0' + + victory-legend@36.9.2: + resolution: {integrity: sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==} + peerDependencies: + react: '>=16.6.0' + + victory-line@36.9.2: + resolution: {integrity: sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==} + peerDependencies: + react: '>=16.6.0' + + victory-pie@36.9.2: + resolution: {integrity: sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==} + peerDependencies: + react: '>=16.6.0' + + victory-polar-axis@36.9.2: + resolution: {integrity: sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==} + peerDependencies: + react: '>=16.6.0' + + victory-scatter@36.9.2: + resolution: {integrity: sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==} + peerDependencies: + react: '>=16.6.0' + + victory-selection-container@36.9.2: + resolution: {integrity: sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==} + peerDependencies: + react: '>=16.6.0' + + victory-shared-events@36.9.2: + resolution: {integrity: sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==} + peerDependencies: + react: '>=16.6.0' + + victory-stack@36.9.2: + resolution: {integrity: sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==} + peerDependencies: + react: '>=16.6.0' + + victory-tooltip@36.9.2: + resolution: {integrity: sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==} + peerDependencies: + react: '>=16.6.0' + + victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + + victory-voronoi-container@36.9.2: + resolution: {integrity: sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==} + peerDependencies: + react: '>=16.6.0' + + victory-voronoi@36.9.2: + resolution: {integrity: sha512-50fq0UBTAFxxU+nabOIPE5P2v/2oAbGAX+Ckz6lu8LFwwig4J1DSz0/vQudqDGjzv3JNEdqTD4FIpyjbxLcxiA==} + peerDependencies: + react: '>=16.6.0' + + victory-zoom-container@36.9.2: + resolution: {integrity: sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==} + peerDependencies: + react: '>=16.6.0' + + victory@36.9.2: + resolution: {integrity: sha512-kgVgiSno4KpD0HxmUo5GzqWI4P/eILLOM6AmJfAlagCnOzrtYGsAw+N1YxOcYvTiKsh/zmWawxHlpw3TMenFDQ==} + peerDependencies: + react: '>=16.6.0' + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yup@1.4.0: + resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + + zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@babel/code-frame@7.24.2': dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - dev: false - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.24.3': dependencies: '@babel/types': 7.24.0 - dev: false - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-string-parser@7.24.1': {} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.2': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 - dev: false - /@babel/runtime@7.24.4: - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.4': dependencies: regenerator-runtime: 0.14.1 - /@babel/types@7.24.0: - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} + '@babel/types@7.24.0': dependencies: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: false - /@emotion/babel-plugin@11.11.0: - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + '@emotion/babel-plugin@11.11.0': dependencies: '@babel/helper-module-imports': 7.24.3 '@babel/runtime': 7.24.4 @@ -258,64 +3385,40 @@ packages: find-root: 1.1.0 source-map: 0.5.7 stylis: 4.2.0 - dev: false - /@emotion/cache@11.11.0: - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + '@emotion/cache@11.11.0': dependencies: '@emotion/memoize': 0.8.1 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 stylis: 4.2.0 - dev: false - /@emotion/css@11.11.2: - resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==} + '@emotion/css@11.11.2': dependencies: '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 - dev: false - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: false + '@emotion/hash@0.9.1': {} - /@emotion/is-prop-valid@0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - requiresBuild: true + '@emotion/is-prop-valid@0.8.8': dependencies: '@emotion/memoize': 0.7.4 - dev: false optional: true - /@emotion/is-prop-valid@1.2.2: - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + '@emotion/is-prop-valid@1.2.2': dependencies: '@emotion/memoize': 0.8.1 - dev: false - /@emotion/memoize@0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - requiresBuild: true - dev: false + '@emotion/memoize@0.7.4': optional: true - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: false + '@emotion/memoize@0.8.1': {} - /@emotion/react@11.11.4(@types/react@18.0.37)(react@18.2.0): - resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true + '@emotion/react@11.11.4(@types/react@18.0.37)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 @@ -327,31 +3430,18 @@ packages: '@types/react': 18.0.37 hoist-non-react-statics: 3.3.2 react: 18.2.0 - dev: false - /@emotion/serialize@1.1.4: - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + '@emotion/serialize@1.1.4': dependencies: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 csstype: 3.1.3 - dev: false - /@emotion/sheet@1.2.2: - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - dev: false + '@emotion/sheet@1.2.2': {} - /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.0.37)(react@18.2.0): - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true + '@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.0.37)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 @@ -362,44 +3452,25 @@ packages: '@emotion/utils': 1.2.1 '@types/react': 18.0.37 react: 18.2.0 - dev: false - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: false + '@emotion/unitless@0.8.1': {} - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: '>=16.8.0' + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': dependencies: react: 18.2.0 - dev: false - /@emotion/utils@1.2.1: - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - dev: false + '@emotion/utils@1.2.1': {} - /@emotion/weak-memoize@0.3.1: - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - dev: false + '@emotion/weak-memoize@0.3.1': {} - /@eslint-community/eslint-utils@4.4.0(eslint@8.38.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.38.0)': dependencies: eslint: 8.38.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -413,56 +3484,35 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.38.0: - resolution: {integrity: sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@8.38.0': {} - /@floating-ui/core@1.6.0: - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + '@floating-ui/core@1.6.0': dependencies: '@floating-ui/utils': 0.2.1 - dev: false - /@floating-ui/dom@1.6.10: - resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + '@floating-ui/dom@1.6.10': dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.7 - dev: false - /@floating-ui/dom@1.6.3: - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + '@floating-ui/dom@1.6.3': dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 - dev: false - /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + '@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0)': dependencies: '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@floating-ui/utils@0.2.1: - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - dev: false + '@floating-ui/utils@0.2.1': {} - /@floating-ui/utils@0.2.7: - resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} - dev: false + '@floating-ui/utils@0.2.7': {} - /@fontsource/roboto@4.5.8: - resolution: {integrity: sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==} - dev: false + '@fontsource/roboto@4.5.8': {} - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 @@ -470,65 +3520,44 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + '@humanwhocodes/object-schema@2.0.3': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: false + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': {} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': {} - /@jridgewell/source-map@0.3.6: - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.6': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - /@juggle/resize-observer@3.4.0: - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - dev: false + '@juggle/resize-observer@3.4.0': {} - /@mapbox/node-pre-gyp@1.0.11: - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - requiresBuild: true + '@mapbox/node-pre-gyp@1.0.11': dependencies: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 @@ -542,19 +3571,9 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false optional: true - /@mui/base@5.0.0-beta.12(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/base@5.0.0-beta.12(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@emotion/is-prop-valid': 1.2.2 @@ -567,19 +3586,9 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-is: 18.2.0 - dev: false - - /@mui/base@5.0.0-beta.40(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-is: 18.2.0 + + '@mui/base@5.0.0-beta.40(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) @@ -591,46 +3600,17 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /@mui/core-downloads-tracker@5.15.15: - resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==} - dev: false + '@mui/core-downloads-tracker@5.15.15': {} - /@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.0.37)(react@18.2.0): - resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.0.37)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.0.37 react: 18.2.0 - dev: false - /@mui/lab@5.0.0-alpha.141(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-PsW55xX2ieNLldca2hLxL1SYtZgRQv++lj1W/Jyi5Z2MHuFDcdqI7yKGrOzyIWw7ctQrmHa1FTShBiCa2wkEoQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/lab@5.0.0-alpha.141(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.0.37)(react@18.2.0) @@ -646,24 +3626,8 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.2.0 - dev: false - /@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.0.37)(react@18.2.0) @@ -682,37 +3646,16 @@ packages: react-dom: 18.2.0(react@18.2.0) react-is: 18.2.0 react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) - dev: false - /@mui/private-theming@5.15.14(@types/react@18.0.37)(react@18.2.0): - resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/private-theming@5.15.14(@types/react@18.0.37)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@mui/utils': 5.15.14(@types/react@18.0.37)(react@18.2.0) '@types/react': 18.0.37 prop-types: 15.8.1 react: 18.2.0 - dev: false - /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0): - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true + '@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@emotion/cache': 11.11.0 @@ -721,23 +3664,8 @@ packages: csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 - dev: false - /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react@18.2.0): - resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.0.37)(react@18.2.0) @@ -751,28 +3679,12 @@ packages: csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 - dev: false - /@mui/types@7.2.14(@types/react@18.0.37): - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/types@7.2.14(@types/react@18.0.37)': dependencies: '@types/react': 18.0.37 - dev: false - /@mui/utils@5.15.14(@types/react@18.0.37)(react@18.2.0): - resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/utils@5.15.14(@types/react@18.0.37)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@types/prop-types': 15.7.12 @@ -780,44 +3692,8 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 - dev: false - /@mui/x-date-pickers@6.19.9(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@mui/system@5.15.15)(@types/react@18.0.37)(date-fns@2.30.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-B2m4Fv/fOme5qmV6zuE3QnWQSvj3zKtI2OvikPz5prpiCcIxqpeytkQ7VfrWH3/Aqd5yhG1Yr4IgbqG0ymIXGg==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@emotion/react': ^11.9.0 - '@emotion/styled': ^11.8.1 - '@mui/material': ^5.8.6 - '@mui/system': ^5.8.0 - date-fns: ^2.25.0 || ^3.2.0 - date-fns-jalali: ^2.13.0-0 - dayjs: ^1.10.7 - luxon: ^3.0.2 - moment: ^2.29.4 - moment-hijri: ^2.1.2 - moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - date-fns: - optional: true - date-fns-jalali: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true - moment-hijri: - optional: true - moment-jalaali: - optional: true + '@mui/x-date-pickers@6.19.9(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@mui/system@5.15.15)(@types/react@18.0.37)(date-fns@2.30.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.0.37)(react@18.2.0) @@ -836,316 +3712,165 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@types/react' - dev: false - /@next/env@13.4.7: - resolution: {integrity: sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==} - dev: false + '@next/env@13.4.7': {} - /@next/eslint-plugin-next@13.3.0: - resolution: {integrity: sha512-wuGN5qSEjSgcq9fVkH0Y/qIPFjnZtW3ZPwfjJOn7l/rrf6y8J24h/lo61kwqunTyzZJm/ETGfGVU9PUs8cnzEA==} + '@next/eslint-plugin-next@13.3.0': dependencies: glob: 7.1.7 - dev: false - /@next/swc-darwin-arm64@13.4.7: - resolution: {integrity: sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-arm64@13.4.7': optional: true - /@next/swc-darwin-x64@13.4.7: - resolution: {integrity: sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-x64@13.4.7': optional: true - /@next/swc-linux-arm64-gnu@13.4.7: - resolution: {integrity: sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-gnu@13.4.7': optional: true - /@next/swc-linux-arm64-musl@13.4.7: - resolution: {integrity: sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-musl@13.4.7': optional: true - /@next/swc-linux-x64-gnu@13.4.7: - resolution: {integrity: sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-gnu@13.4.7': optional: true - /@next/swc-linux-x64-musl@13.4.7: - resolution: {integrity: sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-musl@13.4.7': optional: true - /@next/swc-win32-arm64-msvc@13.4.7: - resolution: {integrity: sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-arm64-msvc@13.4.7': optional: true - /@next/swc-win32-ia32-msvc@13.4.7: - resolution: {integrity: sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-ia32-msvc@13.4.7': optional: true - /@next/swc-win32-x64-msvc@13.4.7: - resolution: {integrity: sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-x64-msvc@13.4.7': optional: true - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: false + '@pkgjs/parseargs@0.11.0': optional: true - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - dev: false + '@popperjs/core@2.11.8': {} - /@react-dnd/asap@5.0.2: - resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} - dev: false + '@react-dnd/asap@5.0.2': {} - /@react-dnd/invariant@4.0.2: - resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} - dev: false + '@react-dnd/invariant@4.0.2': {} - /@react-dnd/shallowequal@4.0.2: - resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} - dev: false + '@react-dnd/shallowequal@4.0.2': {} - /@react-hook/latest@1.0.3(react@18.2.0): - resolution: {integrity: sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==} - peerDependencies: - react: '>=16.8' + '@react-hook/latest@1.0.3(react@18.2.0)': dependencies: react: 18.2.0 - dev: false - /@react-hook/passive-layout-effect@1.2.1(react@18.2.0): - resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} - peerDependencies: - react: '>=16.8' + '@react-hook/passive-layout-effect@1.2.1(react@18.2.0)': dependencies: react: 18.2.0 - dev: false - /@react-hook/resize-observer@1.2.6(react@18.2.0): - resolution: {integrity: sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==} - peerDependencies: - react: '>=16.8' + '@react-hook/resize-observer@1.2.6(react@18.2.0)': dependencies: '@juggle/resize-observer': 3.4.0 '@react-hook/latest': 1.0.3(react@18.2.0) '@react-hook/passive-layout-effect': 1.2.1(react@18.2.0) react: 18.2.0 - dev: false - /@rushstack/eslint-patch@1.10.2: - resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} - dev: false + '@rushstack/eslint-patch@1.10.2': {} - /@swc/helpers@0.5.1: - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + '@swc/helpers@0.5.1': dependencies: tslib: 2.6.2 - dev: false - /@types/d3-array@3.2.1: - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - dev: false + '@types/d3-array@3.2.1': {} - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: false + '@types/d3-color@3.1.3': {} - /@types/d3-ease@3.0.2: - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - dev: false + '@types/d3-ease@3.0.2': {} - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 - dev: false - /@types/d3-path@3.1.0: - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - dev: false + '@types/d3-path@3.1.0': {} - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + '@types/d3-scale@4.0.8': dependencies: '@types/d3-time': 3.0.3 - dev: false - /@types/d3-shape@3.1.6: - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + '@types/d3-shape@3.1.6': dependencies: '@types/d3-path': 3.1.0 - dev: false - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: false + '@types/d3-time@3.0.3': {} - /@types/d3-timer@3.0.2: - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - dev: false + '@types/d3-timer@3.0.2': {} - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.9 '@types/estree': 1.0.5 - dev: true - /@types/eslint@8.56.9: - resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} + '@types/eslint@8.56.9': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@types/estree@1.0.5': {} - /@types/hoist-non-react-statics@3.3.5: - resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + '@types/hoist-non-react-statics@3.3.5': dependencies: '@types/react': 18.0.37 hoist-non-react-statics: 3.3.2 - dev: false - /@types/is-hotkey@0.1.10: - resolution: {integrity: sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==} - dev: false + '@types/is-hotkey@0.1.10': {} - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true + '@types/json-schema@7.0.15': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: false + '@types/json5@0.0.29': {} - /@types/lodash@4.17.0: - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - dev: false + '@types/lodash@4.17.0': {} - /@types/node@18.15.12: - resolution: {integrity: sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg==} + '@types/node@18.15.12': {} - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: false + '@types/parse-json@4.0.2': {} - /@types/pdfobject@2.2.5: - resolution: {integrity: sha512-7gD5tqc/RUDq0PyoLemL0vEHxBYi+zY0WVaFAx/Y0jBsXFgot1vB9No1GhDZGwRGJMCIZbgAb74QG9MTyTNU/g==} - dev: false + '@types/pdfobject@2.2.5': {} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.12': {} - /@types/react-dom@18.0.11: - resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} + '@types/react-dom@18.0.11': dependencies: '@types/react': 18.0.37 - dev: false - /@types/react-relay@14.1.3: - resolution: {integrity: sha512-tsu+3jN0zeOYKV485fwUy3yMEZWkDVzC2JG0tJgEH6p9tcPQkBAUoXqEZFwSBtHtNo1etfa1Eityg3fC55qDvQ==} + '@types/react-relay@14.1.3': dependencies: '@types/react': 18.0.37 '@types/relay-runtime': 14.1.10 - dev: true - /@types/react-transition-group@4.4.10: - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + '@types/react-transition-group@4.4.10': dependencies: '@types/react': 18.0.37 - dev: false - /@types/react@18.0.37: - resolution: {integrity: sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==} + '@types/react@18.0.37': dependencies: '@types/prop-types': 15.7.12 '@types/scheduler': 0.23.0 csstype: 3.1.3 - /@types/relay-runtime@14.1.10: - resolution: {integrity: sha512-px/vskDhwlsh+fRiF9s9TBB84U6FbCfFzdgusnVtN8iQ3lLebHlt/v1v6YzpqUZFDXZxvC6GWUbhXcCfSZwN9A==} - dev: true + '@types/relay-runtime@14.1.10': {} - /@types/scheduler@0.23.0: - resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} + '@types/scheduler@0.23.0': {} - /@typescript-eslint/parser@5.62.0(eslint@8.38.0)(typescript@5.0.4): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@5.62.0(eslint@8.38.0)(typescript@5.0.4)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 @@ -1155,29 +3880,15 @@ packages: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - dev: false - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + '@typescript-eslint/types@5.62.0': {} - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.0.4): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.0.4)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -1189,87 +3900,56 @@ packages: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - dev: false - /@vidstack/react@1.12.9(@types/react@18.0.37)(react@18.2.0): - resolution: {integrity: sha512-2YBkMN590u20P9JVw6EoaAegVz4YP7utxeRXuDkzvn60UG8Ky6v4CdywFaBAHBrxyRefiCJTLB5noDmIRyVplg==} - engines: {node: '>=18'} - peerDependencies: - '@types/react': ^18.0.0 - react: ^18.0.0 + '@vidstack/react@1.12.9(@types/react@18.0.37)(react@18.2.0)': dependencies: '@floating-ui/dom': 1.6.10 '@types/react': 18.0.37 media-captions: 1.0.4 react: 18.2.0 - dev: false - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - dev: true + '@webassemblyjs/helper-buffer@1.12.1': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.12.1 - dev: true - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: true - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 @@ -1279,29 +3959,23 @@ packages: '@webassemblyjs/wasm-opt': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 '@webassemblyjs/wast-printer': 1.12.1 - dev: true - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - dev: true - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 @@ -1309,176 +3983,101 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - dev: true - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true + '@xtuc/long@4.2.2': {} - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - requiresBuild: true - dev: false + abbrev@1.1.1: optional: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 + acorn-import-assertions@1.9.0(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.3: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - requiresBuild: true + agent-base@6.0.2: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false optional: true - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} + ansi-escapes@5.0.0: dependencies: type-fest: 1.4.0 - dev: true - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: true + ansi-regex@2.1.1: {} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + ansi-regex@6.0.1: {} - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true + ansi-styles@2.2.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: false - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + ansi-styles@6.2.1: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: false - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - requiresBuild: true - dev: false + aproba@2.0.0: optional: true - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - requiresBuild: true + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: false optional: true - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: false + arg@5.0.2: {} - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: false - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: false - /array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - dev: true + array-find-index@1.0.2: {} - /array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -1486,16 +4085,10 @@ packages: es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 - dev: false - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false + array-union@2.1.0: {} - /array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -1503,11 +4096,8 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: false - /array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -1515,50 +4105,37 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: false - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: false - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: false - /array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: false - /array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - dev: false - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -1568,27 +4145,14 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: false - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: false + asap@2.0.6: {} - /ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - dev: false + ast-types-flow@0.0.8: {} - /attr-accept@2.2.2: - resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} - engines: {node: '>=4'} - dev: false + attr-accept@2.2.2: {} - /autoprefixer@10.4.14(postcss@8.4.23): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.14(postcss@8.4.23): dependencies: browserslist: 4.23.0 caniuse-lite: 1.0.30001611 @@ -1597,126 +4161,77 @@ packages: picocolors: 1.0.0 postcss: 8.4.23 postcss-value-parser: 4.2.0 - dev: false - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: false - /axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} - engines: {node: '>=4'} - dev: false + axe-core@4.7.0: {} - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + axobject-query@3.2.1: dependencies: dequal: 2.0.3 - dev: false - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.24.4 cosmiconfig: 7.1.0 resolve: 1.22.8 - dev: false - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true + big.js@5.2.2: {} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - dev: false + binary-extensions@2.3.0: {} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: false - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001611 electron-to-chromium: 1.4.740 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true + buffer-from@1.1.2: {} - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: false - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - dev: false - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: false + camelcase-css@2.0.1: {} - /camelcase-keys@2.1.0: - resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} - engines: {node: '>=0.10.0'} + camelcase-keys@2.1.0: dependencies: camelcase: 2.1.1 map-obj: 1.0.1 - dev: true - /camelcase@2.1.1: - resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} - engines: {node: '>=0.10.0'} - dev: true + camelcase@2.1.1: {} - /caniuse-lite@1.0.30001611: - resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} + caniuse-lite@1.0.30001611: {} - /canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} - requiresBuild: true + canvas@2.11.2: dependencies: '@mapbox/node-pre-gyp': 1.0.11 nan: 2.20.0 @@ -1724,44 +4239,30 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false optional: true - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 supports-color: 2.0.0 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: false - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -1772,108 +4273,59 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: false - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - requiresBuild: true - dev: false + chownr@2.0.0: optional: true - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true + chrome-trace-event@1.0.3: {} - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: true - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-truncate@3.1.0: dependencies: slice-ansi: 5.0.0 string-width: 5.1.2 - dev: true - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + client-only@0.0.1: {} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} - engines: {node: '>=6'} - dev: false + clsx@2.1.0: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: false - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: false + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - requiresBuild: true - dev: false + color-support@1.1.3: optional: true - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true + colorette@2.0.20: {} - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} - dev: true + commander@11.0.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false + commander@4.1.1: {} - /compute-scroll-into-view@1.0.20: - resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} - dev: false + compute-scroll-into-view@1.0.20: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-map@0.0.1: {} - /concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true + concurrently@8.2.2: dependencies: chalk: 4.1.2 date-fns: 2.30.0 @@ -1884,362 +4336,208 @@ packages: supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 - dev: true - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - requiresBuild: true - dev: false + console-control-strings@1.1.0: optional: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false + convert-source-map@1.9.0: {} - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: false - /cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + cross-fetch@3.1.8: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding - dev: false - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - dev: false + crypto-js@4.2.0: {} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: false + cssesc@3.0.0: {} - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.1.3: {} - /currently-unhandled@0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} + currently-unhandled@0.4.1: dependencies: array-find-index: 1.0.2 - dev: true - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + d3-array@3.2.4: dependencies: internmap: 2.0.3 - dev: false - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + d3-color@3.1.0: {} - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false + d3-ease@3.0.1: {} - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false + d3-format@3.1.0: {} - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false + d3-path@3.1.0: {} - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 - dev: false - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 - dev: false - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + d3-time@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false + d3-timer@3.0.1: {} - /d3-voronoi@1.1.4: - resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} - dev: false + d3-voronoi@1.1.4: {} - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: false + damerau-levenshtein@1.0.8: {} - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: false - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: false - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: false - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + date-fns@2.30.0: dependencies: '@babel/runtime': 7.24.4 - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: false + dayjs@1.11.10: {} - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: false - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true + decamelize@1.2.0: {} - /decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - dev: false + decimal.js-light@2.5.1: {} - /decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} - requiresBuild: true + decompress-response@4.2.1: dependencies: mimic-response: 2.1.0 - dev: false optional: true - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deep-is@0.1.4: {} - /deepmerge@2.2.1: - resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} - engines: {node: '>=0.10.0'} - dev: false + deepmerge@2.2.1: {} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - dev: false - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - dev: false - /delaunator@4.0.1: - resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==} - dev: false + delaunator@4.0.1: {} - /delaunay-find@0.0.6: - resolution: {integrity: sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==} + delaunay-find@0.0.6: dependencies: delaunator: 4.0.1 - dev: false - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - requiresBuild: true - dev: false + delegates@1.0.0: optional: true - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: false + dequal@2.0.3: {} - /detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - requiresBuild: true - dev: false + detect-libc@2.0.3: optional: true - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: false + didyoumean@1.2.2: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: false - /direction@1.0.4: - resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} - hasBin: true - dev: false + direction@1.0.4: {} - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: false + dlv@1.1.3: {} - /dnd-core@16.0.1: - resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} + dnd-core@16.0.1: dependencies: '@react-dnd/asap': 5.0.2 '@react-dnd/invariant': 4.0.2 redux: 4.2.1 - dev: false - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: false - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.24.4 csstype: 3.1.3 - dev: false - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eastasianwidth@0.2.0: {} - /electron-to-chromium@1.4.740: - resolution: {integrity: sha512-Yvg5i+iyv7Xm18BRdVPVm8lc7kgxM3r6iwqCH2zB7QZy1kZRNmd0Zqm0zcD9XoFREE5/5rwIuIAOT+/mzGcnZg==} + electron-to-chromium@1.4.740: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - requiresBuild: true + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emoji-regex@9.2.2: {} - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true + emojis-list@3.0.0: {} - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 - dev: true - /enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.16.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -2287,23 +4585,14 @@ packages: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: false - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: false - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: false - /es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} + es-errors@1.3.0: {} + + es-iterator-helpers@1.0.18: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -2319,63 +4608,36 @@ packages: internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - dev: false - /es-module-lexer@1.5.0: - resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} - dev: true + es-module-lexer@1.5.0: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - dev: false - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: false - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - dev: false - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: false - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + escape-string-regexp@4.0.0: {} - /eslint-config-next@13.3.0(eslint@8.38.0)(typescript@5.0.4): - resolution: {integrity: sha512-6YEwmFBX0VjBd3ODGW9df0Is0FLaRFdMN8eAahQG9CN6LjQ28J8AFr19ngxqMSg7Qv6Uca/3VeeBosJh1bzu0w==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true + eslint-config-next@13.3.0(eslint@8.38.0)(typescript@5.0.4): dependencies: '@next/eslint-plugin-next': 13.3.0 '@rushstack/eslint-patch': 1.10.2 @@ -2391,33 +4653,20 @@ packages: transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-config-prettier@8.10.0(eslint@8.38.0): - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@8.10.0(eslint@8.38.0): dependencies: eslint: 8.38.0 - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: false - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.38.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.38.0): dependencies: debug: 4.3.4 enhanced-resolve: 5.16.0 @@ -2433,28 +4682,8 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.38.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.38.0): dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.38.0)(typescript@5.0.4) debug: 3.2.7 @@ -2463,17 +4692,8 @@ packages: eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.38.0) transitivePeerDependencies: - supports-color - dev: false - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.38.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.38.0): dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.38.0)(typescript@5.0.4) array-includes: 3.1.8 @@ -2498,13 +4718,8 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-plugin-jsx-a11y@6.8.0(eslint@8.38.0): - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-jsx-a11y@6.8.0(eslint@8.38.0): dependencies: '@babel/runtime': 7.24.4 aria-query: 5.3.0 @@ -2523,22 +4738,12 @@ packages: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - dev: false - /eslint-plugin-react-hooks@4.6.0(eslint@8.38.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@4.6.0(eslint@8.38.0): dependencies: eslint: 8.38.0 - dev: false - /eslint-plugin-react@7.34.1(eslint@8.38.0): - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.34.1(eslint@8.38.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -2559,31 +4764,20 @@ packages: resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 - dev: false - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@3.4.3: {} - /eslint@8.38.0: - resolution: {integrity: sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.38.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) '@eslint-community/regexpp': 4.10.0 @@ -2628,55 +4822,33 @@ packages: transitivePeerDependencies: - supports-color - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + estraverse@5.3.0: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + esutils@2.0.3: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false + eventemitter3@4.0.7: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true + eventemitter3@5.0.1: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true + events@3.3.0: {} - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -2687,44 +4859,30 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - dev: false + fast-equals@5.0.1: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: false - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-levenshtein@2.0.6: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - /fbjs-css-vars@1.0.2: - resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - dev: false + fbjs-css-vars@1.0.2: {} - /fbjs@3.0.5: - resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fbjs@3.0.5: dependencies: cross-fetch: 3.1.8 fbjs-css-vars: 1.0.2 @@ -2735,87 +4893,57 @@ packages: ua-parser-js: 1.0.37 transitivePeerDependencies: - encoding - dev: false - /fetch-graphql-schema@0.2.1: - resolution: {integrity: sha512-XtP692mntCOZRVOnAkZcco3W+2LprOl5Jk3Y0lKG5PJfnnj5Ict/vhMevQT15Dfdt7SZMjLGdr4fD7PbDQXEoQ==} - engines: {node: '>=0.12.0'} - hasBin: true + fetch-graphql-schema@0.2.1: dependencies: chalk: 1.1.3 graphql: 0.8.2 meow: 3.7.0 mkdirp: 0.5.6 node-fetch: 1.7.3 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - /file-selector@0.6.0: - resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} - engines: {node: '>= 12'} + file-selector@0.6.0: dependencies: tslib: 2.6.2 - dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false + find-root@1.1.0: {} - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} + find-up@1.1.2: dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.1: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: false - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: false - /formik@2.4.5(react@18.2.0): - resolution: {integrity: sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==} - peerDependencies: - react: '>=16.8.0' + formik@2.4.5(react@18.2.0): dependencies: '@types/hoist-non-react-statics': 3.3.5 deepmerge: 2.2.1 @@ -2826,72 +4954,39 @@ packages: react-fast-compare: 2.0.4 tiny-warning: 1.0.3 tslib: 2.6.2 - dev: false - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: false + fraction.js@4.3.7: {} - /framer-motion@10.18.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true + framer-motion@10.18.0(react-dom@18.2.0)(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 - dev: false - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - requiresBuild: true + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - dev: false optional: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - dev: false - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: false + functions-have-names@1.2.3: {} - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - requiresBuild: true + gauge@3.0.2: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -2902,80 +4997,51 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: false optional: true - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: false - /get-stdin@4.0.1: - resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} - engines: {node: '>=0.10.0'} - dev: true + get-stdin@4.0.1: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: false - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.3: dependencies: resolve-pkg-maps: 1.0.0 - dev: false - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: false - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob-to-regexp@0.4.1: {} - /glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.12: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 minipass: 7.0.4 path-scurry: 1.10.2 - dev: false - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + glob@7.1.7: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2983,12 +5049,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - requiresBuild: true + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2997,22 +5059,15 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: false - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -3020,524 +5075,301 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: false - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: false - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + grapheme-splitter@1.0.4: {} - /graphql@0.8.2: - resolution: {integrity: sha512-4wpUsDXiewqUCxr0bt5wOk5dV/EIsWRVaB5RmWKhZrAT9ewpOwql2GrhMq1l6WyOrBV/n5GqvXSzKsCwubqwoA==} + graphql@0.8.2: dependencies: iterall: 1.0.2 - dev: true - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} + has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1 - dev: true - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: false + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: false + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: false - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: false + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: false - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - requiresBuild: true - dev: false + has-unicode@2.0.1: optional: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - dev: false - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - requiresBuild: true + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false optional: true - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true + human-signals@4.3.1: {} - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true + husky@8.0.3: {} - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + ignore@5.3.1: {} - /immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - dev: false + immer@9.0.21: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + imurmurhash@0.1.4: {} - /indent-string@2.1.0: - resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} - engines: {node: '>=0.10.0'} + indent-string@2.1.0: dependencies: repeating: 2.0.1 - dev: true - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: false - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false + internmap@2.0.3: {} - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 - dev: false - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: false - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: false - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - dev: false - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: false + is-callable@1.2.7: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: false - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 - dev: false - /is-finite@1.1.0: - resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} - engines: {node: '>=0.10.0'} - dev: true + is-finite@1.1.0: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - requiresBuild: true + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true + is-fullwidth-code-point@4.0.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hotkey@0.1.8: - resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} - dev: false + is-hotkey@0.1.8: {} - /is-hotkey@0.2.0: - resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} - dev: false + is-hotkey@0.2.0: {} - /is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - dev: false + is-map@2.0.3: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: false + is-negative-zero@2.0.3: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + is-path-inside@3.0.3: {} - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: false + is-plain-object@5.0.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: false - /is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - dev: false + is-set@2.0.3: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: false - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: true + is-stream@1.1.0: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: false - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: false - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: false - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: true + is-utf8@0.2.1: {} - /is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - dev: false + is-weakmap@2.0.2: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: false - /is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: false - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /iterall@1.0.2: - resolution: {integrity: sha512-RaKa8RHmSay1GvkTLOYRT8Ju9/Cf0DRK9z7YzS14sID4e2hkP4eknzDhTtzTboO8shZIysbVEEnmjJEHxOVIMQ==} - dev: true + iterall@1.0.2: {} - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 - dev: false - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: false - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 18.15.12 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: false + jiti@1.21.0: {} - /js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} + js-sdsl@4.4.2: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@0.4.1: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false + json-stringify-safe@5.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: false - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true + json5@2.2.3: {} - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 - dev: false - /jwt-decode@3.1.2: - resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - dev: false + jwt-decode@3.1.2: {} - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: false + language-subtag-registry@0.3.22: {} - /language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.22 - dev: false - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + lilconfig@2.1.0: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false + lines-and-columns@1.2.4: {} - /lint-staged@13.3.0: - resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true + lint-staged@13.3.0: dependencies: chalk: 5.3.0 commander: 11.0.0 @@ -3552,16 +5384,8 @@ packages: transitivePeerDependencies: - enquirer - supports-color - dev: true - /listr2@6.6.1: - resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} - engines: {node: '>=16.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true + listr2@6.6.1: dependencies: cli-truncate: 3.1.0 colorette: 2.0.20 @@ -3569,122 +5393,72 @@ packages: log-update: 5.0.1 rfdc: 1.3.1 wrap-ansi: 8.1.0 - dev: true - /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} + load-json-file@1.1.0: dependencies: graceful-fs: 4.2.11 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 strip-bom: 2.0.0 - dev: true - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true + loader-runner@4.3.0: {} - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + loader-utils@2.0.4: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false + lodash-es@4.17.21: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: false + lodash.debounce@4.0.8: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.merge@4.6.2: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + log-update@5.0.1: dependencies: ansi-escapes: 5.0.0 cli-cursor: 4.0.0 slice-ansi: 5.0.0 strip-ansi: 7.1.0 wrap-ansi: 8.1.0 - dev: true - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: false - /loud-rejection@1.6.0: - resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} - engines: {node: '>=0.10.0'} + loud-rejection@1.6.0: dependencies: currently-unhandled: 0.4.1 signal-exit: 3.0.7 - dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - dev: false + lru-cache@10.2.0: {} - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - requiresBuild: true + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: false - /make-cancellable-promise@1.3.2: - resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} - dev: false + make-cancellable-promise@1.3.2: {} - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - requiresBuild: true + make-dir@3.1.0: dependencies: semver: 6.3.1 - dev: false optional: true - /make-event-props@1.6.2: - resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} - dev: false + make-event-props@1.6.2: {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /media-captions@1.0.4: - resolution: {integrity: sha512-cyDNmuZvvO4H27rcBq2Eudxo9IZRDCOX/I7VEyqbxsEiD2Ei7UYUhG/Sc5fvMZjmathgz3fEK7iAKqvpY+Ux1w==} - engines: {node: '>=16'} - dev: false + media-captions@1.0.4: {} - /meow@3.7.0: - resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} - engines: {node: '>=0.10.0'} + meow@3.7.0: dependencies: camelcase-keys: 2.1.0 decamelize: 1.2.0 @@ -3696,176 +5470,86 @@ packages: read-pkg-up: 1.0.1 redent: 1.0.0 trim-newlines: 1.0.0 - dev: true - /merge-refs@1.3.0(@types/react@18.0.37): - resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + merge-refs@1.3.0(@types/react@18.0.37): dependencies: '@types/react': 18.0.37 - dev: false - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false + merge2@1.4.1: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - requiresBuild: true - dev: false + mimic-response@2.1.0: optional: true - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 - dev: false - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - requiresBuild: true + minipass@3.3.6: dependencies: yallist: 4.0.0 - dev: false optional: true - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - requiresBuild: true - dev: false + minipass@5.0.0: optional: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: false + minipass@7.0.4: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - requiresBuild: true + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: false optional: true - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: true - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - requiresBuild: true - dev: false + mkdirp@1.0.4: optional: true - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false + ms@2.1.3: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false - /nan@2.20.0: - resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} - requiresBuild: true - dev: false + nan@2.20.0: optional: true - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-compare@1.4.0: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /next@13.4.7(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==} - engines: {node: '>=16.8.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - fibers: '>= 3.1.0' - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - fibers: - optional: true - sass: - optional: true + next@13.4.7(react-dom@18.2.0)(react@18.2.0): dependencies: '@next/env': 13.4.7 '@swc/helpers': 0.5.1 @@ -3890,186 +5574,112 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false - /node-fetch@1.7.3: - resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + node-fetch@1.7.3: dependencies: encoding: 0.1.13 is-stream: 1.1.0 - dev: true - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - dev: false - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.14: {} - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - requiresBuild: true + nopt@5.0.0: dependencies: abbrev: 1.1.1 - dev: false optional: true - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: false + normalize-range@0.1.2: {} - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - requiresBuild: true + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 - dev: false optional: true - /nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - dev: false + nullthrows@1.1.1: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: false + object-hash@3.0.0: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: false + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: false + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: false - /object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: false - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: false - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - dev: false - /object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} + object.hasown@1.1.4: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: false - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: false - /oidc-client-ts@2.4.0: - resolution: {integrity: sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==} - engines: {node: '>=12.13.0'} + oidc-client-ts@2.4.0: dependencies: crypto-js: 4.2.0 jwt-decode: 3.1.2 - dev: false - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -4078,317 +5688,171 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} + parse-json@2.2.0: dependencies: error-ex: 1.3.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: false - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} + path-exists@2.1.0: dependencies: pinkie-promise: 2.0.1 - dev: true - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.2: dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - dev: false - /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} + path-type@1.1.0: dependencies: graceful-fs: 4.2.11 pify: 2.3.0 pinkie-promise: 2.0.1 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: false + path-type@4.0.0: {} - /path2d-polyfill@2.0.1: - resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} - engines: {node: '>=8'} - requiresBuild: true - dev: false + path2d-polyfill@2.0.1: optional: true - /pdfjs-dist@3.11.174: - resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} - engines: {node: '>=18'} + pdfjs-dist@3.11.174: optionalDependencies: canvas: 2.11.2 path2d-polyfill: 2.0.1 transitivePeerDependencies: - encoding - supports-color - dev: false - /pdfobject@2.3.0: - resolution: {integrity: sha512-w/9pXDXTDs3IDmOri/w8lM/w6LHR0/F4fcBLLzH+4csSoyshQ5su0TE7k0FLHZO7aOjVLDGecqd1M89+PVpVAA==} - dev: false + pdfobject@2.3.0: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: true + pidtree@0.6.0: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + pify@2.3.0: {} - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 - dev: true - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true + pinkie@2.0.4: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: false + pirates@4.0.6: {} - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: false + possible-typed-array-names@1.0.0: {} - /postcss-import@14.1.0(postcss@8.4.23): - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.0.0 + postcss-import@14.1.0(postcss@8.4.23): dependencies: postcss: 8.4.23 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - dev: false - /postcss-js@4.0.1(postcss@8.4.23): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 + postcss-js@4.0.1(postcss@8.4.23): dependencies: camelcase-css: 2.0.1 postcss: 8.4.23 - dev: false - /postcss-load-config@3.1.4(postcss@8.4.23): - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@3.1.4(postcss@8.4.23): dependencies: lilconfig: 2.1.0 postcss: 8.4.23 yaml: 1.10.2 - dev: false - /postcss-nested@6.0.0(postcss@8.4.23): - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + postcss-nested@6.0.0(postcss@8.4.23): dependencies: postcss: 8.4.23 postcss-selector-parser: 6.0.16 - dev: false - /postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} + postcss-selector-parser@6.0.16: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: false - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false + postcss-value-parser@4.2.0: {} - /postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.14: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: false - /postcss@8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.23: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: false - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + prelude-ls@1.2.1: {} - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + promise@7.3.1: dependencies: asap: 2.0.6 - dev: false - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - dev: false - /property-expr@2.0.6: - resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - dev: false + property-expr@2.0.6: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + punycode@2.3.1: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-microtask@1.2.3: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: false + quick-lru@5.1.1: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /raw-loader@4.0.2(webpack@5.91.0): - resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + raw-loader@4.0.2(webpack@5.91.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.91.0 - dev: true - /react-confetti@6.1.0(react@18.2.0): - resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==} - engines: {node: '>=10.18'} - peerDependencies: - react: ^16.3.0 || ^17.0.1 || ^18.0.0 + react-confetti@6.1.0(react@18.2.0): dependencies: react: 18.2.0 tween-functions: 1.2.0 - dev: false - /react-dnd-html5-backend@16.0.1: - resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} + react-dnd-html5-backend@16.0.1: dependencies: dnd-core: 16.0.1 - dev: false - /react-dnd@16.0.1(@types/node@18.15.12)(@types/react@18.0.37)(react@18.2.0): - resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} - peerDependencies: - '@types/hoist-non-react-statics': '>= 3.3.1' - '@types/node': '>= 12' - '@types/react': '>= 16' - react: '>= 16.14' - peerDependenciesMeta: - '@types/hoist-non-react-statics': - optional: true - '@types/node': - optional: true - '@types/react': - optional: true + react-dnd@16.0.1(@types/node@18.15.12)(@types/react@18.0.37)(react@18.2.0): dependencies: '@react-dnd/invariant': 4.0.2 '@react-dnd/shallowequal': 4.0.2 @@ -4398,75 +5862,39 @@ packages: fast-deep-equal: 3.1.3 hoist-non-react-statics: 3.3.2 react: 18.2.0 - dev: false - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - dev: false - /react-dropzone@14.2.3(react@18.2.0): - resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} - engines: {node: '>= 10.13'} - peerDependencies: - react: '>= 16.8 || 18.0.0' + react-dropzone@14.2.3(react@18.2.0): dependencies: attr-accept: 2.2.2 file-selector: 0.6.0 prop-types: 15.8.1 react: 18.2.0 - dev: false - /react-error-boundary@4.0.13(react@18.2.0): - resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} - peerDependencies: - react: '>=16.13.1' + react-error-boundary@4.0.13(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 react: 18.2.0 - dev: false - /react-fast-compare@2.0.4: - resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==} - dev: false + react-fast-compare@2.0.4: {} - /react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - dev: false + react-fast-compare@3.2.2: {} - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false + react-is@16.13.1: {} - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: false + react-is@18.2.0: {} - /react-oidc-context@2.3.1(oidc-client-ts@2.4.0)(react@18.2.0): - resolution: {integrity: sha512-WdhmEU6odNzMk9pvOScxUkf6/1aduiI/nQryr7+iCl2VDnYLASDTIV/zy58KuK4VXG3fBaRKukc/mRpMjF9a3Q==} - engines: {node: '>=12.13.0'} - peerDependencies: - oidc-client-ts: ^2.2.1 - react: '>=16.8.0' + react-oidc-context@2.3.1(oidc-client-ts@2.4.0)(react@18.2.0): dependencies: oidc-client-ts: 2.4.0 react: 18.2.0 - dev: false - /react-pdf@7.7.3(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-pdf@7.7.3(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): dependencies: '@types/react': 18.0.37 clsx: 2.1.0 @@ -4483,12 +5911,8 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /react-relay@15.0.0(react@18.2.0): - resolution: {integrity: sha512-KWdeMMKMJanOL9LsGZYkyAekayYIi+Y4mbDM8VYbHVPgTWJWAQP6yJKS+V4D17qIMo1L84QJQjGaQWEG139p9Q==} - peerDependencies: - react: ^16.9.0 || ^17 || ^18 + react-relay@15.0.0(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 fbjs: 3.0.5 @@ -4498,26 +5922,16 @@ packages: relay-runtime: 15.0.0 transitivePeerDependencies: - encoding - dev: false - /react-smooth@4.0.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-smooth@4.0.1(react-dom@18.2.0)(react@18.2.0): dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) - dev: false - /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' + react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): dependencies: '@babel/runtime': 7.24.4 dom-helpers: 5.2.1 @@ -4525,68 +5939,42 @@ packages: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + react@18.2.0: dependencies: loose-envify: 1.4.0 - dev: false - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-cache@1.0.0: dependencies: pify: 2.3.0 - dev: false - /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} + read-pkg-up@1.0.1: dependencies: find-up: 1.1.2 read-pkg: 1.1.0 - dev: true - /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} + read-pkg@1.1.0: dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - requiresBuild: true + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false optional: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: false - /recharts-scale@0.4.5: - resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + recharts-scale@0.4.5: dependencies: decimal.js-light: 2.5.1 - dev: false - /recharts@2.12.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Cy+BkqrFIYTHJCyKHJEPvbHE2kVQEP6PKbOHJ8ztRGTAhvHuUnCwDaKVb13OwRFZ0QNUk1QvGTDdgWSMbuMtKw==} - engines: {node: '>=14'} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + recharts@2.12.5(react-dom@18.2.0)(react@18.2.0): dependencies: clsx: 2.1.0 eventemitter3: 4.0.7 @@ -4598,25 +5986,17 @@ packages: recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 - dev: false - /redent@1.0.0: - resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} - engines: {node: '>=0.10.0'} + redent@1.0.0: dependencies: indent-string: 2.1.0 strip-indent: 1.0.1 - dev: true - /redux@4.2.1: - resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + redux@4.2.1: dependencies: '@babel/runtime': 7.24.4 - dev: false - /reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -4625,187 +6005,116 @@ packages: get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 - dev: false - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regenerator-runtime@0.14.1: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: false - /relay-compiler@15.0.0: - resolution: {integrity: sha512-19gIIdrVe/lk7Dkz/hqxpBd54bBDWAKG+kR5ael+xznJPdjlr/rlAmh5Tqi6Mgf/wiEQGdtKiZqeNdOW2/wVRw==} - hasBin: true - dev: true + relay-compiler@15.0.0: {} - /relay-runtime@15.0.0: - resolution: {integrity: sha512-7AXkXLQo6gpJNBhk4Kii5b+Yat62HSDD1TgJBi021iSjT1muI8iYd4UZG4f/If209LmaVjkZt2HTNAlk6xtslw==} + relay-runtime@15.0.0: dependencies: '@babel/runtime': 7.24.4 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: - encoding - dev: false - /repeating@2.0.1: - resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} - engines: {node: '>=0.10.0'} + repeating@2.0.1: dependencies: is-finite: 1.1.0 - dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true + require-directory@2.1.1: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolve-from@4.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false + resolve-pkg-maps@1.0.0: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true + rfdc@1.3.1: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: false - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: false - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 - dev: false - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /scroll-into-view-if-needed@2.2.31: - resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + scroll-into-view-if-needed@2.2.31: dependencies: compute-scroll-into-view: 1.0.20 - dev: false - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: false + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: false - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: true - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - requiresBuild: true - dev: false + set-blocking@2.0.0: optional: true - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -4813,90 +6122,53 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: false - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: false - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: false + setimmediate@1.0.5: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true + shell-quote@1.8.1: {} - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: false - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: false + signal-exit@4.1.0: {} - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - requiresBuild: true - dev: false + simple-concat@1.0.1: optional: true - /simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - requiresBuild: true + simple-get@3.1.1: dependencies: decompress-response: 4.2.1 once: 1.4.0 simple-concat: 1.0.1 - dev: false optional: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false + slash@3.0.0: {} - /slate-history@0.93.0(slate@0.94.1): - resolution: {integrity: sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g==} - peerDependencies: - slate: '>=0.65.3' + slate-history@0.93.0(slate@0.94.1): dependencies: is-plain-object: 5.0.0 slate: 0.94.1 - dev: false - /slate-react@0.98.4(react-dom@18.2.0)(react@18.2.0)(slate@0.94.1): - resolution: {integrity: sha512-8Of3v9hFuX8rIRc86LuuBhU9t8ps+9ARKL4yyhCrKQYZ93Ep/LFA3GvPGvtf3zYuVadZ8tkhRH8tbHOGNAndLw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - slate: '>=0.65.3' + slate-react@0.98.4(react-dom@18.2.0)(react@18.2.0)(slate@0.94.1): dependencies: '@juggle/resize-observer': 3.4.0 '@types/is-hotkey': 0.1.10 @@ -4910,101 +6182,62 @@ packages: scroll-into-view-if-needed: 2.2.31 slate: 0.94.1 tiny-invariant: 1.0.6 - dev: false - /slate@0.94.1: - resolution: {integrity: sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA==} + slate@0.94.1: dependencies: immer: 9.0.21 is-plain-object: 5.0.0 tiny-warning: 1.0.3 - dev: false - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: true - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: false + source-map-js@1.2.0: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.6.1: {} - /spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - dev: true + spawn-command@0.0.2: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 - dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 - dev: true - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true + spdx-license-ids@3.0.17: {} - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false + streamsearch@1.1.0: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -5018,116 +6251,65 @@ packages: regexp.prototype.flags: 1.5.2 set-function-name: 2.0.2 side-channel: 1.0.6 - dev: false - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: false - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: false - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: false - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - requiresBuild: true + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: false optional: true - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} + strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 - dev: true - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: false + strip-bom@3.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@1.0.1: - resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} - engines: {node: '>=0.10.0'} - hasBin: true + strip-indent@1.0.1: dependencies: get-stdin: 4.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@3.1.1: {} - /styled-jsx@5.1.1(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + styled-jsx@5.1.1(react@18.2.0): dependencies: client-only: 0.0.1 react: 18.2.0 - dev: false - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: false + stylis@4.2.0: {} - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 @@ -5136,43 +6318,24 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: false - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: true + supports-color@2.0.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: false - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /tailwindcss@3.3.1(postcss@8.4.23): - resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} - engines: {node: '>=12.13.0'} - hasBin: true - peerDependencies: - postcss: ^8.0.9 + tailwindcss@3.3.1(postcss@8.4.23): dependencies: arg: 5.0.2 chokidar: 3.6.0 @@ -5200,16 +6363,10 @@ packages: sucrase: 3.35.0 transitivePeerDependencies: - ts-node - dev: false - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + tapable@2.2.1: {} - /tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - requiresBuild: true + tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -5217,24 +6374,9 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: false optional: true - /terser-webpack-plugin@5.3.10(webpack@5.91.0): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(webpack@5.91.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 @@ -5242,158 +6384,91 @@ packages: serialize-javascript: 6.0.2 terser: 5.30.3 webpack: 5.91.0 - dev: true - /terser@5.30.3: - resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} - engines: {node: '>=10'} - hasBin: true + terser@5.30.3: dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: false - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: false - /tiny-case@1.0.3: - resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - dev: false + tiny-case@1.0.3: {} - /tiny-invariant@1.0.6: - resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} - dev: false + tiny-invariant@1.0.6: {} - /tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - dev: false + tiny-invariant@1.3.3: {} - /tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - dev: false + tiny-warning@1.0.3: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - dev: false + toposort@2.0.2: {} - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - requiresBuild: true - dev: false + tr46@0.0.3: {} - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /trim-newlines@1.0.0: - resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} - engines: {node: '>=0.10.0'} - dev: true + trim-newlines@1.0.0: {} - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false + ts-interface-checker@0.1.13: {} - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: false - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false + tslib@1.14.1: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /tsutils@3.21.0(typescript@5.0.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tsutils@3.21.0(typescript@5.0.4): dependencies: tslib: 1.14.1 typescript: 5.0.4 - dev: false - /tween-functions@1.2.0: - resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} - dev: false + tween-functions@1.2.0: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + type-fest@0.20.2: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + type-fest@1.4.0: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: false + type-fest@2.19.0: {} - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: false - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: false - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -5401,11 +6476,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: false - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -5413,153 +6485,95 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: false - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: false + typescript@5.0.4: {} - /ua-parser-js@1.0.37: - resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} - dev: false + ua-parser-js@1.0.37: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: false - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.0 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /usehooks-ts@3.1.0(react@18.2.0): - resolution: {integrity: sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==} - engines: {node: '>=16.15.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 + usehooks-ts@3.1.0(react@18.2.0): dependencies: lodash.debounce: 4.0.8 react: 18.2.0 - dev: false - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false + util-deprecate@1.0.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /victory-area@36.9.2(react@18.2.0): - resolution: {integrity: sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==} - peerDependencies: - react: '>=16.6.0' + victory-area@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 - dev: false - /victory-axis@36.9.2(react@18.2.0): - resolution: {integrity: sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==} - peerDependencies: - react: '>=16.6.0' + victory-axis@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-bar@36.9.2(react@18.2.0): - resolution: {integrity: sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==} - peerDependencies: - react: '>=16.6.0' + victory-bar@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 - dev: false - /victory-box-plot@36.9.2(react@18.2.0): - resolution: {integrity: sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==} - peerDependencies: - react: '>=16.6.0' + victory-box-plot@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 - dev: false - /victory-brush-container@36.9.2(react@18.2.0): - resolution: {integrity: sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==} - peerDependencies: - react: '>=16.6.0' + victory-brush-container@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-brush-line@36.9.2(react@18.2.0): - resolution: {integrity: sha512-/ncj8HEyl73fh8bhU4Iqe79DL62QP2rWWoogINxsGvndrhpFbL9tj7IPSEawi+riOh/CmohgI/ETu/V7QU9cJw==} - peerDependencies: - react: '>=16.6.0' + victory-brush-line@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-candlestick@36.9.2(react@18.2.0): - resolution: {integrity: sha512-hbStzF61GHkkflJWFgLTZSR8SOm8siJn65rwApLJBIA283yWOlyPjdr/kIQtO/h5QkIiXIuLb7RyiUAJEnH9WA==} - peerDependencies: - react: '>=16.6.0' + victory-candlestick@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-canvas@36.9.2(react@18.2.0): - resolution: {integrity: sha512-ImHJ7JQCpQ9aGCsh37EeVAmqJc7R0gl2CLM99gP9GfuJuZeoZ/GVfX6QFamfr19rYQOD2m9pVbecySBzdYI1zQ==} - peerDependencies: - react: '>=16.6.0' + victory-canvas@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-bar: 36.9.2(react@18.2.0) victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-chart@36.9.2(react@18.2.0): - resolution: {integrity: sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==} - peerDependencies: - react: '>=16.6.0' + victory-chart@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 @@ -5568,23 +6582,15 @@ packages: victory-core: 36.9.2(react@18.2.0) victory-polar-axis: 36.9.2(react@18.2.0) victory-shared-events: 36.9.2(react@18.2.0) - dev: false - /victory-core@36.9.2(react@18.2.0): - resolution: {integrity: sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==} - peerDependencies: - react: '>=16.6.0' + victory-core@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-vendor: 36.9.2 - dev: false - /victory-create-container@36.9.2(react@18.2.0): - resolution: {integrity: sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==} - peerDependencies: - react: '>=16.6.0' + victory-create-container@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 @@ -5594,44 +6600,28 @@ packages: victory-selection-container: 36.9.2(react@18.2.0) victory-voronoi-container: 36.9.2(react@18.2.0) victory-zoom-container: 36.9.2(react@18.2.0) - dev: false - /victory-cursor-container@36.9.2(react@18.2.0): - resolution: {integrity: sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==} - peerDependencies: - react: '>=16.6.0' + victory-cursor-container@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-errorbar@36.9.2(react@18.2.0): - resolution: {integrity: sha512-i/WPMN6/7F55FpEpN9WcwiWwaFJ+2ymfTgfBDLkUD3XJ52HGen4BxUt1ouwDA3FXz9kLa/h6Wbp/fnRhX70row==} - peerDependencies: - react: '>=16.6.0' + victory-errorbar@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-group@36.9.2(react@18.2.0): - resolution: {integrity: sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==} - peerDependencies: - react: '>=16.6.0' + victory-group@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) victory-shared-events: 36.9.2(react@18.2.0) - dev: false - /victory-histogram@36.9.2(react@18.2.0): - resolution: {integrity: sha512-w0ipFwWZ533qyqduRacr5cf+H4PGAUTdWNyGvZbWyu4+GtYYjGdoOolfUcO1ee8VJ1kZodpG8Z7ud6I/GWIzjQ==} - peerDependencies: - react: '>=16.6.0' + victory-histogram@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 @@ -5639,106 +6629,68 @@ packages: victory-bar: 36.9.2(react@18.2.0) victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 - dev: false - /victory-legend@36.9.2(react@18.2.0): - resolution: {integrity: sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==} - peerDependencies: - react: '>=16.6.0' + victory-legend@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-line@36.9.2(react@18.2.0): - resolution: {integrity: sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==} - peerDependencies: - react: '>=16.6.0' + victory-line@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 - dev: false - /victory-pie@36.9.2(react@18.2.0): - resolution: {integrity: sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==} - peerDependencies: - react: '>=16.6.0' + victory-pie@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 - dev: false - /victory-polar-axis@36.9.2(react@18.2.0): - resolution: {integrity: sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==} - peerDependencies: - react: '>=16.6.0' + victory-polar-axis@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-scatter@36.9.2(react@18.2.0): - resolution: {integrity: sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==} - peerDependencies: - react: '>=16.6.0' + victory-scatter@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-selection-container@36.9.2(react@18.2.0): - resolution: {integrity: sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==} - peerDependencies: - react: '>=16.6.0' + victory-selection-container@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-shared-events@36.9.2(react@18.2.0): - resolution: {integrity: sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==} - peerDependencies: - react: '>=16.6.0' + victory-shared-events@36.9.2(react@18.2.0): dependencies: json-stringify-safe: 5.0.1 lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-stack@36.9.2(react@18.2.0): - resolution: {integrity: sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==} - peerDependencies: - react: '>=16.6.0' + victory-stack@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) victory-shared-events: 36.9.2(react@18.2.0) - dev: false - /victory-tooltip@36.9.2(react@18.2.0): - resolution: {integrity: sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==} - peerDependencies: - react: '>=16.6.0' + victory-tooltip@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-vendor@36.9.2: - resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + victory-vendor@36.9.2: dependencies: '@types/d3-array': 3.2.1 '@types/d3-ease': 3.0.2 @@ -5754,12 +6706,8 @@ packages: d3-shape: 3.2.0 d3-time: 3.1.0 d3-timer: 3.0.1 - dev: false - /victory-voronoi-container@36.9.2(react@18.2.0): - resolution: {integrity: sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==} - peerDependencies: - react: '>=16.6.0' + victory-voronoi-container@36.9.2(react@18.2.0): dependencies: delaunay-find: 0.0.6 lodash: 4.17.21 @@ -5767,33 +6715,21 @@ packages: react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) victory-tooltip: 36.9.2(react@18.2.0) - dev: false - /victory-voronoi@36.9.2(react@18.2.0): - resolution: {integrity: sha512-50fq0UBTAFxxU+nabOIPE5P2v/2oAbGAX+Ckz6lu8LFwwig4J1DSz0/vQudqDGjzv3JNEdqTD4FIpyjbxLcxiA==} - peerDependencies: - react: '>=16.6.0' + victory-voronoi@36.9.2(react@18.2.0): dependencies: d3-voronoi: 1.1.4 lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory-zoom-container@36.9.2(react@18.2.0): - resolution: {integrity: sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==} - peerDependencies: - react: '>=16.6.0' + victory-zoom-container@36.9.2(react@18.2.0): dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) - dev: false - /victory@36.9.2(react@18.2.0): - resolution: {integrity: sha512-kgVgiSno4KpD0HxmUo5GzqWI4P/eILLOM6AmJfAlagCnOzrtYGsAw+N1YxOcYvTiKsh/zmWawxHlpw3TMenFDQ==} - peerDependencies: - react: '>=16.6.0' + victory@36.9.2(react@18.2.0): dependencies: react: 18.2.0 victory-area: 36.9.2(react@18.2.0) @@ -5823,49 +6759,26 @@ packages: victory-voronoi: 36.9.2(react@18.2.0) victory-voronoi-container: 36.9.2(react@18.2.0) victory-zoom-container: 36.9.2(react@18.2.0) - dev: false - /warning@4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + warning@4.0.3: dependencies: loose-envify: 1.4.0 - dev: false - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: false - /watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - requiresBuild: true - dev: false + webidl-conversions@3.0.1: {} - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.2.3: {} - /webpack@5.91.0: - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.91.0: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -5895,29 +6808,21 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - requiresBuild: true + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: false - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: false - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -5931,91 +6836,56 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 - dev: false - /which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 - dev: false - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: false - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - requiresBuild: true + wide-align@1.1.5: dependencies: string-width: 4.2.3 - dev: false optional: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true + y18n@5.0.8: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - requiresBuild: true - dev: false + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: false + yaml@1.10.2: {} - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.1: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@21.1.1: {} - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -6024,21 +6894,14 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yup@1.4.0: - resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + yup@1.4.0: dependencies: property-expr: 2.0.6 tiny-case: 1.0.3 toposort: 2.0.2 type-fest: 2.19.0 - dev: false - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - dev: false + zod@3.21.4: {} diff --git a/src/schema.graphql b/src/schema.graphql index a965b7c..f6679d0 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -4,7 +4,6 @@ directive @specifiedBy( url: String! ) on SCALAR -# see also https://github.com/graphql-java/graphql-java-extended-validation/blob/master/README.md directive @DecimalMax(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMax.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION directive @DecimalMin(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMin.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION @@ -45,32 +44,41 @@ directive @oneOf on INPUT_OBJECT directive @resolveTo(requiredSelectionSet: String, sourceName: String!, sourceTypeName: String!, sourceFieldName: String!, sourceSelectionSet: String, sourceArgs: ResolveToSourceArgs, keyField: String, keysArg: String, pubsubTopic: String, filterBy: String, additionalArgs: ResolveToSourceArgs, result: String, resultType: String) on FIELD_DEFINITION interface Assessment { + # # Assessment metadata assessmentMetadata: AssessmentMetadata! + # # ID of the content id: UUID! + # # Metadata of the content metadata: ContentMetadata! + # # Progress data of the content for the current user. userProgressData: UserProgressData! + # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! + # # the items that belong to the Assessment items: [Item!]! } type AssessmentMetadata { + # # Number of skill points a student receives for completing this content skillPoints: Int! + # # Type of the assessment skillTypes: [SkillType!]! + # # The initial learning interval for the assessment in days. # This is the interval that is applied after the assessment is completed the first time. # Following intervals are calculated based on the previous interval and the user's performance. @@ -80,12 +88,15 @@ type AssessmentMetadata { } input AssessmentMetadataInput { + # # Number of skill points a student receives for completing this content skillPoints: Int! + # # Type of the assessment skillTypes: [SkillType!]! + # # The initial learning interval for the assessment in days. # This is the interval that is applied after the assessment is completed the first time. # Following intervals are calculated based on the previous interval and the user's performance. @@ -95,47 +106,61 @@ input AssessmentMetadataInput { } input AssociationInput { + # # id of the corresponding item itemId: UUID + # # Text of the left side of the association, in SlateJS JSON format. left: String! + # # Text of the right side of the association, in SlateJS JSON format. right: String! + # # Feedback for the association when the user selects a wrong answer, in SlateJS JSON format. feedback: JSON } +# # Association question, i.e., a question where the user has to assign the correct right side to each left side. type AssociationQuestion implements Question { + # # Text to display above the association question, in SlateJS JSON format. text: JSON! + # # List of correct associations. correctAssociations: [SingleAssociation!]! + # # Computed list of all the left sides of the associations, shuffled. leftSide: [String!]! + # # Computed list of all the right sides of the associations, shuffled. rightSide: [String!]! + # # Unique identifier of the question and the id of the corresponding item itemId: UUID! + # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! + # # Type of the question. type: QuestionType! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } +# # Level of Blooms Taxonomy enum BloomLevel { REMEMBER @@ -146,34 +171,44 @@ enum BloomLevel { CREATE } +# # A chapter is a part of a course. type Chapter { + # # UUID of the chapter, generated automatically id: UUID! + # # Title of the chapter, maximum length is 255 characters. title: String! + # # Description of the chapter, maximum length is 3000 characters. description: String! + # # Number of the chapter, determines the order of the chapters. number: Int! + # # Start date of the chapter, ISO 8601 format. startDate: DateTime! + # # End date of the chapter, ISO 8601 format. endDate: DateTime! + # # Suggested Start date to start the chapter, ISO 8601 format. # Must be after Start Date and before the End dates. suggestedStartDate: DateTime + # # Suggested End date of the chapter, ISO 8601 format. # Must be after the Start Dates and before the End dates. suggestedEndDate: DateTime + # # The course the chapter belongs to. course: Course! @@ -208,6 +243,7 @@ input ChapterFilter { not: ChapterFilter } +# # Return type of the chapters query, contains a list of chapters and pagination info. type ChapterPayload { elements: [Chapter!]! @@ -215,9 +251,11 @@ type ChapterPayload { } type ClozeBlankElement { + # # The correct answer for the blank. correctAnswer: String! + # # Feedback for the blank when the user selects a wrong answer, in SlateJS JSON format. feedback: JSON } @@ -225,18 +263,23 @@ type ClozeBlankElement { union ClozeElement = ClozeTextElement | ClozeBlankElement input ClozeElementInput { + # # id of the corresponding item itemId: UUID + # # Type of the element. type: ClozeElementType! + # # Text of the element. Only used for TEXT type. text: JSON + # # The correct answer for the blank. Only used for BLANK type. correctAnswer: String + # # Feedback for the blank when the user selects a wrong answer, in SlateJS JSON format. Only used for BLANK type. feedback: JSON } @@ -247,114 +290,151 @@ enum ClozeElementType { } type ClozeQuestion implements Question { + # # The elements of the cloze question. clozeElements: [ClozeElement!]! + # # Addtional wrong answers for the blanks. additionalWrongAnswers: [String!]! + # # All selectable answers for the blanks (computed). This contains the correct answers as well as wrong answers. allBlanks: [String!]! + # # Whether the blanks must be answered in free text or by selecting the correct answer from a list. showBlanksList: Boolean! + # # Unique identifier of the question and the id of the corresponding item itemId: UUID! + # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! + # # Type of the question. type: QuestionType! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } type ClozeTextElement { + # # Text of the element, in SlateJS JSON format. text: JSON! } type CompositeProgressInformation { + # # percentage of completedContents/totalContents progress: Float! + # # absolut number of completed content completedContents: Int! + # # absolut number of total content totalContents: Int! } interface Content { + # # ID of the content id: UUID! + # # Metadata of the content metadata: ContentMetadata! + # # Progress data of the content for the current user. userProgressData: UserProgressData! + # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! } type ContentMetadata { + # # Name of the content name: String! + # # Content type type: ContentType! + # # Suggested date when the content should be done suggestedDate: DateTime! + # # Number of reward points a student receives for completing this content rewardPoints: Int! + # # ID of the chapter this content is associated with chapterId: UUID! + # # ID of the course this content is associated with courseId: UUID! + # # TagNames this content is tagged with tagNames: [String!]! + + # The course this content belongs to. course: Course! + + # The chapter this content belongs to. + chapter: Chapter! } type ContentMutation { + # # Identifier of Content contentId: UUID! + # # Update an existing Content updateMediaContent(input: UpdateMediaContentInput!): MediaContent! + # # Update an existing Assessment updateAssessment(input: UpdateAssessmentInput!): Assessment! + # # Delete an existing Content, throws an error if no Content with the given id exists deleteContent: UUID! + # # Add a tag to an existing content addTagToContent(tagName: String): Content! + # # Remove a tag from an existing content removeTagFromContent(tagName: String): Content! } type ContentPayload { + # # the contents elements: [Content!]! + # # pagination info pageInfo: PaginationInfo! } +# # Type of the content enum ContentType { MEDIA @@ -362,51 +442,64 @@ enum ContentType { QUIZ } +# # Courses are the main entity of the application. They are the top level of the # hierarchy and contain chapters. type Course { + # # UUID of the course. Generated automatically when creating a new course. id: UUID! + # # Title of the course. Maximal length is 255 characters, must not be blank. title: String! + # # Detailed description of the course. Maximal length is 3000 characters. description: String! + # # Start date of the course, ISO 8601 format. # Users can only access the course and work on course content after the start date. # Must be before the end date. startDate: DateTime! + # # End date of the course, ISO 8601 format. # Users can no longer access the course and work on course content after the end date. # Must be after the start date. endDate: DateTime! + # # Published state of the course. If the course is published, it is visible to users. published: Boolean! + # # The year in which the term starts. startYear: Int + # # The division of the academic calendar in which the term takes place. yearDivision: YearDivision + # # Chapters of the course. Can be filtered and sorted. # 🔒 User needs to be enrolled in the course to access this field. chapters( filter: ChapterFilter + # # The fields to sort by. The default sort order is by chapter number. # Throws an error if no field with the given name exists. sortBy: [String!]! = [] + # # The sort direction for each field. If not specified, defaults to ASC. sortDirection: [SortDirection!]! = [ASC] pagination: Pagination ): ChapterPayload! + # # Course Memberships of this course. Contains information about which users are members of the course and what # role they have in it. # 🔒 User needs to be at least an admin of the course to access this field. @@ -438,6 +531,7 @@ type Course { skills: [Skill!]! } +# # Input type for filtering courses. All fields are optional. # If multiple filters are specified, they are combined with AND (except for the or field). input CourseFilter { @@ -451,18 +545,23 @@ input CourseFilter { not: CourseFilter } +# # Represents a course membership object of a user. Each user can be a member of # set of courses and some users can also own courses type CourseMembership { + # # Id of the user. userId: UUID! + # # Id of the course the user is a member of. courseId: UUID! + # # The role of the user in the course. role: UserRoleInCourse! + # # Course of the Course Membership course: Course! @@ -470,18 +569,23 @@ type CourseMembership { user: PublicUserInfo } +# # Represents a course membership input object of a user. input CourseMembershipInput { + # # Id of the user. userId: UUID! + # # Id of the course the user is a member of. courseId: UUID! + # # The role of the user in the course. role: UserRoleInCourse! } +# # Return type for the course query. Contains the course and the pagination info. type CoursePayload { elements: [Course!]! @@ -489,287 +593,361 @@ type CoursePayload { } input CreateAssessmentInput { + # # Metadata for the new Content metadata: CreateContentMetadataInput! + # # Assessment metadata assessmentMetadata: AssessmentMetadataInput! + # # items of the new assessments items: [ItemInput!] } input CreateAssociationQuestionInput { + # # id of the corresponding item itemId: UUID + # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int + # # Text of the question, in SlateJS JSON format. text: JSON! + # # List of associations. correctAssociations: [AssociationInput!]! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } +# # Input type for creating chapters. input CreateChapterInput { + # # Title of the chapter, maximum length is 255 characters, must not be blank. title: String! + # # Description of the chapter, maximum length is 3000 characters. description: String! + # # Number of the chapter, determines the order of the chapters, must be positive. number: Int! + # # Start date of the chapter, ISO 8601 format. # Must be before the end date. startDate: DateTime! + # # End date of the chapter, ISO 8601 format. # Must be after the start date. endDate: DateTime! + # # Suggested Start date to start the chapter, ISO 8601 format. # Must be after Start Date and before the End dates. suggestedStartDate: DateTime + # # Suggested End date of the chapter, ISO 8601 format. # Must be after the Start Dates and before the End dates. suggestedEndDate: DateTime + # # ID of the course the chapter belongs to. # Must be a UUID of an existing course. courseId: UUID! } input CreateClozeQuestionInput { + # # id of the corresponding item itemId: UUID + # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int + # # List of cloze elements. clozeElements: [ClozeElementInput!]! + # # List of additional wrong answers. additionalWrongAnswers: [String!]! = [] + # # If true, the list of possible answers will be shown to the user. showBlanksList: Boolean! = true + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateContentMetadataInput { + # # Name of the content name: String! + # # Type of the content type: ContentType! + # # Suggested date when the content should be done suggestedDate: DateTime! + # # Number of reward points a student receives for completing this content rewardPoints: Int! + # # ID of the chapter this content is associated with chapterId: UUID! + # # TagNames this content is tagged with tagNames: [String!]! = [] } +# # Input type for creating a new course. See also on the course type for detailed field descriptions. input CreateCourseInput { + # # Title of the course, max 255 characters, must not be blank. title: String! + # # Description of the course, max 3000 characters. description: String! + # # Start date of the course, ISO 8601 format. # Must be before the end date. startDate: DateTime! + # # End date of the course, ISO 8601 format. # Must be after the start date. endDate: DateTime! + # # Published status of the course. published: Boolean! + # # The year in which the term starts. startYear: Int + # # The division of the academic calendar in which the term takes place. yearDivision: YearDivision } input CreateExactAnswerQuestionInput { + # # id of the corresponding item itemId: UUID + # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int + # # Text of the question, in SlateJS JSON format. text: JSON! + # # If the answer is case sensitive. If true, the answer is checked case sensitive. caseSensitive: Boolean! = false + # # A list of possible correct answers. correctAnswers: [String!]! + # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateFlashcardInput { + # # id of the item the flashcard belongs to itemId: UUID + # # List of sides of this flashcard. Must be at least two sides. sides: [FlashcardSideInput!]! } input CreateFlashcardSetInput { + # # List of flashcards in this set. flashcards: [CreateFlashcardInput!]! } +# # Input for creating new media content. Media specific fields are stored in the Media Service. input CreateMediaContentInput { + # # Metadata for the new Content metadata: CreateContentMetadataInput! } input CreateMediaRecordInput { + # # Name of the media record. Cannot be blank, maximum length 255 characters. name: String! + # # Type of the media record. type: MediaType! + # # IDs of the MediaContents this media record is associated with contentIds: [UUID!]! } input CreateMultipleChoiceQuestionInput { + # # UUID of the question to update and the id of the corresponding item. itemId: UUID + # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int + # # Text of the question, in SlateJS JSON format. text: JSON! + # # List of answers. answers: [MultipleChoiceAnswerInput!]! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateNumericQuestionInput { + # # id of the corresponding item itemId: UUID + # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int + # # Text of the question, in SlateJS JSON format. text: JSON! + # # The correct answer for the question. correctAnswer: Float! + # # The allowed deviation from the correct answer. tolerance: Float! + # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateQuizInput { - # Threshold of the quiz, i.e., how many questions the user has to answer correctly to pass the quiz. - # - # If this is greater than the number of questions, the behavior is the same - # as if it was equal to the number of questions. + # + # Threshold of the quiz, i.e., how many questions the user has to answer correctly to pass the quiz. + # + # If this is greater than the number of questions, the behavior is the same + # as if it was equal to the number of questions. requiredCorrectAnswers: Int! + # # Question pooling mode of the quiz. questionPoolingMode: QuestionPoolingMode! - # Number of questions that are randomly selected from the list of questions. - # Should only be set if questionPoolingMode is RANDOM. - # - # If this is greater than the number of questions, the behavior is the same - # as if it was equal to the number of questions. - # - # If this is null or not set, the behavior is the same as if it was equal to the number of questions. + # + # Number of questions that are randomly selected from the list of questions. + # Should only be set if questionPoolingMode is RANDOM. + # + # If this is greater than the number of questions, the behavior is the same + # as if it was equal to the number of questions. + # + # If this is null or not set, the behavior is the same as if it was equal to the number of questions. numberOfRandomlySelectedQuestions: Int } input CreateSectionInput { + # # Chapter Section will belong to chapterId: UUID! + # # name given to Section name: String! } input CreateSelfAssessmentQuestionInput { + # # id of the corresponding item itemId: UUID + # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int + # # Text of the question, in SlateJS JSON format. text: JSON! + # # A possible correct answer to the question. solutionSuggestion: JSON! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateStageInput { + # # updated List of UUIDs for content labeled as required in this Stage requiredContents: [UUID!]! + # # updated List of UUIDs for content labeled as optional in this Stage optionalContents: [UUID!]! } -# An RFC-3339 compliant Full Date Scalar scalar Date -# A slightly refined version of RFC-3339 compliant DateTime Scalar scalar DateTime # Filter for date values. @@ -803,59 +981,76 @@ type DocumentRecordSegment implements MediaRecordSegment { mediaRecord: MediaRecord! } +# # A question with a clear, correct answer that can be automatically checked. # Differs from self-assessment questions in that the user has to enter one of the correct answers and # the answer is checked automatically. type ExactAnswerQuestion implements Question { + # # Text of the question, in SlateJS JSON format. text: JSON! + # # A list of possible correct answers. The user has to enter one of these answers. correctAnswers: [String!]! + # # If the answer is case sensitive. If true, the answer is checked case sensitive. caseSensitive: Boolean! + # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON + # # Unique identifier of the question and the id of the corresponding item itemId: UUID! + # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! + # # Type of the question. type: QuestionType! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } +# # A flashcard is a set of two or more sides. Each side has a label and a text. # The label is used to specify which side of the flashcard is being shown to the user first for learning # and which sides he has to guess. type Flashcard { + # # Unique identifier of this flashcard, which is the id of the corresponding item itemId: UUID! + # # List of sides of this flashcard. sides: [FlashcardSide!]! + # # Progress data of the flashcard, specific to given users. # If userId is not provided, the progress data of the current user is returned. userProgressData: FlashcardProgressData! } +# # Feedback for the logFlashcardLearned mutation. type FlashcardLearnedFeedback { + # # Whether the flashcard was learned correctly. success: Boolean! + # # Next date when the flashcard should be learned again. nextLearnDate: DateTime! + # # Progress of the whole flashcard set. flashcardSetProgress: FlashcardSetProgress! } @@ -868,13 +1063,16 @@ type FlashcardOutput { } type FlashcardProgressData { + # # The date the user learned the flashcard. # This is null it the user has not learned the content item once. lastLearned: DateTime + # # The learning interval in days for the content item. learningInterval: Int + # # The next time the content should be learned. # Calculated using the date the user completed the content item and the learning interval. # This is null if the user has not completed the content item once. @@ -882,26 +1080,33 @@ type FlashcardProgressData { } type FlashcardProgressDataLog { + # # The id of the Log id: UUID + # # The date the user learned the flashcard. learnedAt: DateTime! + # # Whether the user knew the flashcard or not. success: Boolean! } +# # A set of flashcards. A flashcard set belongs to exactly one assessment. Therefore, the uuid of the assessment # also serves as the identifier of a flashcard set. type FlashcardSet { + # # The uuid of the assessment this flashcard set belongs to. # This also serves as the identifier of this flashcard set. assessmentId: UUID! + # # Id of the course this flashcard set belongs to. courseId: UUID! + # # List of flashcards in this set. flashcards: [Flashcard!]! @@ -909,23 +1114,30 @@ type FlashcardSet { content: Content } +# # A set of flashcards, flashcard related fields are stored in the flashcard service. type FlashcardSetAssessment implements Assessment & Content { + # # Assessment metadata assessmentMetadata: AssessmentMetadata! + # # ID of the content id: UUID! + # # Metadata of the content metadata: ContentMetadata! + # # Progress data of the content for the current user. userProgressData: UserProgressData! + # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! + # # the items that belong to the Flashcard items: [Item!]! @@ -934,19 +1146,23 @@ type FlashcardSetAssessment implements Assessment & Content { } type FlashcardSetMutation { + # # ID of the flashcard set that is being modified. assessmentId: UUID! + # # Creates a new flashcard. Throws an error if the flashcard set does not exist. # ⚠️ This mutation is only accessible internally in the system and allows the caller to create Flashcards without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_createFlashcard(input: CreateFlashcardInput!): Flashcard! + # # Updates a flashcard. Throws an error if the flashcard does not exist. # ⚠️ This mutation is only accessible internally in the system and allows the caller to update Flashcards without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateFlashcard(input: UpdateFlashcardInput!): Flashcard! + # # Deletes the flashcard with the specified ID. Throws an error if the flashcard does not exist. deleteFlashcard(id: UUID!): UUID! @@ -958,38 +1174,48 @@ type FlashcardSetMutation { } type FlashcardSetProgress { + # # Percentage of how many flashcards in the set have been learned. percentageLearned: Float! + # # Percentage of how many flashcards have been learned correctly of the ones that have been learned. correctness: Float! } type FlashcardSide { + # # Text of this flashcard side as rich text in SlateJS json. text: JSON! + # # Label of this flashcard side. E.g. "Front" or "Back", or "Question" or "Answer". label: String! + # # Whether this side is a question, i.e. should be shown to the user to guess the other sides or not. isQuestion: Boolean! + # # Whether this side is also an answer. Some Flashcards can have their sides be # used as both questions or answers for the other sides isAnswer: Boolean! } input FlashcardSideInput { + # # Text of this flashcard side. text: JSON! + # # Label of this flashcard side. E.g. "Front" or "Back", or "Question" or "Answer". label: String! + # # Whether this side is a question, i.e. should be shown to the user to guess the other sides or not. isQuestion: Boolean! + # # Whether this side is also an answer. Some Flashcards can have their sides be # used as both questions or answers for the other sides isAnswer: Boolean! @@ -1023,35 +1249,44 @@ input IntFilter { lessThan: Int } +# # An item is a part of an assessment. Based on students' performances on items the # SkillLevel Service estimates a students knowledge. # An item is something like a question in a quiz, a flashcard of a flashcard set. type Item { + # # the id of the item id: UUID! + # # The skills or the competencies the item belongs to. associatedSkills: [Skill!]! + # # The Level of Blooms Taxonomy the item belongs to associatedBloomLevels: [BloomLevel!]! } input ItemInput { + # # the id of the item id: UUID + # # The skills or the competencies the item belongs to. associatedSkills: [SkillInput!]! + # # The Level of Blooms Taxonomy the item belongs to associatedBloomLevels: [BloomLevel!]! } type ItemProgress { + # # the id of the corresponding item itemId: UUID! + # # the correctness of the users response. # Value between 0 and 1 representing the user's correctness on the content item. responseCorrectness: Float! @@ -1060,38 +1295,46 @@ type ItemProgress { # A JSON scalar scalar JSON -# 24-hour clock time value string in the format `hh:mm:ss` or `hh:mm:ss.sss`. scalar LocalTime input LogFlashcardLearnedInput { + # # The id of the flashcard that was learned. flashcardId: UUID! + # # If the user knew the flashcard or not. successful: Boolean! } input LogFlashcardSetLearnedInput { + # # The id of the flashcard that was learned. flashcardSetId: UUID! + # # The id of the user that learned the flashcard. userId: UUID! + # # The percentage of flashcards in the set that the user knew. percentageSuccess: Float! } type MediaContent implements Content { + # # ID of the content id: UUID! + # # Metadata of the content metadata: ContentMetadata! + # # Progress data of the content for the current user. userProgressData: UserProgressData! + # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! @@ -1105,40 +1348,51 @@ type MediaContent implements Content { # this can be done in a separate files as long as they are in this folder and # end with .graphqls type MediaRecord { + # # ID of the media record id: UUID! + # # Ids of the courses this MediaRecord is associated with courseIds: [UUID!]! + # # Name of the media record name: String! + # # User ID of the creator of the media record. creatorId: UUID! + # # Type of the media record type: MediaType! + # # IDs of the MediaContents this media record is associated with contentIds: [UUID!]! + # # Temporary upload url for the media record uploadUrl: String! + # # Temporary download url for the media record downloadUrl: String! + # # Temporary upload url for the media record which can only be used from within the system. # (This is necessary because the MinIO pre-signed URLs cannot be changed, meaning we cannot use the same URL for both # internal and external access because the hostname changes.) internalUploadUrl: String! + # # Temporary download url for the media record which can only be used from within the system. # (This is necessary because the MinIO pre-signed URLs cannot be changed, meaning we cannot use the same URL for both # internal and external access because the hostname changes.) internalDownloadUrl: String! + # # The progress data of the given user for this medium. userProgressData: MediaRecordProgressData! @@ -1155,9 +1409,11 @@ type MediaRecord { } type MediaRecordProgressData { + # # Whether the medium has been worked on by the user. workedOn: Boolean! + # # Date on which the medium was worked on by the user. # This is null if the medium has not been worked on by the user. dateWorkedOn: DateTime @@ -1182,6 +1438,7 @@ type MediaRecordSegmentLink { segment2: MediaRecordSegment! } +# # The type of the media record enum MediaType { VIDEO @@ -1193,179 +1450,218 @@ enum MediaType { } type MultipleChoiceAnswer { + # # Text of the answer, in SlateJS JSON format. answerText: JSON! + # # Whether the answer is correct or not. correct: Boolean! + # # Feedback for when the user selects this answer, in SlateJS JSON format. feedback: JSON } input MultipleChoiceAnswerInput { + # # Text of the answer, in SlateJS JSON format. answerText: JSON! + # # Whether the answer is correct or not. correct: Boolean! + # # Feedback for when the user selects this answer, in SlateJS JSON format. feedback: JSON } +# # Multiple choice question, i.e., a question with multiple answers of which the user has to select the correct ones. type MultipleChoiceQuestion implements Question { + # # Text of the question, in SlateJS JSON format. text: JSON! + # # List of answers. answers: [MultipleChoiceAnswer!]! + # # How many answers the user has to select. This is computed from the list of answers. numberOfCorrectAnswers: Int! + # # Unique identifier of the question and the id of the corresponding item itemId: UUID! + # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! + # # Type of the question. type: QuestionType! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } -# Mutations for the flashcard service. Provides mutations for creating, updating, and deleting flashcard as well as -# creating and deleting flashcard sets. To update a flashcard set, update, delete, and create flashcards individually. type Mutation { - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the reward score of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") - + # # Creates a new media record # 🔒 The user must have the "course-creator" role to perform this action. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. createMediaRecord(input: CreateMediaRecordInput!): MediaRecord! + # # Updates an existing media record with the given UUID # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. updateMediaRecord(input: UpdateMediaRecordInput!): MediaRecord! + # # Deletes the media record with the given UUID # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. deleteMediaRecord(id: UUID!): UUID! + # # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. # This means that for the content, all already linked media records are removed and replaced by the given ones. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. setLinkedMediaRecordsForContent(contentId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! - # Logs that a media has been worked on by the current user. - # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html - # - # Possible side effects: - # When all media records of a content have been worked on by a user, - # a user-progress event is emitted for the content. - # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. + # + # Logs that a media has been worked on by the current user. + # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html + # + # Possible side effects: + # When all media records of a content have been worked on by a user, + # a user-progress event is emitted for the content. + # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. logMediaRecordWorkedOn(mediaRecordId: UUID!): MediaRecord! + # # Add the MediaRecords with the given UUIDS to the Course with the given UUID. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. setMediaRecordsForCourse(courseId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! + # + # Deletes a flashcard set. Throws an error if the flashcard set does not exist. + # The contained flashcards are deleted as well. + deleteFlashcardSet(input: UUID!): UUID! @deprecated(reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead.") + + # + # Modify a flashcard set. + # 🔒 The user must be an admin the course the flashcard set is in to perform this action. + mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! + + # + # Logs that a user has learned a flashcard. + # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. + logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! + + # # Modify Content # 🔒 The user must have admin access to the course containing the section to perform this action. mutateContent(contentId: UUID!): ContentMutation! + # # Modify the section with the given id. # 🔒 The user must have admin access to the course containing the section to perform this action. mutateSection(sectionId: UUID!): SectionMutation! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the skill level of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. - # 🔒 The user must be a super-user, otherwise an exception is thrown. + # + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the reward score of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") + + # + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the skill level of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. + # 🔒 The user must be a super-user, otherwise an exception is thrown. recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") + # # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! + # # Creates a new chapter with the given input and returns the created chapter. # The course id must be a course id of an existing course. # 🔒 The user must be an admin in this course to perform this action. createChapter(input: CreateChapterInput!): Chapter! + # # Updates an existing course with the given input and returns the updated course. # The course id must be a course id of an existing course. # 🔒 The user must be an admin in this course to perform this action. updateCourse(input: UpdateCourseInput!): Course! + # # Updates an existing chapter with the given input and returns the updated chapter. # The chapter id must be a chapter id of an existing chapter. # 🔒 The user must be an admin in this course to perform this action. updateChapter(input: UpdateChapterInput!): Chapter! + # # Deletes an existing course, throws an error if no course with the given id exists. # 🔒 The user must be an admin in this course to perform this action. deleteCourse(id: UUID!): UUID! + # # Deletes an existing chapter, throws an error if no chapter with the given id exists. # 🔒 The user must be an admin in this course to perform this action. deleteChapter(id: UUID!): UUID! + # # Lets the current user join a course as a student. joinCourse(courseId: UUID!): CourseMembership! + # # Lets the current user leave a course. Returns the membership that was deleted. leaveCourse(courseId: UUID!): CourseMembership! + # # Adds the specified user to the specified course with the specified role. # 🔒 The calling user must be an admin in this course to perform this action. createMembership(input: CourseMembershipInput!): CourseMembership! + # # Updates a user's membership in a course with the given input. # 🔒 The calling user must be an admin in this course to perform this action. updateMembership(input: CourseMembershipInput!): CourseMembership! + # # Removes the specified user's access to the specified course. # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! + # # Modify a quiz. # 🔒 The user must be an admin the course the quiz is in to perform this action. mutateQuiz(assessmentId: UUID!): QuizMutation! + # # Delete a quiz. deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") + # # Log that a multiple choice quiz is completed. # 🔒 The user must be enrolled in the course the quiz is in to perform this action. logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! - # Deletes a flashcard set. Throws an error if the flashcard set does not exist. - # The contained flashcards are deleted as well. - deleteFlashcardSet(input: UUID!): UUID! @deprecated(reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead.") - - # Modify a flashcard set. - # 🔒 The user must be an admin the course the flashcard set is in to perform this action. - mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! - - # Logs that a user has learned a flashcard. - # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! - # Creates a new media content and links the given media records to it. createMediaContentAndLinkRecords(contentInput: CreateMediaContentInput!, mediaRecordIds: [UUID!]!): MediaContent! @@ -1380,28 +1676,36 @@ type Mutation { } type NumericQuestion implements Question { + # # Text of the question, in SlateJS JSON format. text: JSON! + # # The correct answer to the question. correctAnswer: Float! + # # The tolerance for the correct answer. The user's answer is correct if it is within the tolerance of the correct answer. tolerance: Float! + # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON + # # Unique identifier of the question and the id of the corresponding item itemId: UUID! + # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! + # # Type of the question. type: QuestionType! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } @@ -1437,23 +1741,29 @@ type PaginationInfo { } type ProgressLogItem { + # # The date the user completed the content item. timestamp: DateTime! + # # Whether the user completed the content item successfully. success: Boolean! + # # Value between 0 and 1 representing the user's correctness on the content item. # Can be null as some contents cannot provide a meaningful correctness value. correctness: Float! + # # How many hints the user used to complete the content item. hintsUsed: Int! + # # Time in milliseconds it took the user to complete the content item. # Can be null for contents that do not measure completion time. timeToComplete: Int + # # !OPTIONAL # the items the user has completed and the students' performance on these items # Can be null as some contents don't contains items for assessments @@ -1466,179 +1776,219 @@ type PublicUserInfo { } type Query { - # Get the reward score of the current user for the specified course. - # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. - userCourseRewardScores(courseId: UUID!): RewardScores! - - # Get the reward score of the specified user for the specified course. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! - - # Gets the power scores for each user in the course, ordered by power score descending. - # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. - scoreboard(courseId: UUID!): [ScoreboardItem!]! - - # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID - # cannot be found. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + # + # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID + # cannot be found. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. mediaRecordsByIds(ids: [UUID!]!): [MediaRecord!]! - # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID - # cannot be found, it instead returns NULL for that media record. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + # + # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID + # cannot be found, it instead returns NULL for that media record. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. findMediaRecordsByIds(ids: [UUID!]!): [MediaRecord]! - # Returns all media records of the system. - # - # 🔒 The user must be a super-user, otherwise an exception is thrown. + # + # Returns all media records of the system. + # + # 🔒 The user must be a super-user, otherwise an exception is thrown. mediaRecords: [MediaRecord!]! @deprecated(reason: "In production there should probably be no way to get all media records of the system.") - # Returns all media records which the current user created. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + # + # Returns all media records which the current user created. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. userMediaRecords: [MediaRecord!]! - # Returns the media records associated the given content IDs as a list of lists where each sublist contains - # the media records associated with the content ID at the same index in the input list - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + # + # Returns the media records associated the given content IDs as a list of lists where each sublist contains + # the media records associated with the content ID at the same index in the input list + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! - # Returns all media records for the given CourseIds - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + # + # Returns all media records for the given CourseIds + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. mediaRecordsForCourses(courseIds: [UUID!]!): [[MediaRecord!]!]! + # # Returns all media records which were created by the users. mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! + # # Gets the publicly available information for a list of users with the specified IDs. # If a user does not exist, null is returned for that user. findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! + # # Gets the user information of the currently authorized user. currentUserInfo: UserInfo! + # # Gets all of the users' information for a list of users with the specified IDs. # Only available to privileged users. # If a user does not exist, null is returned for that user. findUserInfos(ids: [UUID!]!): [UserInfo]! + # + # Get flashcards by their ids. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! + + # + # Get flashcard sets by their assessment ids. + # Returns a list of flashcard sets in the same order as the provided ids. + # Each element is null if the corresponding id is not found. + # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. + findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! + + # + # Get flashcards of a course that are due to be reviewed. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! + + # # Retrieves all existing contents for a given course. # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] + # # Get contents by ids. Throws an error if any of the ids are not found. # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, # otherwise an error is thrown. contentsByIds(ids: [UUID!]!): [Content!]! + # # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned # for the respective contents. findContentsByIds(ids: [UUID!]!): [Content]! + # # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents # associated with that chapter # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! - # Generates user specific suggestions for multiple chapters. - # - # Only content that the user can access will be considered. - # The contents will be ranked by suggested date, with the most overdue or most urgent content first. - # - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + # + # Generates user specific suggestions for multiple chapters. + # + # Only content that the user can access will be considered. + # The contents will be ranked by suggested date, with the most overdue or most urgent content first. + # + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. suggestionsByChapterIds( + # # The ids of the chapters for which suggestions should be generated. chapterIds: [UUID!]! + # # The amount of suggestions to generate in total. amount: Int! + # # Only suggestions for these skill types will be generated. # If no skill types are given, suggestions for all skill types will be generated, # also containing suggestions for media content (which do not have a skill type). skillTypes: [SkillType!]! = [] ): [Suggestion!]! + # + # Get the reward score of the current user for the specified course. + # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. + userCourseRewardScores(courseId: UUID!): RewardScores! + + # + # Get the reward score of the specified user for the specified course. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! + + # + # Gets the power scores for each user in the course, ordered by power score descending. + # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. + scoreboard(courseId: UUID!): [ScoreboardItem!]! + + # # Get a list of courses. Can be filtered, sorted and paginated. # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. courses( filter: CourseFilter + # # The fields to sort by. # Throws an error if no field with the given name exists. sortBy: [String!] + # # The sort direction for each field. If not specified, defaults to ASC. sortDirection: [SortDirection!]! = [ASC] pagination: Pagination ): CoursePayload! + # # Returns the courses with the given ids. # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. coursesByIds(ids: [UUID!]!): [Course!]! + # # Get quiz by assessment ID. # If any of the assessment IDs are not found, the corresponding quiz will be null. # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for # an quiz if the user has no access to it. findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! - - # Get flashcards by their ids. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! - - # Get flashcard sets by their assessment ids. - # Returns a list of flashcard sets in the same order as the provided ids. - # Each element is null if the corresponding id is not found. - # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. - findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! - - # Get flashcards of a course that are due to be reviewed. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! semanticSearch(queryText: String!, count: Int! = 10): [SemanticSearchResult!]! } +# # Generic question interface. interface Question { + # # Unique identifier of the question and the id of the corresponding item itemId: UUID! + # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! + # # Type of the question. type: QuestionType! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input QuestionCompletedInput { + # # ID of the question. questionId: UUID! + # # true when question was answered correctly correct: Boolean! + # # true when a hint was used for the question usedHint: Boolean! } enum QuestionPoolingMode { + # # Questions are randomly selected from the list of questions. RANDOM + # # Questions are selected in order from the list of questions. ORDERED } +# # The type of a question. enum QuestionType { MULTIPLE_CHOICE @@ -1649,37 +1999,45 @@ enum QuestionType { SELF_ASSESSMENT } +# # A quiz is a set of questions that the user has to answer correctly to pass the quiz. # Questions can be of different types, e.g., multiple choice, clozes, or open questions. type Quiz { + # # Identifier of the quiz, same as the identifier of the assessment. assessmentId: UUID! + # # List of questions. questionPool: [Question!]! + # # Threshold of the quiz, i.e., how many questions the user has to answer correctly to pass the quiz. # If this number is greater than the number of questions, the behavior is the same # as if it was equal to the number of questions. requiredCorrectAnswers: Int! + # # Question pooling mode of the quiz. questionPoolingMode: QuestionPoolingMode! - # Number of questions that are randomly selected from the list of questions. - # Will only be considered if questionPoolingMode is RANDOM. - # - # If this is greater than the number of questions, the behavior is the same - # as if it was equal to the number of questions. - # - # If this is null or not set, the behavior is the same as if it was equal to the number of questions. + # + # Number of questions that are randomly selected from the list of questions. + # Will only be considered if questionPoolingMode is RANDOM. + # + # If this is greater than the number of questions, the behavior is the same + # as if it was equal to the number of questions. + # + # If this is null or not set, the behavior is the same as if it was equal to the number of questions. numberOfRandomlySelectedQuestions: Int + # # The selected questions of the question pool. # This is identical to the list of questions if questionPoolingMode is ORDERED. # This will be different each time it is queried if questionPoolingMode is RANDOM. selectedQuestions: [Question!]! + # # Id of the course this quiz belongs to. courseId: UUID! @@ -1687,23 +2045,30 @@ type Quiz { content: Content } +# # A quiz, quiz related fields are stored in the quiz service. type QuizAssessment implements Assessment & Content { + # # Assessment metadata assessmentMetadata: AssessmentMetadata! + # # ID of the content id: UUID! + # # Metadata of the content metadata: ContentMetadata! + # # Progress data of the content for the current user. userProgressData: UserProgressData! + # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! + # # the items that belong to the Quiz items: [Item!]! @@ -1713,102 +2078,126 @@ type QuizAssessment implements Assessment & Content { } input QuizCompletedInput { + # # ID of the quiz. quizId: UUID! + # # List of questions that were answered in the quiz. completedQuestions: [QuestionCompletedInput!]! } +# # Feedback data when `logQuizCompletion` is called. type QuizCompletionFeedback { + # # Whether the quiz was passed or not. success: Boolean! + # # The number of questions that were answered correctly. correctness: Float! + # # The number of hints that were used. hintsUsed: Int! } type QuizMutation { + # # Id of the quiz to modify. assessmentId: UUID! + # # Add a multiple choice question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_addMultipleChoiceQuestion(input: CreateMultipleChoiceQuestionInput!): Quiz! + # # Update a multiple choice question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateMultipleChoiceQuestion(input: UpdateMultipleChoiceQuestionInput!): Quiz! + # # Add a cloze question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_addClozeQuestion(input: CreateClozeQuestionInput!): Quiz! + # # Update a cloze question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateClozeQuestion(input: UpdateClozeQuestionInput!): Quiz! + # # Add an association question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_addAssociationQuestion(input: CreateAssociationQuestionInput!): Quiz! + # # Update an association question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateAssociationQuestion(input: UpdateAssociationQuestionInput!): Quiz! + # # Add an free text question with exact answer to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_addExactAnswerQuestion(input: CreateExactAnswerQuestionInput!): Quiz! + # # Update an free text question with exact answer in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateExactAnswerQuestion(input: UpdateExactAnswerQuestionInput!): Quiz! + # # Add a numeric question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_addNumericQuestion(input: CreateNumericQuestionInput!): Quiz! + # # Update a numeric question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateNumericQuestion(input: UpdateNumericQuestionInput!): Quiz! + # # Add a self assessment question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_addSelfAssessmentQuestion(input: CreateSelfAssessmentQuestionInput!): Quiz! + # # Update a self assessment question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateSelfAssessmentQuestion(input: UpdateSelfAssessmentQuestionInput!): Quiz! + # # Removes the question with the given number from the quiz. # This will also update the numbers of the following questions. removeQuestion(number: Int!): Quiz! + # # Switch the position of two questions with the given numbers. switchQuestions(firstNumber: Int!, secondNumber: Int!): Quiz! + # # Set the threshold of the quiz, i.e., how many questions the user has to answer correctly to pass the quiz. setRequiredCorrectAnswers(requiredCorrectAnswers: Int!): Quiz! + # # Set the question pooling mode of the quiz. setQuestionPoolingMode(questionPoolingMode: QuestionPoolingMode!): Quiz! + # # Set the number of questions that are randomly selected from the list of questions. # Will only be considered if questionPoolingMode is RANDOM. setNumberOfRandomlySelectedQuestions(numberOfRandomlySelectedQuestions: Int!): Quiz! @@ -1858,157 +2247,203 @@ type QuizOutput { scalar ResolveToSourceArgs +# # The reason why the reward score has changed. enum RewardChangeReason { + # # The user has completed a content for the first time. # The associated contents are the content that were completed. CONTENT_DONE + # # The user has reviewed a content. # The associated contents are the content that were reviewed. CONTENT_REVIEWED + # # There exists a content that is due for learning. # The associated contents are the content that are due for learning. CONTENT_DUE_FOR_LEARNING + # # There exists a content that is due for repetition. # The associated contents are the content that are due for repetition. CONTENT_DUE_FOR_REPETITION + # # The score changed because the underlying scores changed. # Relevant for the power score. COMPOSITE_VALUE } +# # An item in the reward score log. type RewardLogItem { + # # The date when the reward score changed. date: DateTime! + # # The difference between the previous and the new reward score. difference: Int! + # # The old reward score. oldValue: Int! + # # The new reward score. newValue: Int! + # # The reason why the reward score has changed. reason: RewardChangeReason! + # # The ids of the contents that are associated with the change. associatedContentIds: [UUID!]! associatedContents: [Content]! } +# # The reward score of a user. type RewardScore { + # # The absolute value of the reward score. # Health and fitness are between 0 and 100. # Growth, strength and power can be any non-negative integer. value: Int! + # # The relative value of the reward score. # Shows how many points relative to the total points have been achieved. # Only used for growth currently. percentage: Float! + # # A log of the changes to the reward score, ordered by date descending. log: [RewardLogItem!]! } +# # The five reward scores of a user. type RewardScores { + # # Health represents how up-to-date the user is with the course. health: RewardScore! + # # Fitness represents how well the user repeats previously learned content. fitness: RewardScore! + # # Growth represents the overall progress of the user. growth: RewardScore! + # # Strength is earned by competing with other users. strength: RewardScore! + # # A composite score of all the other scores. power: RewardScore! } +# # An item in the scoreboard. type ScoreboardItem { + # # The user id of the user. userId: UUID! + # # The power score of the user. powerScore: Int! user: PublicUserInfo } +# # Representation of a Section type Section { + # # Unique identifier of the Section Object id: UUID! + # # Id of the Course the Section is located in. courseId: UUID! + # # Name of the Section name: String! + # # Chapter the Section is located in chapterId: UUID! + # # List of Stages contained in a Section stages: [Stage!]! chapter: Chapter! } type SectionMutation { + # # Identifier of the section sectionId: UUID! + # # update the name of a Section updateSectionName(name: String!): Section! + # # delete a Section by ID deleteSection: UUID! + # # create new Stage in Section createStage(input: CreateStageInput): Stage! + # # Update Content of Stage updateStage(input: UpdateStageInput): Stage! + # # delete Stage by ID deleteStage(id: UUID!): UUID! + # # update Order of Stages within a Section updateStageOrder(stages: [UUID!]!): Section! } +# # A single question with a free text answer field, where the answer is not automatically checked. # The user has to enter a solution and self-assess whether it is correct or not. # This is useful for questions where the answer is not clear-cut, e.g. when the user should explain a concept. type SelfAssessmentQuestion implements Question { + # # Text of the question, in SlateJS JSON format. text: JSON! + # # A possible correct answer to the question. solutionSuggestion: JSON! + # # Unique identifier of the question and the id of the corresponding item itemId: UUID! + # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! + # # Type of the question. type: QuestionType! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } @@ -2020,22 +2455,28 @@ type SemanticSearchResult { } type SingleAssociation { + # # The left side of the association, in SlateJS JSON format. left: JSON! + # # The right side of the association, in SlateJS JSON format. right: JSON! + # # Feedback for the association when the user assigns a wrong answer, in SlateJS JSON format. feedback: JSON } +# # a skill or compentency. # Something like loops or data structures. type Skill { + # # the id of a skill id: UUID! + # # the name of the skill skillName: String! @@ -2044,71 +2485,92 @@ type Skill { } input SkillInput { + # # the id of a skill. Field is optional, because not all required skills may # exist, if a new item is created. If the id is empty a new skill, # will be created id: UUID + # # the name of the skill skillName: String! } +# # The skill level of a user. type SkillLevel { + # # The value of the skill level. # levels are between 0 and 1. value: Float! + # # A log of the changes to the skill level log: [SkillLevelLogItem!]! } +# # An item in the skill level change log. type SkillLevelLogItem { + # # The date when the skill level changed. date: DateTime! + # # The difference between the previous and the new skill level. difference: Float! + # # The old skill level. oldValue: Float! + # # The new skill level. newValue: Float! + # # The ids of the contents that are associated with the change. associatedItemId: UUID! + # # the response of the user to the item userResponse: Float! + # # the probability of a correct response, that M-Elo predicts predictedCorrectness: Float! associatedContents: [Content]! } +# # The four skill level of a user. type SkillLevels { + # # remember represents how much user remember the concept remember: SkillLevel + # # understand represents how well the user understands learned content. understand: SkillLevel + # # apply represents the how well user applies the learned concept during assessment. apply: SkillLevel + # # apply is how much user can evaluate information and draw conclusions analyze: SkillLevel + # # evaluate represent how well a user can use the learned content to evaluate evaluate: SkillLevel + # # create represents how well a user can create new things based on the learned content create: SkillLevel } +# # Type of the assessment enum SkillType { REMEMBER @@ -2123,23 +2585,30 @@ enum SortDirection { DESC } +# # Representation of a Stage type Stage { + # # Unique identifier of the Stage Object id: UUID! + # # Position of the Stage within the Section position: Int! + # # List of Content that is labeled as required content requiredContents: [Content!]! + # # Percentage of User Progress made to required Content requiredContentsProgress: Float! + # # List of Content that is labeled as optional content optionalContents: [Content!]! + # # Percentage of Progress made to optional Content optionalContentsProgress: Float! } @@ -2157,11 +2626,14 @@ input StringFilter { ignoreCase: Boolean! = false } +# # Represents a suggestion for a user to learn new content or review old content. type Suggestion { + # # The content that is suggested to the user. content: Content! + # # The type of suggestion. type: SuggestionType! } @@ -2171,236 +2643,299 @@ enum SuggestionType { REPETITION } -# An RFC-3339 compliant Full Time Scalar scalar Time input UpdateAssessmentInput { + # # Metadata for the new Content metadata: UpdateContentMetadataInput! + # # Assessment metadata assessmentMetadata: AssessmentMetadataInput! + # # items of the new assessments items: [ItemInput!] } input UpdateAssociationQuestionInput { + # # UUID of the question to update and the id of the corresponding item. itemId: UUID! + # # Text of the question, in SlateJS JSON format. text: JSON! + # # List of associations. correctAssociations: [AssociationInput!]! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } +# # Input type for updating chapters. # The ID field specifies which chapter should be updated, all other fields specify the new values. input UpdateChapterInput { + # # UUID of the chapter that should be updated. id: UUID! + # # Title of the chapter, maximum length is 255 characters, must not be blank. title: String! + # # Description of the chapter, maximum length is 3000 characters. description: String! + # # Number of the chapter, determines the order of the chapters, must be positive. number: Int! + # # Start date of the chapter, ISO 8601 format. # Must be before the end date. startDate: DateTime! + # # End date of the chapter, ISO 8601 format. # Must be after the start date. endDate: DateTime! + # # Suggested Start date to start the chapter, ISO 8601 format. # Must be after Start Date and before the End dates. suggestedStartDate: DateTime + # # Suggested End date of the chapter, ISO 8601 format. # Must be after the Start Dates and before the End dates. suggestedEndDate: DateTime } input UpdateClozeQuestionInput { + # # UUID of the question to update and the id of the corresponding item. itemId: UUID! + # # List of cloze elements. clozeElements: [ClozeElementInput!]! + # # List of additional wrong answers. additionalWrongAnswers: [String!]! + # # If true, the list of possible answers will be shown to the user. showBlanksList: Boolean! = true + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateContentMetadataInput { + # # Name of the content name: String! + # # Date when the content should be done suggestedDate: DateTime! + # # Number of reward points a student receives for completing this content rewardPoints: Int! + # # ID of the chapter this content is associated with chapterId: UUID! + # # TagNames this content is tagged with tagNames: [String!]! = [] } +# # Input type for updating an existing course. See also on the course type for detailed field descriptions. # The id specifies the course that should be updated, the other fields specify the new values. input UpdateCourseInput { + # # UUID of the course that should be updated. # Must be an id of an existing course, otherwise an error is returned. id: UUID! + # # The new title of the course, max 255 characters, must not be blank. title: String! + # # The new description of the course, max 3000 characters. description: String! + # # The new start date of the course, ISO 8601 format. startDate: DateTime! + # # The new end date of the course, ISO 8601 format. endDate: DateTime! + # # The new published status of the course. published: Boolean! + # # The year in which the term starts. startYear: Int + # # The division of the academic calendar in which the term takes place. yearDivision: YearDivision } input UpdateExactAnswerQuestionInput { + # # UUID of the question to update and the id of the corresponding item. itemId: UUID! + # # Text of the question, in SlateJS JSON format. text: JSON! + # # A list of possible correct answers. correctAnswers: [String!]! + # # If the answer is case sensitive. If true, the answer is checked case sensitive. caseSensitive: Boolean! = false + # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateFlashcardInput { + # # Id of the flashcard to update, which is the id of the corresponding item. itemId: UUID! + # # List of sides of this flashcard. Must be at least two sides. sides: [FlashcardSideInput!]! } input UpdateMediaContentInput { + # # Metadata for the new Content metadata: UpdateContentMetadataInput! } input UpdateMediaRecordInput { + # # ID of the media record which should be updated id: UUID! + # # New name of the media record. Cannot be blank, maximum length 255 characters. name: String! + # # New type of the media record. type: MediaType! + # # IDs of the MediaContents this media record is associated with contentIds: [UUID!]! } input UpdateMultipleChoiceQuestionInput { + # # UUID of the question to update and the id of the corresponding item. itemId: UUID! + # # Text of the question, in SlateJS JSON format. text: JSON! + # # List of answers. answers: [MultipleChoiceAnswerInput!]! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateNumericQuestionInput { + # # UUID of the question to update and the id of the corresponding item. itemId: UUID! + # # Text of the question, in SlateJS JSON format. text: JSON! + # # The correct answer for the question. correctAnswer: Float! + # # The allowed deviation from the correct answer. tolerance: Float! + # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateSelfAssessmentQuestionInput { + # # UUID of the question to update and the id of the corresponding item. itemId: UUID! + # # Text of the question, in SlateJS JSON format. text: JSON! + # # A possible correct answer to the question. solutionSuggestion: JSON! + # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateStageInput { + # # Identifier of the Stage id: UUID! + # # updated List of UUIDs for content labeled as required in this Stage requiredContents: [UUID!]! + # # updated List of UUIDs for content labeled as optional in this Stage optionalContents: [UUID!]! } -# A Url scalar scalar Url type UserInfo { @@ -2419,39 +2954,49 @@ type UserInfo { mediaRecords: [MediaRecord!]! } +# # Represents a user's progress on a content item. # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html type UserProgressData { + # # The user's id. userId: UUID! + # # The id of the content item. contentId: UUID! + # # A list of entries each representing the user completing the content item. # Sorted by date in descending order. log: [ProgressLogItem]! + # # The learning interval in days for the content item. # If null, the content item is not scheduled for learning. learningInterval: Int + # # The next time the content should be learned. # Calculated using the date the user completed the content item and the learning interval. # This is null if the user has not completed the content item once. nextLearnDate: DateTime + # # The last time the content was learned successfully. # This is null if the user has not completed the content item once. lastLearnDate: DateTime + # # True if the user has completed the content item at least once successfully. isLearned: Boolean! + # # True if the assessment is due for review. isDueForReview: Boolean! } +# # Enum containing all valid roles a user can have in a course. enum UserRoleInCourse { STUDENT @@ -2459,7 +3004,6 @@ enum UserRoleInCourse { ADMINISTRATOR } -# A universally unique identifier compliant UUID Scalar scalar UUID type VideoRecordSegment implements MediaRecordSegment { @@ -2486,6 +3030,7 @@ type VideoRecordSegment implements MediaRecordSegment { mediaRecord: MediaRecord! } +# # The division of the academic year. enum YearDivision { FIRST_SEMESTER From e627829df3b8e92ec85d264a4551c4a6fc06f12c Mon Sep 17 00:00:00 2001 From: myluki2000 Date: Tue, 17 Sep 2024 16:33:50 +0200 Subject: [PATCH 03/33] Change search param from route param to query param --- app/search/{[query] => }/SearchResult.tsx | 0 .../{[query] => }/SearchResultGroup.tsx | 0 app/search/[query]/page.tsx | 120 --------------- app/search/page.tsx | 142 ++++++++++++++++++ components/Navbar.tsx | 2 +- 5 files changed, 143 insertions(+), 121 deletions(-) rename app/search/{[query] => }/SearchResult.tsx (100%) rename app/search/{[query] => }/SearchResultGroup.tsx (100%) delete mode 100644 app/search/[query]/page.tsx create mode 100644 app/search/page.tsx diff --git a/app/search/[query]/SearchResult.tsx b/app/search/SearchResult.tsx similarity index 100% rename from app/search/[query]/SearchResult.tsx rename to app/search/SearchResult.tsx diff --git a/app/search/[query]/SearchResultGroup.tsx b/app/search/SearchResultGroup.tsx similarity index 100% rename from app/search/[query]/SearchResultGroup.tsx rename to app/search/SearchResultGroup.tsx diff --git a/app/search/[query]/page.tsx b/app/search/[query]/page.tsx deleted file mode 100644 index 2fba09a..0000000 --- a/app/search/[query]/page.tsx +++ /dev/null @@ -1,120 +0,0 @@ -"use client"; - -import { pageSemanticSearchQuery } from "@/__generated__/pageSemanticSearchQuery.graphql"; -import { Box, Button, Collapse, TextField, Typography } from "@mui/material"; -import { useParams } from "next/navigation"; -import { graphql, useLazyLoadQuery } from "react-relay"; -import SearchResult from "./SearchResult"; -import SearchResultGroup from "./SearchResultGroup"; -import {ManageSearch, ExpandMore, ExpandLess} from '@mui/icons-material'; -import { useState } from "react"; - -export default function SearchPage() { - const params = useParams(); - const query: string = decodeURIComponent(params.query as string); - - const { semanticSearch } = useLazyLoadQuery( - graphql` - query pageSemanticSearchQuery($query: String!) { - semanticSearch(queryText: $query, count: 40) { - score - mediaRecordSegment { - __typename - id - thumbnail - mediaRecordId - ...on VideoRecordSegment { - startTime - screenText - transcript - mediaRecord { - id - name - type - contents { - metadata { - name - chapter { - title - } - course { - title - } - } - } - } - } - ...on DocumentRecordSegment { - page - text - mediaRecord { - id - name - type - contents { - metadata { - name - chapter { - title - } - course { - title - } - } - } - } - } - } - } - } - `, - { query } - ); - - const semanticSearchResultGroups = Object.values(Object.groupBy(semanticSearch, (result) => result.mediaRecordSegment.mediaRecord?.id ?? "unknown")); - - // sort the elements in each group by score from lowest to highest - semanticSearchResultGroups.forEach((group) => { - if (group !== undefined) - group.sort((a, b) => a.score - b.score); - }); - - // sort the groups themselves by the score of the first element in each group - semanticSearchResultGroups.sort((a, b) => { - let aScore = a === undefined ? 99999 : a[0].score; - let bScore = b === undefined ? 99999 : b[0].score; - return aScore - bScore; - }); - - const [isAdvancedSearchOpen, setIsAdvancedSearchOpen] = useState(false); - function toggleAdvancedSearch() { - setIsAdvancedSearchOpen(!isAdvancedSearchOpen); - } - - return ( -
    - Search - - - - - - - - - - { - Object.values(semanticSearchResultGroups).map((resultGroup) => { - return ( - - ); - }) - } -
    - ); -} \ No newline at end of file diff --git a/app/search/page.tsx b/app/search/page.tsx new file mode 100644 index 0000000..a69aac2 --- /dev/null +++ b/app/search/page.tsx @@ -0,0 +1,142 @@ +"use client"; + +import { pageSemanticSearchQuery, pageSemanticSearchQuery$data } from "@/__generated__/pageSemanticSearchQuery.graphql"; +import { Box, Button, Collapse, IconButton, InputAdornment, TextField, Typography } from "@mui/material"; +import { useParams, useRouter, useSearchParams } from "next/navigation"; +import { graphql, useLazyLoadQuery } from "react-relay"; +import SearchResult from "./SearchResult"; +import SearchResultGroup from "./SearchResultGroup"; +import {ManageSearch, ExpandMore, ExpandLess, Search} from '@mui/icons-material'; +import { useState } from "react"; + +export default function SearchPage() { + const router = useRouter(); + const searchParams = useSearchParams(); + const query: string | null = searchParams.get("query"); + + let semanticSearchResultGroups: (pageSemanticSearchQuery$data["semanticSearch"][0][] | undefined)[] = []; + + if(query !== null) { + const { semanticSearch } = useLazyLoadQuery( + graphql` + query pageSemanticSearchQuery($query: String!) { + semanticSearch(queryText: $query, count: 40) { + score + mediaRecordSegment { + __typename + id + thumbnail + mediaRecordId + ...on VideoRecordSegment { + startTime + screenText + transcript + mediaRecord { + id + name + type + contents { + metadata { + name + chapter { + title + } + course { + title + } + } + } + } + } + ...on DocumentRecordSegment { + page + text + mediaRecord { + id + name + type + contents { + metadata { + name + chapter { + title + } + course { + title + } + } + } + } + } + } + } + } + `, + { query } + ); + + semanticSearchResultGroups = Object.values(Object.groupBy(semanticSearch, (result) => result.mediaRecordSegment.mediaRecord?.id ?? "unknown")); + } + + // sort the elements in each group by score from lowest to highest + semanticSearchResultGroups.forEach((group) => { + if (group !== undefined) + group.sort((a, b) => a.score - b.score); + }); + + // sort the groups themselves by the score of the first element in each group + semanticSearchResultGroups.sort((a, b) => { + let aScore = a === undefined ? 99999 : a[0].score; + let bScore = b === undefined ? 99999 : b[0].score; + return aScore - bScore; + }); + + const [isAdvancedSearchOpen, setIsAdvancedSearchOpen] = useState(false); + function toggleAdvancedSearch() { + setIsAdvancedSearchOpen(!isAdvancedSearchOpen); + } + + const [queryTextFieldValue, setQueryTextFieldValue] = useState(query); + + return ( +
    + Search + + + setQueryTextFieldValue(e.target.value)} + InputProps={{ + endAdornment: + router.push(`/search?query=${queryTextFieldValue}`)}> + + + , + }} /> + + + + + + + {((query !== null) && + Object.values(semanticSearchResultGroups).map((resultGroup) => { + return ( + + ); + }) + )} +
    + ); +} \ No newline at end of file diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 67ee128..21597e7 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -150,7 +150,7 @@ function NavbarBase({ return setSearchPopupOpen(false)}> {children}
    + ); + } + else { + return
    + } } function SkillLevelLabel({ @@ -145,8 +145,8 @@ export function SkillLevel({ value: number; courseId: string; }) { - const level = Math.floor(value*100); // integer part is level - const progress = value*100; // decimal part is progress + const level = Math.floor(value * 100); // integer part is level + const progress = value * 100; // decimal part is progress if (level < 50) { return ( @@ -264,7 +264,7 @@ export function SkillLevelBase({ // }} // arrow // > - {badge} + {badge} // ); } diff --git a/components/flashcard/LecturerEditFlashcard.tsx b/components/flashcard/LecturerEditFlashcard.tsx index 8882306..e629629 100644 --- a/components/flashcard/LecturerEditFlashcard.tsx +++ b/components/flashcard/LecturerEditFlashcard.tsx @@ -170,7 +170,7 @@ export function Flashcard({ {title} - +
    {flashcard.sides.map((side, i) => (
    diff --git a/components/flashcard/LocalFlashcard.tsx b/components/flashcard/LocalFlashcard.tsx index 06f8aa2..8b5cdd6 100644 --- a/components/flashcard/LocalFlashcard.tsx +++ b/components/flashcard/LocalFlashcard.tsx @@ -68,7 +68,7 @@ export function LocalFlashcard({ New flashcard (not saved) - +
    {sides.map((side, i) => (
    - + - + {data.clozeElements.map((elem, i) => elem.type === "text" ? ( diff --git a/components/quiz/MutlipleChoiceQuestionModal.tsx b/components/quiz/MutlipleChoiceQuestionModal.tsx index 8e0229c..b9fd013 100644 --- a/components/quiz/MutlipleChoiceQuestionModal.tsx +++ b/components/quiz/MutlipleChoiceQuestionModal.tsx @@ -105,7 +105,7 @@ export function MultipleChoiceQuestionModal({ - + Date: Thu, 19 Sep 2024 15:29:02 +0200 Subject: [PATCH 10/33] qs --- .../[courseId]/media/[mediaId]/student.tsx | 95 +++++++++++++------ 1 file changed, 66 insertions(+), 29 deletions(-) diff --git a/app/courses/[courseId]/media/[mediaId]/student.tsx b/app/courses/[courseId]/media/[mediaId]/student.tsx index 116d4bf..1f1bc3e 100644 --- a/app/courses/[courseId]/media/[mediaId]/student.tsx +++ b/app/courses/[courseId]/media/[mediaId]/student.tsx @@ -27,12 +27,14 @@ import "@vidstack/react/player/styles/default/theme.css"; import { differenceInHours } from "date-fns"; import dayjs from "dayjs"; import duration from "dayjs/plugin/duration"; -import { clamp } from "lodash"; +import { clamp, orderBy } from "lodash"; dayjs.extend(duration); +import { studentContentFragment$key } from "@/__generated__/studentContentFragment.graphql"; import { studentContentSideVideoFragment$key } from "@/__generated__/studentContentSideVideoFragment.graphql"; import { studentMediaLogProgressVideoMutation } from "@/__generated__/studentMediaLogProgressVideoMutation.graphql"; + import { useParams } from "next/navigation"; import { MutableRefObject, RefObject, useRef, useState } from "react"; @@ -67,6 +69,7 @@ export default function StudentMediaPage() { } ...MediaContentLinkFragment + ...studentContentFragment } } `, @@ -169,6 +172,7 @@ export default function StudentMediaPage() { setError={setError} _records={videos} selected={selected.left} + _content={content} setSelected={(val: number) => setSelected({ ...selected, left: val }) } @@ -209,9 +213,9 @@ export default function StudentMediaPage() { videoRef={videoRef} setError={setError} _records={documents} - selected={selected.left} + selected={selected.right} setSelected={(val: number) => - setSelected({ ...selected, left: val }) + setSelected({ ...selected, right: val }) } /> )} @@ -360,12 +364,14 @@ function VideoSide({ setSelected, setError, videoRef, + _content, }: { _records: studentContentSideVideoFragment$key; selected: number; setSelected: (val: number) => void; setError: (err: any) => void; videoRef: MutableRefObject; + _content: studentContentFragment$key; }) { const mediaRecords = useFragment( graphql` @@ -392,6 +398,30 @@ function VideoSide({ `, _records ); + + const content = useFragment( + graphql` + fragment studentContentFragment on MediaContent { + id + segmentLinks { + segment1 { + id + } + segment2 { + id + } + } + mediaRecords { + name + segments { + id + thumbnail + } + } + } + `, + _content + ); const currentRecord = mediaRecords[selected]; const [mediaRecordWorkedOn] = @@ -412,6 +442,7 @@ function VideoSide({ ) < 24; const [duration, setDuration] = useState(0); + const segments = orderBy(currentRecord.segments, (x) => x.startTime, "asc"); return (
    @@ -448,10 +479,10 @@ function VideoSide({ ({ + cues: segments.map((x, idx) => ({ startTime: x.startTime ?? 0, text: x.title ?? "", - endTime: currentRecord.segments[idx + 1]?.startTime ?? duration, + endTime: segments[idx + 1]?.startTime ?? duration, })), }} label="Chapters" @@ -463,38 +494,44 @@ function VideoSide({ ({ + thumbnails={segments.map((x) => ({ startTime: x.startTime ?? 0, - url: "data:image/jpeg;base64," + x.thumbnail, + url: x.thumbnail ?? "", }))} />
    - {currentRecord.segments.map((segment) => ( -
    { - if (videoRef.current && segment.startTime !== undefined) - videoRef.current.currentTime = segment.startTime; - }} - key={segment.id} - className="bg-slate-50 border borders-slate-200 shadow hover:bg-slate-100 text-xs rounded-md p-2 transition duration-100 cursor-pointer flex gap-2" - > - {segment.title!} -
    -
    - {dayjs - .duration(segment.startTime ?? 0, "seconds") - .format("HH:mm:ss")} + {segments.map((segment) => { + const links = content.segmentLinks.filter( + (x) => x.segment1.id === segment.id || x.segment2.id === segment.id + ); + + return ( +
    { + if (videoRef.current && segment.startTime !== undefined) + videoRef.current.currentTime = segment.startTime; + }} + key={segment.id} + className="bg-slate-50 border borders-slate-200 shadow hover:bg-slate-100 text-xs rounded-md p-2 transition duration-100 cursor-pointer flex gap-2" + > + {segment.title!} +
    +
    + {dayjs + .duration(segment.startTime ?? 0, "seconds") + .format("HH:mm:ss")} +
    + {segment.title}
    - {segment.title}
    -
    - ))} + ); + })}
    From e28b1d7a78f88f6e1dda1b16c5d99086fd0ca6f1 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Thu, 19 Sep 2024 17:32:35 +0200 Subject: [PATCH 11/33] jump to current segment --- .../media/[mediaId]/DocumentSide.tsx | 110 + .../[courseId]/media/[mediaId]/VideoSide.tsx | 306 + .../[courseId]/media/[mediaId]/student.tsx | 362 +- components/PdfViewer.tsx | 8 + package.json | 1 + pnpm-lock.yaml | 7334 ++++++++--------- 6 files changed, 3682 insertions(+), 4439 deletions(-) create mode 100644 app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx create mode 100644 app/courses/[courseId]/media/[mediaId]/VideoSide.tsx diff --git a/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx b/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx new file mode 100644 index 0000000..48df803 --- /dev/null +++ b/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx @@ -0,0 +1,110 @@ +import { DocumentSideFragment$key } from "@/__generated__/DocumentSideFragment.graphql"; +import { DocumentSideLogProgressMutation } from "@/__generated__/DocumentSideLogProgressMutation.graphql"; +import { PdfViewer } from "@/components/PdfViewer"; +import { Check } from "@mui/icons-material"; +import { Button, MenuItem, Select } from "@mui/material"; +import { differenceInHours } from "date-fns"; +import { useState } from "react"; +import { graphql, useFragment, useMutation } from "react-relay"; + +export function DocumentSide({ + setError, + _content, +}: { + setError: (err: any) => void; + _content: DocumentSideFragment$key; +}) { + const [progress, setProgress] = useState(0); + const content = useFragment( + graphql` + fragment DocumentSideFragment on MediaContent { + id + + mediaRecords { + id + ...ContentMediaDisplayFragment + type + name + downloadUrl + userProgressData { + dateWorkedOn + } + closedCaptions + segments { + id + + id + thumbnail + ... on DocumentRecordSegment { + page + } + + __typename + } + } + } + `, + _content + ); + const [selected, setSelected] = useState(0); + + const documents = content.mediaRecords.filter((x) => x.type !== "VIDEO"); + const currentRecord = documents[selected]; + + const [mediaRecordWorkedOn] = + useMutation(graphql` + mutation DocumentSideLogProgressMutation($id: UUID!) { + logMediaRecordWorkedOn(mediaRecordId: $id) { + id + } + } + `); + + const workedOnToday = + Math.abs( + differenceInHours( + new Date(), + new Date(currentRecord?.userProgressData.dateWorkedOn ?? "") + ) + ) < 24; + + return ( +
    + {(documents?.length ?? 0) > 1 && ( + + )} + + {currentRecord && ( + null} + url={currentRecord.downloadUrl} + /> + )} + +
    + +
    +
    + ); +} diff --git a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx new file mode 100644 index 0000000..7dc51fd --- /dev/null +++ b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx @@ -0,0 +1,306 @@ +import { + VideoSideFragment$data, + VideoSideFragment$key, +} from "@/__generated__/VideoSideFragment.graphql"; +import { VideoSideLogProgressMutation } from "@/__generated__/VideoSideLogProgressMutation.graphql"; +import { Check } from "@mui/icons-material"; +import { Button, Divider, MenuItem, Select } from "@mui/material"; +import { + MediaPlayer, + MediaPlayerInstance, + MediaProvider, + Track, +} from "@vidstack/react"; +import { + defaultLayoutIcons, + DefaultVideoLayout, +} from "@vidstack/react/player/layouts/default"; +import { differenceInHours } from "date-fns"; + +import dayjs from "dayjs"; +import duration from "dayjs/plugin/duration"; +import { orderBy } from "lodash"; +import { MutableRefObject, useEffect, useRef, useState } from "react"; +import { useFragment, useMutation } from "react-relay"; +import { graphql } from "relay-runtime"; +import { dispatch } from "use-bus"; +dayjs.extend(duration); + +export function VideoSide({ + setError, + _content, +}: { + setError: (err: any) => void; + _content: VideoSideFragment$key; +}) { + const content = useFragment( + graphql` + fragment VideoSideFragment on MediaContent { + id + segmentLinks { + segment1 { + id + } + segment2 { + id + } + } + mediaRecords { + id + + type + name + downloadUrl + userProgressData { + dateWorkedOn + } + closedCaptions + segments { + id + ... on VideoRecordSegment { + startTime + + transcript + thumbnail + title + } + + id + thumbnail + ... on DocumentRecordSegment { + page + } + + __typename + } + } + } + `, + _content + ); + const [selected, setSelected] = useState(0); + + const videos = content.mediaRecords.filter((x) => x.type === "VIDEO"); + const currentRecord = videos[selected]; + + const videoRef = useRef(null); + + const [mediaRecordWorkedOn] = + useMutation(graphql` + mutation VideoSideLogProgressMutation($id: UUID!) { + logMediaRecordWorkedOn(mediaRecordId: $id) { + id + } + } + `); + + const workedOnToday = + Math.abs( + differenceInHours( + new Date(), + new Date(currentRecord?.userProgressData.dateWorkedOn ?? "") + ) + ) < 24; + + const [duration, setDuration] = useState(0); + const segments = orderBy(currentRecord.segments, (x) => x.startTime, "asc"); + + const [playbackPosition, setPlaybackPosition] = useState(0); + + useEffect(() => { + const interval = setInterval(() => { + setPlaybackPosition(videoRef.current?.currentTime ?? 0); + }); + return () => clearInterval(interval); + }, [videoRef]); + + const currentSegment = segments.find( + (x, idx) => + segments.length - 2 === idx || + (segments[idx + 1].startTime ?? 0) > playbackPosition + ); + + const currentSegmentProgress = currentSegment + ? (playbackPosition - (currentSegment.startTime ?? 0)) / + ((segments[segments.indexOf(currentSegment) + 1]?.startTime ?? duration) - + (currentSegment.startTime ?? 0)) + : 0; + + return ( +
    + {/* media record selector */} + {(videos?.length ?? 0) > 1 && ( + + )} + + {/* player */} + + setDuration(e)} + > + {currentRecord.closedCaptions && ( + + )} + + ({ + startTime: x.startTime ?? 0, + text: x.title ?? "", + endTime: segments[idx + 1]?.startTime ?? duration, + })), + }} + label="Chapters" + kind="chapters" + type="json" + default + /> + + + ({ + startTime: x.startTime ?? 0, + url: x.thumbnail ?? "", + }))} + /> + + + {/* current segment */} + + {currentSegment && ( + <> +
    + + + + )} + + {/* all segments */} +
    + {segments.map((segment) => ( + + ))} +
    + +
    + +
    +
    + ); +} + +function Segment({ + segment, + content, + videoRef, + currentSegmentInfo, +}: { + segment: VideoSideFragment$data["mediaRecords"][0]["segments"][0]; + content: VideoSideFragment$data; + videoRef: MutableRefObject; + currentSegmentInfo?: { progress: number }; +}) { + const links = content.segmentLinks + .filter((x) => x.segment1.id === segment.id || x.segment2.id === segment.id) + .map((x) => (x.segment1.id === segment.id ? x.segment2.id : x.segment1.id)); + + const linkedRecords = content.mediaRecords + .flatMap((x) => x.segments) + .filter((x) => links.includes(x.id)); + + return ( +
    { + if (videoRef.current && segment.startTime !== undefined) + videoRef.current.currentTime = segment.startTime; + } + } + key={segment.id} + className={` overflow-hidden relative border shadow text-xs rounded-md p-2 transition duration-100 flex gap-2 ${ + currentSegmentInfo + ? "bg-emerald-700/10 border-emerald-600/20" + : "bg-slate-50 hover:bg-slate-100 border-slate-200 cursor-pointer" + }`} + > + {segment.title!} +
    +
    + {dayjs.duration(segment.startTime ?? 0, "seconds").format("HH:mm:ss")} +
    + {segment.title} +
    +
    + {currentSegmentInfo && linkedRecords.length > 0 && ( +
    + {linkedRecords.map((x) => ( +
    + {linkedRecords.map((x) => ( +
    { + dispatch({ type: "openPage", page: x.page }); + }} + > + Page {(x.page ?? 0) + 1} → +
    + ))} +
    + ))} +
    + )} +
    + {currentSegmentInfo && ( +
    + )} +
    + ); +} diff --git a/app/courses/[courseId]/media/[mediaId]/student.tsx b/app/courses/[courseId]/media/[mediaId]/student.tsx index 1f1bc3e..cfbda84 100644 --- a/app/courses/[courseId]/media/[mediaId]/student.tsx +++ b/app/courses/[courseId]/media/[mediaId]/student.tsx @@ -1,50 +1,26 @@ "use client"; /* eslint-disable @next/next/no-img-element */ -import { - MediaPlayer, - MediaPlayerInstance, - MediaProvider, - Track, -} from "@vidstack/react"; -import { - defaultLayoutIcons, - DefaultVideoLayout, -} from "@vidstack/react/player/layouts/default"; -import "@vidstack/react/player/styles/default/layouts/video.css"; -import "@vidstack/react/player/styles/default/theme.css"; - import { studentContentDownloadButtonFragment$key } from "@/__generated__/studentContentDownloadButtonFragment.graphql"; -import { studentContentSideFragment$key } from "@/__generated__/studentContentSideFragment.graphql"; -import { studentMediaLogProgressMutation } from "@/__generated__/studentMediaLogProgressMutation.graphql"; import { studentMediaQuery } from "@/__generated__/studentMediaQuery.graphql"; import { ContentTags } from "@/components/ContentTags"; import { Heading } from "@/components/Heading"; import { PageError } from "@/components/PageError"; -import { Check, Download } from "@mui/icons-material"; -import { Alert, Button, MenuItem, Select } from "@mui/material"; +import { Download } from "@mui/icons-material"; +import { Alert, Button } from "@mui/material"; import "@vidstack/react/player/styles/default/layouts/video.css"; import "@vidstack/react/player/styles/default/theme.css"; -import { differenceInHours } from "date-fns"; import dayjs from "dayjs"; import duration from "dayjs/plugin/duration"; -import { clamp, orderBy } from "lodash"; +import { clamp } from "lodash"; +import { DocumentSide } from "./DocumentSide"; dayjs.extend(duration); -import { studentContentFragment$key } from "@/__generated__/studentContentFragment.graphql"; -import { studentContentSideVideoFragment$key } from "@/__generated__/studentContentSideVideoFragment.graphql"; -import { studentMediaLogProgressVideoMutation } from "@/__generated__/studentMediaLogProgressVideoMutation.graphql"; - import { useParams } from "next/navigation"; -import { MutableRefObject, RefObject, useRef, useState } from "react"; -import { - graphql, - useFragment, - useLazyLoadQuery, - useMutation, -} from "react-relay"; -import { ContentMediaDisplay } from "./ContentMediaDisplay"; +import { useRef, useState } from "react"; +import { graphql, useFragment, useLazyLoadQuery } from "react-relay"; +import { VideoSide } from "./VideoSide"; export default function StudentMediaPage() { const { mediaId } = useParams(); @@ -61,21 +37,17 @@ export default function StudentMediaPage() { } ... on MediaContent { mediaRecords { - ...studentContentSideFragment - ...studentContentSideVideoFragment type id } } - - ...MediaContentLinkFragment - ...studentContentFragment + ...DocumentSideFragment + ...VideoSideFragment } } `, { mediaId } ); - const videoRef = useRef(null); const [nagDismissed, setNagDismissed] = useState(false); @@ -104,8 +76,8 @@ export default function StudentMediaPage() { ); } - const videos = content.mediaRecords.filter((x) => x.type === "VIDEO"); - const documents = content.mediaRecords.filter((x) => x.type !== "VIDEO"); + const hasDocuments = content.mediaRecords.some((x) => x.type !== "VIDEO"); + const hasVideos = content.mediaRecords.some((x) => x.type === "VIDEO"); return (
    @@ -157,7 +129,7 @@ export default function StudentMediaPage() { ref={ref} className="grid gap-4 w-full h-full" style={ - videos.length && documents.length + hasVideos && hasDocuments ? { gridTemplateColumns: `calc(${splitPercentage}% - 10px) 20px calc(${ 100 - splitPercentage @@ -166,19 +138,8 @@ export default function StudentMediaPage() { : {} } > - {videos.length > 0 && ( - - setSelected({ ...selected, left: val }) - } - /> - )} - {videos.length > 0 && documents.length > 0 && ( + {hasVideos && } + {hasVideos && hasDocuments && (
    { const l = (e: MouseEvent) => { @@ -208,16 +169,8 @@ export default function StudentMediaPage() {
    )} - {documents.length > 0 && ( - - setSelected({ ...selected, right: val }) - } - /> + {hasDocuments && ( + )}
    @@ -268,286 +221,3 @@ export function DownloadButton({ ); } - -function DocumentSide({ - _records, - selected, - setSelected, - setError, - videoRef, -}: { - _records: studentContentSideFragment$key; - selected: number; - setSelected: (val: number) => void; - setError: (err: any) => void; - videoRef: RefObject; -}) { - const [progress, setProgress] = useState(0); - - const mediaRecords = useFragment( - graphql` - fragment studentContentSideFragment on MediaRecord @relay(plural: true) { - id - name - downloadUrl - ...ContentMediaDisplayFragment - userProgressData { - dateWorkedOn - } - } - `, - _records - ); - const currentRecord = mediaRecords[selected]; - - const [mediaRecordWorkedOn] = - useMutation(graphql` - mutation studentMediaLogProgressMutation($id: UUID!) { - logMediaRecordWorkedOn(mediaRecordId: $id) { - id - } - } - `); - - const workedOnToday = - Math.abs( - differenceInHours( - new Date(), - new Date(currentRecord?.userProgressData.dateWorkedOn ?? "") - ) - ) < 24; - - return ( -
    - {(mediaRecords?.length ?? 0) > 1 && ( - - )} - - {currentRecord && ( - - )} - -
    - -
    -
    - ); -} - -function VideoSide({ - _records, - selected, - setSelected, - setError, - videoRef, - _content, -}: { - _records: studentContentSideVideoFragment$key; - selected: number; - setSelected: (val: number) => void; - setError: (err: any) => void; - videoRef: MutableRefObject; - _content: studentContentFragment$key; -}) { - const mediaRecords = useFragment( - graphql` - fragment studentContentSideVideoFragment on MediaRecord - @relay(plural: true) { - id - name - downloadUrl - userProgressData { - dateWorkedOn - } - closedCaptions - segments { - id - ... on VideoRecordSegment { - startTime - - transcript - thumbnail - title - } - } - } - `, - _records - ); - - const content = useFragment( - graphql` - fragment studentContentFragment on MediaContent { - id - segmentLinks { - segment1 { - id - } - segment2 { - id - } - } - mediaRecords { - name - segments { - id - thumbnail - } - } - } - `, - _content - ); - const currentRecord = mediaRecords[selected]; - - const [mediaRecordWorkedOn] = - useMutation(graphql` - mutation studentMediaLogProgressVideoMutation($id: UUID!) { - logMediaRecordWorkedOn(mediaRecordId: $id) { - id - } - } - `); - - const workedOnToday = - Math.abs( - differenceInHours( - new Date(), - new Date(currentRecord?.userProgressData.dateWorkedOn ?? "") - ) - ) < 24; - - const [duration, setDuration] = useState(0); - const segments = orderBy(currentRecord.segments, (x) => x.startTime, "asc"); - - return ( -
    - {(mediaRecords?.length ?? 0) > 1 && ( - - )} - - setDuration(e)} - > - {currentRecord.closedCaptions && ( - - )} - - ({ - startTime: x.startTime ?? 0, - text: x.title ?? "", - endTime: segments[idx + 1]?.startTime ?? duration, - })), - }} - label="Chapters" - kind="chapters" - type="json" - default - /> - - - ({ - startTime: x.startTime ?? 0, - url: x.thumbnail ?? "", - }))} - /> - - -
    - {segments.map((segment) => { - const links = content.segmentLinks.filter( - (x) => x.segment1.id === segment.id || x.segment2.id === segment.id - ); - - return ( -
    { - if (videoRef.current && segment.startTime !== undefined) - videoRef.current.currentTime = segment.startTime; - }} - key={segment.id} - className="bg-slate-50 border borders-slate-200 shadow hover:bg-slate-100 text-xs rounded-md p-2 transition duration-100 cursor-pointer flex gap-2" - > - {segment.title!} -
    -
    - {dayjs - .duration(segment.startTime ?? 0, "seconds") - .format("HH:mm:ss")} -
    - {segment.title} -
    -
    - ); - })} -
    - -
    - -
    -
    - ); -} diff --git a/components/PdfViewer.tsx b/components/PdfViewer.tsx index 4e82083..c999893 100644 --- a/components/PdfViewer.tsx +++ b/components/PdfViewer.tsx @@ -8,6 +8,7 @@ import { useDebounceValue, useResizeObserver } from "usehooks-ts"; import { CircularProgress } from "@mui/material"; import { times } from "lodash"; import { useEffect, useRef, useState } from "react"; +import useBus from "use-bus"; pdfjs.GlobalWorkerOptions.workerSrc = new URL( "pdfjs-dist/build/pdf.worker.min.js", @@ -33,6 +34,13 @@ export function PdfViewer({ const [pageNumber, setPageNumber] = useState(1); const [_, setViewedPages] = useState([] as number[]); + useBus("openPage", (e) => { + console.log(e); + if ("page" in e) { + setPageNumber(e.page + 1); + } + }); + useEffect(() => { const timeout = setTimeout(() => { if (numPages) { diff --git a/package.json b/package.json index 72c83ac..b26b32d 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "slate-react": "^0.98.4", "tailwindcss": "3.3.1", "typescript": "5.0.4", + "use-bus": "^2.5.2", "usehooks-ts": "^3.1.0", "victory": "^36.9.2", "yup": "^1.4.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc5d0f2..e7d0466 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3378 +1,254 @@ -lockfileVersion: '9.0' +lockfileVersion: '6.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -importers: +dependencies: + '@emotion/css': + specifier: ^11.11.2 + version: 11.11.2 + '@emotion/react': + specifier: ^11.11.4 + version: 11.11.4(@types/react@18.0.37)(react@18.2.0) + '@emotion/styled': + specifier: ^11.11.5 + version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.0.37)(react@18.2.0) + '@fontsource/roboto': + specifier: ^4.5.8 + version: 4.5.8 + '@mui/icons-material': + specifier: ^5.15.15 + version: 5.15.15(@mui/material@5.15.15)(@types/react@18.0.37)(react@18.2.0) + '@mui/lab': + specifier: 5.0.0-alpha.141 + version: 5.0.0-alpha.141(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) + '@mui/material': + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) + '@mui/x-date-pickers': + specifier: ^6.19.9 + version: 6.19.9(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@mui/system@5.15.15)(@types/react@18.0.37)(date-fns@2.30.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) + '@react-hook/resize-observer': + specifier: ^1.2.6 + version: 1.2.6(react@18.2.0) + '@types/is-hotkey': + specifier: ^0.1.10 + version: 0.1.10 + '@types/lodash': + specifier: ^4.17.0 + version: 4.17.0 + '@types/node': + specifier: 18.15.12 + version: 18.15.12 + '@types/pdfobject': + specifier: ^2.2.5 + version: 2.2.5 + '@types/react': + specifier: 18.0.37 + version: 18.0.37 + '@types/react-dom': + specifier: 18.0.11 + version: 18.0.11 + '@vidstack/react': + specifier: ^1.12.9 + version: 1.12.9(@types/react@18.0.37)(react@18.2.0) + autoprefixer: + specifier: 10.4.14 + version: 10.4.14(postcss@8.4.23) + clsx: + specifier: ^2.1.0 + version: 2.1.0 + date-fns: + specifier: ^2.30.0 + version: 2.30.0 + dayjs: + specifier: ^1.11.10 + version: 1.11.10 + eslint: + specifier: 8.38.0 + version: 8.38.0 + eslint-config-next: + specifier: 13.3.0 + version: 13.3.0(eslint@8.38.0)(typescript@5.0.4) + formik: + specifier: ^2.4.5 + version: 2.4.5(react@18.2.0) + framer-motion: + specifier: ^10.18.0 + version: 10.18.0(react-dom@18.2.0)(react@18.2.0) + is-hotkey: + specifier: ^0.2.0 + version: 0.2.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + next: + specifier: 13.4.7 + version: 13.4.7(react-dom@18.2.0)(react@18.2.0) + oidc-client-ts: + specifier: ^2.4.0 + version: 2.4.0 + pdfobject: + specifier: ^2.3.0 + version: 2.3.0 + postcss: + specifier: 8.4.23 + version: 8.4.23 + react: + specifier: 18.2.0 + version: 18.2.0 + react-confetti: + specifier: ^6.1.0 + version: 6.1.0(react@18.2.0) + react-dnd: + specifier: ^16.0.1 + version: 16.0.1(@types/node@18.15.12)(@types/react@18.0.37)(react@18.2.0) + react-dnd-html5-backend: + specifier: ^16.0.1 + version: 16.0.1 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-dropzone: + specifier: ^14.2.3 + version: 14.2.3(react@18.2.0) + react-error-boundary: + specifier: ^4.0.13 + version: 4.0.13(react@18.2.0) + react-oidc-context: + specifier: ^2.3.1 + version: 2.3.1(oidc-client-ts@2.4.0)(react@18.2.0) + react-pdf: + specifier: ^7.7.1 + version: 7.7.3(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) + react-relay: + specifier: 15.0.0 + version: 15.0.0(react@18.2.0) + recharts: + specifier: ^2.12.5 + version: 2.12.5(react-dom@18.2.0)(react@18.2.0) + relay-runtime: + specifier: 15.0.0 + version: 15.0.0 + slate: + specifier: ^0.94.1 + version: 0.94.1 + slate-history: + specifier: ^0.93.0 + version: 0.93.0(slate@0.94.1) + slate-react: + specifier: ^0.98.4 + version: 0.98.4(react-dom@18.2.0)(react@18.2.0)(slate@0.94.1) + tailwindcss: + specifier: 3.3.1 + version: 3.3.1(postcss@8.4.23) + typescript: + specifier: 5.0.4 + version: 5.0.4 + use-bus: + specifier: ^2.5.2 + version: 2.5.2(react@18.2.0) + usehooks-ts: + specifier: ^3.1.0 + version: 3.1.0(react@18.2.0) + victory: + specifier: ^36.9.2 + version: 36.9.2(react@18.2.0) + yup: + specifier: ^1.4.0 + version: 1.4.0 + +devDependencies: + '@types/react-relay': + specifier: 14.1.3 + version: 14.1.3 + '@types/relay-runtime': + specifier: 14.1.10 + version: 14.1.10 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + eslint-config-prettier: + specifier: ^8.10.0 + version: 8.10.0(eslint@8.38.0) + fetch-graphql-schema: + specifier: ^0.2.1 + version: 0.2.1 + husky: + specifier: ^8.0.3 + version: 8.0.3 + lint-staged: + specifier: ^13.3.0 + version: 13.3.0 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + raw-loader: + specifier: ^4.0.2 + version: 4.0.2(webpack@5.91.0) + relay-compiler: + specifier: 15.0.0 + version: 15.0.0 - .: - dependencies: - '@emotion/css': - specifier: ^11.11.2 - version: 11.11.2 - '@emotion/react': - specifier: ^11.11.4 - version: 11.11.4(@types/react@18.0.37)(react@18.2.0) - '@emotion/styled': - specifier: ^11.11.5 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.0.37)(react@18.2.0) - '@fontsource/roboto': - specifier: ^4.5.8 - version: 4.5.8 - '@mui/icons-material': - specifier: ^5.15.15 - version: 5.15.15(@mui/material@5.15.15)(@types/react@18.0.37)(react@18.2.0) - '@mui/lab': - specifier: 5.0.0-alpha.141 - version: 5.0.0-alpha.141(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': - specifier: ^5.15.15 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) - '@mui/x-date-pickers': - specifier: ^6.19.9 - version: 6.19.9(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@mui/system@5.15.15)(@types/react@18.0.37)(date-fns@2.30.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) - '@react-hook/resize-observer': - specifier: ^1.2.6 - version: 1.2.6(react@18.2.0) - '@types/is-hotkey': - specifier: ^0.1.10 - version: 0.1.10 - '@types/lodash': - specifier: ^4.17.0 - version: 4.17.0 - '@types/node': - specifier: 18.15.12 - version: 18.15.12 - '@types/pdfobject': - specifier: ^2.2.5 - version: 2.2.5 - '@types/react': - specifier: 18.0.37 - version: 18.0.37 - '@types/react-dom': - specifier: 18.0.11 - version: 18.0.11 - '@vidstack/react': - specifier: ^1.12.9 - version: 1.12.9(@types/react@18.0.37)(react@18.2.0) - autoprefixer: - specifier: 10.4.14 - version: 10.4.14(postcss@8.4.23) - clsx: - specifier: ^2.1.0 - version: 2.1.0 - date-fns: - specifier: ^2.30.0 - version: 2.30.0 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - eslint: - specifier: 8.38.0 - version: 8.38.0 - eslint-config-next: - specifier: 13.3.0 - version: 13.3.0(eslint@8.38.0)(typescript@5.0.4) - formik: - specifier: ^2.4.5 - version: 2.4.5(react@18.2.0) - framer-motion: - specifier: ^10.18.0 - version: 10.18.0(react-dom@18.2.0)(react@18.2.0) - is-hotkey: - specifier: ^0.2.0 - version: 0.2.0 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - next: - specifier: 13.4.7 - version: 13.4.7(react-dom@18.2.0)(react@18.2.0) - oidc-client-ts: - specifier: ^2.4.0 - version: 2.4.0 - pdfobject: - specifier: ^2.3.0 - version: 2.3.0 - postcss: - specifier: 8.4.23 - version: 8.4.23 - react: - specifier: 18.2.0 - version: 18.2.0 - react-confetti: - specifier: ^6.1.0 - version: 6.1.0(react@18.2.0) - react-dnd: - specifier: ^16.0.1 - version: 16.0.1(@types/node@18.15.12)(@types/react@18.0.37)(react@18.2.0) - react-dnd-html5-backend: - specifier: ^16.0.1 - version: 16.0.1 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-dropzone: - specifier: ^14.2.3 - version: 14.2.3(react@18.2.0) - react-error-boundary: - specifier: ^4.0.13 - version: 4.0.13(react@18.2.0) - react-oidc-context: - specifier: ^2.3.1 - version: 2.3.1(oidc-client-ts@2.4.0)(react@18.2.0) - react-pdf: - specifier: ^7.7.1 - version: 7.7.3(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) - react-relay: - specifier: 15.0.0 - version: 15.0.0(react@18.2.0) - recharts: - specifier: ^2.12.5 - version: 2.12.5(react-dom@18.2.0)(react@18.2.0) - relay-runtime: - specifier: 15.0.0 - version: 15.0.0 - slate: - specifier: ^0.94.1 - version: 0.94.1 - slate-history: - specifier: ^0.93.0 - version: 0.93.0(slate@0.94.1) - slate-react: - specifier: ^0.98.4 - version: 0.98.4(react-dom@18.2.0)(react@18.2.0)(slate@0.94.1) - tailwindcss: - specifier: 3.3.1 - version: 3.3.1(postcss@8.4.23) - typescript: - specifier: 5.0.4 - version: 5.0.4 - usehooks-ts: - specifier: ^3.1.0 - version: 3.1.0(react@18.2.0) - victory: - specifier: ^36.9.2 - version: 36.9.2(react@18.2.0) - yup: - specifier: ^1.4.0 - version: 1.4.0 - devDependencies: - '@types/react-relay': - specifier: 14.1.3 - version: 14.1.3 - '@types/relay-runtime': - specifier: 14.1.10 - version: 14.1.10 - concurrently: - specifier: ^8.2.2 - version: 8.2.2 - eslint-config-prettier: - specifier: ^8.10.0 - version: 8.10.0(eslint@8.38.0) - fetch-graphql-schema: - specifier: ^0.2.1 - version: 0.2.1 - husky: - specifier: ^8.0.3 - version: 8.0.3 - lint-staged: - specifier: ^13.3.0 - version: 13.3.0 - prettier: - specifier: ^2.8.8 - version: 2.8.8 - raw-loader: - specifier: ^4.0.2 - version: 4.0.2(webpack@5.91.0) - relay-compiler: - specifier: 15.0.0 - version: 15.0.0 - -packages: - - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} - engines: {node: '>=6.9.0'} - - '@emotion/babel-plugin@11.11.0': - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} - - '@emotion/cache@11.11.0': - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} - - '@emotion/css@11.11.2': - resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==} - - '@emotion/hash@0.9.1': - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - - '@emotion/is-prop-valid@0.8.8': - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - - '@emotion/is-prop-valid@1.2.2': - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - - '@emotion/memoize@0.7.4': - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - - '@emotion/memoize@0.8.1': - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - - '@emotion/react@11.11.4': - resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/serialize@1.1.4': - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} - - '@emotion/sheet@1.2.2': - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - - '@emotion/styled@11.11.5': - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/unitless@0.8.1': - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - - '@emotion/use-insertion-effect-with-fallbacks@1.0.1': - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} - peerDependencies: - react: '>=16.8.0' - - '@emotion/utils@1.2.1': - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - - '@emotion/weak-memoize@0.3.1': - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.38.0': - resolution: {integrity: sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@floating-ui/core@1.6.0': - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} - - '@floating-ui/dom@1.6.10': - resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} - - '@floating-ui/dom@1.6.3': - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} - - '@floating-ui/react-dom@2.0.8': - resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.1': - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - - '@floating-ui/utils@0.2.7': - resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} - - '@fontsource/roboto@4.5.8': - resolution: {integrity: sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==} - - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@juggle/resize-observer@3.4.0': - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - - '@mui/base@5.0.0-beta.12': - resolution: {integrity: sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/base@5.0.0-beta.40': - resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/core-downloads-tracker@5.15.15': - resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==} - - '@mui/icons-material@5.15.15': - resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/lab@5.0.0-alpha.141': - resolution: {integrity: sha512-PsW55xX2ieNLldca2hLxL1SYtZgRQv++lj1W/Jyi5Z2MHuFDcdqI7yKGrOzyIWw7ctQrmHa1FTShBiCa2wkEoQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/material@5.15.15': - resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/private-theming@5.15.14': - resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/styled-engine@5.15.14': - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - - '@mui/system@5.15.15': - resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true - - '@mui/types@7.2.14': - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/utils@5.15.14': - resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@mui/x-date-pickers@6.19.9': - resolution: {integrity: sha512-B2m4Fv/fOme5qmV6zuE3QnWQSvj3zKtI2OvikPz5prpiCcIxqpeytkQ7VfrWH3/Aqd5yhG1Yr4IgbqG0ymIXGg==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@emotion/react': ^11.9.0 - '@emotion/styled': ^11.8.1 - '@mui/material': ^5.8.6 - '@mui/system': ^5.8.0 - date-fns: ^2.25.0 || ^3.2.0 - date-fns-jalali: ^2.13.0-0 - dayjs: ^1.10.7 - luxon: ^3.0.2 - moment: ^2.29.4 - moment-hijri: ^2.1.2 - moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - date-fns: - optional: true - date-fns-jalali: - optional: true - dayjs: - optional: true - luxon: - optional: true - moment: - optional: true - moment-hijri: - optional: true - moment-jalaali: - optional: true - - '@next/env@13.4.7': - resolution: {integrity: sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==} - - '@next/eslint-plugin-next@13.3.0': - resolution: {integrity: sha512-wuGN5qSEjSgcq9fVkH0Y/qIPFjnZtW3ZPwfjJOn7l/rrf6y8J24h/lo61kwqunTyzZJm/ETGfGVU9PUs8cnzEA==} - - '@next/swc-darwin-arm64@13.4.7': - resolution: {integrity: sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@13.4.7': - resolution: {integrity: sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@13.4.7': - resolution: {integrity: sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@13.4.7': - resolution: {integrity: sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@13.4.7': - resolution: {integrity: sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@13.4.7': - resolution: {integrity: sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@13.4.7': - resolution: {integrity: sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-ia32-msvc@13.4.7': - resolution: {integrity: sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@13.4.7': - resolution: {integrity: sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - - '@react-dnd/asap@5.0.2': - resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} - - '@react-dnd/invariant@4.0.2': - resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} - - '@react-dnd/shallowequal@4.0.2': - resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} - - '@react-hook/latest@1.0.3': - resolution: {integrity: sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==} - peerDependencies: - react: '>=16.8' - - '@react-hook/passive-layout-effect@1.2.1': - resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} - peerDependencies: - react: '>=16.8' - - '@react-hook/resize-observer@1.2.6': - resolution: {integrity: sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==} - peerDependencies: - react: '>=16.8' - - '@rushstack/eslint-patch@1.10.2': - resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} - - '@swc/helpers@0.5.1': - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} - - '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - - '@types/d3-path@3.1.0': - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - - '@types/d3-shape@3.1.6': - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@8.56.9': - resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/hoist-non-react-statics@3.3.5': - resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} - - '@types/is-hotkey@0.1.10': - resolution: {integrity: sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - - '@types/node@18.15.12': - resolution: {integrity: sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - - '@types/pdfobject@2.2.5': - resolution: {integrity: sha512-7gD5tqc/RUDq0PyoLemL0vEHxBYi+zY0WVaFAx/Y0jBsXFgot1vB9No1GhDZGwRGJMCIZbgAb74QG9MTyTNU/g==} - - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - - '@types/react-dom@18.0.11': - resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} - - '@types/react-relay@14.1.3': - resolution: {integrity: sha512-tsu+3jN0zeOYKV485fwUy3yMEZWkDVzC2JG0tJgEH6p9tcPQkBAUoXqEZFwSBtHtNo1etfa1Eityg3fC55qDvQ==} - - '@types/react-transition-group@4.4.10': - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} - - '@types/react@18.0.37': - resolution: {integrity: sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==} - - '@types/relay-runtime@14.1.10': - resolution: {integrity: sha512-px/vskDhwlsh+fRiF9s9TBB84U6FbCfFzdgusnVtN8iQ3lLebHlt/v1v6YzpqUZFDXZxvC6GWUbhXcCfSZwN9A==} - - '@types/scheduler@0.23.0': - resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} - - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@vidstack/react@1.12.9': - resolution: {integrity: sha512-2YBkMN590u20P9JVw6EoaAegVz4YP7utxeRXuDkzvn60UG8Ky6v4CdywFaBAHBrxyRefiCJTLB5noDmIRyVplg==} - engines: {node: '>=18'} - peerDependencies: - '@types/react': ^18.0.0 - react: ^18.0.0 - - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} - - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} - - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} - - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - - array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - - attr-accept@2.2.2: - resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} - engines: {node: '>=4'} - - autoprefixer@10.4.14: - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} - engines: {node: '>=4'} - - axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} - - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - camelcase-keys@2.1.0: - resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} - engines: {node: '>=0.10.0'} - - camelcase@2.1.1: - resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} - engines: {node: '>=0.10.0'} - - caniuse-lite@1.0.30001611: - resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} - - canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} - - chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} - engines: {node: '>=6'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - compute-scroll-into-view@1.0.20: - resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - currently-unhandled@0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - d3-voronoi@1.1.4: - resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} - - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - - dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decimal.js-light@2.5.1: - resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} - - decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@2.2.1: - resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} - engines: {node: '>=0.10.0'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delaunator@4.0.1: - resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==} - - delaunay-find@0.0.6: - resolution: {integrity: sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - direction@1.0.4: - resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} - hasBin: true - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - dnd-core@16.0.1: - resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - electron-to-chromium@1.4.740: - resolution: {integrity: sha512-Yvg5i+iyv7Xm18BRdVPVm8lc7kgxM3r6iwqCH2zB7QZy1kZRNmd0Zqm0zcD9XoFREE5/5rwIuIAOT+/mzGcnZg==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.5.0: - resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-next@13.3.0: - resolution: {integrity: sha512-6YEwmFBX0VjBd3ODGW9df0Is0FLaRFdMN8eAahQG9CN6LjQ28J8AFr19ngxqMSg7Qv6Uca/3VeeBosJh1bzu0w==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-config-prettier@8.10.0: - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.6.1: - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsx-a11y@6.8.0: - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.34.1: - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.38.0: - resolution: {integrity: sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} - engines: {node: '>=6.0.0'} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fbjs-css-vars@1.0.2: - resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - - fbjs@3.0.5: - resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} - - fetch-graphql-schema@0.2.1: - resolution: {integrity: sha512-XtP692mntCOZRVOnAkZcco3W+2LprOl5Jk3Y0lKG5PJfnnj5Ict/vhMevQT15Dfdt7SZMjLGdr4fD7PbDQXEoQ==} - engines: {node: '>=0.12.0'} - hasBin: true - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-selector@0.6.0: - resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} - engines: {node: '>= 12'} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - - formik@2.4.5: - resolution: {integrity: sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==} - peerDependencies: - react: '>=16.8.0' - - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - - framer-motion@10.18.0: - resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-stdin@4.0.1: - resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} - engines: {node: '>=0.10.0'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - - graphql@0.8.2: - resolution: {integrity: sha512-4wpUsDXiewqUCxr0bt5wOk5dV/EIsWRVaB5RmWKhZrAT9ewpOwql2GrhMq1l6WyOrBV/n5GqvXSzKsCwubqwoA==} - - has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - - husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - - immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@2.1.0: - resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} - engines: {node: '>=0.10.0'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - - is-finite@1.1.0: - resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hotkey@0.1.8: - resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} - - is-hotkey@0.2.0: - resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - iterall@1.0.2: - resolution: {integrity: sha512-RaKa8RHmSay1GvkTLOYRT8Ju9/Cf0DRK9z7YzS14sID4e2hkP4eknzDhTtzTboO8shZIysbVEEnmjJEHxOVIMQ==} - - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - - js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - jwt-decode@3.1.2: - resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lint-staged@13.3.0: - resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true - - listr2@6.6.1: - resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} - engines: {node: '>=16.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - - load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loud-rejection@1.6.0: - resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} - engines: {node: '>=0.10.0'} - - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - make-cancellable-promise@1.3.2: - resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} - - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - - make-event-props@1.6.2: - resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - media-captions@1.0.4: - resolution: {integrity: sha512-cyDNmuZvvO4H27rcBq2Eudxo9IZRDCOX/I7VEyqbxsEiD2Ei7UYUhG/Sc5fvMZjmathgz3fEK7iAKqvpY+Ux1w==} - engines: {node: '>=16'} - - meow@3.7.0: - resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} - engines: {node: '>=0.10.0'} - - merge-refs@1.3.0: - resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nan@2.20.0: - resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - next@13.4.7: - resolution: {integrity: sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==} - engines: {node: '>=16.8.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - fibers: '>= 3.1.0' - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - fibers: - optional: true - sass: - optional: true - - node-fetch@1.7.3: - resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - - nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - - oidc-client-ts@2.4.0: - resolution: {integrity: sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==} - engines: {node: '>=12.13.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} - - path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - path2d-polyfill@2.0.1: - resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} - engines: {node: '>=8'} - - pdfjs-dist@3.11.174: - resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} - engines: {node: '>=18'} - - pdfobject@2.3.0: - resolution: {integrity: sha512-w/9pXDXTDs3IDmOri/w8lM/w6LHR0/F4fcBLLzH+4csSoyshQ5su0TE7k0FLHZO7aOjVLDGecqd1M89+PVpVAA==} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss-import@14.1.0: - resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-nested@6.0.0: - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - property-expr@2.0.6: - resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - raw-loader@4.0.2: - resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - react-confetti@6.1.0: - resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==} - engines: {node: '>=10.18'} - peerDependencies: - react: ^16.3.0 || ^17.0.1 || ^18.0.0 - - react-dnd-html5-backend@16.0.1: - resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} - - react-dnd@16.0.1: - resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} - peerDependencies: - '@types/hoist-non-react-statics': '>= 3.3.1' - '@types/node': '>= 12' - '@types/react': '>= 16' - react: '>= 16.14' - peerDependenciesMeta: - '@types/hoist-non-react-statics': - optional: true - '@types/node': - optional: true - '@types/react': - optional: true - - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - - react-dropzone@14.2.3: - resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} - engines: {node: '>= 10.13'} - peerDependencies: - react: '>= 16.8 || 18.0.0' - - react-error-boundary@4.0.13: - resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} - peerDependencies: - react: '>=16.13.1' - - react-fast-compare@2.0.4: - resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==} - - react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - - react-oidc-context@2.3.1: - resolution: {integrity: sha512-WdhmEU6odNzMk9pvOScxUkf6/1aduiI/nQryr7+iCl2VDnYLASDTIV/zy58KuK4VXG3fBaRKukc/mRpMjF9a3Q==} - engines: {node: '>=12.13.0'} - peerDependencies: - oidc-client-ts: ^2.2.1 - react: '>=16.8.0' - - react-pdf@7.7.3: - resolution: {integrity: sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-relay@15.0.0: - resolution: {integrity: sha512-KWdeMMKMJanOL9LsGZYkyAekayYIi+Y4mbDM8VYbHVPgTWJWAQP6yJKS+V4D17qIMo1L84QJQjGaQWEG139p9Q==} - peerDependencies: - react: ^16.9.0 || ^17 || ^18 - - react-smooth@4.0.1: - resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' - - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - - read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - - read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - recharts-scale@0.4.5: - resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} - - recharts@2.12.5: - resolution: {integrity: sha512-Cy+BkqrFIYTHJCyKHJEPvbHE2kVQEP6PKbOHJ8ztRGTAhvHuUnCwDaKVb13OwRFZ0QNUk1QvGTDdgWSMbuMtKw==} - engines: {node: '>=14'} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 - - redent@1.0.0: - resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} - engines: {node: '>=0.10.0'} - - redux@4.2.1: - resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} - - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - relay-compiler@15.0.0: - resolution: {integrity: sha512-19gIIdrVe/lk7Dkz/hqxpBd54bBDWAKG+kR5ael+xznJPdjlr/rlAmh5Tqi6Mgf/wiEQGdtKiZqeNdOW2/wVRw==} - hasBin: true - - relay-runtime@15.0.0: - resolution: {integrity: sha512-7AXkXLQo6gpJNBhk4Kii5b+Yat62HSDD1TgJBi021iSjT1muI8iYd4UZG4f/If209LmaVjkZt2HTNAlk6xtslw==} - - repeating@2.0.1: - resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} - engines: {node: '>=0.10.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - scroll-into-view-if-needed@2.2.31: - resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slate-history@0.93.0: - resolution: {integrity: sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g==} - peerDependencies: - slate: '>=0.65.3' - - slate-react@0.98.4: - resolution: {integrity: sha512-8Of3v9hFuX8rIRc86LuuBhU9t8ps+9ARKL4yyhCrKQYZ93Ep/LFA3GvPGvtf3zYuVadZ8tkhRH8tbHOGNAndLw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - slate: '>=0.65.3' - - slate@0.94.1: - resolution: {integrity: sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA==} - - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-indent@1.0.1: - resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} - engines: {node: '>=0.10.0'} - hasBin: true - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - - stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tailwindcss@3.3.1: - resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} - engines: {node: '>=12.13.0'} - hasBin: true - peerDependencies: - postcss: ^8.0.9 - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.30.3: - resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} - engines: {node: '>=10'} - hasBin: true - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - tiny-case@1.0.3: - resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - - tiny-invariant@1.0.6: - resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - trim-newlines@1.0.0: - resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} - engines: {node: '>=0.10.0'} - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - - tween-functions@1.2.0: - resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - - ua-parser-js@1.0.37: - resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - usehooks-ts@3.1.0: - resolution: {integrity: sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==} - engines: {node: '>=16.15.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - victory-area@36.9.2: - resolution: {integrity: sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==} - peerDependencies: - react: '>=16.6.0' - - victory-axis@36.9.2: - resolution: {integrity: sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==} - peerDependencies: - react: '>=16.6.0' - - victory-bar@36.9.2: - resolution: {integrity: sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==} - peerDependencies: - react: '>=16.6.0' - - victory-box-plot@36.9.2: - resolution: {integrity: sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==} - peerDependencies: - react: '>=16.6.0' - - victory-brush-container@36.9.2: - resolution: {integrity: sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==} - peerDependencies: - react: '>=16.6.0' - - victory-brush-line@36.9.2: - resolution: {integrity: sha512-/ncj8HEyl73fh8bhU4Iqe79DL62QP2rWWoogINxsGvndrhpFbL9tj7IPSEawi+riOh/CmohgI/ETu/V7QU9cJw==} - peerDependencies: - react: '>=16.6.0' - - victory-candlestick@36.9.2: - resolution: {integrity: sha512-hbStzF61GHkkflJWFgLTZSR8SOm8siJn65rwApLJBIA283yWOlyPjdr/kIQtO/h5QkIiXIuLb7RyiUAJEnH9WA==} - peerDependencies: - react: '>=16.6.0' - - victory-canvas@36.9.2: - resolution: {integrity: sha512-ImHJ7JQCpQ9aGCsh37EeVAmqJc7R0gl2CLM99gP9GfuJuZeoZ/GVfX6QFamfr19rYQOD2m9pVbecySBzdYI1zQ==} - peerDependencies: - react: '>=16.6.0' - - victory-chart@36.9.2: - resolution: {integrity: sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==} - peerDependencies: - react: '>=16.6.0' - - victory-core@36.9.2: - resolution: {integrity: sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==} - peerDependencies: - react: '>=16.6.0' - - victory-create-container@36.9.2: - resolution: {integrity: sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==} - peerDependencies: - react: '>=16.6.0' - - victory-cursor-container@36.9.2: - resolution: {integrity: sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==} - peerDependencies: - react: '>=16.6.0' - - victory-errorbar@36.9.2: - resolution: {integrity: sha512-i/WPMN6/7F55FpEpN9WcwiWwaFJ+2ymfTgfBDLkUD3XJ52HGen4BxUt1ouwDA3FXz9kLa/h6Wbp/fnRhX70row==} - peerDependencies: - react: '>=16.6.0' - - victory-group@36.9.2: - resolution: {integrity: sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==} - peerDependencies: - react: '>=16.6.0' - - victory-histogram@36.9.2: - resolution: {integrity: sha512-w0ipFwWZ533qyqduRacr5cf+H4PGAUTdWNyGvZbWyu4+GtYYjGdoOolfUcO1ee8VJ1kZodpG8Z7ud6I/GWIzjQ==} - peerDependencies: - react: '>=16.6.0' - - victory-legend@36.9.2: - resolution: {integrity: sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==} - peerDependencies: - react: '>=16.6.0' - - victory-line@36.9.2: - resolution: {integrity: sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==} - peerDependencies: - react: '>=16.6.0' - - victory-pie@36.9.2: - resolution: {integrity: sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==} - peerDependencies: - react: '>=16.6.0' - - victory-polar-axis@36.9.2: - resolution: {integrity: sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==} - peerDependencies: - react: '>=16.6.0' - - victory-scatter@36.9.2: - resolution: {integrity: sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==} - peerDependencies: - react: '>=16.6.0' - - victory-selection-container@36.9.2: - resolution: {integrity: sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==} - peerDependencies: - react: '>=16.6.0' - - victory-shared-events@36.9.2: - resolution: {integrity: sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==} - peerDependencies: - react: '>=16.6.0' - - victory-stack@36.9.2: - resolution: {integrity: sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==} - peerDependencies: - react: '>=16.6.0' - - victory-tooltip@36.9.2: - resolution: {integrity: sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==} - peerDependencies: - react: '>=16.6.0' - - victory-vendor@36.9.2: - resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} - - victory-voronoi-container@36.9.2: - resolution: {integrity: sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==} - peerDependencies: - react: '>=16.6.0' - - victory-voronoi@36.9.2: - resolution: {integrity: sha512-50fq0UBTAFxxU+nabOIPE5P2v/2oAbGAX+Ckz6lu8LFwwig4J1DSz0/vQudqDGjzv3JNEdqTD4FIpyjbxLcxiA==} - peerDependencies: - react: '>=16.6.0' - - victory-zoom-container@36.9.2: - resolution: {integrity: sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==} - peerDependencies: - react: '>=16.6.0' - - victory@36.9.2: - resolution: {integrity: sha512-kgVgiSno4KpD0HxmUo5GzqWI4P/eILLOM6AmJfAlagCnOzrtYGsAw+N1YxOcYvTiKsh/zmWawxHlpw3TMenFDQ==} - peerDependencies: - react: '>=16.6.0' - - warning@4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - - webpack@5.91.0: - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yup@1.4.0: - resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} - - zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - -snapshots: +packages: - '@aashutoshrathi/word-wrap@1.2.6': {} + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} - '@babel/code-frame@7.24.2': + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 + dev: false - '@babel/helper-module-imports@7.24.3': + /@babel/helper-module-imports@7.24.3: + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 + dev: false - '@babel/helper-string-parser@7.24.1': {} + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: false - '@babel/helper-validator-identifier@7.22.20': {} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: false - '@babel/highlight@7.24.2': + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 + dev: false - '@babel/runtime@7.24.4': + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 - '@babel/types@7.24.0': + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: false - '@emotion/babel-plugin@11.11.0': + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.24.3 '@babel/runtime': 7.24.4 @@ -3385,40 +261,64 @@ snapshots: find-root: 1.1.0 source-map: 0.5.7 stylis: 4.2.0 + dev: false - '@emotion/cache@11.11.0': + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} dependencies: '@emotion/memoize': 0.8.1 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 stylis: 4.2.0 + dev: false - '@emotion/css@11.11.2': + /@emotion/css@11.11.2: + resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==} dependencies: '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 + dev: false - '@emotion/hash@0.9.1': {} + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false - '@emotion/is-prop-valid@0.8.8': + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true dependencies: '@emotion/memoize': 0.7.4 + dev: false optional: true - '@emotion/is-prop-valid@1.2.2': + /@emotion/is-prop-valid@1.2.2: + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} dependencies: '@emotion/memoize': 0.8.1 + dev: false - '@emotion/memoize@0.7.4': + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true + dev: false optional: true - '@emotion/memoize@0.8.1': {} + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false - '@emotion/react@11.11.4(@types/react@18.0.37)(react@18.2.0)': + /@emotion/react@11.11.4(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 @@ -3430,18 +330,31 @@ snapshots: '@types/react': 18.0.37 hoist-non-react-statics: 3.3.2 react: 18.2.0 + dev: false - '@emotion/serialize@1.1.4': + /@emotion/serialize@1.1.4: + resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} dependencies: '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 csstype: 3.1.3 + dev: false - '@emotion/sheet@1.2.2': {} + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false - '@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.0.37)(react@18.2.0)': + /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@emotion/babel-plugin': 11.11.0 @@ -3452,25 +365,44 @@ snapshots: '@emotion/utils': 1.2.1 '@types/react': 18.0.37 react: 18.2.0 + dev: false - '@emotion/unitless@0.8.1': {} + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false - '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' dependencies: react: 18.2.0 + dev: false - '@emotion/utils@1.2.1': {} + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false - '@emotion/weak-memoize@0.3.1': {} + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false - '@eslint-community/eslint-utils@4.4.0(eslint@8.38.0)': + /@eslint-community/eslint-utils@4.4.0(eslint@8.38.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: eslint: 8.38.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -3484,35 +416,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.38.0': {} + /@eslint/js@8.38.0: + resolution: {integrity: sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@floating-ui/core@1.6.0': + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: '@floating-ui/utils': 0.2.1 + dev: false - '@floating-ui/dom@1.6.10': + /@floating-ui/dom@1.6.10: + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.7 + dev: false - '@floating-ui/dom@1.6.3': + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 + dev: false - '@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0)': + /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' dependencies: '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false - '@floating-ui/utils@0.2.1': {} + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false - '@floating-ui/utils@0.2.7': {} + /@floating-ui/utils@0.2.7: + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + dev: false - '@fontsource/roboto@4.5.8': {} + /@fontsource/roboto@4.5.8: + resolution: {integrity: sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA==} + dev: false - '@humanwhocodes/config-array@0.11.14': + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 @@ -3520,44 +473,65 @@ snapshots: transitivePeerDependencies: - supports-color - '@humanwhocodes/module-importer@1.0.1': {} + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': {} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - '@isaacs/cliui@8.0.2': + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} dependencies: string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 + string-width-cjs: /string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 + strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false - '@jridgewell/gen-mapping@0.3.5': + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.2': {} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': {} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 + dev: true - '@jridgewell/sourcemap-codec@1.4.15': {} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.25': + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@juggle/resize-observer@3.4.0': {} + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: false - '@mapbox/node-pre-gyp@1.0.11': + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + requiresBuild: true dependencies: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 @@ -3571,9 +545,19 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + dev: false optional: true - '@mui/base@5.0.0-beta.12(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0)': + /@mui/base@5.0.0-beta.12(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tZjjXNAyUpwSDT1uRliZMhRQkWYzELJ8Qi61EuOMRpi36HIwnK2T7Nr4RI423Sv8G2EEikDAZj7je33eNd73NQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@emotion/is-prop-valid': 1.2.2 @@ -3587,8 +571,18 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.2.0 + dev: false - '@mui/base@5.0.0-beta.40(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0)': + /@mui/base@5.0.0-beta.40(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) @@ -3600,17 +594,46 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false - '@mui/core-downloads-tracker@5.15.15': {} + /@mui/core-downloads-tracker@5.15.15: + resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==} + dev: false - '@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.0.37)(react@18.2.0)': + /@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.0.37 react: 18.2.0 + dev: false - '@mui/lab@5.0.0-alpha.141(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0)': + /@mui/lab@5.0.0-alpha.141(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PsW55xX2ieNLldca2hLxL1SYtZgRQv++lj1W/Jyi5Z2MHuFDcdqI7yKGrOzyIWw7ctQrmHa1FTShBiCa2wkEoQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.0.37)(react@18.2.0) @@ -3626,8 +649,24 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.2.0 + dev: false - '@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0)': + /@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.0.37)(react@18.2.0) @@ -3646,16 +685,37 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-is: 18.2.0 react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + dev: false - '@mui/private-theming@5.15.14(@types/react@18.0.37)(react@18.2.0)': + /@mui/private-theming@5.15.14(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@mui/utils': 5.15.14(@types/react@18.0.37)(react@18.2.0) '@types/react': 18.0.37 prop-types: 15.8.1 react: 18.2.0 + dev: false - '@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0)': + /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0): + resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true dependencies: '@babel/runtime': 7.24.4 '@emotion/cache': 11.11.0 @@ -3664,8 +724,23 @@ snapshots: csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 + dev: false - '@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react@18.2.0)': + /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.0.37)(react@18.2.0) @@ -3679,12 +754,28 @@ snapshots: csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 + dev: false - '@mui/types@7.2.14(@types/react@18.0.37)': + /@mui/types@7.2.14(@types/react@18.0.37): + resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@types/react': 18.0.37 + dev: false - '@mui/utils@5.15.14(@types/react@18.0.37)(react@18.2.0)': + /@mui/utils@5.15.14(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@babel/runtime': 7.24.4 '@types/prop-types': 15.7.12 @@ -3692,8 +783,44 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 + dev: false - '@mui/x-date-pickers@6.19.9(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@mui/system@5.15.15)(@types/react@18.0.37)(date-fns@2.30.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0)': + /@mui/x-date-pickers@6.19.9(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@mui/system@5.15.15)(@types/react@18.0.37)(date-fns@2.30.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-B2m4Fv/fOme5qmV6zuE3QnWQSvj3zKtI2OvikPz5prpiCcIxqpeytkQ7VfrWH3/Aqd5yhG1Yr4IgbqG0ymIXGg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.9.0 + '@emotion/styled': ^11.8.1 + '@mui/material': ^5.8.6 + '@mui/system': ^5.8.0 + date-fns: ^2.25.0 || ^3.2.0 + date-fns-jalali: ^2.13.0-0 + dayjs: ^1.10.7 + luxon: ^3.0.2 + moment: ^2.29.4 + moment-hijri: ^2.1.2 + moment-jalaali: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + date-fns: + optional: true + date-fns-jalali: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + moment-hijri: + optional: true + moment-jalaali: + optional: true dependencies: '@babel/runtime': 7.24.4 '@emotion/react': 11.11.4(@types/react@18.0.37)(react@18.2.0) @@ -3712,165 +839,316 @@ snapshots: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@types/react' + dev: false - '@next/env@13.4.7': {} + /@next/env@13.4.7: + resolution: {integrity: sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==} + dev: false - '@next/eslint-plugin-next@13.3.0': + /@next/eslint-plugin-next@13.3.0: + resolution: {integrity: sha512-wuGN5qSEjSgcq9fVkH0Y/qIPFjnZtW3ZPwfjJOn7l/rrf6y8J24h/lo61kwqunTyzZJm/ETGfGVU9PUs8cnzEA==} dependencies: glob: 7.1.7 + dev: false - '@next/swc-darwin-arm64@13.4.7': + /@next/swc-darwin-arm64@13.4.7: + resolution: {integrity: sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@next/swc-darwin-x64@13.4.7': + /@next/swc-darwin-x64@13.4.7: + resolution: {integrity: sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-arm64-gnu@13.4.7': + /@next/swc-linux-arm64-gnu@13.4.7: + resolution: {integrity: sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-arm64-musl@13.4.7': + /@next/swc-linux-arm64-musl@13.4.7: + resolution: {integrity: sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-x64-gnu@13.4.7': + /@next/swc-linux-x64-gnu@13.4.7: + resolution: {integrity: sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-linux-x64-musl@13.4.7': + /@next/swc-linux-x64-musl@13.4.7: + resolution: {integrity: sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-arm64-msvc@13.4.7': + /@next/swc-win32-arm64-msvc@13.4.7: + resolution: {integrity: sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-ia32-msvc@13.4.7': + /@next/swc-win32-ia32-msvc@13.4.7: + resolution: {integrity: sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false optional: true - '@next/swc-win32-x64-msvc@13.4.7': + /@next/swc-win32-x64-msvc@13.4.7: + resolution: {integrity: sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false optional: true - '@nodelib/fs.scandir@2.1.5': + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - '@nodelib/fs.walk@1.2.8': + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@pkgjs/parseargs@0.11.0': + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false optional: true - '@popperjs/core@2.11.8': {} + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false - '@react-dnd/asap@5.0.2': {} + /@react-dnd/asap@5.0.2: + resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} + dev: false - '@react-dnd/invariant@4.0.2': {} + /@react-dnd/invariant@4.0.2: + resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} + dev: false - '@react-dnd/shallowequal@4.0.2': {} + /@react-dnd/shallowequal@4.0.2: + resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} + dev: false - '@react-hook/latest@1.0.3(react@18.2.0)': + /@react-hook/latest@1.0.3(react@18.2.0): + resolution: {integrity: sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==} + peerDependencies: + react: '>=16.8' dependencies: react: 18.2.0 + dev: false - '@react-hook/passive-layout-effect@1.2.1(react@18.2.0)': + /@react-hook/passive-layout-effect@1.2.1(react@18.2.0): + resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} + peerDependencies: + react: '>=16.8' dependencies: react: 18.2.0 + dev: false - '@react-hook/resize-observer@1.2.6(react@18.2.0)': + /@react-hook/resize-observer@1.2.6(react@18.2.0): + resolution: {integrity: sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==} + peerDependencies: + react: '>=16.8' dependencies: '@juggle/resize-observer': 3.4.0 '@react-hook/latest': 1.0.3(react@18.2.0) '@react-hook/passive-layout-effect': 1.2.1(react@18.2.0) react: 18.2.0 + dev: false - '@rushstack/eslint-patch@1.10.2': {} + /@rushstack/eslint-patch@1.10.2: + resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} + dev: false - '@swc/helpers@0.5.1': + /@swc/helpers@0.5.1: + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: tslib: 2.6.2 + dev: false - '@types/d3-array@3.2.1': {} + /@types/d3-array@3.2.1: + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + dev: false - '@types/d3-color@3.1.3': {} + /@types/d3-color@3.1.3: + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + dev: false - '@types/d3-ease@3.0.2': {} + /@types/d3-ease@3.0.2: + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + dev: false - '@types/d3-interpolate@3.0.4': + /@types/d3-interpolate@3.0.4: + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} dependencies: '@types/d3-color': 3.1.3 + dev: false - '@types/d3-path@3.1.0': {} + /@types/d3-path@3.1.0: + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + dev: false - '@types/d3-scale@4.0.8': + /@types/d3-scale@4.0.8: + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} dependencies: '@types/d3-time': 3.0.3 + dev: false - '@types/d3-shape@3.1.6': + /@types/d3-shape@3.1.6: + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} dependencies: '@types/d3-path': 3.1.0 + dev: false - '@types/d3-time@3.0.3': {} + /@types/d3-time@3.0.3: + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + dev: false - '@types/d3-timer@3.0.2': {} + /@types/d3-timer@3.0.2: + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + dev: false - '@types/eslint-scope@3.7.7': + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: '@types/eslint': 8.56.9 '@types/estree': 1.0.5 + dev: true - '@types/eslint@8.56.9': + /@types/eslint@8.56.9: + resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 + dev: true - '@types/estree@1.0.5': {} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true - '@types/hoist-non-react-statics@3.3.5': + /@types/hoist-non-react-statics@3.3.5: + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} dependencies: '@types/react': 18.0.37 hoist-non-react-statics: 3.3.2 + dev: false - '@types/is-hotkey@0.1.10': {} + /@types/is-hotkey@0.1.10: + resolution: {integrity: sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==} + dev: false - '@types/json-schema@7.0.15': {} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true - '@types/json5@0.0.29': {} + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: false - '@types/lodash@4.17.0': {} + /@types/lodash@4.17.0: + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + dev: false - '@types/node@18.15.12': {} + /@types/node@18.15.12: + resolution: {integrity: sha512-Wha1UwsB3CYdqUm2PPzh/1gujGCNtWVUYF0mB00fJFoR4gTyWTDPjSm+zBF787Ahw8vSGgBja90MkgFwvB86Dg==} - '@types/parse-json@4.0.2': {} + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false - '@types/pdfobject@2.2.5': {} + /@types/pdfobject@2.2.5: + resolution: {integrity: sha512-7gD5tqc/RUDq0PyoLemL0vEHxBYi+zY0WVaFAx/Y0jBsXFgot1vB9No1GhDZGwRGJMCIZbgAb74QG9MTyTNU/g==} + dev: false - '@types/prop-types@15.7.12': {} + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - '@types/react-dom@18.0.11': + /@types/react-dom@18.0.11: + resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} dependencies: '@types/react': 18.0.37 + dev: false - '@types/react-relay@14.1.3': + /@types/react-relay@14.1.3: + resolution: {integrity: sha512-tsu+3jN0zeOYKV485fwUy3yMEZWkDVzC2JG0tJgEH6p9tcPQkBAUoXqEZFwSBtHtNo1etfa1Eityg3fC55qDvQ==} dependencies: '@types/react': 18.0.37 '@types/relay-runtime': 14.1.10 + dev: true - '@types/react-transition-group@4.4.10': + /@types/react-transition-group@4.4.10: + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} dependencies: '@types/react': 18.0.37 + dev: false - '@types/react@18.0.37': + /@types/react@18.0.37: + resolution: {integrity: sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==} dependencies: '@types/prop-types': 15.7.12 '@types/scheduler': 0.23.0 csstype: 3.1.3 - '@types/relay-runtime@14.1.10': {} + /@types/relay-runtime@14.1.10: + resolution: {integrity: sha512-px/vskDhwlsh+fRiF9s9TBB84U6FbCfFzdgusnVtN8iQ3lLebHlt/v1v6YzpqUZFDXZxvC6GWUbhXcCfSZwN9A==} + dev: true - '@types/scheduler@0.23.0': {} + /@types/scheduler@0.23.0: + resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} - '@typescript-eslint/parser@5.62.0(eslint@8.38.0)(typescript@5.0.4)': + /@typescript-eslint/parser@5.62.0(eslint@8.38.0)(typescript@5.0.4): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 @@ -3880,15 +1158,29 @@ snapshots: typescript: 5.0.4 transitivePeerDependencies: - supports-color + dev: false - '@typescript-eslint/scope-manager@5.62.0': + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 + dev: false - '@typescript-eslint/types@5.62.0': {} + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.0.4)': + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.0.4): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -3900,56 +1192,87 @@ snapshots: typescript: 5.0.4 transitivePeerDependencies: - supports-color + dev: false - '@typescript-eslint/visitor-keys@5.62.0': + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 + dev: false - '@vidstack/react@1.12.9(@types/react@18.0.37)(react@18.2.0)': + /@vidstack/react@1.12.9(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-2YBkMN590u20P9JVw6EoaAegVz4YP7utxeRXuDkzvn60UG8Ky6v4CdywFaBAHBrxyRefiCJTLB5noDmIRyVplg==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^18.0.0 + react: ^18.0.0 dependencies: '@floating-ui/dom': 1.6.10 '@types/react': 18.0.37 media-captions: 1.0.4 react: 18.2.0 + dev: false - '@webassemblyjs/ast@1.12.1': + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true - '@webassemblyjs/helper-api-error@1.11.6': {} + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true - '@webassemblyjs/helper-buffer@1.12.1': {} + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + dev: true - '@webassemblyjs/helper-numbers@1.11.6': + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 + dev: true - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true - '@webassemblyjs/helper-wasm-section@1.12.1': + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.12.1 + dev: true - '@webassemblyjs/ieee754@1.11.6': + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 + dev: true - '@webassemblyjs/leb128@1.11.6': + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 + dev: true - '@webassemblyjs/utf8@1.11.6': {} + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true - '@webassemblyjs/wasm-edit@1.12.1': + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 @@ -3959,23 +1282,29 @@ snapshots: '@webassemblyjs/wasm-opt': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 '@webassemblyjs/wast-printer': 1.12.1 + dev: true - '@webassemblyjs/wasm-gen@1.12.1': + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 + dev: true - '@webassemblyjs/wasm-opt@1.12.1': + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 + dev: true - '@webassemblyjs/wasm-parser@1.12.1': + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 @@ -3983,101 +1312,176 @@ snapshots: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 + dev: true - '@webassemblyjs/wast-printer@1.12.1': + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} dependencies: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 + dev: true - '@xtuc/ieee754@1.2.0': {} + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true - '@xtuc/long@4.2.2': {} + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true - abbrev@1.1.1: + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + requiresBuild: true + dev: false optional: true - acorn-import-assertions@1.9.0(acorn@8.11.3): + /acorn-import-assertions@1.9.0(acorn@8.11.3): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 dependencies: acorn: 8.11.3 + dev: true - acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.11.3 - acorn@8.11.3: {} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true - agent-base@6.0.2: + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + requiresBuild: true dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: false optional: true - ajv-keywords@3.5.2(ajv@6.12.6): + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 dependencies: ajv: 6.12.6 + dev: true - ajv@6.12.6: + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-escapes@5.0.0: + /ansi-escapes@5.0.0: + resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} + engines: {node: '>=12'} dependencies: type-fest: 1.4.0 + dev: true - ansi-regex@2.1.1: {} + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true - ansi-regex@5.0.1: {} + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - ansi-regex@6.0.1: {} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} - ansi-styles@2.2.1: {} + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true - ansi-styles@3.2.1: + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: false - ansi-styles@4.3.0: + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} - any-promise@1.3.0: {} + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false - anymatch@3.1.3: + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + dev: false - aproba@2.0.0: + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + requiresBuild: true + dev: false optional: true - are-we-there-yet@2.0.0: + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + requiresBuild: true dependencies: delegates: 1.0.0 readable-stream: 3.6.2 + dev: false optional: true - arg@5.0.2: {} + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false - argparse@2.0.1: {} + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: dequal: 2.0.3 + dev: false - array-buffer-byte-length@1.0.1: + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 + dev: false - array-find-index@1.0.2: {} + /array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true - array-includes@3.1.8: + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -4085,10 +1489,16 @@ snapshots: es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 + dev: false - array-union@2.1.0: {} + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false - array.prototype.findlast@1.2.5: + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -4096,8 +1506,11 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 + dev: false - array.prototype.findlastindex@1.2.5: + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -4105,37 +1518,50 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 + dev: false - array.prototype.flat@1.3.2: + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 + dev: false - array.prototype.flatmap@1.3.2: + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 + dev: false - array.prototype.toreversed@1.1.2: + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 + dev: false - array.prototype.tosorted@1.1.3: + /array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 + dev: false - arraybuffer.prototype.slice@1.0.3: + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -4145,14 +1571,27 @@ snapshots: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 + dev: false - asap@2.0.6: {} + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false - ast-types-flow@0.0.8: {} + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: false - attr-accept@2.2.2: {} + /attr-accept@2.2.2: + resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} + engines: {node: '>=4'} + dev: false - autoprefixer@10.4.14(postcss@8.4.23): + /autoprefixer@10.4.14(postcss@8.4.23): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 dependencies: browserslist: 4.23.0 caniuse-lite: 1.0.30001611 @@ -4161,77 +1600,126 @@ snapshots: picocolors: 1.0.0 postcss: 8.4.23 postcss-value-parser: 4.2.0 + dev: false - available-typed-arrays@1.0.7: + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} dependencies: possible-typed-array-names: 1.0.0 + dev: false - axe-core@4.7.0: {} + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + dev: false - axobject-query@3.2.1: + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: dequal: 2.0.3 + dev: false - babel-plugin-macros@3.1.0: + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} dependencies: '@babel/runtime': 7.24.4 cosmiconfig: 7.1.0 resolve: 1.22.8 + dev: false - balanced-match@1.0.2: {} + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - big.js@5.2.2: {} + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true - binary-extensions@2.3.0: {} + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: false - brace-expansion@1.1.11: + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 + dev: false - braces@3.0.2: + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - browserslist@4.23.0: + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true dependencies: caniuse-lite: 1.0.30001611 electron-to-chromium: 1.4.740 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - buffer-from@1.1.2: {} + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true - busboy@1.6.0: + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 + dev: false - call-bind@1.0.7: + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.2 + dev: false - callsites@3.1.0: {} + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - camelcase-css@2.0.1: {} + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false - camelcase-keys@2.1.0: + /camelcase-keys@2.1.0: + resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} + engines: {node: '>=0.10.0'} dependencies: camelcase: 2.1.1 map-obj: 1.0.1 + dev: true - camelcase@2.1.1: {} + /camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + dev: true - caniuse-lite@1.0.30001611: {} + /caniuse-lite@1.0.30001611: + resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} - canvas@2.11.2: + /canvas@2.11.2: + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} + requiresBuild: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 nan: 2.20.0 @@ -4239,30 +1727,44 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + dev: false optional: true - chalk@1.1.3: + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 supports-color: 2.0.0 + dev: true - chalk@2.4.2: + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: false - chalk@4.1.2: + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true - chokidar@3.6.0: + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -4273,59 +1775,108 @@ snapshots: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 + dev: false - chownr@2.0.0: + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + requiresBuild: true + dev: false optional: true - chrome-trace-event@1.0.3: {} + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true - cli-cursor@4.0.0: + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: restore-cursor: 4.0.0 + dev: true - cli-truncate@3.1.0: + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: slice-ansi: 5.0.0 string-width: 5.1.2 + dev: true - client-only@0.0.1: {} + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false - cliui@8.0.1: + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: true - clsx@2.1.0: {} + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false - color-convert@1.9.3: + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: false - color-convert@2.0.1: + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false - color-name@1.1.4: {} + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + requiresBuild: true + dev: false optional: true - colorette@2.0.20: {} + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true - commander@11.0.0: {} + /commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + dev: true - commander@2.20.3: {} + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true - commander@4.1.1: {} + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false - compute-scroll-into-view@1.0.20: {} + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + dev: false - concat-map@0.0.1: {} + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@8.2.2: + /concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true dependencies: chalk: 4.1.2 date-fns: 2.30.0 @@ -4336,208 +1887,362 @@ snapshots: supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 + dev: true - console-control-strings@1.1.0: + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + requiresBuild: true + dev: false optional: true - convert-source-map@1.9.0: {} + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false - cosmiconfig@7.1.0: + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + dev: false - cross-fetch@3.1.8: + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: node-fetch: 2.7.0 transitivePeerDependencies: - encoding + dev: false - cross-spawn@7.0.3: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - crypto-js@4.2.0: {} + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: false - cssesc@3.0.0: {} + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false - csstype@3.1.3: {} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - currently-unhandled@0.4.1: + /currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} dependencies: array-find-index: 1.0.2 + dev: true - d3-array@3.2.4: + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} dependencies: internmap: 2.0.3 + dev: false - d3-color@3.1.0: {} + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false - d3-ease@3.0.1: {} + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false - d3-format@3.1.0: {} + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false - d3-interpolate@3.0.1: + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} dependencies: d3-color: 3.1.0 + dev: false - d3-path@3.1.0: {} + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false - d3-scale@4.0.2: + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 + dev: false - d3-shape@3.2.0: + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} dependencies: d3-path: 3.1.0 + dev: false - d3-time-format@4.1.0: + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} dependencies: d3-time: 3.1.0 + dev: false - d3-time@3.1.0: + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} dependencies: d3-array: 3.2.4 + dev: false - d3-timer@3.0.1: {} + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false - d3-voronoi@1.1.4: {} + /d3-voronoi@1.1.4: + resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} + dev: false - damerau-levenshtein@1.0.8: {} + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: false - data-view-buffer@1.0.1: + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + dev: false - data-view-byte-length@1.0.1: + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + dev: false - data-view-byte-offset@1.0.0: + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 + dev: false - date-fns@2.30.0: + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} dependencies: '@babel/runtime': 7.24.4 - dayjs@1.11.10: {} + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + dev: false - debug@3.2.7: + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.3 + dev: false - debug@4.3.4: + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.2 - decamelize@1.2.0: {} + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true - decimal.js-light@2.5.1: {} + /decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + dev: false - decompress-response@4.2.1: + /decompress-response@4.2.1: + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} + requiresBuild: true dependencies: mimic-response: 2.1.0 + dev: false optional: true - deep-is@0.1.4: {} + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@2.2.1: {} + /deepmerge@2.2.1: + resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} + engines: {node: '>=0.10.0'} + dev: false - define-data-property@1.1.4: + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 + dev: false - define-properties@1.2.1: + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 + dev: false - delaunator@4.0.1: {} + /delaunator@4.0.1: + resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==} + dev: false - delaunay-find@0.0.6: + /delaunay-find@0.0.6: + resolution: {integrity: sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==} dependencies: delaunator: 4.0.1 + dev: false - delegates@1.0.0: + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + requiresBuild: true + dev: false optional: true - dequal@2.0.3: {} + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false - detect-libc@2.0.3: + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + requiresBuild: true + dev: false optional: true - didyoumean@1.2.2: {} + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false - dir-glob@3.0.1: + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: false - direction@1.0.4: {} + /direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + dev: false - dlv@1.1.3: {} + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false - dnd-core@16.0.1: + /dnd-core@16.0.1: + resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} dependencies: '@react-dnd/asap': 5.0.2 '@react-dnd/invariant': 4.0.2 redux: 4.2.1 + dev: false - doctrine@2.1.0: + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 + dev: false - doctrine@3.0.0: + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 - dom-helpers@5.2.1: + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: '@babel/runtime': 7.24.4 csstype: 3.1.3 + dev: false - eastasianwidth@0.2.0: {} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.740: {} + /electron-to-chromium@1.4.740: + resolution: {integrity: sha512-Yvg5i+iyv7Xm18BRdVPVm8lc7kgxM3r6iwqCH2zB7QZy1kZRNmd0Zqm0zcD9XoFREE5/5rwIuIAOT+/mzGcnZg==} - emoji-regex@8.0.0: {} + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + requiresBuild: true - emoji-regex@9.2.2: {} + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojis-list@3.0.0: {} + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true - encoding@0.1.13: + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} dependencies: iconv-lite: 0.6.3 + dev: true - enhanced-resolve@5.16.0: + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - error-ex@1.3.2: + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -4585,14 +2290,23 @@ snapshots: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 + dev: false - es-define-property@1.0.0: + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 + dev: false - es-errors@1.3.0: {} + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: false - es-iterator-helpers@1.0.18: + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -4608,36 +2322,63 @@ snapshots: internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 + dev: false - es-module-lexer@1.5.0: {} + /es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + dev: true - es-object-atoms@1.0.0: + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 + dev: false - es-set-tostringtag@2.0.3: + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 + dev: false - es-shim-unscopables@1.0.2: + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: hasown: 2.0.2 + dev: false - es-to-primitive@1.2.1: + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 + dev: false - escalade@3.1.2: {} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} - escape-string-regexp@1.0.5: {} + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: {} + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - eslint-config-next@13.3.0(eslint@8.38.0)(typescript@5.0.4): + /eslint-config-next@13.3.0(eslint@8.38.0)(typescript@5.0.4): + resolution: {integrity: sha512-6YEwmFBX0VjBd3ODGW9df0Is0FLaRFdMN8eAahQG9CN6LjQ28J8AFr19ngxqMSg7Qv6Uca/3VeeBosJh1bzu0w==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@next/eslint-plugin-next': 13.3.0 '@rushstack/eslint-patch': 1.10.2 @@ -4653,20 +2394,33 @@ snapshots: transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color + dev: false - eslint-config-prettier@8.10.0(eslint@8.38.0): + /eslint-config-prettier@8.10.0(eslint@8.38.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' dependencies: eslint: 8.38.0 + dev: true - eslint-import-resolver-node@0.3.9: + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color + dev: false - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.38.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.38.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' dependencies: debug: 4.3.4 enhanced-resolve: 5.16.0 @@ -4682,8 +2436,28 @@ snapshots: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color + dev: false - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.38.0): + /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.38.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.38.0)(typescript@5.0.4) debug: 3.2.7 @@ -4692,8 +2466,17 @@ snapshots: eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.38.0) transitivePeerDependencies: - supports-color + dev: false - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.38.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.38.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.38.0)(typescript@5.0.4) array-includes: 3.1.8 @@ -4718,8 +2501,13 @@ snapshots: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false - eslint-plugin-jsx-a11y@6.8.0(eslint@8.38.0): + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.38.0): + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: '@babel/runtime': 7.24.4 aria-query: 5.3.0 @@ -4738,12 +2526,22 @@ snapshots: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 + dev: false - eslint-plugin-react-hooks@4.6.0(eslint@8.38.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.38.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: eslint: 8.38.0 + dev: false - eslint-plugin-react@7.34.1(eslint@8.38.0): + /eslint-plugin-react@7.34.1(eslint@8.38.0): + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -4764,20 +2562,31 @@ snapshots: resolve: 2.0.0-next.5 semver: 6.3.1 string.prototype.matchall: 4.0.11 + dev: false - eslint-scope@5.1.1: + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 + dev: true - eslint-scope@7.2.2: + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-visitor-keys@3.4.3: {} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.38.0: + /eslint@8.38.0: + resolution: {integrity: sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) '@eslint-community/regexpp': 4.10.0 @@ -4822,33 +2631,55 @@ snapshots: transitivePeerDependencies: - supports-color - espree@9.6.1: + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - esquery@1.5.0: + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 - esrecurse@4.3.0: + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true - estraverse@5.3.0: {} + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} - esutils@2.0.3: {} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} - eventemitter3@4.0.7: {} + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false - eventemitter3@5.0.1: {} + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true - events@3.3.0: {} + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true - execa@7.2.0: + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4859,30 +2690,44 @@ snapshots: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 + dev: true - fast-deep-equal@3.1.3: {} + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-equals@5.0.1: {} + /fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + dev: false - fast-glob@3.3.2: + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 + dev: false - fast-json-stable-stringify@2.1.0: {} + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-levenshtein@2.0.6: {} + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.17.1: + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 - fbjs-css-vars@1.0.2: {} + /fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: false - fbjs@3.0.5: + /fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} dependencies: cross-fetch: 3.1.8 fbjs-css-vars: 1.0.2 @@ -4893,57 +2738,87 @@ snapshots: ua-parser-js: 1.0.37 transitivePeerDependencies: - encoding + dev: false - fetch-graphql-schema@0.2.1: + /fetch-graphql-schema@0.2.1: + resolution: {integrity: sha512-XtP692mntCOZRVOnAkZcco3W+2LprOl5Jk3Y0lKG5PJfnnj5Ict/vhMevQT15Dfdt7SZMjLGdr4fD7PbDQXEoQ==} + engines: {node: '>=0.12.0'} + hasBin: true dependencies: chalk: 1.1.3 graphql: 0.8.2 meow: 3.7.0 mkdirp: 0.5.6 node-fetch: 1.7.3 + dev: true - file-entry-cache@6.0.1: + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.2.0 - file-selector@0.6.0: + /file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} dependencies: tslib: 2.6.2 + dev: false - fill-range@7.0.1: + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - find-root@1.1.0: {} + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false - find-up@1.1.2: + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 + dev: true - find-up@5.0.0: + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.1: {} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - for-each@0.3.3: + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 + dev: false - foreground-child@3.1.1: + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + dev: false - formik@2.4.5(react@18.2.0): + /formik@2.4.5(react@18.2.0): + resolution: {integrity: sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==} + peerDependencies: + react: '>=16.8.0' dependencies: '@types/hoist-non-react-statics': 3.3.5 deepmerge: 2.2.1 @@ -4954,39 +2829,72 @@ snapshots: react-fast-compare: 2.0.4 tiny-warning: 1.0.3 tslib: 2.6.2 + dev: false - fraction.js@4.3.7: {} + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false - framer-motion@10.18.0(react-dom@18.2.0)(react@18.2.0): + /framer-motion@10.18.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 + dev: false - fs-minipass@2.1.0: + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + requiresBuild: true dependencies: minipass: 3.3.6 + dev: false optional: true - fs.realpath@1.0.0: {} + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false optional: true - function-bind@1.1.2: {} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 + dev: false - functions-have-names@1.2.3: {} + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: false - gauge@3.0.2: + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + requiresBuild: true dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -4997,51 +2905,80 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 + dev: false optional: true - get-caller-file@2.0.5: {} + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true - get-intrinsic@1.2.4: + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 + dev: false - get-stdin@4.0.1: {} + /get-stdin@4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + dev: true - get-stream@6.0.1: {} + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true - get-symbol-description@1.0.2: + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 + dev: false - get-tsconfig@4.7.3: + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} dependencies: resolve-pkg-maps: 1.0.0 + dev: false - glob-parent@5.1.2: + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 + dev: false - glob-parent@6.0.2: + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.12: + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.4 minipass: 7.0.4 path-scurry: 1.10.2 + dev: false - glob@7.1.7: + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5049,8 +2986,12 @@ snapshots: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: false - glob@7.2.3: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + requiresBuild: true dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5059,15 +3000,22 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@13.24.0: + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - globalthis@1.0.3: + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 + dev: false - globby@11.1.0: + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -5075,301 +3023,524 @@ snapshots: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 + dev: false - gopd@1.0.1: + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.4 + dev: false - graceful-fs@4.2.11: {} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: {} + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - graphql@0.8.2: + /graphql@0.8.2: + resolution: {integrity: sha512-4wpUsDXiewqUCxr0bt5wOk5dV/EIsWRVaB5RmWKhZrAT9ewpOwql2GrhMq1l6WyOrBV/n5GqvXSzKsCwubqwoA==} dependencies: iterall: 1.0.2 + dev: true - has-ansi@2.0.0: + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 + dev: true - has-bigints@1.0.2: {} + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: false - has-flag@3.0.0: {} + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false - has-flag@4.0.0: {} + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - has-property-descriptors@1.0.2: + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 + dev: false - has-proto@1.0.3: {} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: false - has-symbols@1.0.3: {} + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false - has-tostringtag@1.0.2: + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: false - has-unicode@2.0.1: + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + requiresBuild: true + dev: false optional: true - hasown@2.0.2: + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - hoist-non-react-statics@3.3.2: + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 + dev: false - hosted-git-info@2.8.9: {} + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true - https-proxy-agent@5.0.1: + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + requiresBuild: true dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: false optional: true - human-signals@4.3.1: {} + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true - husky@8.0.3: {} + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true - iconv-lite@0.6.3: + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: true - ignore@5.3.1: {} + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} - immer@9.0.21: {} + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false - import-fresh@3.3.0: + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - imurmurhash@0.1.4: {} + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - indent-string@2.1.0: + /indent-string@2.1.0: + resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} + engines: {node: '>=0.10.0'} dependencies: repeating: 2.0.1 + dev: true - inflight@1.0.6: + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 - inherits@2.0.4: {} + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.7: + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 + dev: false - internmap@2.0.3: {} + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false - invariant@2.2.4: + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 + dev: false - is-array-buffer@3.0.4: + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 + dev: false - is-arrayish@0.2.1: {} + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.0.0: + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: false - is-bigint@1.0.4: + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 + dev: false - is-binary-path@2.1.0: + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} dependencies: binary-extensions: 2.3.0 + dev: false - is-boolean-object@1.1.2: + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + dev: false - is-callable@1.2.7: {} + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false - is-core-module@2.13.1: + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} dependencies: is-typed-array: 1.1.13 + dev: false - is-date-object@1.0.5: + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: false - is-extglob@2.1.1: {} + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: call-bind: 1.0.7 + dev: false - is-finite@1.1.0: {} + /is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + dev: true - is-fullwidth-code-point@3.0.0: {} + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + requiresBuild: true - is-fullwidth-code-point@4.0.0: {} + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true - is-generator-function@1.0.10: + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: false - is-glob@4.0.3: + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - is-hotkey@0.1.8: {} + /is-hotkey@0.1.8: + resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} + dev: false - is-hotkey@0.2.0: {} + /is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + dev: false - is-map@2.0.3: {} + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: false - is-negative-zero@2.0.3: {} + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: false - is-number-object@1.0.7: + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: false - is-number@7.0.0: {} + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: {} + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} - is-plain-object@5.0.0: {} + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false - is-regex@1.1.4: + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + dev: false - is-set@2.0.3: {} + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: false - is-shared-array-buffer@1.0.3: + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 + dev: false - is-stream@1.1.0: {} + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true - is-stream@3.0.0: {} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - is-string@1.0.7: + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: false - is-symbol@1.0.4: + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: false - is-typed-array@1.1.13: + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.15 + dev: false - is-utf8@0.2.1: {} + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true - is-weakmap@2.0.2: {} + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: false - is-weakref@1.0.2: + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.7 + dev: false - is-weakset@2.0.3: + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 + dev: false - isarray@2.0.5: {} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false - isexe@2.0.0: {} + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iterall@1.0.2: {} + /iterall@1.0.2: + resolution: {integrity: sha512-RaKa8RHmSay1GvkTLOYRT8Ju9/Cf0DRK9z7YzS14sID4e2hkP4eknzDhTtzTboO8shZIysbVEEnmjJEHxOVIMQ==} + dev: true - iterator.prototype@1.1.2: + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 + dev: false - jackspeak@2.3.6: + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + dev: false - jest-worker@27.5.1: + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} dependencies: '@types/node': 18.15.12 merge-stream: 2.0.0 supports-color: 8.1.1 + dev: true - jiti@1.21.0: {} + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: false - js-sdsl@4.4.2: {} + /js-sdsl@4.4.2: + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - js-tokens@4.0.0: {} + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false - js-yaml@4.1.0: + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true dependencies: argparse: 2.0.1 - json-buffer@3.0.1: {} + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: {} + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: {} + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-stable-stringify-without-jsonify@1.0.1: {} + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: {} + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false - json5@1.0.2: + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true dependencies: minimist: 1.2.8 + dev: false - json5@2.2.3: {} + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true - jsx-ast-utils@3.3.5: + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 object.values: 1.2.0 + dev: false - jwt-decode@3.1.2: {} + /jwt-decode@3.1.2: + resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} + dev: false - keyv@4.5.4: + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 - language-subtag-registry@0.3.22: {} + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: false - language-tags@1.0.9: + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} dependencies: language-subtag-registry: 0.3.22 + dev: false - levn@0.4.1: + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lilconfig@2.1.0: {} + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} - lines-and-columns@1.2.4: {} + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false - lint-staged@13.3.0: + /lint-staged@13.3.0: + resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true dependencies: chalk: 5.3.0 commander: 11.0.0 @@ -5384,8 +3555,16 @@ snapshots: transitivePeerDependencies: - enquirer - supports-color + dev: true - listr2@6.6.1: + /listr2@6.6.1: + resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} + engines: {node: '>=16.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true dependencies: cli-truncate: 3.1.0 colorette: 2.0.20 @@ -5393,72 +3572,122 @@ snapshots: log-update: 5.0.1 rfdc: 1.3.1 wrap-ansi: 8.1.0 + dev: true - load-json-file@1.1.0: + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} dependencies: graceful-fs: 4.2.11 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 strip-bom: 2.0.0 + dev: true - loader-runner@4.3.0: {} + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true - loader-utils@2.0.4: + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 + dev: true - locate-path@6.0.0: + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - lodash-es@4.17.21: {} + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false - lodash.debounce@4.0.8: {} + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false - lodash.merge@4.6.2: {} + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.17.21: {} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-update@5.0.1: + /log-update@5.0.1: + resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: ansi-escapes: 5.0.0 cli-cursor: 4.0.0 slice-ansi: 5.0.0 strip-ansi: 7.1.0 wrap-ansi: 8.1.0 + dev: true - loose-envify@1.4.0: + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true dependencies: js-tokens: 4.0.0 + dev: false - loud-rejection@1.6.0: + /loud-rejection@1.6.0: + resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} + engines: {node: '>=0.10.0'} dependencies: currently-unhandled: 0.4.1 signal-exit: 3.0.7 + dev: true - lru-cache@10.2.0: {} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: false - lru-cache@6.0.0: + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + requiresBuild: true dependencies: yallist: 4.0.0 + dev: false - make-cancellable-promise@1.3.2: {} + /make-cancellable-promise@1.3.2: + resolution: {integrity: sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==} + dev: false - make-dir@3.1.0: + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + requiresBuild: true dependencies: semver: 6.3.1 + dev: false optional: true - make-event-props@1.6.2: {} + /make-event-props@1.6.2: + resolution: {integrity: sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==} + dev: false - map-obj@1.0.1: {} + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true - media-captions@1.0.4: {} + /media-captions@1.0.4: + resolution: {integrity: sha512-cyDNmuZvvO4H27rcBq2Eudxo9IZRDCOX/I7VEyqbxsEiD2Ei7UYUhG/Sc5fvMZjmathgz3fEK7iAKqvpY+Ux1w==} + engines: {node: '>=16'} + dev: false - meow@3.7.0: + /meow@3.7.0: + resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} + engines: {node: '>=0.10.0'} dependencies: camelcase-keys: 2.1.0 decamelize: 1.2.0 @@ -5470,86 +3699,176 @@ snapshots: read-pkg-up: 1.0.1 redent: 1.0.0 trim-newlines: 1.0.0 + dev: true - merge-refs@1.3.0(@types/react@18.0.37): + /merge-refs@1.3.0(@types/react@18.0.37): + resolution: {integrity: sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@types/react': 18.0.37 + dev: false - merge-stream@2.0.0: {} + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true - merge2@1.4.1: {} + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false - micromatch@4.0.5: + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 - mime-db@1.52.0: {} + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true - mime-types@2.1.35: + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 + dev: true - mimic-fn@2.1.0: {} + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true - mimic-fn@4.0.0: {} + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true - mimic-response@2.1.0: + /mimic-response@2.1.0: + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} + requiresBuild: true + dev: false optional: true - minimatch@3.1.2: + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - minimatch@9.0.4: + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: false - minimist@1.2.8: {} + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@3.3.6: + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + requiresBuild: true dependencies: yallist: 4.0.0 + dev: false optional: true - minipass@5.0.0: + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + requiresBuild: true + dev: false optional: true - minipass@7.0.4: {} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false - minizlib@2.1.2: + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + requiresBuild: true dependencies: minipass: 3.3.6 yallist: 4.0.0 + dev: false optional: true - mkdirp@0.5.6: + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true dependencies: minimist: 1.2.8 + dev: true - mkdirp@1.0.4: + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dev: false optional: true - ms@2.1.2: {} + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: {} + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false - mz@2.7.0: + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 + dev: false - nan@2.20.0: + /nan@2.20.0: + resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} + requiresBuild: true + dev: false optional: true - nanoid@3.3.7: {} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false - natural-compare@1.4.0: {} + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - neo-async@2.6.2: {} + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true - next@13.4.7(react-dom@18.2.0)(react@18.2.0): + /next@13.4.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==} + engines: {node: '>=16.8.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + fibers: '>= 3.1.0' + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + fibers: + optional: true + sass: + optional: true dependencies: '@next/env': 13.4.7 '@swc/helpers': 0.5.1 @@ -5574,112 +3893,186 @@ snapshots: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + dev: false - node-fetch@1.7.3: + /node-fetch@1.7.3: + resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} dependencies: encoding: 0.1.13 is-stream: 1.1.0 + dev: true - node-fetch@2.7.0: + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true dependencies: whatwg-url: 5.0.0 + dev: false - node-releases@2.0.14: {} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - nopt@5.0.0: + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + requiresBuild: true dependencies: abbrev: 1.1.1 + dev: false optional: true - normalize-package-data@2.5.0: + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 + dev: true - normalize-path@3.0.0: {} + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false - normalize-range@0.1.2: {} + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false - npm-run-path@5.3.0: + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 + dev: true - npmlog@5.0.1: + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + requiresBuild: true dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 + dev: false optional: true - nullthrows@1.1.1: {} + /nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: false - object-assign@4.1.1: {} + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} - object-hash@3.0.0: {} + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false - object-inspect@1.13.1: {} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: false - object-keys@1.1.1: {} + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false - object.assign@4.1.5: + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 + dev: false - object.entries@1.1.8: + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: false - object.fromentries@2.0.8: + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 + dev: false - object.groupby@1.0.3: + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 + dev: false - object.hasown@1.1.4: + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 + dev: false - object.values@1.2.0: + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: false - oidc-client-ts@2.4.0: + /oidc-client-ts@2.4.0: + resolution: {integrity: sha512-WijhkTrlXK2VvgGoakWJiBdfIsVGz6CFzgjNNqZU1hPKV2kyeEaJgLs7RwuiSp2WhLfWBQuLvr2SxVlZnk3N1w==} + engines: {node: '>=12.13.0'} dependencies: crypto-js: 4.2.0 jwt-decode: 3.1.2 + dev: false - once@1.4.0: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - onetime@5.1.2: + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 + dev: true - onetime@6.0.0: + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 + dev: true - optionator@0.9.3: + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -5688,171 +4081,317 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - p-limit@3.1.0: + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - p-locate@5.0.0: + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - parent-module@1.0.1: + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: callsites: 3.1.0 - parse-json@2.2.0: + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} dependencies: error-ex: 1.3.2 + dev: true - parse-json@5.2.0: + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} dependencies: '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + dev: false - path-exists@2.1.0: + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} dependencies: pinkie-promise: 2.0.1 + dev: true - path-exists@4.0.0: {} + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} - path-is-absolute@1.0.1: {} + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} - path-key@3.1.1: {} + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - path-key@4.0.0: {} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true - path-parse@1.0.7: {} + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.2: + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 minipass: 7.0.4 + dev: false - path-type@1.1.0: + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} dependencies: graceful-fs: 4.2.11 pify: 2.3.0 pinkie-promise: 2.0.1 + dev: true - path-type@4.0.0: {} + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false - path2d-polyfill@2.0.1: + /path2d-polyfill@2.0.1: + resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} + engines: {node: '>=8'} + requiresBuild: true + dev: false optional: true - pdfjs-dist@3.11.174: + /pdfjs-dist@3.11.174: + resolution: {integrity: sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==} + engines: {node: '>=18'} optionalDependencies: canvas: 2.11.2 path2d-polyfill: 2.0.1 transitivePeerDependencies: - encoding - supports-color + dev: false - pdfobject@2.3.0: {} + /pdfobject@2.3.0: + resolution: {integrity: sha512-w/9pXDXTDs3IDmOri/w8lM/w6LHR0/F4fcBLLzH+4csSoyshQ5su0TE7k0FLHZO7aOjVLDGecqd1M89+PVpVAA==} + dev: false - picocolors@1.0.0: {} + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - picomatch@2.3.1: {} + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - pidtree@0.6.0: {} + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true - pify@2.3.0: {} + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} - pinkie-promise@2.0.1: + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 + dev: true - pinkie@2.0.4: {} + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true - pirates@4.0.6: {} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: false - possible-typed-array-names@1.0.0: {} + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: false - postcss-import@14.1.0(postcss@8.4.23): + /postcss-import@14.1.0(postcss@8.4.23): + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 dependencies: postcss: 8.4.23 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 + dev: false - postcss-js@4.0.1(postcss@8.4.23): + /postcss-js@4.0.1(postcss@8.4.23): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 postcss: 8.4.23 + dev: false - postcss-load-config@3.1.4(postcss@8.4.23): + /postcss-load-config@3.1.4(postcss@8.4.23): + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true dependencies: lilconfig: 2.1.0 postcss: 8.4.23 yaml: 1.10.2 + dev: false - postcss-nested@6.0.0(postcss@8.4.23): + /postcss-nested@6.0.0(postcss@8.4.23): + resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 dependencies: postcss: 8.4.23 postcss-selector-parser: 6.0.16 + dev: false - postcss-selector-parser@6.0.16: + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + dev: false - postcss-value-parser@4.2.0: {} + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false - postcss@8.4.14: + /postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 + dev: false - postcss@8.4.23: + /postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 + dev: false - prelude-ls@1.2.1: {} + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} - prettier@2.8.8: {} + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true - promise@7.3.1: + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: asap: 2.0.6 + dev: false - prop-types@15.8.1: + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + dev: false - property-expr@2.0.6: {} + /property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + dev: false - punycode@2.3.1: {} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} - queue-microtask@1.2.3: {} + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@5.1.1: {} + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false - randombytes@2.1.0: + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 + dev: true - raw-loader@4.0.2(webpack@5.91.0): + /raw-loader@4.0.2(webpack@5.91.0): + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.91.0 + dev: true - react-confetti@6.1.0(react@18.2.0): + /react-confetti@6.1.0(react@18.2.0): + resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==} + engines: {node: '>=10.18'} + peerDependencies: + react: ^16.3.0 || ^17.0.1 || ^18.0.0 dependencies: react: 18.2.0 tween-functions: 1.2.0 + dev: false - react-dnd-html5-backend@16.0.1: + /react-dnd-html5-backend@16.0.1: + resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} dependencies: dnd-core: 16.0.1 + dev: false - react-dnd@16.0.1(@types/node@18.15.12)(@types/react@18.0.37)(react@18.2.0): + /react-dnd@16.0.1(@types/node@18.15.12)(@types/react@18.0.37)(react@18.2.0): + resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} + peerDependencies: + '@types/hoist-non-react-statics': '>= 3.3.1' + '@types/node': '>= 12' + '@types/react': '>= 16' + react: '>= 16.14' + peerDependenciesMeta: + '@types/hoist-non-react-statics': + optional: true + '@types/node': + optional: true + '@types/react': + optional: true dependencies: '@react-dnd/invariant': 4.0.2 '@react-dnd/shallowequal': 4.0.2 @@ -5862,39 +4401,75 @@ snapshots: fast-deep-equal: 3.1.3 hoist-non-react-statics: 3.3.2 react: 18.2.0 + dev: false - react-dom@18.2.0(react@18.2.0): + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 + dev: false - react-dropzone@14.2.3(react@18.2.0): + /react-dropzone@14.2.3(react@18.2.0): + resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' dependencies: attr-accept: 2.2.2 file-selector: 0.6.0 prop-types: 15.8.1 react: 18.2.0 + dev: false - react-error-boundary@4.0.13(react@18.2.0): + /react-error-boundary@4.0.13(react@18.2.0): + resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + peerDependencies: + react: '>=16.13.1' dependencies: '@babel/runtime': 7.24.4 react: 18.2.0 + dev: false - react-fast-compare@2.0.4: {} + /react-fast-compare@2.0.4: + resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==} + dev: false - react-fast-compare@3.2.2: {} + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + dev: false - react-is@16.13.1: {} + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false - react-is@18.2.0: {} + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: false - react-oidc-context@2.3.1(oidc-client-ts@2.4.0)(react@18.2.0): + /react-oidc-context@2.3.1(oidc-client-ts@2.4.0)(react@18.2.0): + resolution: {integrity: sha512-WdhmEU6odNzMk9pvOScxUkf6/1aduiI/nQryr7+iCl2VDnYLASDTIV/zy58KuK4VXG3fBaRKukc/mRpMjF9a3Q==} + engines: {node: '>=12.13.0'} + peerDependencies: + oidc-client-ts: ^2.2.1 + react: '>=16.8.0' dependencies: oidc-client-ts: 2.4.0 react: 18.2.0 + dev: false - react-pdf@7.7.3(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): + /react-pdf@7.7.3(@types/react@18.0.37)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a2VfDl8hiGjugpqezBTUzJHYLNB7IS7a2t7GD52xMI9xHg8LdVaTMsnM9ZlNmKadnStT/tvX5IfV0yLn+JvYmw==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true dependencies: '@types/react': 18.0.37 clsx: 2.1.0 @@ -5911,8 +4486,12 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + dev: false - react-relay@15.0.0(react@18.2.0): + /react-relay@15.0.0(react@18.2.0): + resolution: {integrity: sha512-KWdeMMKMJanOL9LsGZYkyAekayYIi+Y4mbDM8VYbHVPgTWJWAQP6yJKS+V4D17qIMo1L84QJQjGaQWEG139p9Q==} + peerDependencies: + react: ^16.9.0 || ^17 || ^18 dependencies: '@babel/runtime': 7.24.4 fbjs: 3.0.5 @@ -5922,16 +4501,26 @@ snapshots: relay-runtime: 15.0.0 transitivePeerDependencies: - encoding + dev: false - react-smooth@4.0.1(react-dom@18.2.0)(react@18.2.0): + /react-smooth@4.0.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: fast-equals: 5.0.1 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + dev: false - react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): + /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' dependencies: '@babel/runtime': 7.24.4 dom-helpers: 5.2.1 @@ -5939,42 +4528,68 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false - react@18.2.0: + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false - read-cache@1.0.0: + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 + dev: false - read-pkg-up@1.0.1: + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} dependencies: find-up: 1.1.2 read-pkg: 1.1.0 + dev: true - read-pkg@1.1.0: + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 + dev: true - readable-stream@3.6.2: + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + requiresBuild: true dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: false optional: true - readdirp@3.6.0: + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + dev: false - recharts-scale@0.4.5: + /recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} dependencies: decimal.js-light: 2.5.1 + dev: false - recharts@2.12.5(react-dom@18.2.0)(react@18.2.0): + /recharts@2.12.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Cy+BkqrFIYTHJCyKHJEPvbHE2kVQEP6PKbOHJ8ztRGTAhvHuUnCwDaKVb13OwRFZ0QNUk1QvGTDdgWSMbuMtKw==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: clsx: 2.1.0 eventemitter3: 4.0.7 @@ -5986,17 +4601,25 @@ snapshots: recharts-scale: 0.4.5 tiny-invariant: 1.3.3 victory-vendor: 36.9.2 + dev: false - redent@1.0.0: + /redent@1.0.0: + resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} + engines: {node: '>=0.10.0'} dependencies: indent-string: 2.1.0 strip-indent: 1.0.1 + dev: true - redux@4.2.1: + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} dependencies: '@babel/runtime': 7.24.4 + dev: false - reflect.getprototypeof@1.0.6: + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -6005,116 +4628,187 @@ snapshots: get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 + dev: false - regenerator-runtime@0.14.1: {} + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.2: + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 + dev: false - relay-compiler@15.0.0: {} + /relay-compiler@15.0.0: + resolution: {integrity: sha512-19gIIdrVe/lk7Dkz/hqxpBd54bBDWAKG+kR5ael+xznJPdjlr/rlAmh5Tqi6Mgf/wiEQGdtKiZqeNdOW2/wVRw==} + hasBin: true + dev: true - relay-runtime@15.0.0: + /relay-runtime@15.0.0: + resolution: {integrity: sha512-7AXkXLQo6gpJNBhk4Kii5b+Yat62HSDD1TgJBi021iSjT1muI8iYd4UZG4f/If209LmaVjkZt2HTNAlk6xtslw==} dependencies: '@babel/runtime': 7.24.4 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: - encoding + dev: false - repeating@2.0.1: + /repeating@2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} dependencies: is-finite: 1.1.0 + dev: true - require-directory@2.1.1: {} + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true - resolve-from@4.0.0: {} + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} - resolve-pkg-maps@1.0.0: {} + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: false - resolve@1.22.8: + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: false - restore-cursor@4.0.0: + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 + dev: true - reusify@1.0.4: {} + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: {} + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true - rimraf@3.0.2: + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true dependencies: glob: 7.2.3 - run-parallel@1.2.0: + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - rxjs@7.8.1: + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: tslib: 2.6.2 + dev: true - safe-array-concat@1.1.2: + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 + dev: false - safe-buffer@5.2.1: {} + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 + dev: false - safer-buffer@2.1.2: {} + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true - scheduler@0.23.0: + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + dev: false - schema-utils@3.3.0: + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true - scroll-into-view-if-needed@2.2.31: + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} dependencies: compute-scroll-into-view: 1.0.20 + dev: false - semver@5.7.2: {} + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true - semver@6.3.1: {} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false - semver@7.6.0: + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true dependencies: lru-cache: 6.0.0 + dev: false - serialize-javascript@6.0.2: + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 + dev: true - set-blocking@2.0.0: + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + requiresBuild: true + dev: false optional: true - set-function-length@1.2.2: + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -6122,53 +4816,90 @@ snapshots: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 + dev: false - set-function-name@2.0.2: + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + dev: false - setimmediate@1.0.5: {} + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false - shebang-command@2.0.0: + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - shebang-regex@3.0.0: {} + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - shell-quote@1.8.1: {} + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true - side-channel@1.0.6: + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 + dev: false - signal-exit@3.0.7: {} + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: {} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false - simple-concat@1.0.1: + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true + dev: false optional: true - simple-get@3.1.1: + /simple-get@3.1.1: + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + requiresBuild: true dependencies: decompress-response: 4.2.1 once: 1.4.0 simple-concat: 1.0.1 + dev: false optional: true - slash@3.0.0: {} + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false - slate-history@0.93.0(slate@0.94.1): + /slate-history@0.93.0(slate@0.94.1): + resolution: {integrity: sha512-Gr1GMGPipRuxIz41jD2/rbvzPj8eyar56TVMyJBvBeIpQSSjNISssvGNDYfJlSWM8eaRqf6DAcxMKzsLCYeX6g==} + peerDependencies: + slate: '>=0.65.3' dependencies: is-plain-object: 5.0.0 slate: 0.94.1 + dev: false - slate-react@0.98.4(react-dom@18.2.0)(react@18.2.0)(slate@0.94.1): + /slate-react@0.98.4(react-dom@18.2.0)(react@18.2.0)(slate@0.94.1): + resolution: {integrity: sha512-8Of3v9hFuX8rIRc86LuuBhU9t8ps+9ARKL4yyhCrKQYZ93Ep/LFA3GvPGvtf3zYuVadZ8tkhRH8tbHOGNAndLw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + slate: '>=0.65.3' dependencies: '@juggle/resize-observer': 3.4.0 '@types/is-hotkey': 0.1.10 @@ -6182,62 +4913,101 @@ snapshots: scroll-into-view-if-needed: 2.2.31 slate: 0.94.1 tiny-invariant: 1.0.6 + dev: false - slate@0.94.1: + /slate@0.94.1: + resolution: {integrity: sha512-GH/yizXr1ceBoZ9P9uebIaHe3dC/g6Plpf9nlUwnvoyf6V1UOYrRwkabtOCd3ZfIGxomY4P7lfgLr7FPH8/BKA==} dependencies: immer: 9.0.21 is-plain-object: 5.0.0 tiny-warning: 1.0.3 + dev: false - slice-ansi@5.0.0: + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 + dev: true - source-map-js@1.2.0: {} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: false - source-map-support@0.5.21: + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: true - source-map@0.5.7: {} + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false - source-map@0.6.1: {} + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true - spawn-command@0.0.2: {} + /spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + dev: true - spdx-correct@3.2.0: + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 + dev: true - spdx-exceptions@2.5.0: {} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true - spdx-expression-parse@3.0.1: + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.17 + dev: true - spdx-license-ids@3.0.17: {} + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + dev: true - streamsearch@1.1.0: {} + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false - string-argv@0.3.2: {} + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true - string-width@4.2.3: + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.11: + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -6251,65 +5021,116 @@ snapshots: regexp.prototype.flags: 1.5.2 set-function-name: 2.0.2 side-channel: 1.0.6 + dev: false - string.prototype.trim@1.2.9: + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 + dev: false - string.prototype.trimend@1.0.8: + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: false - string.prototype.trimstart@1.0.8: + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: false - string_decoder@1.3.0: + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + requiresBuild: true dependencies: safe-buffer: 5.2.1 + dev: false optional: true - strip-ansi@3.0.1: + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 + dev: true - strip-ansi@6.0.1: + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - strip-bom@2.0.0: + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} dependencies: is-utf8: 0.2.1 + dev: true - strip-bom@3.0.0: {} + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false - strip-final-newline@3.0.0: {} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true - strip-indent@1.0.1: + /strip-indent@1.0.1: + resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} + engines: {node: '>=0.10.0'} + hasBin: true dependencies: get-stdin: 4.0.1 + dev: true - strip-json-comments@3.1.1: {} + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} - styled-jsx@5.1.1(react@18.2.0): + /styled-jsx@5.1.1(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true dependencies: client-only: 0.0.1 react: 18.2.0 + dev: false - stylis@4.2.0: {} + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false - sucrase@3.35.0: + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 @@ -6318,24 +5139,43 @@ snapshots: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 + dev: false - supports-color@2.0.0: {} + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true - supports-color@5.5.0: + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: false - supports-color@7.2.0: + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - supports-color@8.1.1: + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} dependencies: has-flag: 4.0.0 + dev: true - supports-preserve-symlinks-flag@1.0.0: {} + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} - tailwindcss@3.3.1(postcss@8.4.23): + /tailwindcss@3.3.1(postcss@8.4.23): + resolution: {integrity: sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==} + engines: {node: '>=12.13.0'} + hasBin: true + peerDependencies: + postcss: ^8.0.9 dependencies: arg: 5.0.2 chokidar: 3.6.0 @@ -6363,10 +5203,16 @@ snapshots: sucrase: 3.35.0 transitivePeerDependencies: - ts-node + dev: false - tapable@2.2.1: {} + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} - tar@6.2.1: + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + requiresBuild: true dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -6374,9 +5220,24 @@ snapshots: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 + dev: false optional: true - terser-webpack-plugin@5.3.10(webpack@5.91.0): + /terser-webpack-plugin@5.3.10(webpack@5.91.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 @@ -6384,91 +5245,158 @@ snapshots: serialize-javascript: 6.0.2 terser: 5.30.3 webpack: 5.91.0 + dev: true - terser@5.30.3: + /terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} + engines: {node: '>=10'} + hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 + dev: true - text-table@0.2.0: {} + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 + dev: false - thenify@3.3.1: + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 + dev: false - tiny-case@1.0.3: {} + /tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + dev: false - tiny-invariant@1.0.6: {} + /tiny-invariant@1.0.6: + resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} + dev: false - tiny-invariant@1.3.3: {} + /tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + dev: false - tiny-warning@1.0.3: {} + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + dev: false - to-fast-properties@2.0.0: {} + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false - to-regex-range@5.0.1: + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - toposort@2.0.2: {} + /toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + dev: false - tr46@0.0.3: {} + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + requiresBuild: true + dev: false - tree-kill@1.2.2: {} + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true - trim-newlines@1.0.0: {} + /trim-newlines@1.0.0: + resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} + engines: {node: '>=0.10.0'} + dev: true - ts-interface-checker@0.1.13: {} + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false - tsconfig-paths@3.15.0: + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 + dev: false - tslib@1.14.1: {} + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false - tslib@2.6.2: {} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsutils@3.21.0(typescript@5.0.4): + /tsutils@3.21.0(typescript@5.0.4): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 typescript: 5.0.4 + dev: false - tween-functions@1.2.0: {} + /tween-functions@1.2.0: + resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==} + dev: false - type-check@0.4.0: + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} - type-fest@1.4.0: {} + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true - type-fest@2.19.0: {} + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false - typed-array-buffer@1.0.2: + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 + dev: false - typed-array-byte-length@1.0.1: + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 + dev: false - typed-array-byte-offset@1.0.2: + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -6476,8 +5404,11 @@ snapshots: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 + dev: false - typed-array-length@1.0.6: + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -6485,95 +5416,161 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + dev: false - typescript@5.0.4: {} + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: false - ua-parser-js@1.0.37: {} + /ua-parser-js@1.0.37: + resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} + dev: false - unbox-primitive@1.0.2: + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + dev: false - update-browserslist-db@1.0.13(browserslist@4.23.0): + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' dependencies: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.0 - uri-js@4.4.1: + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 - usehooks-ts@3.1.0(react@18.2.0): + /use-bus@2.5.2(react@18.2.0): + resolution: {integrity: sha512-BZXI74mU6JJuuh9YoBexGpj1yZwU9bRvnVPl/bEUhcgC3D+BbqVbEU1RHdFqIVIODkZE/VfQJgNPid3FkCxhFQ==} + peerDependencies: + react: ^16.8 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /usehooks-ts@3.1.0(react@18.2.0): + resolution: {integrity: sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 dependencies: lodash.debounce: 4.0.8 react: 18.2.0 + dev: false - util-deprecate@1.0.2: {} + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false - validate-npm-package-license@3.0.4: + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + dev: true - victory-area@36.9.2(react@18.2.0): + /victory-area@36.9.2(react@18.2.0): + resolution: {integrity: sha512-32aharvPf2RgdQB+/u1j3/ajYFNH/7ugLX9ZRpdd65gP6QEbtXL+58gS6CxvFw6gr/y8a0xMlkMKkpDVacXLpw==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 + dev: false - victory-axis@36.9.2(react@18.2.0): + /victory-axis@36.9.2(react@18.2.0): + resolution: {integrity: sha512-4Odws+IAjprJtBg2b2ZCxEPgrQ6LgIOa22cFkGghzOSfTyNayN4M3AauNB44RZyn2O/hDiM1gdBkEg1g9YDevQ==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-bar@36.9.2(react@18.2.0): + /victory-bar@36.9.2(react@18.2.0): + resolution: {integrity: sha512-R3LFoR91FzwWcnyGK2P8DHNVv9gsaWhl5pSr2KdeNtvLbZVEIvUkTeVN9RMBMzterSFPw0mbWhS1Asb3sV6PPw==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 + dev: false - victory-box-plot@36.9.2(react@18.2.0): + /victory-box-plot@36.9.2(react@18.2.0): + resolution: {integrity: sha512-nUD45V/YHDkAKZyak7YDsz+Vk1F9N0ica3jWQe0AY0JqD9DleHa8RY/olSVws26kLyEj1I+fQqva6GodcLaIqQ==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 + dev: false - victory-brush-container@36.9.2(react@18.2.0): + /victory-brush-container@36.9.2(react@18.2.0): + resolution: {integrity: sha512-KcQjzFeo40tn52cJf1A02l5MqeR9GKkk3loDqM3T2hfi1PCyUrZXEUjGN5HNlLizDRvtcemaAHNAWlb70HbG/g==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-brush-line@36.9.2(react@18.2.0): + /victory-brush-line@36.9.2(react@18.2.0): + resolution: {integrity: sha512-/ncj8HEyl73fh8bhU4Iqe79DL62QP2rWWoogINxsGvndrhpFbL9tj7IPSEawi+riOh/CmohgI/ETu/V7QU9cJw==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-candlestick@36.9.2(react@18.2.0): + /victory-candlestick@36.9.2(react@18.2.0): + resolution: {integrity: sha512-hbStzF61GHkkflJWFgLTZSR8SOm8siJn65rwApLJBIA283yWOlyPjdr/kIQtO/h5QkIiXIuLb7RyiUAJEnH9WA==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-canvas@36.9.2(react@18.2.0): + /victory-canvas@36.9.2(react@18.2.0): + resolution: {integrity: sha512-ImHJ7JQCpQ9aGCsh37EeVAmqJc7R0gl2CLM99gP9GfuJuZeoZ/GVfX6QFamfr19rYQOD2m9pVbecySBzdYI1zQ==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-bar: 36.9.2(react@18.2.0) victory-core: 36.9.2(react@18.2.0) + dev: false - victory-chart@36.9.2(react@18.2.0): + /victory-chart@36.9.2(react@18.2.0): + resolution: {integrity: sha512-dMNcS0BpqL3YiGvI4BSEmPR76FCksCgf3K4CSZ7C/MGyrElqB6wWwzk7afnlB1Qr71YIHXDmdwsPNAl/iEwTtA==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 @@ -6582,15 +5579,23 @@ snapshots: victory-core: 36.9.2(react@18.2.0) victory-polar-axis: 36.9.2(react@18.2.0) victory-shared-events: 36.9.2(react@18.2.0) + dev: false - victory-core@36.9.2(react@18.2.0): + /victory-core@36.9.2(react@18.2.0): + resolution: {integrity: sha512-AzmMy+9MYMaaRmmZZovc/Po9urHne3R3oX7bbXeQdVuK/uMBrlPiv11gVJnuEH2SXLVyep43jlKgaBp8ef9stQ==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-vendor: 36.9.2 + dev: false - victory-create-container@36.9.2(react@18.2.0): + /victory-create-container@36.9.2(react@18.2.0): + resolution: {integrity: sha512-uA0dh1R0YDzuXyE/7StZvq4qshet+WYceY7R1UR5mR/F9079xy+iQsa2Ca4h97/GtVZoLO6r1eKLWBt9TN+U7A==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 @@ -6600,28 +5605,44 @@ snapshots: victory-selection-container: 36.9.2(react@18.2.0) victory-voronoi-container: 36.9.2(react@18.2.0) victory-zoom-container: 36.9.2(react@18.2.0) + dev: false - victory-cursor-container@36.9.2(react@18.2.0): + /victory-cursor-container@36.9.2(react@18.2.0): + resolution: {integrity: sha512-jidab4j3MaciF3fGX70jTj4H9rrLcY8o2LUrhJ67ZLvEFGGmnPtph+p8Fe97Umrag7E/DszjNxQZolpwlgUh3g==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-errorbar@36.9.2(react@18.2.0): + /victory-errorbar@36.9.2(react@18.2.0): + resolution: {integrity: sha512-i/WPMN6/7F55FpEpN9WcwiWwaFJ+2ymfTgfBDLkUD3XJ52HGen4BxUt1ouwDA3FXz9kLa/h6Wbp/fnRhX70row==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-group@36.9.2(react@18.2.0): + /victory-group@36.9.2(react@18.2.0): + resolution: {integrity: sha512-wBmpsjBTKva8mxHvHNY3b8RE58KtnpLLItEyyAHaYkmExwt3Uj8Cld3sF3vmeuijn2iR64NPKeMbgMbfZJzycw==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) victory-shared-events: 36.9.2(react@18.2.0) + dev: false - victory-histogram@36.9.2(react@18.2.0): + /victory-histogram@36.9.2(react@18.2.0): + resolution: {integrity: sha512-w0ipFwWZ533qyqduRacr5cf+H4PGAUTdWNyGvZbWyu4+GtYYjGdoOolfUcO1ee8VJ1kZodpG8Z7ud6I/GWIzjQ==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 @@ -6629,68 +5650,106 @@ snapshots: victory-bar: 36.9.2(react@18.2.0) victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 + dev: false - victory-legend@36.9.2(react@18.2.0): + /victory-legend@36.9.2(react@18.2.0): + resolution: {integrity: sha512-cucFJpv6fty+yXp5pElQFQnHBk1TqA4guGUMI+XF/wLlnuM4bhdAtASobRIIBkz0mHGBaCAAV4PzL9azPU/9dg==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-line@36.9.2(react@18.2.0): + /victory-line@36.9.2(react@18.2.0): + resolution: {integrity: sha512-kmYFZUo0o2xC8cXRsmt/oUBRQSZJVT2IJnAkboUepypoj09e6CY5tRH4TSdfEDGkBk23xQkn7d4IFgl4kAGnSA==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 + dev: false - victory-pie@36.9.2(react@18.2.0): + /victory-pie@36.9.2(react@18.2.0): + resolution: {integrity: sha512-i3zWezvy5wQEkhXKt4rS9ILGH7Vr9Q5eF9fKO4GMwDPBdYOTE3Dh2tVaSrfDC8g9zFIc0DKzOtVoJRTb+0AkPg==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) victory-vendor: 36.9.2 + dev: false - victory-polar-axis@36.9.2(react@18.2.0): + /victory-polar-axis@36.9.2(react@18.2.0): + resolution: {integrity: sha512-HBR90FF4M56yf/atXjSmy3DMps1vSAaLXmdVXLM/A5g+0pUS7HO719r5x6dsR3I6Rm+8x6Kk8xJs0qgpnGQIEw==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-scatter@36.9.2(react@18.2.0): + /victory-scatter@36.9.2(react@18.2.0): + resolution: {integrity: sha512-hK9AtbJQfaW05i8BH7Lf1HK7vWMAfQofj23039HEQJqTKbCL77YT+Q0LhZw1a1BRCpC/5aSg9EuqblhfIYw2wg==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-selection-container@36.9.2(react@18.2.0): + /victory-selection-container@36.9.2(react@18.2.0): + resolution: {integrity: sha512-chboroEwqqVlMB60kveXM2WznJ33ZM00PWkFVCoJDzHHlYs7TCADxzhqet2S67SbZGSyvSprY2YztSxX8kZ+XQ==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-shared-events@36.9.2(react@18.2.0): + /victory-shared-events@36.9.2(react@18.2.0): + resolution: {integrity: sha512-W/atiw3Or6MnpBuhluFv6007YrixIRh5NtiRvtFLGxNuQJLYjaSh6koRAih5xJer5Pj7YUx0tL9x67jTRcJ6Dg==} + peerDependencies: + react: '>=16.6.0' dependencies: json-stringify-safe: 5.0.1 lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-stack@36.9.2(react@18.2.0): + /victory-stack@36.9.2(react@18.2.0): + resolution: {integrity: sha512-imR6FniVlDFlBa/B3Est8kTryNhWj2ZNpivmVOebVDxkKcVlLaDg3LotCUOI7NzOhBQaro0UzeE9KmZV93JcYA==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) victory-shared-events: 36.9.2(react@18.2.0) + dev: false - victory-tooltip@36.9.2(react@18.2.0): + /victory-tooltip@36.9.2(react@18.2.0): + resolution: {integrity: sha512-76seo4TWD1WfZHJQH87IP3tlawv38DuwrUxpnTn8+uW6/CUex82poQiVevYdmJzhataS9jjyCWv3w7pOmLBCLg==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-vendor@36.9.2: + /victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} dependencies: '@types/d3-array': 3.2.1 '@types/d3-ease': 3.0.2 @@ -6706,8 +5765,12 @@ snapshots: d3-shape: 3.2.0 d3-time: 3.1.0 d3-timer: 3.0.1 + dev: false - victory-voronoi-container@36.9.2(react@18.2.0): + /victory-voronoi-container@36.9.2(react@18.2.0): + resolution: {integrity: sha512-NIVYqck9N4OQnEz9mgQ4wILsci3OBWWK7RLuITGHyoD7Ne/+WH1i0Pv2y9eIx+f55rc928FUTugPPhkHvXyH3A==} + peerDependencies: + react: '>=16.6.0' dependencies: delaunay-find: 0.0.6 lodash: 4.17.21 @@ -6715,21 +5778,33 @@ snapshots: react-fast-compare: 3.2.2 victory-core: 36.9.2(react@18.2.0) victory-tooltip: 36.9.2(react@18.2.0) + dev: false - victory-voronoi@36.9.2(react@18.2.0): + /victory-voronoi@36.9.2(react@18.2.0): + resolution: {integrity: sha512-50fq0UBTAFxxU+nabOIPE5P2v/2oAbGAX+Ckz6lu8LFwwig4J1DSz0/vQudqDGjzv3JNEdqTD4FIpyjbxLcxiA==} + peerDependencies: + react: '>=16.6.0' dependencies: d3-voronoi: 1.1.4 lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory-zoom-container@36.9.2(react@18.2.0): + /victory-zoom-container@36.9.2(react@18.2.0): + resolution: {integrity: sha512-pXa2Ji6EX/pIarKT6Hcmmu2n7IG/x8Vs0D2eACQ/nbpvZa+DXWIxCRW4hcg2Va35fmXcDIEpGaX3/soXzZ+pbw==} + peerDependencies: + react: '>=16.6.0' dependencies: lodash: 4.17.21 react: 18.2.0 victory-core: 36.9.2(react@18.2.0) + dev: false - victory@36.9.2(react@18.2.0): + /victory@36.9.2(react@18.2.0): + resolution: {integrity: sha512-kgVgiSno4KpD0HxmUo5GzqWI4P/eILLOM6AmJfAlagCnOzrtYGsAw+N1YxOcYvTiKsh/zmWawxHlpw3TMenFDQ==} + peerDependencies: + react: '>=16.6.0' dependencies: react: 18.2.0 victory-area: 36.9.2(react@18.2.0) @@ -6759,26 +5834,49 @@ snapshots: victory-voronoi: 36.9.2(react@18.2.0) victory-voronoi-container: 36.9.2(react@18.2.0) victory-zoom-container: 36.9.2(react@18.2.0) + dev: false - warning@4.0.3: + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} dependencies: loose-envify: 1.4.0 + dev: false - watchpack@2.4.0: + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + dev: false - watchpack@2.4.1: + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + dev: true - webidl-conversions@3.0.1: {} + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + requiresBuild: true + dev: false - webpack-sources@3.2.3: {} + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true - webpack@5.91.0: + /webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -6808,21 +5906,29 @@ snapshots: - '@swc/core' - esbuild - uglify-js + dev: true - whatwg-url@5.0.0: + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + requiresBuild: true dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 + dev: false - which-boxed-primitive@1.0.2: + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 + dev: false - which-builtin-type@1.1.3: + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -6836,56 +5942,91 @@ snapshots: which-boxed-primitive: 1.0.2 which-collection: 1.0.2 which-typed-array: 1.1.15 + dev: false - which-collection@1.0.2: + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 + dev: false - which-typed-array@1.1.15: + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 + dev: false - which@2.0.2: + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true dependencies: isexe: 2.0.0 - wide-align@1.1.5: + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + requiresBuild: true dependencies: string-width: 4.2.3 + dev: false optional: true - wrap-ansi@7.0.0: + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: {} + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - y18n@5.0.8: {} + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true - yallist@4.0.0: {} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + requiresBuild: true + dev: false - yaml@1.10.2: {} + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false - yaml@2.3.1: {} + /yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + dev: true - yargs-parser@21.1.1: {} + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true - yargs@17.7.2: + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -6894,14 +6035,21 @@ snapshots: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 + dev: true - yocto-queue@0.1.0: {} + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - yup@1.4.0: + /yup@1.4.0: + resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} dependencies: property-expr: 2.0.6 tiny-case: 1.0.3 toposort: 2.0.2 type-fest: 2.19.0 + dev: false - zod@3.21.4: {} + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false From 11a94703dae08fcc9ad025dd782679a804cbda83 Mon Sep 17 00:00:00 2001 From: myluki2000 Date: Sat, 21 Sep 2024 12:47:02 +0200 Subject: [PATCH 12/33] SearchResult: Fix time display for video segments --- app/search/SearchResult.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/search/SearchResult.tsx b/app/search/SearchResult.tsx index 04f981f..209af78 100644 --- a/app/search/SearchResult.tsx +++ b/app/search/SearchResult.tsx @@ -19,7 +19,8 @@ function getSegmentContents(mediaRecordSegment: NonNullable[number]["mediaRecordSegment"]) { switch (mediaRecordSegment.__typename) { case "VideoRecordSegment": - return Time {mediaRecordSegment.screenText}; + const date = new Date(mediaRecordSegment.startTime! * 1000); + return Time {date.toISOString().slice(11, 19)}; case "DocumentRecordSegment": return Page {mediaRecordSegment.page! + 1}; default: From 66687b514318dc17bdd2c58e623de0982026c4e6 Mon Sep 17 00:00:00 2001 From: myluki2000 Date: Thu, 26 Sep 2024 12:53:12 +0200 Subject: [PATCH 13/33] Move search results to separate component --- app/search/page.tsx | 22 ++------------ .../search/SearchResultGroup.tsx | 6 ++-- .../search/SearchResultItem.tsx | 2 +- components/search/SearchResultsBox.tsx | 29 +++++++++++++++++++ 4 files changed, 35 insertions(+), 24 deletions(-) rename {app => components}/search/SearchResultGroup.tsx (96%) rename app/search/SearchResult.tsx => components/search/SearchResultItem.tsx (94%) create mode 100644 components/search/SearchResultsBox.tsx diff --git a/app/search/page.tsx b/app/search/page.tsx index cb22813..de14a97 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -4,10 +4,9 @@ import { pageSemanticSearchQuery, pageSemanticSearchQuery$data } from "@/__gener import { Autocomplete, Box, Button, Collapse, IconButton, InputAdornment, Paper, TextField, Typography } from "@mui/material"; import { useRouter, useSearchParams } from "next/navigation"; import { graphql, useLazyLoadQuery } from "react-relay"; -import SearchResultGroup from "./SearchResultGroup"; import {ManageSearch, ExpandMore, ExpandLess, Search} from '@mui/icons-material'; import { useState } from "react"; -import lodash from "lodash"; +import SearchResultsBox from "@/components/search/SearchResultsBox"; export default function SearchPage() { const router = useRouter(); @@ -89,13 +88,6 @@ export default function SearchPage() { } ); - // Group the search results - const semanticSearchResultGroups = lodash.chain(semanticSearch ?? []) - .groupBy((result) => result.mediaRecordSegment.mediaRecord?.id ?? "unknown") - .forEach((group) => group.sort((a, b) => a.score - b.score)) - .sortBy((group) => group[0].score) - .value(); - // open advanced search by default if an advanced search parameter was provided const [isAdvancedSearchOpen, setIsAdvancedSearchOpen] = useState(searchParams.get("courses") !== null || searchParams.get("count") !== null); function toggleAdvancedSearch() { @@ -176,17 +168,7 @@ export default function SearchPage() { onClick={toggleAdvancedSearch}>{isAdvancedSearchOpen ? "Close Advanced Search" : "Advanced Search"} - {((query !== null) && - Object.values(semanticSearchResultGroups).map((resultGroup) => { - if(resultGroup !== undefined) - return ( - - ); - }) - )} + {(query !== null && )} ); } \ No newline at end of file diff --git a/app/search/SearchResultGroup.tsx b/components/search/SearchResultGroup.tsx similarity index 96% rename from app/search/SearchResultGroup.tsx rename to components/search/SearchResultGroup.tsx index f577b81..48728a2 100644 --- a/app/search/SearchResultGroup.tsx +++ b/components/search/SearchResultGroup.tsx @@ -1,7 +1,7 @@ "use client"; import { Box, Breadcrumbs, Button, Card, Divider, IconButton, Link, Paper, Tooltip } from "@mui/material"; -import SearchResult from "./SearchResult"; +import SearchResultItem from "./SearchResultItem"; import { ExpandMore, ExpandLess } from "@mui/icons-material"; import { useState } from "react"; import { MediaRecordIcon } from "@/components/MediaRecordIcon"; @@ -37,7 +37,7 @@ export default function SearchResultGroup({ searchResults, collapsedResultCount {searchResults.slice(0, collapsedResultCount).map((result, index: number) => { return ( {index > 0 && } - + ) })} @@ -55,7 +55,7 @@ export default function SearchResultGroup({ searchResults, collapsedResultCount && searchResults.slice(collapsedResultCount, searchResults.length).map((result, index: number) => { return ( {index > 0 && } - + ) })} diff --git a/app/search/SearchResult.tsx b/components/search/SearchResultItem.tsx similarity index 94% rename from app/search/SearchResult.tsx rename to components/search/SearchResultItem.tsx index 209af78..4995366 100644 --- a/app/search/SearchResult.tsx +++ b/components/search/SearchResultItem.tsx @@ -36,7 +36,7 @@ const NoMaxWidthTooltip = styled(({ className, ...props }: TooltipProps) => ( }, }); -export default function SearchResult({ searchResult }: { searchResult: NonNullable[number] }) { +export default function SearchResultItem({ searchResult }: { searchResult: NonNullable[number] }) { return result.mediaRecordSegment.mediaRecord?.id ?? "unknown") + .forEach((group) => group.sort((a, b) => a.score - b.score)) + .sortBy((group) => group[0].score) + .value(); + + return {(Object.values(semanticSearchResultGroups).map((resultGroup) => { + if(resultGroup !== undefined) + return ( + + ); + }) + )} + +} \ No newline at end of file From 83aff44ff324ef8ca0b3721619099227dc1dd5d2 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Thu, 26 Sep 2024 20:43:29 +0200 Subject: [PATCH 14/33] similar segments --- .../media/[mediaId]/SimilarSegments.tsx | 52 + .../[courseId]/media/[mediaId]/VideoSide.tsx | 110 +- .../[courseId]/media/[mediaId]/student.tsx | 5 +- app/layout.tsx | 2 +- app/search/page.tsx | 324 ++--- components/search/SearchResultGroup.tsx | 229 ++-- components/search/SearchResultsBox.tsx | 112 +- package.json | 2 +- src/RelayEnvironment.ts | 2 +- src/schema.graphql | 1161 ++++++----------- 10 files changed, 923 insertions(+), 1076 deletions(-) create mode 100644 app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx diff --git a/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx b/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx new file mode 100644 index 0000000..6bc4e82 --- /dev/null +++ b/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx @@ -0,0 +1,52 @@ +import { SimilarSegmentsQuery } from "@/__generated__/SimilarSegmentsQuery.graphql"; +import SearchResultsBox from "@/components/search/SearchResultsBox"; +import { CircularProgress, Drawer } from "@mui/material"; +import { useState, useTransition } from "react"; +import { graphql, useLazyLoadQuery } from "react-relay"; +import useBus from "use-bus"; + +export function SimilarSegments() { + const [segmentId, setsegmentId] = useState(null); + const [isLoading, startTransition] = useTransition(); + + useBus("searchSimilarSegment", (e) => { + if ("segmentId" in e) { + startTransition(() => setsegmentId(e.segmentId)); + } + }); + + const segments = useLazyLoadQuery( + graphql` + query SimilarSegmentsQuery($segmentId: UUID!, $skip: Boolean!) { + getSemanticallySimilarMediaRecordSegments( + mediaRecordSegmentId: $segmentId + count: 10 + ) @skip(if: $skip) { + ...SearchResultsBox + } + } + `, + { segmentId: segmentId!, skip: !segmentId } + ); + + return ( + setsegmentId(null)} + anchor="right" + > +
    + {isLoading && ( +
    + +
    + )} + {segments.getSemanticallySimilarMediaRecordSegments && ( + + )} +
    +
    + ); +} diff --git a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx index 7dc51fd..0f3a525 100644 --- a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx +++ b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx @@ -3,7 +3,7 @@ import { VideoSideFragment$key, } from "@/__generated__/VideoSideFragment.graphql"; import { VideoSideLogProgressMutation } from "@/__generated__/VideoSideLogProgressMutation.graphql"; -import { Check } from "@mui/icons-material"; +import { DescriptionOutlined, Search } from "@mui/icons-material"; import { Button, Divider, MenuItem, Select } from "@mui/material"; import { MediaPlayer, @@ -15,6 +15,7 @@ import { defaultLayoutIcons, DefaultVideoLayout, } from "@vidstack/react/player/layouts/default"; + import { differenceInHours } from "date-fns"; import dayjs from "dayjs"; @@ -191,11 +192,10 @@ export function VideoSide({ {currentSegment && ( <>
    - @@ -235,12 +235,10 @@ function Segment({ segment, content, videoRef, - currentSegmentInfo, }: { segment: VideoSideFragment$data["mediaRecords"][0]["segments"][0]; content: VideoSideFragment$data; videoRef: MutableRefObject; - currentSegmentInfo?: { progress: number }; }) { const links = content.segmentLinks .filter((x) => x.segment1.id === segment.id || x.segment2.id === segment.id) @@ -252,20 +250,12 @@ function Segment({ return (
    { - if (videoRef.current && segment.startTime !== undefined) - videoRef.current.currentTime = segment.startTime; - } - } + onClick={() => { + if (videoRef.current && segment.startTime !== undefined) + videoRef.current.currentTime = segment.startTime; + }} key={segment.id} - className={` overflow-hidden relative border shadow text-xs rounded-md p-2 transition duration-100 flex gap-2 ${ - currentSegmentInfo - ? "bg-emerald-700/10 border-emerald-600/20" - : "bg-slate-50 hover:bg-slate-100 border-slate-200 cursor-pointer" - }`} + className={` overflow-hidden relative border shadow text-xs rounded-md p-2 transition duration-100 flex gap-2 bg-slate-50 hover:bg-slate-100 border-slate-200 cursor-pointer`} > {segment.title!}
    @@ -275,7 +265,7 @@ function Segment({ {segment.title}
    - {currentSegmentInfo && linkedRecords.length > 0 && ( + {linkedRecords.length > 0 && (
    {linkedRecords.map((x) => (
    @@ -283,11 +273,13 @@ function Segment({
    { + onClick={(e) => { dispatch({ type: "openPage", page: x.page }); + e.stopPropagation(); }} > - Page {(x.page ?? 0) + 1} → + Page {(x.page ?? 0) + 1}{" "} +
    ))}
    @@ -295,12 +287,76 @@ function Segment({
    )}
    - {currentSegmentInfo && ( +
    + ); +} + +function CurrentSegment({ + segment, + content, + progress, +}: { + segment: VideoSideFragment$data["mediaRecords"][0]["segments"][0]; + content: VideoSideFragment$data; + progress: number; +}) { + const links = content.segmentLinks + .filter((x) => x.segment1.id === segment.id || x.segment2.id === segment.id) + .map((x) => (x.segment1.id === segment.id ? x.segment2.id : x.segment1.id)); + + const linkedRecords = content.mediaRecords + .flatMap((x) => x.segments) + .filter((x) => links.includes(x.id)); + + return ( +
    + {segment.title!} +
    +
    + {dayjs.duration(segment.startTime ?? 0, "seconds").format("HH:mm:ss")} +
    + {segment.title} +
    +
    + {linkedRecords.length > 0 && ( +
    + {linkedRecords.map((x) => ( +
    + {linkedRecords.map((x) => ( +
    { + dispatch({ type: "openPage", page: x.page }); + }} + > + Page {(x.page ?? 0) + 1}{" "} + +
    + ))} +
    + ))} +
    + )} +
    - )} + className="text-xs font-medium text-emerald-900/80 hover:text-emerald-900 rounded-sm p-1 transition-all cursor-pointer text-end" + onClick={(e) => { + dispatch({ type: "searchSimilarSegment", segmentId: segment.id }); + e.stopPropagation(); + }} + > + Similar Content +
    +
    + +
    ); } diff --git a/app/courses/[courseId]/media/[mediaId]/student.tsx b/app/courses/[courseId]/media/[mediaId]/student.tsx index cfbda84..c518d59 100644 --- a/app/courses/[courseId]/media/[mediaId]/student.tsx +++ b/app/courses/[courseId]/media/[mediaId]/student.tsx @@ -20,6 +20,7 @@ import { useParams } from "next/navigation"; import { useRef, useState } from "react"; import { graphql, useFragment, useLazyLoadQuery } from "react-relay"; +import { SimilarSegments } from "./SimilarSegments"; import { VideoSide } from "./VideoSide"; export default function StudentMediaPage() { @@ -81,6 +82,8 @@ export default function StudentMediaPage() { return (
    + + {hasVideos && } diff --git a/app/layout.tsx b/app/layout.tsx index 7920330..7885764 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -34,7 +34,7 @@ const oidcConfig: AuthProviderProps = { client_id: process.env.NEXT_PUBLIC_OAUTH_CLIENT_ID ?? "frontend", authority: process.env.NEXT_PUBLIC_OAUTH_AUTHORITY ?? - "http://localhost:9009/realms/GITS", + "https://vault.lutr.me:9009/realms/GITS", onSigninCallback() { window.history.replaceState({}, document.title, window.location.pathname); diff --git a/app/search/page.tsx b/app/search/page.tsx index de14a97..195d688 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -1,174 +1,180 @@ "use client"; -import { pageSemanticSearchQuery, pageSemanticSearchQuery$data } from "@/__generated__/pageSemanticSearchQuery.graphql"; -import { Autocomplete, Box, Button, Collapse, IconButton, InputAdornment, Paper, TextField, Typography } from "@mui/material"; +import { pageSemanticSearchQuery } from "@/__generated__/pageSemanticSearchQuery.graphql"; +import SearchResultsBox from "@/components/search/SearchResultsBox"; +import { + ExpandLess, + ExpandMore, + ManageSearch, + Search, +} from "@mui/icons-material"; +import { + Autocomplete, + Box, + Button, + Collapse, + IconButton, + InputAdornment, + Paper, + TextField, + Typography, +} from "@mui/material"; import { useRouter, useSearchParams } from "next/navigation"; -import { graphql, useLazyLoadQuery } from "react-relay"; -import {ManageSearch, ExpandMore, ExpandLess, Search} from '@mui/icons-material'; import { useState } from "react"; -import SearchResultsBox from "@/components/search/SearchResultsBox"; +import { graphql, useLazyLoadQuery } from "react-relay"; export default function SearchPage() { - const router = useRouter(); - const searchParams = useSearchParams(); - const query: string | null = searchParams.get("query"); + const router = useRouter(); + const searchParams = useSearchParams(); + const query: string | null = searchParams.get("query"); - const { semanticSearch, currentUserInfo } = useLazyLoadQuery( - graphql` - query pageSemanticSearchQuery($query: String!, $count: Int!, $skipQuery: Boolean!, $courseWhitelist: [UUID!]) { - semanticSearch(queryText: $query, count: $count, courseWhitelist: $courseWhitelist) @skip(if: $skipQuery) { - score - mediaRecordSegment { - __typename - id - thumbnail - mediaRecordId - ...on VideoRecordSegment { - startTime - screenText - transcript - mediaRecord { - id - name - type - contents { - metadata { - name - chapter { - title - } - course { - title - } - } - } - } - } - ...on DocumentRecordSegment { - page - text - mediaRecord { - id - name - type - contents { - id - metadata { - name - chapter { - id - title - } - course { - id - title - } - } - } - } - } - } - } - currentUserInfo { - id - availableCourseMemberships { - course { - id - title - } - } - } + const { semanticSearch, currentUserInfo } = + useLazyLoadQuery( + graphql` + query pageSemanticSearchQuery( + $query: String! + $count: Int! + $skipQuery: Boolean! + $courseWhitelist: [UUID!] + ) { + semanticSearch( + queryText: $query + count: $count + courseWhitelist: $courseWhitelist + ) @skip(if: $skipQuery) { + score + ...SearchResultsBox + } + currentUserInfo { + id + availableCourseMemberships { + course { + id + title + } } - `, - { - query: query ?? "", - count: searchParams.get("count") ? parseInt(searchParams.get("count")!) : 20, - courseWhitelist: searchParams.get("courses") ? searchParams.get("courses")!.split(",") : null, - skipQuery: query === null + } } + `, + { + query: query ?? "", + count: searchParams.get("count") + ? parseInt(searchParams.get("count")!) + : 20, + courseWhitelist: searchParams.get("courses") + ? searchParams.get("courses")!.split(",") + : null, + skipQuery: query === null, + } ); - // open advanced search by default if an advanced search parameter was provided - const [isAdvancedSearchOpen, setIsAdvancedSearchOpen] = useState(searchParams.get("courses") !== null || searchParams.get("count") !== null); - function toggleAdvancedSearch() { - setIsAdvancedSearchOpen(!isAdvancedSearchOpen); - } + // open advanced search by default if an advanced search parameter was provided + const [isAdvancedSearchOpen, setIsAdvancedSearchOpen] = useState( + searchParams.get("courses") !== null || searchParams.get("count") !== null + ); + function toggleAdvancedSearch() { + setIsAdvancedSearchOpen(!isAdvancedSearchOpen); + } - const [queryTextFieldValue, setQueryTextFieldValue] = useState(query); + const [queryTextFieldValue, setQueryTextFieldValue] = useState(query); - const [advancedSearchSelectedCourses, setAdvancedSearchSelectedCourses] = useState([]); - const [advancedSearchResultCount, setAdvancedSearchResultCount] = useState(20); + const [advancedSearchSelectedCourses, setAdvancedSearchSelectedCourses] = + useState([]); + const [advancedSearchResultCount, setAdvancedSearchResultCount] = + useState(20); - return ( -
    - Search - - - setQueryTextFieldValue(e.target.value)} - onKeyDown={(e) => { - if(e.key === "Enter") { - router.push(`/search?query=${queryTextFieldValue}`); - } - }} - InputLabelProps={{shrink: true}} - InputProps={{ - endAdornment: - { - // if advanced search is open, pass the advanced search parameters, otherwise don't - if(isAdvancedSearchOpen) { - let url = `/search?query=${queryTextFieldValue}&count=${advancedSearchResultCount}`; - if(advancedSearchSelectedCourses.length > 0) { - url += `&courses=${advancedSearchSelectedCourses.map(x => x.id).join(",")}`; - } - router.push(url) - } else { - router.push(`/search?query=${queryTextFieldValue}`) - } - }}> - - - , - }} /> - - - x.course) ?? []} - getOptionLabel={(option) => option.title} - value={advancedSearchSelectedCourses} - onChange={(_, value) => setAdvancedSearchSelectedCourses(value)} - renderInput={(params) => } - /> - setAdvancedSearchResultCount(parseInt(e.target.value))} - InputLabelProps={{shrink: true}} /> - - - - + return ( +
    + Search - {(query !== null && )} -
    - ); -} \ No newline at end of file + + setQueryTextFieldValue(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + router.push(`/search?query=${queryTextFieldValue}`); + } + }} + InputLabelProps={{ shrink: true }} + InputProps={{ + endAdornment: ( + + { + // if advanced search is open, pass the advanced search parameters, otherwise don't + if (isAdvancedSearchOpen) { + let url = `/search?query=${queryTextFieldValue}&count=${advancedSearchResultCount}`; + if (advancedSearchSelectedCourses.length > 0) { + url += `&courses=${advancedSearchSelectedCourses + .map((x) => x.id) + .join(",")}`; + } + router.push(url); + } else { + router.push(`/search?query=${queryTextFieldValue}`); + } + }} + > + + + + ), + }} + /> + + + x.course + ) ?? [] + } + getOptionLabel={(option) => option.title} + value={advancedSearchSelectedCourses} + onChange={(_, value) => setAdvancedSearchSelectedCourses(value)} + renderInput={(params) => ( + + )} + /> + + setAdvancedSearchResultCount(parseInt(e.target.value)) + } + InputLabelProps={{ shrink: true }} + /> + + + + + + {query !== null && semanticSearch && ( + + )} +
    + ); +} diff --git a/components/search/SearchResultGroup.tsx b/components/search/SearchResultGroup.tsx index 48728a2..135b70f 100644 --- a/components/search/SearchResultGroup.tsx +++ b/components/search/SearchResultGroup.tsx @@ -1,103 +1,158 @@ "use client"; -import { Box, Breadcrumbs, Button, Card, Divider, IconButton, Link, Paper, Tooltip } from "@mui/material"; -import SearchResultItem from "./SearchResultItem"; -import { ExpandMore, ExpandLess } from "@mui/icons-material"; -import { useState } from "react"; +import { SearchResultsBox$data } from "@/__generated__/SearchResultsBox.graphql"; import { MediaRecordIcon } from "@/components/MediaRecordIcon"; -import { pageSemanticSearchQuery$data } from "@/__generated__/pageSemanticSearchQuery.graphql"; - -export default function SearchResultGroup({ searchResults, collapsedResultCount }: - { searchResults: NonNullable[number][], collapsedResultCount: number }) { +import { ExpandLess, ExpandMore } from "@mui/icons-material"; +import { + Box, + Breadcrumbs, + Button, + Divider, + IconButton, + Link, + Paper, + Tooltip, +} from "@mui/material"; +import { useState } from "react"; +import SearchResultItem from "./SearchResultItem"; - const [isExpanded, setIsExpanded] = useState(true); - function toggleExpanded() { - setIsExpanded(!isExpanded); - }; +export default function SearchResultGroup({ + searchResults, + collapsedResultCount, +}: { + searchResults: SearchResultsBox$data; + collapsedResultCount: number; +}) { + const [isExpanded, setIsExpanded] = useState(true); + function toggleExpanded() { + setIsExpanded(!isExpanded); + } - const [doShowMoreResults, setDoShowMoreResults] = useState(false); - function toggleShowMoreResults() { - setDoShowMoreResults(!doShowMoreResults); - }; + const [doShowMoreResults, setDoShowMoreResults] = useState(false); + function toggleShowMoreResults() { + setDoShowMoreResults(!doShowMoreResults); + } - // media record is the same for all results in the group, just get the first segment's media record - const mediaRecord = searchResults[0].mediaRecordSegment.mediaRecord; - if(mediaRecord === null || mediaRecord === undefined) { - return null; - } + // media record is the same for all results in the group, just get the first segment's media record + const mediaRecord = searchResults[0].mediaRecordSegment.mediaRecord; + if (mediaRecord === null || mediaRecord === undefined) { + return null; + } - const userAccessibleContent = mediaRecord.contents.find((x) => x !== undefined && x !== null); - if(userAccessibleContent === null || userAccessibleContent === undefined) { - return null; - } + const userAccessibleContent = mediaRecord.contents.find( + (x) => x !== undefined && x !== null + ); + if (userAccessibleContent === null || userAccessibleContent === undefined) { + return null; + } - function renderResultsIfExpanded() { - if(isExpanded) { - return
    - {searchResults.slice(0, collapsedResultCount).map((result, index: number) => { - return ( - {index > 0 && } - - ) - })} + function renderResultsIfExpanded() { + if (isExpanded) { + return ( +
    + {searchResults + .slice(0, collapsedResultCount) + .map((result, index: number) => { + return ( + + {index > 0 && } + + + ); + })} - + - {/* Show the rest of the results if user has expanded the result group */} - {doShowMoreResults - && searchResults.slice(collapsedResultCount, searchResults.length).map((result, index: number) => { - return ( + {/* Show the rest of the results if user has expanded the result group */} + {doShowMoreResults && + searchResults + .slice(collapsedResultCount, searchResults.length) + .map((result, index: number) => { + return ( + {index > 0 && } - ) - })} - - -
    - } + + ); + })} +
    + ); } + } - return - - - - - {isExpanded ? : } - - - - {userAccessibleContent.metadata.course.title} - - - {userAccessibleContent.metadata.chapter.title} - - - {userAccessibleContent.metadata.name} - - - {mediaRecord.name} - - + return ( + + + + + + {isExpanded ? : } + + + + {userAccessibleContent.metadata.course.title} + + + {userAccessibleContent.metadata.chapter.title} + + + {userAccessibleContent.metadata.name} + + + {mediaRecord.name} + + - - - - - - - - {renderResultsIfExpanded()} - + + + + + + + + {renderResultsIfExpanded()} + -} \ No newline at end of file + ); +} diff --git a/components/search/SearchResultsBox.tsx b/components/search/SearchResultsBox.tsx index 0330349..f8e20ce 100644 --- a/components/search/SearchResultsBox.tsx +++ b/components/search/SearchResultsBox.tsx @@ -1,29 +1,97 @@ "use client"; -import { pageSemanticSearchQuery$data } from "@/__generated__/pageSemanticSearchQuery.graphql"; +import { SearchResultsBox$key } from "@/__generated__/SearchResultsBox.graphql"; +import { Box } from "@mui/material"; import lodash from "lodash"; +import { graphql, useFragment } from "react-relay"; import SearchResultGroup from "./SearchResultGroup"; -import { Box } from "@mui/material"; -export default function SearchResultsBox({ searchResults }: - { searchResults:pageSemanticSearchQuery$data['semanticSearch'] } -) { - // Group the search results - const semanticSearchResultGroups = lodash.chain(searchResults ?? []) - .groupBy((result) => result.mediaRecordSegment.mediaRecord?.id ?? "unknown") - .forEach((group) => group.sort((a, b) => a.score - b.score)) - .sortBy((group) => group[0].score) - .value(); +export default function SearchResultsBox({ + searchResults: _searchResults, +}: { + searchResults: SearchResultsBox$key; +}) { + const searchResults = useFragment( + graphql` + fragment SearchResultsBox on SemanticSearchResult @relay(plural: true) { + score + mediaRecordSegment { + __typename + id + thumbnail + mediaRecordId + ... on VideoRecordSegment { + startTime + screenText + transcript + mediaRecord { + id + name + type + contents { + metadata { + name + chapter { + title + } + course { + title + } + } + } + } + } + ... on DocumentRecordSegment { + page + text + mediaRecord { + id + name + type + contents { + id + metadata { + name + chapter { + id + title + } + course { + id + title + } + } + } + } + } + } + } + `, + _searchResults + ); + + // Group the search results + const semanticSearchResultGroups = lodash + .chain(searchResults ?? []) + .groupBy((result) => result.mediaRecordSegment.mediaRecord?.id ?? "unknown") + .forEach((group) => group.sort((a, b) => a.score - b.score)) + .sortBy((group) => group[0].score) + .value(); - return {(Object.values(semanticSearchResultGroups).map((resultGroup) => { - if(resultGroup !== undefined) - return ( - - ); - }) - )} + return ( + + {Object.values(semanticSearchResultGroups).map((resultGroup) => { + if (resultGroup !== undefined) + return ( + + ); + })} -} \ No newline at end of file + ); +} diff --git a/package.json b/package.json index b26b32d..b9387ef 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "format": "prettier --write .", "check-format": "prettier --check .", "prepare": "husky install", - "update-schema": "fetch-graphql-schema http://localhost:8080/graphql -o src/schema.graphql -r && ( [[ \"$OSTYPE\" == \"darwin\"* ]] && sed -i '' 's/Assessment,/Assessment \\&/' src/schema.graphql || sed -i 's/Assessment,/Assessment \\&/' src/schema.graphql )" + "update-schema": "fetch-graphql-schema https://vault.lutr.me:8081/graphql -o src/schema.graphql -r && ( [[ \"$OSTYPE\" == \"darwin\"* ]] && sed -i '' 's/Assessment,/Assessment \\&/' src/schema.graphql || sed -i 's/Assessment,/Assessment \\&/' src/schema.graphql )" }, "lint-staged": { "*.{ts,tsx,css,json}": "prettier --write" diff --git a/src/RelayEnvironment.ts b/src/RelayEnvironment.ts index 08f7420..186f39a 100644 --- a/src/RelayEnvironment.ts +++ b/src/RelayEnvironment.ts @@ -9,7 +9,7 @@ import { useAuth; const HTTP_ENDPOINT = - process.env.NEXT_PUBLIC_BACKEND_URL ?? "http://localhost:8080/graphql"; + process.env.NEXT_PUBLIC_BACKEND_URL ?? "https://vault.lutr.me:8081/graphql"; function createFetchFn(token: string | undefined): FetchFunction { return async (request, variables) => { diff --git a/src/schema.graphql b/src/schema.graphql index 790f90f..1174003 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -5,37 +5,79 @@ directive @specifiedBy( ) on SCALAR # see also https://github.com/graphql-java/graphql-java-extended-validation/blob/master/README.md -directive @DecimalMax(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMax.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION +directive @DecimalMax( + value: String! + inclusive: Boolean! = true + message: String = "graphql.validation.DecimalMax.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @DecimalMin( + value: String! + inclusive: Boolean! = true + message: String = "graphql.validation.DecimalMin.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Max( + value: Int! = 2147483647 + message: String = "graphql.validation.Max.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Min( + value: Int! = 0 + message: String = "graphql.validation.Min.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Negative( + message: String = "graphql.validation.Negative.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NegativeOrZero( + message: String = "graphql.validation.NegativeOrZero.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotBlank( + message: String = "graphql.validation.NotBlank.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotEmpty( + message: String = "graphql.validation.NotEmpty.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerNotEmpty( + message: String = "graphql.validation.ContainerNotEmpty.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Pattern( + regexp: String! = ".*" + message: String = "graphql.validation.Pattern.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Positive( + message: String = "graphql.validation.Positive.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @PositiveOrZero( + message: String = "graphql.validation.PositiveOrZero.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Range( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.Range.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Size( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.Size.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerSize( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.ContainerSize.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION -directive @DecimalMin(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMin.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Max(value: Int! = 2147483647, message: String = "graphql.validation.Max.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Min(value: Int! = 0, message: String = "graphql.validation.Min.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Negative(message: String = "graphql.validation.Negative.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NegativeOrZero(message: String = "graphql.validation.NegativeOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotBlank(message: String = "graphql.validation.NotBlank.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotEmpty(message: String = "graphql.validation.NotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerNotEmpty(message: String = "graphql.validation.ContainerNotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Pattern(regexp: String! = ".*", message: String = "graphql.validation.Pattern.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Positive(message: String = "graphql.validation.Positive.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @PositiveOrZero(message: String = "graphql.validation.PositiveOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Range(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Range.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Size(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Size.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerSize(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.ContainerSize.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -# # The @OnDemand directive is used to mark fields that are only internally resolved when requested. # Implementation Note: This will cause the code generator to omit the field from the generated DTOs. directive @OnDemand on FIELD_DEFINITION @@ -43,44 +85,49 @@ directive @OnDemand on FIELD_DEFINITION # Indicates an Input Object is a OneOf Input Object. directive @oneOf on INPUT_OBJECT -directive @resolveTo(requiredSelectionSet: String, sourceName: String!, sourceTypeName: String!, sourceFieldName: String!, sourceSelectionSet: String, sourceArgs: ResolveToSourceArgs, keyField: String, keysArg: String, pubsubTopic: String, filterBy: String, additionalArgs: ResolveToSourceArgs, result: String, resultType: String) on FIELD_DEFINITION +directive @resolveTo( + requiredSelectionSet: String + sourceName: String! + sourceTypeName: String! + sourceFieldName: String! + sourceSelectionSet: String + sourceArgs: ResolveToSourceArgs + keyField: String + keysArg: String + pubsubTopic: String + filterBy: String + additionalArgs: ResolveToSourceArgs + result: String + resultType: String +) on FIELD_DEFINITION interface Assessment { - # # Assessment metadata assessmentMetadata: AssessmentMetadata! - # # ID of the content id: UUID! - # # Metadata of the content metadata: ContentMetadata! - # # Progress data of the content for the current user. userProgressData: UserProgressData! - # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! - # # the items that belong to the Assessment items: [Item!]! } type AssessmentMetadata { - # # Number of skill points a student receives for completing this content skillPoints: Int! - # # Type of the assessment skillTypes: [SkillType!]! - # # The initial learning interval for the assessment in days. # This is the interval that is applied after the assessment is completed the first time. # Following intervals are calculated based on the previous interval and the user's performance. @@ -90,15 +137,12 @@ type AssessmentMetadata { } input AssessmentMetadataInput { - # # Number of skill points a student receives for completing this content skillPoints: Int! - # # Type of the assessment skillTypes: [SkillType!]! - # # The initial learning interval for the assessment in days. # This is the interval that is applied after the assessment is completed the first time. # Following intervals are calculated based on the previous interval and the user's performance. @@ -108,61 +152,47 @@ input AssessmentMetadataInput { } input AssociationInput { - # # id of the corresponding item itemId: UUID - # # Text of the left side of the association, in SlateJS JSON format. left: String! - # # Text of the right side of the association, in SlateJS JSON format. right: String! - # # Feedback for the association when the user selects a wrong answer, in SlateJS JSON format. feedback: JSON } -# # Association question, i.e., a question where the user has to assign the correct right side to each left side. type AssociationQuestion implements Question { - # # Text to display above the association question, in SlateJS JSON format. text: JSON! - # # List of correct associations. correctAssociations: [SingleAssociation!]! - # # Computed list of all the left sides of the associations, shuffled. leftSide: [String!]! - # # Computed list of all the right sides of the associations, shuffled. rightSide: [String!]! - # # Unique identifier of the question and the id of the corresponding item itemId: UUID! - # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! - # # Type of the question. type: QuestionType! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } -# # Level of Blooms Taxonomy enum BloomLevel { REMEMBER @@ -173,44 +203,34 @@ enum BloomLevel { CREATE } -# # A chapter is a part of a course. type Chapter { - # # UUID of the chapter, generated automatically id: UUID! - # # Title of the chapter, maximum length is 255 characters. title: String! - # # Description of the chapter, maximum length is 3000 characters. description: String! - # # Number of the chapter, determines the order of the chapters. number: Int! - # # Start date of the chapter, ISO 8601 format. startDate: DateTime! - # # End date of the chapter, ISO 8601 format. endDate: DateTime! - # # Suggested Start date to start the chapter, ISO 8601 format. # Must be after Start Date and before the End dates. suggestedStartDate: DateTime - # # Suggested End date of the chapter, ISO 8601 format. # Must be after the Start Dates and before the End dates. suggestedEndDate: DateTime - # # The course the chapter belongs to. course: Course! @@ -245,7 +265,6 @@ input ChapterFilter { not: ChapterFilter } -# # Return type of the chapters query, contains a list of chapters and pagination info. type ChapterPayload { elements: [Chapter!]! @@ -253,11 +272,9 @@ type ChapterPayload { } type ClozeBlankElement { - # # The correct answer for the blank. correctAnswer: String! - # # Feedback for the blank when the user selects a wrong answer, in SlateJS JSON format. feedback: JSON } @@ -265,23 +282,18 @@ type ClozeBlankElement { union ClozeElement = ClozeTextElement | ClozeBlankElement input ClozeElementInput { - # # id of the corresponding item itemId: UUID - # # Type of the element. type: ClozeElementType! - # # Text of the element. Only used for TEXT type. text: JSON - # # The correct answer for the blank. Only used for BLANK type. correctAnswer: String - # # Feedback for the blank when the user selects a wrong answer, in SlateJS JSON format. Only used for BLANK type. feedback: JSON } @@ -292,104 +304,81 @@ enum ClozeElementType { } type ClozeQuestion implements Question { - # # The elements of the cloze question. clozeElements: [ClozeElement!]! - # # Addtional wrong answers for the blanks. additionalWrongAnswers: [String!]! - # # All selectable answers for the blanks (computed). This contains the correct answers as well as wrong answers. allBlanks: [String!]! - # # Whether the blanks must be answered in free text or by selecting the correct answer from a list. showBlanksList: Boolean! - # # Unique identifier of the question and the id of the corresponding item itemId: UUID! - # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! - # # Type of the question. type: QuestionType! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } type ClozeTextElement { - # # Text of the element, in SlateJS JSON format. text: JSON! } type CompositeProgressInformation { - # # percentage of completedContents/totalContents progress: Float! - # # absolut number of completed content completedContents: Int! - # # absolut number of total content totalContents: Int! } interface Content { - # # ID of the content id: UUID! - # # Metadata of the content metadata: ContentMetadata! - # # Progress data of the content for the current user. userProgressData: UserProgressData! - # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! } type ContentMetadata { - # # Name of the content name: String! - # # Content type type: ContentType! - # # Suggested date when the content should be done suggestedDate: DateTime! - # # Number of reward points a student receives for completing this content rewardPoints: Int! - # # ID of the chapter this content is associated with chapterId: UUID! - # # ID of the course this content is associated with courseId: UUID! - # # TagNames this content is tagged with tagNames: [String!]! @@ -401,42 +390,33 @@ type ContentMetadata { } type ContentMutation { - # # Identifier of Content contentId: UUID! - # # Update an existing Content updateMediaContent(input: UpdateMediaContentInput!): MediaContent! - # # Update an existing Assessment updateAssessment(input: UpdateAssessmentInput!): Assessment! - # # Delete an existing Content, throws an error if no Content with the given id exists deleteContent: UUID! - # # Add a tag to an existing content addTagToContent(tagName: String): Content! - # # Remove a tag from an existing content removeTagFromContent(tagName: String): Content! } type ContentPayload { - # # the contents elements: [Content!]! - # # pagination info pageInfo: PaginationInfo! } -# # Type of the content enum ContentType { MEDIA @@ -444,64 +424,51 @@ enum ContentType { QUIZ } -# # Courses are the main entity of the application. They are the top level of the # hierarchy and contain chapters. type Course { - # # UUID of the course. Generated automatically when creating a new course. id: UUID! - # # Title of the course. Maximal length is 255 characters, must not be blank. title: String! - # # Detailed description of the course. Maximal length is 3000 characters. description: String! - # # Start date of the course, ISO 8601 format. # Users can only access the course and work on course content after the start date. # Must be before the end date. startDate: DateTime! - # # End date of the course, ISO 8601 format. # Users can no longer access the course and work on course content after the end date. # Must be after the start date. endDate: DateTime! - # # Published state of the course. If the course is published, it is visible to users. published: Boolean! - # # The year in which the term starts. startYear: Int - # # The division of the academic calendar in which the term takes place. yearDivision: YearDivision - # # Chapters of the course. Can be filtered and sorted. # 🔒 User needs to be enrolled in the course to access this field. chapters( filter: ChapterFilter - # # The fields to sort by. The default sort order is by chapter number. # Throws an error if no field with the given name exists. sortBy: [String!]! = [] - # # The sort direction for each field. If not specified, defaults to ASC. sortDirection: [SortDirection!]! = [ASC] pagination: Pagination ): ChapterPayload! - # # Course Memberships of this course. Contains information about which users are members of the course and what # role they have in it. # 🔒 User needs to be at least an admin of the course to access this field. @@ -533,7 +500,6 @@ type Course { skills: [Skill!]! } -# # Input type for filtering courses. All fields are optional. # If multiple filters are specified, they are combined with AND (except for the or field). input CourseFilter { @@ -547,23 +513,18 @@ input CourseFilter { not: CourseFilter } -# # Represents a course membership object of a user. Each user can be a member of # set of courses and some users can also own courses type CourseMembership { - # # Id of the user. userId: UUID! - # # Id of the course the user is a member of. courseId: UUID! - # # The role of the user in the course. role: UserRoleInCourse! - # # Course of the Course Membership course: Course! @@ -571,23 +532,18 @@ type CourseMembership { user: PublicUserInfo } -# # Represents a course membership input object of a user. input CourseMembershipInput { - # # Id of the user. userId: UUID! - # # Id of the course the user is a member of. courseId: UUID! - # # The role of the user in the course. role: UserRoleInCourse! } -# # Return type for the course query. Contains the course and the pagination info. type CoursePayload { elements: [Course!]! @@ -595,355 +551,279 @@ type CoursePayload { } input CreateAssessmentInput { - # # Metadata for the new Content metadata: CreateContentMetadataInput! - # # Assessment metadata assessmentMetadata: AssessmentMetadataInput! - # # items of the new assessments items: [ItemInput!] } input CreateAssociationQuestionInput { - # # id of the corresponding item itemId: UUID - # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int - # # Text of the question, in SlateJS JSON format. text: JSON! - # # List of associations. correctAssociations: [AssociationInput!]! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } -# # Input type for creating chapters. input CreateChapterInput { - # # Title of the chapter, maximum length is 255 characters, must not be blank. title: String! - # # Description of the chapter, maximum length is 3000 characters. description: String! - # # Number of the chapter, determines the order of the chapters, must be positive. number: Int! - # # Start date of the chapter, ISO 8601 format. # Must be before the end date. startDate: DateTime! - # # End date of the chapter, ISO 8601 format. # Must be after the start date. endDate: DateTime! - # # Suggested Start date to start the chapter, ISO 8601 format. # Must be after Start Date and before the End dates. suggestedStartDate: DateTime - # # Suggested End date of the chapter, ISO 8601 format. # Must be after the Start Dates and before the End dates. suggestedEndDate: DateTime - # # ID of the course the chapter belongs to. # Must be a UUID of an existing course. courseId: UUID! } input CreateClozeQuestionInput { - # # id of the corresponding item itemId: UUID - # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int - # # List of cloze elements. clozeElements: [ClozeElementInput!]! - # # List of additional wrong answers. additionalWrongAnswers: [String!]! = [] - # # If true, the list of possible answers will be shown to the user. showBlanksList: Boolean! = true - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateContentMetadataInput { - # # Name of the content name: String! - # # Type of the content type: ContentType! - # # Suggested date when the content should be done suggestedDate: DateTime! - # # Number of reward points a student receives for completing this content rewardPoints: Int! - # # ID of the chapter this content is associated with chapterId: UUID! - # # TagNames this content is tagged with tagNames: [String!]! = [] } -# # Input type for creating a new course. See also on the course type for detailed field descriptions. input CreateCourseInput { - # # Title of the course, max 255 characters, must not be blank. title: String! - # # Description of the course, max 3000 characters. description: String! - # # Start date of the course, ISO 8601 format. # Must be before the end date. startDate: DateTime! - # # End date of the course, ISO 8601 format. # Must be after the start date. endDate: DateTime! - # # Published status of the course. published: Boolean! - # # The year in which the term starts. startYear: Int - # # The division of the academic calendar in which the term takes place. yearDivision: YearDivision } input CreateExactAnswerQuestionInput { - # # id of the corresponding item itemId: UUID - # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int - # # Text of the question, in SlateJS JSON format. text: JSON! - # # If the answer is case sensitive. If true, the answer is checked case sensitive. caseSensitive: Boolean! = false - # # A list of possible correct answers. correctAnswers: [String!]! - # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateFlashcardInput { - # # id of the item the flashcard belongs to itemId: UUID - # # List of sides of this flashcard. Must be at least two sides. sides: [FlashcardSideInput!]! } input CreateFlashcardSetInput { - # # List of flashcards in this set. flashcards: [CreateFlashcardInput!]! } -# # Input for creating new media content. Media specific fields are stored in the Media Service. input CreateMediaContentInput { - # # Metadata for the new Content metadata: CreateContentMetadataInput! } input CreateMediaRecordInput { - # # Name of the media record. Cannot be blank, maximum length 255 characters. name: String! - # # Type of the media record. type: MediaType! - # # IDs of the MediaContents this media record is associated with contentIds: [UUID!]! } input CreateMultipleChoiceQuestionInput { - # # UUID of the question to update and the id of the corresponding item. itemId: UUID - # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int - # # Text of the question, in SlateJS JSON format. text: JSON! - # # List of answers. answers: [MultipleChoiceAnswerInput!]! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateNumericQuestionInput { - # # id of the corresponding item itemId: UUID - # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int - # # Text of the question, in SlateJS JSON format. text: JSON! - # # The correct answer for the question. correctAnswer: Float! - # # The allowed deviation from the correct answer. tolerance: Float! - # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateQuizInput { - # - # Threshold of the quiz, i.e., how many questions the user has to answer correctly to pass the quiz. - # - # If this is greater than the number of questions, the behavior is the same - # as if it was equal to the number of questions. + # Threshold of the quiz, i.e., how many questions the user has to answer correctly to pass the quiz. + # + # If this is greater than the number of questions, the behavior is the same + # as if it was equal to the number of questions. requiredCorrectAnswers: Int! - # # Question pooling mode of the quiz. questionPoolingMode: QuestionPoolingMode! - # - # Number of questions that are randomly selected from the list of questions. - # Should only be set if questionPoolingMode is RANDOM. - # - # If this is greater than the number of questions, the behavior is the same - # as if it was equal to the number of questions. - # - # If this is null or not set, the behavior is the same as if it was equal to the number of questions. + # Number of questions that are randomly selected from the list of questions. + # Should only be set if questionPoolingMode is RANDOM. + # + # If this is greater than the number of questions, the behavior is the same + # as if it was equal to the number of questions. + # + # If this is null or not set, the behavior is the same as if it was equal to the number of questions. numberOfRandomlySelectedQuestions: Int } input CreateSectionInput { - # # Chapter Section will belong to chapterId: UUID! - # # name given to Section name: String! } input CreateSelfAssessmentQuestionInput { - # # id of the corresponding item itemId: UUID - # # Number of the question, used for ordering. # This can be omitted, in which case a number, one higher than the highest number of the existing questions, will be used. number: Int - # # Text of the question, in SlateJS JSON format. text: JSON! - # # A possible correct answer to the question. solutionSuggestion: JSON! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input CreateStageInput { - # # updated List of UUIDs for content labeled as required in this Stage requiredContents: [UUID!]! - # # updated List of UUIDs for content labeled as optional in this Stage optionalContents: [UUID!]! } @@ -954,15 +834,12 @@ scalar Date # A slightly refined version of RFC-3339 compliant DateTime Scalar scalar DateTime -# # Filter for date values. # If multiple filters are specified, they are combined with AND. input DateTimeFilter { - # # If specified, filters for dates after the specified value. after: DateTime - # # If specified, filters for dates before the specified value. before: DateTime } @@ -985,79 +862,64 @@ type DocumentRecordSegment implements MediaRecordSegment { # Title of this segment. title: String + + # The media record this segment is part of. mediaRecord: MediaRecord! } -# # A question with a clear, correct answer that can be automatically checked. # Differs from self-assessment questions in that the user has to enter one of the correct answers and # the answer is checked automatically. type ExactAnswerQuestion implements Question { - # # Text of the question, in SlateJS JSON format. text: JSON! - # # A list of possible correct answers. The user has to enter one of these answers. correctAnswers: [String!]! - # # If the answer is case sensitive. If true, the answer is checked case sensitive. caseSensitive: Boolean! - # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON - # # Unique identifier of the question and the id of the corresponding item itemId: UUID! - # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! - # # Type of the question. type: QuestionType! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } -# # A flashcard is a set of two or more sides. Each side has a label and a text. # The label is used to specify which side of the flashcard is being shown to the user first for learning # and which sides he has to guess. type Flashcard { - # # Unique identifier of this flashcard, which is the id of the corresponding item itemId: UUID! - # # List of sides of this flashcard. sides: [FlashcardSide!]! - # # Progress data of the flashcard, specific to given users. # If userId is not provided, the progress data of the current user is returned. userProgressData: FlashcardProgressData! } -# # Feedback for the logFlashcardLearned mutation. type FlashcardLearnedFeedback { - # # Whether the flashcard was learned correctly. success: Boolean! - # # Next date when the flashcard should be learned again. nextLearnDate: DateTime! - # # Progress of the whole flashcard set. flashcardSetProgress: FlashcardSetProgress! } @@ -1070,16 +932,13 @@ type FlashcardOutput { } type FlashcardProgressData { - # # The date the user learned the flashcard. # This is null it the user has not learned the content item once. lastLearned: DateTime - # # The learning interval in days for the content item. learningInterval: Int - # # The next time the content should be learned. # Calculated using the date the user completed the content item and the learning interval. # This is null if the user has not completed the content item once. @@ -1087,33 +946,26 @@ type FlashcardProgressData { } type FlashcardProgressDataLog { - # # The id of the Log id: UUID - # # The date the user learned the flashcard. learnedAt: DateTime! - # # Whether the user knew the flashcard or not. success: Boolean! } -# # A set of flashcards. A flashcard set belongs to exactly one assessment. Therefore, the uuid of the assessment # also serves as the identifier of a flashcard set. type FlashcardSet { - # # The uuid of the assessment this flashcard set belongs to. # This also serves as the identifier of this flashcard set. assessmentId: UUID! - # # Id of the course this flashcard set belongs to. courseId: UUID! - # # List of flashcards in this set. flashcards: [Flashcard!]! @@ -1121,30 +973,23 @@ type FlashcardSet { content: Content } -# # A set of flashcards, flashcard related fields are stored in the flashcard service. type FlashcardSetAssessment implements Assessment & Content { - # # Assessment metadata assessmentMetadata: AssessmentMetadata! - # # ID of the content id: UUID! - # # Metadata of the content metadata: ContentMetadata! - # # Progress data of the content for the current user. userProgressData: UserProgressData! - # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! - # # the items that belong to the Flashcard items: [Item!]! @@ -1153,76 +998,70 @@ type FlashcardSetAssessment implements Assessment & Content { } type FlashcardSetMutation { - # # ID of the flashcard set that is being modified. assessmentId: UUID! - # # Creates a new flashcard. Throws an error if the flashcard set does not exist. # ⚠️ This mutation is only accessible internally in the system and allows the caller to create Flashcards without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_createFlashcard(input: CreateFlashcardInput!): Flashcard! - # # Updates a flashcard. Throws an error if the flashcard does not exist. # ⚠️ This mutation is only accessible internally in the system and allows the caller to update Flashcards without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateFlashcard(input: UpdateFlashcardInput!): Flashcard! - # # Deletes the flashcard with the specified ID. Throws an error if the flashcard does not exist. deleteFlashcard(id: UUID!): UUID! # Creates a new flashcard and the linked item - createFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: CreateFlashcardInput!): FlashcardOutput! + createFlashcard( + item: ItemInput! + assessmentId: UUID! + flashcardInput: CreateFlashcardInput! + ): FlashcardOutput! # Creates a new flashcard and the linked item - updateFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: UpdateFlashcardInput!): FlashcardOutput! + updateFlashcard( + item: ItemInput! + assessmentId: UUID! + flashcardInput: UpdateFlashcardInput! + ): FlashcardOutput! } type FlashcardSetProgress { - # # Percentage of how many flashcards in the set have been learned. percentageLearned: Float! - # # Percentage of how many flashcards have been learned correctly of the ones that have been learned. correctness: Float! } type FlashcardSide { - # # Text of this flashcard side as rich text in SlateJS json. text: JSON! - # # Label of this flashcard side. E.g. "Front" or "Back", or "Question" or "Answer". label: String! - # # Whether this side is a question, i.e. should be shown to the user to guess the other sides or not. isQuestion: Boolean! - # # Whether this side is also an answer. Some Flashcards can have their sides be # used as both questions or answers for the other sides isAnswer: Boolean! } input FlashcardSideInput { - # # Text of this flashcard side. text: JSON! - # # Label of this flashcard side. E.g. "Front" or "Back", or "Question" or "Answer". label: String! - # # Whether this side is a question, i.e. should be shown to the user to guess the other sides or not. isQuestion: Boolean! - # # Whether this side is also an answer. Some Flashcards can have their sides be # used as both questions or answers for the other sides isAnswer: Boolean! @@ -1243,61 +1082,48 @@ input IngestMediaRecordInput { id: UUID! } -# # Filter for integer values. # If multiple filters are specified, they are combined with AND. input IntFilter { - # # An integer value to match exactly. equals: Int - # # If specified, filters for values greater than to the specified value. greaterThan: Int - # # If specified, filters for values less than to the specified value. lessThan: Int } -# # An item is a part of an assessment. Based on students' performances on items the # SkillLevel Service estimates a students knowledge. # An item is something like a question in a quiz, a flashcard of a flashcard set. type Item { - # # the id of the item id: UUID! - # # The skills or the competencies the item belongs to. associatedSkills: [Skill!]! - # # The Level of Blooms Taxonomy the item belongs to associatedBloomLevels: [BloomLevel!]! } input ItemInput { - # # the id of the item id: UUID - # # The skills or the competencies the item belongs to. associatedSkills: [SkillInput!]! - # # The Level of Blooms Taxonomy the item belongs to associatedBloomLevels: [BloomLevel!]! } type ItemProgress { - # # the id of the corresponding item itemId: UUID! - # # the correctness of the users response. # Value between 0 and 1 representing the user's correctness on the content item. responseCorrectness: Float! @@ -1310,43 +1136,34 @@ scalar JSON scalar LocalTime input LogFlashcardLearnedInput { - # # The id of the flashcard that was learned. flashcardId: UUID! - # # If the user knew the flashcard or not. successful: Boolean! } input LogFlashcardSetLearnedInput { - # # The id of the flashcard that was learned. flashcardSetId: UUID! - # # The id of the user that learned the flashcard. userId: UUID! - # # The percentage of flashcards in the set that the user knew. percentageSuccess: Float! } type MediaContent implements Content { - # # ID of the content id: UUID! - # # Metadata of the content metadata: ContentMetadata! - # # Progress data of the content for the current user. userProgressData: UserProgressData! - # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! @@ -1360,51 +1177,40 @@ type MediaContent implements Content { # this can be done in a separate files as long as they are in this folder and # end with .graphqls type MediaRecord { - # # ID of the media record id: UUID! - # # Ids of the courses this MediaRecord is associated with courseIds: [UUID!]! - # # Name of the media record name: String! - # # User ID of the creator of the media record. creatorId: UUID! - # # Type of the media record type: MediaType! - # # IDs of the MediaContents this media record is associated with contentIds: [UUID!]! - # # Temporary upload url for the media record uploadUrl: String! - # # Temporary download url for the media record downloadUrl: String! - # # Temporary upload url for the media record which can only be used from within the system. # (This is necessary because the MinIO pre-signed URLs cannot be changed, meaning we cannot use the same URL for both # internal and external access because the hostname changes.) internalUploadUrl: String! - # # Temporary download url for the media record which can only be used from within the system. # (This is necessary because the MinIO pre-signed URLs cannot be changed, meaning we cannot use the same URL for both # internal and external access because the hostname changes.) internalDownloadUrl: String! - # # The progress data of the given user for this medium. userProgressData: MediaRecordProgressData! @@ -1421,11 +1227,9 @@ type MediaRecord { } type MediaRecordProgressData { - # # Whether the medium has been worked on by the user. workedOn: Boolean! - # # Date on which the medium was worked on by the user. # This is null if the medium has not been worked on by the user. dateWorkedOn: DateTime @@ -1450,7 +1254,6 @@ type MediaRecordSegmentLink { segment2: MediaRecordSegment! } -# # The type of the media record enum MediaType { VIDEO @@ -1462,329 +1265,290 @@ enum MediaType { } type MultipleChoiceAnswer { - # # Text of the answer, in SlateJS JSON format. answerText: JSON! - # # Whether the answer is correct or not. correct: Boolean! - # # Feedback for when the user selects this answer, in SlateJS JSON format. feedback: JSON } input MultipleChoiceAnswerInput { - # # Text of the answer, in SlateJS JSON format. answerText: JSON! - # # Whether the answer is correct or not. correct: Boolean! - # # Feedback for when the user selects this answer, in SlateJS JSON format. feedback: JSON } -# # Multiple choice question, i.e., a question with multiple answers of which the user has to select the correct ones. type MultipleChoiceQuestion implements Question { - # # Text of the question, in SlateJS JSON format. text: JSON! - # # List of answers. answers: [MultipleChoiceAnswer!]! - # # How many answers the user has to select. This is computed from the list of answers. numberOfCorrectAnswers: Int! - # # Unique identifier of the question and the id of the corresponding item itemId: UUID! - # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! - # # Type of the question. type: QuestionType! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } type Mutation { - # - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the reward score of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") - - # - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the skill level of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. - # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") - - # - # Creates a new media record - # 🔒 The user must have the "course-creator" role to perform this action. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. - createMediaRecord(input: CreateMediaRecordInput!): MediaRecord! - - # - # Updates an existing media record with the given UUID - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - updateMediaRecord(input: UpdateMediaRecordInput!): MediaRecord! - - # - # Deletes the media record with the given UUID - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - deleteMediaRecord(id: UUID!): UUID! - - # - # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. - # This means that for the content, all already linked media records are removed and replaced by the given ones. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setLinkedMediaRecordsForContent(contentId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! - - # - # Logs that a media has been worked on by the current user. - # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html - # - # Possible side effects: - # When all media records of a content have been worked on by a user, - # a user-progress event is emitted for the content. - # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. - logMediaRecordWorkedOn(mediaRecordId: UUID!): MediaRecord! - - # - # Add the MediaRecords with the given UUIDS to the Course with the given UUID. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setMediaRecordsForCourse(courseId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! - - # - # Modify a quiz. - # 🔒 The user must be an admin the course the quiz is in to perform this action. - mutateQuiz(assessmentId: UUID!): QuizMutation! - - # - # Delete a quiz. - deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") - - # - # Log that a multiple choice quiz is completed. - # 🔒 The user must be enrolled in the course the quiz is in to perform this action. - logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! - - # - # Deletes a flashcard set. Throws an error if the flashcard set does not exist. - # The contained flashcards are deleted as well. - deleteFlashcardSet(input: UUID!): UUID! @deprecated(reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead.") - - # - # Modify a flashcard set. - # 🔒 The user must be an admin the course the flashcard set is in to perform this action. - mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! - - # - # Logs that a user has learned a flashcard. - # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the reward score of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! + @deprecated(reason: "Only for testing purposes. Will be removed.") - # # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! - # # Creates a new chapter with the given input and returns the created chapter. # The course id must be a course id of an existing course. # 🔒 The user must be an admin in this course to perform this action. createChapter(input: CreateChapterInput!): Chapter! - # # Updates an existing course with the given input and returns the updated course. # The course id must be a course id of an existing course. # 🔒 The user must be an admin in this course to perform this action. updateCourse(input: UpdateCourseInput!): Course! - # # Updates an existing chapter with the given input and returns the updated chapter. # The chapter id must be a chapter id of an existing chapter. # 🔒 The user must be an admin in this course to perform this action. updateChapter(input: UpdateChapterInput!): Chapter! - # # Deletes an existing course, throws an error if no course with the given id exists. # 🔒 The user must be an admin in this course to perform this action. deleteCourse(id: UUID!): UUID! - # # Deletes an existing chapter, throws an error if no chapter with the given id exists. # 🔒 The user must be an admin in this course to perform this action. deleteChapter(id: UUID!): UUID! - # # Lets the current user join a course as a student. joinCourse(courseId: UUID!): CourseMembership! - # # Lets the current user leave a course. Returns the membership that was deleted. leaveCourse(courseId: UUID!): CourseMembership! - # # Adds the specified user to the specified course with the specified role. # 🔒 The calling user must be an admin in this course to perform this action. createMembership(input: CourseMembershipInput!): CourseMembership! - # # Updates a user's membership in a course with the given input. # 🔒 The calling user must be an admin in this course to perform this action. updateMembership(input: CourseMembershipInput!): CourseMembership! - # # Removes the specified user's access to the specified course. # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! - # + # Deletes a flashcard set. Throws an error if the flashcard set does not exist. + # The contained flashcards are deleted as well. + deleteFlashcardSet(input: UUID!): UUID! + @deprecated( + reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead." + ) + + # Modify a flashcard set. + # 🔒 The user must be an admin the course the flashcard set is in to perform this action. + mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! + + # Logs that a user has learned a flashcard. + # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. + logFlashcardLearned( + input: LogFlashcardLearnedInput! + ): FlashcardLearnedFeedback! + + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the skill level of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. + # 🔒 The user must be a super-user, otherwise an exception is thrown. + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! + @deprecated(reason: "Only for testing purposes. Will be removed.") + + # Creates a new media record + # 🔒 The user must have the "course-creator" role to perform this action. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. + createMediaRecord(input: CreateMediaRecordInput!): MediaRecord! + + # Updates an existing media record with the given UUID + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + updateMediaRecord(input: UpdateMediaRecordInput!): MediaRecord! + + # Deletes the media record with the given UUID + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + deleteMediaRecord(id: UUID!): UUID! + + # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. + # This means that for the content, all already linked media records are removed and replaced by the given ones. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + setLinkedMediaRecordsForContent( + contentId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! + + # Logs that a media has been worked on by the current user. + # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html + # + # Possible side effects: + # When all media records of a content have been worked on by a user, + # a user-progress event is emitted for the content. + # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. + logMediaRecordWorkedOn(mediaRecordId: UUID!): MediaRecord! + + # Add the MediaRecords with the given UUIDS to the Course with the given UUID. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + setMediaRecordsForCourse( + courseId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! + + # Modify a quiz. + # 🔒 The user must be an admin the course the quiz is in to perform this action. + mutateQuiz(assessmentId: UUID!): QuizMutation! + + # Delete a quiz. + deleteQuiz(assessmentId: UUID!): UUID! + @deprecated( + reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead." + ) + + # Log that a multiple choice quiz is completed. + # 🔒 The user must be enrolled in the course the quiz is in to perform this action. + logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! + # Modify Content # 🔒 The user must have admin access to the course containing the section to perform this action. mutateContent(contentId: UUID!): ContentMutation! - # # Modify the section with the given id. # 🔒 The user must have admin access to the course containing the section to perform this action. mutateSection(sectionId: UUID!): SectionMutation! # Creates a new media content and links the given media records to it. - createMediaContentAndLinkRecords(contentInput: CreateMediaContentInput!, mediaRecordIds: [UUID!]!): MediaContent! + createMediaContentAndLinkRecords( + contentInput: CreateMediaContentInput! + mediaRecordIds: [UUID!]! + ): MediaContent! # Creates a new quiz assessment and a new, linked quiz with the given properties. - createQuizAssessment(assessmentInput: CreateAssessmentInput!, quizInput: CreateQuizInput!): QuizAssessment! + createQuizAssessment( + assessmentInput: CreateAssessmentInput! + quizInput: CreateQuizInput! + ): QuizAssessment! # Creates a new flashcard set assessment and a new, linked flashcard set with the given properties. - createFlashcardSetAssessment(assessmentInput: CreateAssessmentInput!, flashcardSetInput: CreateFlashcardSetInput!): FlashcardSetAssessment + createFlashcardSetAssessment( + assessmentInput: CreateAssessmentInput! + flashcardSetInput: CreateFlashcardSetInput! + ): FlashcardSetAssessment # Creates a new section in a chapter. createSection(input: CreateSectionInput!): Section! } type NumericQuestion implements Question { - # # Text of the question, in SlateJS JSON format. text: JSON! - # # The correct answer to the question. correctAnswer: Float! - # # The tolerance for the correct answer. The user's answer is correct if it is within the tolerance of the correct answer. tolerance: Float! - # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON - # # Unique identifier of the question and the id of the corresponding item itemId: UUID! - # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! - # # Type of the question. type: QuestionType! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } -# # Specifies the page size and page number for paginated results. input Pagination { - # # The page number, starting at 0. # If not specified, the default value is 0. # For values greater than 0, the page size must be specified. # If this value is larger than the number of pages, an empty page is returned. page: Int! = 0 - # # The number of elements per page. size: Int! } -# # Return type for information about paginated results. type PaginationInfo { - # # The current page number. page: Int! - # # The number of elements per page. size: Int! - # # The total number of elements across all pages. totalElements: Int! - # # The total number of pages. totalPages: Int! - # # Whether there is a next page. hasNext: Boolean! } type ProgressLogItem { - # # The date the user completed the content item. timestamp: DateTime! - # # Whether the user completed the content item successfully. success: Boolean! - # # Value between 0 and 1 representing the user's correctness on the content item. # Can be null as some contents cannot provide a meaningful correctness value. correctness: Float! - # # How many hints the user used to complete the content item. hintsUsed: Int! - # # Time in milliseconds it took the user to complete the content item. # Can be null for contents that do not measure completion time. timeToComplete: Int - # # !OPTIONAL # the items the user has completed and the students' performance on these items # Can be null as some contents don't contains items for assessments @@ -1797,222 +1561,198 @@ type PublicUserInfo { } type Query { - # # Gets the publicly available information for a list of users with the specified IDs. # If a user does not exist, null is returned for that user. findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - # # Gets the user information of the currently authorized user. currentUserInfo: UserInfo! - # # Gets all of the users' information for a list of users with the specified IDs. # Only available to privileged users. # If a user does not exist, null is returned for that user. findUserInfos(ids: [UUID!]!): [UserInfo]! - # # Get the reward score of the current user for the specified course. # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. userCourseRewardScores(courseId: UUID!): RewardScores! - # # Get the reward score of the specified user for the specified course. # 🔒 The user be an admin in the course with the given courseId to perform this action. courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! - # # Gets the power scores for each user in the course, ordered by power score descending. # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. scoreboard(courseId: UUID!): [ScoreboardItem!]! - # - # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID - # cannot be found. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - mediaRecordsByIds(ids: [UUID!]!): [MediaRecord!]! - - # - # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID - # cannot be found, it instead returns NULL for that media record. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - findMediaRecordsByIds(ids: [UUID!]!): [MediaRecord]! - - # - # Returns all media records of the system. - # - # 🔒 The user must be a super-user, otherwise an exception is thrown. - mediaRecords: [MediaRecord!]! @deprecated(reason: "In production there should probably be no way to get all media records of the system.") - - # - # Returns all media records which the current user created. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - userMediaRecords: [MediaRecord!]! - - # - # Returns the media records associated the given content IDs as a list of lists where each sublist contains - # the media records associated with the content ID at the same index in the input list - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! + # Get a list of courses. Can be filtered, sorted and paginated. + # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. + courses( + filter: CourseFilter - # - # Returns all media records for the given CourseIds - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - mediaRecordsForCourses(courseIds: [UUID!]!): [[MediaRecord!]!]! + # The fields to sort by. + # Throws an error if no field with the given name exists. + sortBy: [String!] - # - # Returns all media records which were created by the users. - mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! + # The sort direction for each field. If not specified, defaults to ASC. + sortDirection: [SortDirection!]! = [ASC] + pagination: Pagination + ): CoursePayload! - # - # Get quiz by assessment ID. - # If any of the assessment IDs are not found, the corresponding quiz will be null. - # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for - # an quiz if the user has no access to it. - findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! + # Returns the courses with the given ids. + # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. + coursesByIds(ids: [UUID!]!): [Course!]! - # # Get flashcards by their ids. # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! - # # Get flashcard sets by their assessment ids. # Returns a list of flashcard sets in the same order as the provided ids. # Each element is null if the corresponding id is not found. # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! - # # Get flashcards of a course that are due to be reviewed. # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! - # - # Get a list of courses. Can be filtered, sorted and paginated. - # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. - courses( - filter: CourseFilter + # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID + # cannot be found. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + mediaRecordsByIds(ids: [UUID!]!): [MediaRecord!]! - # - # The fields to sort by. - # Throws an error if no field with the given name exists. - sortBy: [String!] + # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID + # cannot be found, it instead returns NULL for that media record. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + findMediaRecordsByIds(ids: [UUID!]!): [MediaRecord]! - # - # The sort direction for each field. If not specified, defaults to ASC. - sortDirection: [SortDirection!]! = [ASC] - pagination: Pagination - ): CoursePayload! + # Returns all media records of the system. + # + # 🔒 The user must be a super-user, otherwise an exception is thrown. + mediaRecords: [MediaRecord!]! + @deprecated( + reason: "In production there should probably be no way to get all media records of the system." + ) - # - # Returns the courses with the given ids. - # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. - coursesByIds(ids: [UUID!]!): [Course!]! + # Returns all media records which the current user created. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + userMediaRecords: [MediaRecord!]! + + # Returns the media records associated the given content IDs as a list of lists where each sublist contains + # the media records associated with the content ID at the same index in the input list + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! + + # Returns all media records for the given CourseIds + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + mediaRecordsForCourses(courseIds: [UUID!]!): [[MediaRecord!]!]! + + # Returns all media records which were created by the users. + mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! + + # Get quiz by assessment ID. + # If any of the assessment IDs are not found, the corresponding quiz will be null. + # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for + # an quiz if the user has no access to it. + findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! - # # Retrieves all existing contents for a given course. # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] - # # Get contents by ids. Throws an error if any of the ids are not found. # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, # otherwise an error is thrown. contentsByIds(ids: [UUID!]!): [Content!]! - # # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned # for the respective contents. findContentsByIds(ids: [UUID!]!): [Content]! - # # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents # associated with that chapter # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! - # - # Generates user specific suggestions for multiple chapters. - # - # Only content that the user can access will be considered. - # The contents will be ranked by suggested date, with the most overdue or most urgent content first. - # - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + # Generates user specific suggestions for multiple chapters. + # + # Only content that the user can access will be considered. + # The contents will be ranked by suggested date, with the most overdue or most urgent content first. + # + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. suggestionsByChapterIds( - # # The ids of the chapters for which suggestions should be generated. chapterIds: [UUID!]! - # # The amount of suggestions to generate in total. amount: Int! - # # Only suggestions for these skill types will be generated. # If no skill types are given, suggestions for all skill types will be generated, # also containing suggestions for media content (which do not have a skill type). skillTypes: [SkillType!]! = [] ): [Suggestion!]! - # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is + # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. - semanticSearch(queryText: String!, count: Int! = 10, courseWhitelist: [UUID!]): [SemanticSearchResult!]! + semanticSearch( + queryText: String! + count: Int! = 10 + courseWhitelist: [UUID!] + ): [SemanticSearchResult!]! + + # Returns the media record segments that are semantically similar to the media record segment with the specified ID. + # Returns at most `count` results. If `excludeOwnMediaRecord` is true, segments from the same media record as the + # specified segment will be excluded from the results. + getSemanticallySimilarMediaRecordSegments( + mediaRecordSegmentId: UUID! + count: Int! = 10 + excludeOwnMediaRecord: Boolean + ): [SemanticSearchResult!]! } -# # Generic question interface. interface Question { - # # Unique identifier of the question and the id of the corresponding item itemId: UUID! - # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! - # # Type of the question. type: QuestionType! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input QuestionCompletedInput { - # # ID of the question. questionId: UUID! - # # true when question was answered correctly correct: Boolean! - # # true when a hint was used for the question usedHint: Boolean! } enum QuestionPoolingMode { - # # Questions are randomly selected from the list of questions. RANDOM - # # Questions are selected in order from the list of questions. ORDERED } -# # The type of a question. enum QuestionType { MULTIPLE_CHOICE @@ -2023,45 +1763,37 @@ enum QuestionType { SELF_ASSESSMENT } -# # A quiz is a set of questions that the user has to answer correctly to pass the quiz. # Questions can be of different types, e.g., multiple choice, clozes, or open questions. type Quiz { - # # Identifier of the quiz, same as the identifier of the assessment. assessmentId: UUID! - # # List of questions. questionPool: [Question!]! - # # Threshold of the quiz, i.e., how many questions the user has to answer correctly to pass the quiz. # If this number is greater than the number of questions, the behavior is the same # as if it was equal to the number of questions. requiredCorrectAnswers: Int! - # # Question pooling mode of the quiz. questionPoolingMode: QuestionPoolingMode! - # - # Number of questions that are randomly selected from the list of questions. - # Will only be considered if questionPoolingMode is RANDOM. - # - # If this is greater than the number of questions, the behavior is the same - # as if it was equal to the number of questions. - # - # If this is null or not set, the behavior is the same as if it was equal to the number of questions. + # Number of questions that are randomly selected from the list of questions. + # Will only be considered if questionPoolingMode is RANDOM. + # + # If this is greater than the number of questions, the behavior is the same + # as if it was equal to the number of questions. + # + # If this is null or not set, the behavior is the same as if it was equal to the number of questions. numberOfRandomlySelectedQuestions: Int - # # The selected questions of the question pool. # This is identical to the list of questions if questionPoolingMode is ORDERED. # This will be different each time it is queried if questionPoolingMode is RANDOM. selectedQuestions: [Question!]! - # # Id of the course this quiz belongs to. courseId: UUID! @@ -2069,30 +1801,23 @@ type Quiz { content: Content } -# # A quiz, quiz related fields are stored in the quiz service. type QuizAssessment implements Assessment & Content { - # # Assessment metadata assessmentMetadata: AssessmentMetadata! - # # ID of the content id: UUID! - # # Metadata of the content metadata: ContentMetadata! - # # Progress data of the content for the current user. userProgressData: UserProgressData! - # # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! - # # the items that belong to the Quiz items: [Item!]! @@ -2102,165 +1827,209 @@ type QuizAssessment implements Assessment & Content { } input QuizCompletedInput { - # # ID of the quiz. quizId: UUID! - # # List of questions that were answered in the quiz. completedQuestions: [QuestionCompletedInput!]! } -# # Feedback data when `logQuizCompletion` is called. type QuizCompletionFeedback { - # # Whether the quiz was passed or not. success: Boolean! - # # The number of questions that were answered correctly. correctness: Float! - # # The number of hints that were used. hintsUsed: Int! } type QuizMutation { - # # Id of the quiz to modify. assessmentId: UUID! - # # Add a multiple choice question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addMultipleChoiceQuestion(input: CreateMultipleChoiceQuestionInput!): Quiz! + _internal_noauth_addMultipleChoiceQuestion( + input: CreateMultipleChoiceQuestionInput! + ): Quiz! - # # Update a multiple choice question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateMultipleChoiceQuestion(input: UpdateMultipleChoiceQuestionInput!): Quiz! + _internal_noauth_updateMultipleChoiceQuestion( + input: UpdateMultipleChoiceQuestionInput! + ): Quiz! - # # Add a cloze question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_addClozeQuestion(input: CreateClozeQuestionInput!): Quiz! - # # Update a cloze question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_updateClozeQuestion(input: UpdateClozeQuestionInput!): Quiz! - # # Add an association question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addAssociationQuestion(input: CreateAssociationQuestionInput!): Quiz! + _internal_noauth_addAssociationQuestion( + input: CreateAssociationQuestionInput! + ): Quiz! - # # Update an association question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateAssociationQuestion(input: UpdateAssociationQuestionInput!): Quiz! + _internal_noauth_updateAssociationQuestion( + input: UpdateAssociationQuestionInput! + ): Quiz! - # # Add an free text question with exact answer to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addExactAnswerQuestion(input: CreateExactAnswerQuestionInput!): Quiz! + _internal_noauth_addExactAnswerQuestion( + input: CreateExactAnswerQuestionInput! + ): Quiz! - # # Update an free text question with exact answer in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateExactAnswerQuestion(input: UpdateExactAnswerQuestionInput!): Quiz! + _internal_noauth_updateExactAnswerQuestion( + input: UpdateExactAnswerQuestionInput! + ): Quiz! - # # Add a numeric question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ _internal_noauth_addNumericQuestion(input: CreateNumericQuestionInput!): Quiz! - # # Update a numeric question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateNumericQuestion(input: UpdateNumericQuestionInput!): Quiz! + _internal_noauth_updateNumericQuestion( + input: UpdateNumericQuestionInput! + ): Quiz! - # # Add a self assessment question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addSelfAssessmentQuestion(input: CreateSelfAssessmentQuestionInput!): Quiz! + _internal_noauth_addSelfAssessmentQuestion( + input: CreateSelfAssessmentQuestionInput! + ): Quiz! - # # Update a self assessment question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateSelfAssessmentQuestion(input: UpdateSelfAssessmentQuestionInput!): Quiz! + _internal_noauth_updateSelfAssessmentQuestion( + input: UpdateSelfAssessmentQuestionInput! + ): Quiz! - # # Removes the question with the given number from the quiz. # This will also update the numbers of the following questions. removeQuestion(number: Int!): Quiz! - # # Switch the position of two questions with the given numbers. switchQuestions(firstNumber: Int!, secondNumber: Int!): Quiz! - # # Set the threshold of the quiz, i.e., how many questions the user has to answer correctly to pass the quiz. setRequiredCorrectAnswers(requiredCorrectAnswers: Int!): Quiz! - # # Set the question pooling mode of the quiz. setQuestionPoolingMode(questionPoolingMode: QuestionPoolingMode!): Quiz! - # # Set the number of questions that are randomly selected from the list of questions. # Will only be considered if questionPoolingMode is RANDOM. - setNumberOfRandomlySelectedQuestions(numberOfRandomlySelectedQuestions: Int!): Quiz! + setNumberOfRandomlySelectedQuestions( + numberOfRandomlySelectedQuestions: Int! + ): Quiz! # Add a multiple choice question to the quiz questions, at the end of the list. - addMultipleChoiceQuestion(questionInput: CreateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addMultipleChoiceQuestion( + questionInput: CreateMultipleChoiceQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a multiple choice question in the quiz questions. - updateMultipleChoiceQuestion(questionInput: UpdateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateMultipleChoiceQuestion( + questionInput: UpdateMultipleChoiceQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a cloze question to the quiz questions, at the end of the list. - addClozeQuestion(questionInput: CreateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addClozeQuestion( + questionInput: CreateClozeQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a cloze question in the quiz questions. - updateClozeQuestion(questionInput: UpdateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateClozeQuestion( + questionInput: UpdateClozeQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add an association question to the quiz questions, at the end of the list. - addAssociationQuestion(questionInput: CreateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addAssociationQuestion( + questionInput: CreateAssociationQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update an association question in the quiz questions. - updateAssociationQuestion(questionInput: UpdateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateAssociationQuestion( + questionInput: UpdateAssociationQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add an free text question with exact answer to the quiz questions, at the end of the list. - addExactAnswerQuestion(questionInput: CreateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addExactAnswerQuestion( + questionInput: CreateExactAnswerQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update an free text question with exact answer in the quiz questions. - updateExactAnswerQuestion(questionInput: UpdateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateExactAnswerQuestion( + questionInput: UpdateExactAnswerQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a numeric question to the quiz questions, at the end of the list. - addNumericQuestion(questionInput: CreateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addNumericQuestion( + questionInput: CreateNumericQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a numeric question in the quiz questions. - updateNumericQuestion(questionInput: UpdateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateNumericQuestion( + questionInput: UpdateNumericQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a self assessment question to the quiz questions, at the end of the list. - addSelfAssessmentQuestion(questionInput: CreateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addSelfAssessmentQuestion( + questionInput: CreateSelfAssessmentQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a self assessment question in the quiz questions. - updateSelfAssessmentQuestion(questionInput: UpdateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateSelfAssessmentQuestion( + questionInput: UpdateSelfAssessmentQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! } type QuizOutput { @@ -2271,203 +2040,157 @@ type QuizOutput { scalar ResolveToSourceArgs -# # The reason why the reward score has changed. enum RewardChangeReason { - # # The user has completed a content for the first time. # The associated contents are the content that were completed. CONTENT_DONE - # # The user has reviewed a content. # The associated contents are the content that were reviewed. CONTENT_REVIEWED - # # There exists a content that is due for learning. # The associated contents are the content that are due for learning. CONTENT_DUE_FOR_LEARNING - # # There exists a content that is due for repetition. # The associated contents are the content that are due for repetition. CONTENT_DUE_FOR_REPETITION - # # The score changed because the underlying scores changed. # Relevant for the power score. COMPOSITE_VALUE } -# # An item in the reward score log. type RewardLogItem { - # # The date when the reward score changed. date: DateTime! - # # The difference between the previous and the new reward score. difference: Int! - # # The old reward score. oldValue: Int! - # # The new reward score. newValue: Int! - # # The reason why the reward score has changed. reason: RewardChangeReason! - # # The ids of the contents that are associated with the change. associatedContentIds: [UUID!]! associatedContents: [Content]! } -# # The reward score of a user. type RewardScore { - # # The absolute value of the reward score. # Health and fitness are between 0 and 100. # Growth, strength and power can be any non-negative integer. value: Int! - # # The relative value of the reward score. # Shows how many points relative to the total points have been achieved. # Only used for growth currently. percentage: Float! - # # A log of the changes to the reward score, ordered by date descending. log: [RewardLogItem!]! } -# # The five reward scores of a user. type RewardScores { - # # Health represents how up-to-date the user is with the course. health: RewardScore! - # # Fitness represents how well the user repeats previously learned content. fitness: RewardScore! - # # Growth represents the overall progress of the user. growth: RewardScore! - # # Strength is earned by competing with other users. strength: RewardScore! - # # A composite score of all the other scores. power: RewardScore! } -# # An item in the scoreboard. type ScoreboardItem { - # # The user id of the user. userId: UUID! - # # The power score of the user. powerScore: Int! user: PublicUserInfo } -# # Representation of a Section type Section { - # # Unique identifier of the Section Object id: UUID! - # # Id of the Course the Section is located in. courseId: UUID! - # # Name of the Section name: String! - # # Chapter the Section is located in chapterId: UUID! - # # List of Stages contained in a Section stages: [Stage!]! chapter: Chapter! } type SectionMutation { - # # Identifier of the section sectionId: UUID! - # # update the name of a Section updateSectionName(name: String!): Section! - # # delete a Section by ID deleteSection: UUID! - # # create new Stage in Section createStage(input: CreateStageInput): Stage! - # # Update Content of Stage updateStage(input: UpdateStageInput): Stage! - # # delete Stage by ID deleteStage(id: UUID!): UUID! - # # update Order of Stages within a Section updateStageOrder(stages: [UUID!]!): Section! } -# # A single question with a free text answer field, where the answer is not automatically checked. # The user has to enter a solution and self-assess whether it is correct or not. # This is useful for questions where the answer is not clear-cut, e.g. when the user should explain a concept. type SelfAssessmentQuestion implements Question { - # # Text of the question, in SlateJS JSON format. text: JSON! - # # A possible correct answer to the question. solutionSuggestion: JSON! - # # Unique identifier of the question and the id of the corresponding item itemId: UUID! - # # Number of the question, i.e., the position of the question in the list of questions. # Only relevant if questionPoolingMode is ORDERED. number: Int! - # # Type of the question. type: QuestionType! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } @@ -2479,28 +2202,22 @@ type SemanticSearchResult { } type SingleAssociation { - # # The left side of the association, in SlateJS JSON format. left: JSON! - # # The right side of the association, in SlateJS JSON format. right: JSON! - # # Feedback for the association when the user assigns a wrong answer, in SlateJS JSON format. feedback: JSON } -# # a skill or compentency. # Something like loops or data structures. type Skill { - # # the id of a skill id: UUID! - # # the name of the skill skillName: String! @@ -2509,92 +2226,71 @@ type Skill { } input SkillInput { - # # the id of a skill. Field is optional, because not all required skills may # exist, if a new item is created. If the id is empty a new skill, # will be created id: UUID - # # the name of the skill skillName: String! } -# # The skill level of a user. type SkillLevel { - # # The value of the skill level. # levels are between 0 and 1. value: Float! - # # A log of the changes to the skill level log: [SkillLevelLogItem!]! } -# # An item in the skill level change log. type SkillLevelLogItem { - # # The date when the skill level changed. date: DateTime! - # # The difference between the previous and the new skill level. difference: Float! - # # The old skill level. oldValue: Float! - # # The new skill level. newValue: Float! - # # The ids of the contents that are associated with the change. associatedItemId: UUID! - # # the response of the user to the item userResponse: Float! - # # the probability of a correct response, that M-Elo predicts predictedCorrectness: Float! associatedContents: [Content]! } -# # The four skill level of a user. type SkillLevels { - # # remember represents how much user remember the concept remember: SkillLevel - # # understand represents how well the user understands learned content. understand: SkillLevel - # # apply represents the how well user applies the learned concept during assessment. apply: SkillLevel - # # apply is how much user can evaluate information and draw conclusions analyze: SkillLevel - # # evaluate represent how well a user can use the learned content to evaluate evaluate: SkillLevel - # # create represents how well a user can create new things based on the learned content create: SkillLevel } -# # Type of the assessment enum SkillType { CREATE @@ -2605,66 +2301,51 @@ enum SkillType { ANALYZE } -# # Specifies the sort direction, either ascending or descending. enum SortDirection { ASC DESC } -# # Representation of a Stage type Stage { - # # Unique identifier of the Stage Object id: UUID! - # # Position of the Stage within the Section position: Int! - # # List of Content that is labeled as required content requiredContents: [Content!]! - # # Percentage of User Progress made to required Content requiredContentsProgress: Float! - # # List of Content that is labeled as optional content optionalContents: [Content!]! - # # Percentage of Progress made to optional Content optionalContentsProgress: Float! } -# # Filter for string values. # If multiple filters are specified, they are combined with AND. input StringFilter { - # # A string value to match exactly. equals: String - # # A string value that must be contained in the field that is being filtered. contains: String - # # If true, the filter is case-insensitive. ignoreCase: Boolean! = false } -# # Represents a suggestion for a user to learn new content or review old content. type Suggestion { - # # The content that is suggested to the user. content: Content! - # # The type of suggestion. type: SuggestionType! } @@ -2678,292 +2359,227 @@ enum SuggestionType { scalar Time input UpdateAssessmentInput { - # # Metadata for the new Content metadata: UpdateContentMetadataInput! - # # Assessment metadata assessmentMetadata: AssessmentMetadataInput! - # # items of the new assessments items: [ItemInput!] } input UpdateAssociationQuestionInput { - # # UUID of the question to update and the id of the corresponding item. itemId: UUID! - # # Text of the question, in SlateJS JSON format. text: JSON! - # # List of associations. correctAssociations: [AssociationInput!]! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } -# # Input type for updating chapters. # The ID field specifies which chapter should be updated, all other fields specify the new values. input UpdateChapterInput { - # # UUID of the chapter that should be updated. id: UUID! - # # Title of the chapter, maximum length is 255 characters, must not be blank. title: String! - # # Description of the chapter, maximum length is 3000 characters. description: String! - # # Number of the chapter, determines the order of the chapters, must be positive. number: Int! - # # Start date of the chapter, ISO 8601 format. # Must be before the end date. startDate: DateTime! - # # End date of the chapter, ISO 8601 format. # Must be after the start date. endDate: DateTime! - # # Suggested Start date to start the chapter, ISO 8601 format. # Must be after Start Date and before the End dates. suggestedStartDate: DateTime - # # Suggested End date of the chapter, ISO 8601 format. # Must be after the Start Dates and before the End dates. suggestedEndDate: DateTime } input UpdateClozeQuestionInput { - # # UUID of the question to update and the id of the corresponding item. itemId: UUID! - # # List of cloze elements. clozeElements: [ClozeElementInput!]! - # # List of additional wrong answers. additionalWrongAnswers: [String!]! - # # If true, the list of possible answers will be shown to the user. showBlanksList: Boolean! = true - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateContentMetadataInput { - # # Name of the content name: String! - # # Date when the content should be done suggestedDate: DateTime! - # # Number of reward points a student receives for completing this content rewardPoints: Int! - # # ID of the chapter this content is associated with chapterId: UUID! - # # TagNames this content is tagged with tagNames: [String!]! = [] } -# # Input type for updating an existing course. See also on the course type for detailed field descriptions. # The id specifies the course that should be updated, the other fields specify the new values. input UpdateCourseInput { - # # UUID of the course that should be updated. # Must be an id of an existing course, otherwise an error is returned. id: UUID! - # # The new title of the course, max 255 characters, must not be blank. title: String! - # # The new description of the course, max 3000 characters. description: String! - # # The new start date of the course, ISO 8601 format. startDate: DateTime! - # # The new end date of the course, ISO 8601 format. endDate: DateTime! - # # The new published status of the course. published: Boolean! - # # The year in which the term starts. startYear: Int - # # The division of the academic calendar in which the term takes place. yearDivision: YearDivision } input UpdateExactAnswerQuestionInput { - # # UUID of the question to update and the id of the corresponding item. itemId: UUID! - # # Text of the question, in SlateJS JSON format. text: JSON! - # # A list of possible correct answers. correctAnswers: [String!]! - # # If the answer is case sensitive. If true, the answer is checked case sensitive. caseSensitive: Boolean! = false - # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateFlashcardInput { - # # Id of the flashcard to update, which is the id of the corresponding item. itemId: UUID! - # # List of sides of this flashcard. Must be at least two sides. sides: [FlashcardSideInput!]! } input UpdateMediaContentInput { - # # Metadata for the new Content metadata: UpdateContentMetadataInput! } input UpdateMediaRecordInput { - # # ID of the media record which should be updated id: UUID! - # # New name of the media record. Cannot be blank, maximum length 255 characters. name: String! - # # New type of the media record. type: MediaType! - # # IDs of the MediaContents this media record is associated with contentIds: [UUID!]! } input UpdateMultipleChoiceQuestionInput { - # # UUID of the question to update and the id of the corresponding item. itemId: UUID! - # # Text of the question, in SlateJS JSON format. text: JSON! - # # List of answers. answers: [MultipleChoiceAnswerInput!]! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateNumericQuestionInput { - # # UUID of the question to update and the id of the corresponding item. itemId: UUID! - # # Text of the question, in SlateJS JSON format. text: JSON! - # # The correct answer for the question. correctAnswer: Float! - # # The allowed deviation from the correct answer. tolerance: Float! - # # Feedback for the question when the user enters a wrong answer, in SlateJS JSON format. feedback: JSON - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateSelfAssessmentQuestionInput { - # # UUID of the question to update and the id of the corresponding item. itemId: UUID! - # # Text of the question, in SlateJS JSON format. text: JSON! - # # A possible correct answer to the question. solutionSuggestion: JSON! - # # Optional hint for the question, in SlateJS JSON format. hint: JSON } input UpdateStageInput { - # # Identifier of the Stage id: UUID! - # # updated List of UUIDs for content labeled as required in this Stage requiredContents: [UUID!]! - # # updated List of UUIDs for content labeled as optional in this Stage optionalContents: [UUID!]! } @@ -2987,49 +2603,39 @@ type UserInfo { mediaRecords: [MediaRecord!]! } -# # Represents a user's progress on a content item. # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html type UserProgressData { - # # The user's id. userId: UUID! - # # The id of the content item. contentId: UUID! - # # A list of entries each representing the user completing the content item. # Sorted by date in descending order. log: [ProgressLogItem]! - # # The learning interval in days for the content item. # If null, the content item is not scheduled for learning. learningInterval: Int - # # The next time the content should be learned. # Calculated using the date the user completed the content item and the learning interval. # This is null if the user has not completed the content item once. nextLearnDate: DateTime - # # The last time the content was learned successfully. # This is null if the user has not completed the content item once. lastLearnDate: DateTime - # # True if the user has completed the content item at least once successfully. isLearned: Boolean! - # # True if the assessment is due for review. isDueForReview: Boolean! } -# # Enum containing all valid roles a user can have in a course. enum UserRoleInCourse { STUDENT @@ -3061,10 +2667,11 @@ type VideoRecordSegment implements MediaRecordSegment { # Title of this segment. title: String + + # The media record this segment is part of. mediaRecord: MediaRecord! } -# # The division of the academic year. enum YearDivision { FIRST_SEMESTER From 8f58867519ca8a7373bad9ae214de4d43cfbefb7 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Fri, 27 Sep 2024 13:02:43 +0200 Subject: [PATCH 15/33] qs --- .../[courseId]/media/[mediaId]/VideoSide.tsx | 2 +- components/search/SearchResultItem.tsx | 134 +++++++++++------- 2 files changed, 82 insertions(+), 54 deletions(-) diff --git a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx index 0f3a525..4e9fe8b 100644 --- a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx +++ b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx @@ -3,7 +3,7 @@ import { VideoSideFragment$key, } from "@/__generated__/VideoSideFragment.graphql"; import { VideoSideLogProgressMutation } from "@/__generated__/VideoSideLogProgressMutation.graphql"; -import { DescriptionOutlined, Search } from "@mui/icons-material"; +import { Check, DescriptionOutlined, Search } from "@mui/icons-material"; import { Button, Divider, MenuItem, Select } from "@mui/material"; import { MediaPlayer, diff --git a/components/search/SearchResultItem.tsx b/components/search/SearchResultItem.tsx index 4995366..a3f7a56 100644 --- a/components/search/SearchResultItem.tsx +++ b/components/search/SearchResultItem.tsx @@ -1,64 +1,92 @@ "use client"; -import ExpandableText from '@/components/ExpandableText'; -import { Box, styled, Typography } from '@mui/material'; -import Tooltip, { TooltipProps, tooltipClasses } from '@mui/material/Tooltip'; -import { pageSemanticSearchQuery$data } from '@/__generated__/pageSemanticSearchQuery.graphql'; +import { SearchResultsBox$data } from "@/__generated__/SearchResultsBox.graphql"; +import ExpandableText from "@/components/ExpandableText"; +import { Box, styled, Typography } from "@mui/material"; +import Tooltip, { tooltipClasses, TooltipProps } from "@mui/material/Tooltip"; -function getSegmentContents(mediaRecordSegment: NonNullable[number]["mediaRecordSegment"]): string { - switch (mediaRecordSegment.__typename) { - case "VideoRecordSegment": - return mediaRecordSegment.transcript ?? ""; - case "DocumentRecordSegment": - return mediaRecordSegment.text ?? ""; - default: - return "Unknown media type"; - } +function getSegmentContents( + mediaRecordSegment: SearchResultsBox$data[0]["mediaRecordSegment"] +): string { + switch (mediaRecordSegment.__typename) { + case "VideoRecordSegment": + return mediaRecordSegment.transcript ?? ""; + case "DocumentRecordSegment": + return mediaRecordSegment.text ?? ""; + default: + return "Unknown media type"; + } } -function getSegmentTitle(mediaRecordSegment: NonNullable[number]["mediaRecordSegment"]) { - switch (mediaRecordSegment.__typename) { - case "VideoRecordSegment": - const date = new Date(mediaRecordSegment.startTime! * 1000); - return Time {date.toISOString().slice(11, 19)}; - case "DocumentRecordSegment": - return Page {mediaRecordSegment.page! + 1}; - default: - return Unknown media type; - } +function getSegmentTitle( + mediaRecordSegment: SearchResultsBox$data[0]["mediaRecordSegment"] +) { + switch (mediaRecordSegment.__typename) { + case "VideoRecordSegment": + const date = new Date(mediaRecordSegment.startTime! * 1000); + return ( + + Time {date.toISOString().slice(11, 19)} + + ); + case "DocumentRecordSegment": + return ( + + Page {mediaRecordSegment.page! + 1} + + ); + default: + return Unknown media type; + } } const NoMaxWidthTooltip = styled(({ className, ...props }: TooltipProps) => ( - - ))({ - [`& .${tooltipClasses.tooltip}`]: { - maxWidth: 'none', - }, - }); + +))({ + [`& .${tooltipClasses.tooltip}`]: { + maxWidth: "none", + }, +}); -export default function SearchResultItem({ searchResult }: { searchResult: NonNullable[number] }) { - return - - }> - - - - - {getSegmentTitle(searchResult.mediaRecordSegment)} - - +export default function SearchResultItem({ + searchResult, +}: { + searchResult: NonNullable; +}) { + return ( + + + } + > + + + + + {getSegmentTitle(searchResult.mediaRecordSegment)} + + -} \ No newline at end of file + ); +} From e0b8adbc09ff60af374e82d2df3423304960049d Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Mon, 30 Sep 2024 17:58:09 +0200 Subject: [PATCH 16/33] deeplinking etc --- .../media/[mediaId]/DocumentSide.tsx | 164 ++++++++- .../[courseId]/media/[mediaId]/VideoSide.tsx | 310 +++++++++++------- components/search/SearchResultItem.tsx | 8 +- 3 files changed, 354 insertions(+), 128 deletions(-) diff --git a/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx b/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx index 48df803..54d0016 100644 --- a/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx +++ b/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx @@ -1,12 +1,33 @@ import { DocumentSideFragment$key } from "@/__generated__/DocumentSideFragment.graphql"; import { DocumentSideLogProgressMutation } from "@/__generated__/DocumentSideLogProgressMutation.graphql"; -import { PdfViewer } from "@/components/PdfViewer"; import { Check } from "@mui/icons-material"; import { Button, MenuItem, Select } from "@mui/material"; import { differenceInHours } from "date-fns"; import { useState } from "react"; import { graphql, useFragment, useMutation } from "react-relay"; +import duration from "dayjs/plugin/duration"; +import { Document, Page, pdfjs, Thumbnail } from "react-pdf"; +import "react-pdf/dist/esm/Page/AnnotationLayer.css"; +import "react-pdf/dist/esm/Page/TextLayer.css"; +import { useDebounceValue, useResizeObserver } from "usehooks-ts"; + +import { CircularProgress } from "@mui/material"; +import { times } from "lodash"; +import { useRef } from "react"; +import useBus, { dispatch } from "use-bus"; + +pdfjs.GlobalWorkerOptions.workerSrc = new URL( + "pdfjs-dist/build/pdf.worker.min.js", + import.meta.url +).toString(); +dayjs.extend(duration); + +import dayjs from "dayjs"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; +import "react-pdf/dist/esm/Page/AnnotationLayer.css"; +import "react-pdf/dist/esm/Page/TextLayer.css"; + export function DocumentSide({ setError, _content, @@ -14,11 +35,18 @@ export function DocumentSide({ setError: (err: any) => void; _content: DocumentSideFragment$key; }) { - const [progress, setProgress] = useState(0); const content = useFragment( graphql` fragment DocumentSideFragment on MediaContent { id + segmentLinks { + segment1 { + id + } + segment2 { + id + } + } mediaRecords { id @@ -30,6 +58,7 @@ export function DocumentSide({ dateWorkedOn } closedCaptions + segments { id @@ -38,6 +67,9 @@ export function DocumentSide({ ... on DocumentRecordSegment { page } + ... on VideoRecordSegment { + startTime + } __typename } @@ -46,10 +78,36 @@ export function DocumentSide({ `, _content ); - const [selected, setSelected] = useState(0); - const documents = content.mediaRecords.filter((x) => x.type !== "VIDEO"); - const currentRecord = documents[selected]; + + const searchParams = useSearchParams(); + const router = useRouter(); + const pathname = usePathname(); + + const [numPages, setNumPages] = useState(); + const [pageNumber, setPageNumber] = useState( + searchParams.get("page") ? Number(searchParams.get("page")) : 1 + ); + + const currentRecord = + documents.find((x) => x.id === searchParams.get("selectedDocument")) ?? + documents[0]; + + const segment = currentRecord.segments.find( + (x) => (x.page ?? -1) + 1 === pageNumber + ); + + const links = content.segmentLinks + .filter( + (x) => x.segment1.id === segment?.id || x.segment2.id === segment?.id + ) + .map((x) => + x.segment1.id === segment?.id ? x.segment2.id : x.segment1.id + ); + + const linkedRecords = content.mediaRecords + .flatMap((x) => x.segments) + .filter((x) => links.includes(x.id)); const [mediaRecordWorkedOn] = useMutation(graphql` @@ -68,28 +126,104 @@ export function DocumentSide({ ) ) < 24; + const ref = useRef(null); + const { width = 0 } = useResizeObserver({ + ref, + box: "border-box", + }); + + const [debouncedWidth] = useDebounceValue(width, 200); + + useBus("openPage", (e) => { + if ("page" in e) { + setPageNumber(e.page + 1); + } + }); + + function onDocumentLoadSuccess({ numPages }: { numPages: number }): void { + setNumPages(numPages); + } + return (
    {(documents?.length ?? 0) > 1 && ( )} - {currentRecord && ( - null} - url={currentRecord.downloadUrl} - /> - )} +
    + } + > +
    + } + pageNumber={pageNumber} + /> +
    + + {linkedRecords.length > 0 && ( + <> +
    + Referenced at: + {linkedRecords.map((linkedRecord) => ( +
    + dispatch({ type: "jumpTo", time: linkedRecord.startTime }) + } + className="w-12 aspect-video rounded-sm overflow-hidden shadow-lg relative" + > +
    + {dayjs + .duration(linkedRecord.startTime ?? 0, "seconds") + .format( + linkedRecord.startTime && + linkedRecord.startTime > 60 * 60 + ? "HH:mm:ss" + : "mm:ss" + )} +
    + +
    + ))} +
    + + )} +
    + {numPages != null && + times(numPages, () => null).map((_, idx) => ( + setPageNumber(idx + 1)} + pageNumber={idx + 1} + key={idx} + > + ))} +
    +
    +
    ); diff --git a/components/ExpandableText.tsx b/components/ExpandableText.tsx index 63cdc8b..2ee88b1 100644 --- a/components/ExpandableText.tsx +++ b/components/ExpandableText.tsx @@ -4,52 +4,72 @@ import { Box, Button, Collapse, Typography } from "@mui/material"; import { ExpandMore, ExpandLess } from "@mui/icons-material"; import { useEffect, useRef, useState } from "react"; -export default function ExpandableText({ text, collapsedSize }: { text: string, collapsedSize: number }) { - const unexpandedStyle = { - whiteSpace: "pre-line", - background: `linear-gradient(black ${collapsedSize * 0.5}px, white ${collapsedSize}px)`, - backgroundClip: "text", - color: "transparent", - }; - const expandedStyle = { - whiteSpace: "pre-line", - }; - - const [expanded, setExpanded] = useState(false); - function toggleExpanded() { - setExpanded(!expanded); - }; +export default function ExpandableText({ + text, + collapsedSize, +}: { + text: string; + collapsedSize: number; +}) { + const unexpandedStyle = { + whiteSpace: "pre-line", + background: `linear-gradient(black ${ + collapsedSize * 0.5 + }px, white ${collapsedSize}px)`, + backgroundClip: "text", + color: "transparent", + }; + const expandedStyle = { + whiteSpace: "pre-line", + }; - const typographyRef = useRef(null); - const [isOverflowing, setIsOverflowing] = useState(false); - useEffect(() => { - if (typographyRef.current) { - // Check if the content overflows - const { scrollHeight } = typographyRef.current; - if (scrollHeight > collapsedSize) { - setIsOverflowing(true); - setExpanded(false); - } else { - setIsOverflowing(false); - setExpanded(true); - } - } - }, [text]); + const [expanded, setExpanded] = useState(false); + function toggleExpanded() { + setExpanded(!expanded); + } - function renderButtonIfIsOverflowing() { - if (isOverflowing) { - return - } + const typographyRef = useRef(null); + const [isOverflowing, setIsOverflowing] = useState(false); + useEffect(() => { + if (typographyRef.current) { + // Check if the content overflows + const { scrollHeight } = typographyRef.current; + if (scrollHeight > collapsedSize) { + setIsOverflowing(true); + setExpanded(false); + } else { + setIsOverflowing(false); + setExpanded(true); + } } + }, [text]); - return ( - - - {text.replaceAll("\n\n", "\n")} - - - {renderButtonIfIsOverflowing()} - ) -} \ No newline at end of file + function renderButtonIfIsOverflowing() { + if (isOverflowing) { + return ( + + ); + } + } + + return ( + + + + {text.replaceAll("\n\n", "\n")} + + + {renderButtonIfIsOverflowing()} + + ); +} diff --git a/components/ItemFormSection.tsx b/components/ItemFormSection.tsx index d142bc1..d229d53 100644 --- a/components/ItemFormSection.tsx +++ b/components/ItemFormSection.tsx @@ -83,7 +83,6 @@ export function ItemFormSection({ } } function checkIfAvailableSkillIsPartOfSkills(skillToTest: SkillInput) { - console.log(skills); if (skills.length > 0) { for (let i = 0; i < skills.length; i++) { if (skills[i].skillName == skillToTest.skillName) { diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 21597e7..5235d7f 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -146,17 +146,23 @@ function NavbarBase({ const [isSearchPopupOpen, setSearchPopupOpen] = useState(false); - function SearchPopupPaper({children}: {children?: any}) { - return setSearchPopupOpen(false)}> - {children} - - - + function SearchPopupPaper({ children }: { children?: any }) { + return ( + setSearchPopupOpen(false)}> + + {children} + + + + ); } return ( diff --git a/components/Skill.tsx b/components/Skill.tsx index 3f25d13..d4d52d3 100644 --- a/components/Skill.tsx +++ b/components/Skill.tsx @@ -13,7 +13,7 @@ function stringToColor(string: String) { hash = string.charCodeAt(i) + ((hash << 5) - hash); } - let color = '#'; + let color = "#"; for (i = 0; i < 3; i += 1) { const value = (hash >> (i * 8)) & 0xff; @@ -23,11 +23,7 @@ function stringToColor(string: String) { return color; } -export function Skill({ - _skill -}: { - _skill: SkillFragment$key; -}) { +export function Skill({ _skill }: { _skill: SkillFragment$key }) { const { skillName, skillLevels } = useFragment( graphql` fragment SkillFragment on Skill { @@ -45,10 +41,10 @@ export function Skill({ analyze { value } - evaluate{ + evaluate { value } - create{ + create { value } } @@ -62,9 +58,13 @@ export function Skill({ {skillLevels.remember !== null && skillLevels.remember.value > 0 && ( )} - {skillLevels.understand !== null && skillLevels.understand.value > 0 && ( - - )} + {skillLevels.understand !== null && + skillLevels.understand.value > 0 && ( + + )} {skillLevels.apply !== null && skillLevels.apply.value > 0 && ( )} @@ -76,42 +76,44 @@ export function Skill({ )} {skillLevels.create !== null && skillLevels.create.value > 0 && ( - )} ); + )}{" "} + + ); interface HexagonProps { color: string; name: string; } const Hexagon: React.FC = ({ color, name }) => { return ( - + - {name} + + {name} + - ) + ); }; return ( -
    - ); } else { return null; // or some default JSX } } -function SkillLevel({ - label, - value, -}: { - label: string; - value: number; -} -) { +function SkillLevel({ label, value }: { label: string; value: number }) { return ( -
    {label}:{value}
    +
    + {label}:{value} +
    ); - -} \ No newline at end of file +} diff --git a/components/SkillLevels.tsx b/components/SkillLevels.tsx index 6c69a35..9d1870e 100644 --- a/components/SkillLevels.tsx +++ b/components/SkillLevels.tsx @@ -15,10 +15,7 @@ export function SkillLevels({ _skill: SkillLevelsFragment$key; courseId: string; }) { - const { - skillLevels, - - } = useFragment( + const { skillLevels } = useFragment( graphql` fragment SkillLevelsFragment on Skill { skillName @@ -35,10 +32,10 @@ export function SkillLevels({ analyze { value } - evaluate{ + evaluate { value } - create{ + create { value } } @@ -60,15 +57,16 @@ export function SkillLevels({ /> )} - {skillLevels.understand !== null && skillLevels.understand.value > 0 && ( - - - - )} + {skillLevels.understand !== null && + skillLevels.understand.value > 0 && ( + + + + )} {skillLevels.apply !== null && skillLevels.apply.value > 0 && ( )}
    ); - } - else { - return
    + } else { + return
    ; } } diff --git a/components/flashcard/LecturerEditFlashcard.tsx b/components/flashcard/LecturerEditFlashcard.tsx index e629629..6bfcba1 100644 --- a/components/flashcard/LecturerEditFlashcard.tsx +++ b/components/flashcard/LecturerEditFlashcard.tsx @@ -21,14 +21,14 @@ export function Flashcard({ _flashcard, _assessmentId, courseId, - items + items, }: { title: string; onError: (error: any) => void; _flashcard: LecturerEditFlashcardFragment$key; _assessmentId: string; - courseId:string; - items:ItemData[]; + courseId: string; + items: ItemData[]; }) { const flashcard = useFragment( graphql` @@ -44,46 +44,51 @@ export function Flashcard({ `, _flashcard ); - + const findAvailableItem = (items: ItemData[], itemId: string): ItemData => { - for(let itemFromList of items){ - if(itemFromList.id === itemId){ + for (let itemFromList of items) { + if (itemFromList.id === itemId) { return itemFromList; } } - return { + return { associatedBloomLevels: [], associatedSkills: [], id: undefined, }; - } - + }; + const [addSideOpen, setAddSideOpen] = useState(false); - const [item, setItem] = useState(() => findAvailableItem(items, flashcard.itemId)); + const [item, setItem] = useState(() => + findAvailableItem(items, flashcard.itemId) + ); const [updateFlashcard, isUpdating] = useMutation(graphql` mutation LecturerEditFlashcardMutation( $flashcard: UpdateFlashcardInput! $assessmentId: UUID! - $item:ItemInput! - + $item: ItemInput! ) { mutateFlashcardSet(assessmentId: $assessmentId) { assessmentId - updateFlashcard(flashcardInput: $flashcard,assessmentId: $assessmentId,item:$item) { - flashcard{ + updateFlashcard( + flashcardInput: $flashcard + assessmentId: $assessmentId + item: $item + ) { + flashcard { __id itemId ...LecturerEditFlashcardFragment } - item{ + item { id associatedSkills { id skillName } associatedBloomLevels - } + } } } } @@ -99,34 +104,41 @@ export function Flashcard({ }), }; - updateFlashcard({ - variables: { assessmentId: _assessmentId, flashcard: newFlashcard,item:item }, + variables: { + assessmentId: _assessmentId, + flashcard: newFlashcard, + item: item, + }, onError, }); } - function handleItem(item: ItemData|null,newSkillAdded?:boolean){ - if(item){ - setItem(item); - const newFlashcard = { - itemId: flashcard.itemId, - sides: flashcard.sides, - }; + function handleItem(item: ItemData | null, newSkillAdded?: boolean) { + if (item) { + setItem(item); + const newFlashcard = { + itemId: flashcard.itemId, + sides: flashcard.sides, + }; - updateFlashcard({ - variables: { assessmentId: _assessmentId, flashcard: newFlashcard,item:item }, - onError, - onCompleted(){ - //reload page, when a new skill is added - if(newSkillAdded){ - console.log("reload"); - window.location.reload(); - } - console.log("logger"); - } - }); - } + updateFlashcard({ + variables: { + assessmentId: _assessmentId, + flashcard: newFlashcard, + item: item, + }, + onError, + onCompleted() { + //reload page, when a new skill is added + if (newSkillAdded) { + console.log("reload"); + window.location.reload(); + } + console.log("logger"); + }, + }); + } } function handleDeleteFlashcardSide(idx: number) { @@ -136,7 +148,11 @@ export function Flashcard({ }; updateFlashcard({ - variables: { assessmentId: _assessmentId, flashcard: newFlashcard,item:item }, + variables: { + assessmentId: _assessmentId, + flashcard: newFlashcard, + item: item, + }, onError, }); } @@ -156,7 +172,11 @@ export function Flashcard({ }; updateFlashcard({ - variables: { assessmentId: _assessmentId, flashcard: newFlashcard,item:item }, + variables: { + assessmentId: _assessmentId, + flashcard: newFlashcard, + item: item, + }, onError, onCompleted() { setAddSideOpen(false); @@ -170,7 +190,11 @@ export function Flashcard({ {title} - +
    {flashcard.sides.map((side, i) => (
    diff --git a/components/flashcard/LocalFlashcard.tsx b/components/flashcard/LocalFlashcard.tsx index 8b5cdd6..f2d1508 100644 --- a/components/flashcard/LocalFlashcard.tsx +++ b/components/flashcard/LocalFlashcard.tsx @@ -3,27 +3,35 @@ import { EditSideModal } from "./EditSideModal"; import { useState } from "react"; import { FlashcardSide, FlashcardSideData } from "./FlashcardSide"; import { Add } from "@mui/icons-material"; -import { ItemData,ItemFormSection } from "../ItemFormSection"; +import { ItemData, ItemFormSection } from "../ItemFormSection"; export function LocalFlashcard({ onClose, onSubmit, courseId, }: { onClose: () => void; - onSubmit: (sides: FlashcardSideData[],item:ItemData,newItemAdded:boolean) => void; - courseId:string + onSubmit: ( + sides: FlashcardSideData[], + item: ItemData, + newItemAdded: boolean + ) => void; + courseId: string; }) { const [sides, setSides] = useState([]); const [addSideOpen, setAddSideOpen] = useState(false); - const [newSkillAdded,setNewSkillAdded]=useState(false); - const [item,setItem]=useState({ + const [newSkillAdded, setNewSkillAdded] = useState(false); + const [item, setItem] = useState({ associatedBloomLevels: [], associatedSkills: [], id: undefined, }); const numQuestions = sides.filter((s) => s.isQuestion).length; const numAnswers = sides.filter((s) => s.isAnswer).length; - const valid = numQuestions >= 1 && numAnswers >= 1 && item.associatedBloomLevels.length > 0 && item.associatedSkills.length > 0; + const valid = + numQuestions >= 1 && + numAnswers >= 1 && + item.associatedBloomLevels.length > 0 && + item.associatedSkills.length > 0; function handleEditFlashcardSide(idx: number, data: FlashcardSideData) { setSides((sides) => sides.map((side, i) => (i == idx ? data : side))); @@ -34,19 +42,17 @@ export function LocalFlashcard({ setAddSideOpen(false); } - function handleItem(item: ItemData|null,newSkillAdded?:boolean){ - if(item){ + function handleItem(item: ItemData | null, newSkillAdded?: boolean) { + if (item) { setItem(item); - if(newSkillAdded){ + if (newSkillAdded) { setNewSkillAdded(newSkillAdded); } - } - else{ + } else { setItem({ associatedBloomLevels: [], associatedSkills: [], id: undefined, - }); } } @@ -56,7 +62,7 @@ export function LocalFlashcard({ diff --git a/components/quiz/AddAssociationQuestionModal.tsx b/components/quiz/AddAssociationQuestionModal.tsx index e81c277..cdc1ba2 100644 --- a/components/quiz/AddAssociationQuestionModal.tsx +++ b/components/quiz/AddAssociationQuestionModal.tsx @@ -13,13 +13,13 @@ export function AddAssociationQuestionModal({ assessmentId, open, onClose, - courseId + courseId, }: { _allRecords: MediaRecordSelector$key; assessmentId: string; open: boolean; onClose: () => void; - courseId:string; + courseId: string; }) { const [error, setError] = useState(null); @@ -27,32 +27,40 @@ export function AddAssociationQuestionModal({ useMutation(graphql` mutation AddAssociationQuestionModalMutation( $input: CreateAssociationQuestionInput! - $assessmentId:UUID! - $item:ItemInput! + $assessmentId: UUID! + $item: ItemInput! ) { mutateQuiz(assessmentId: $assessmentId) { assessmentId - addAssociationQuestion(questionInput: $input,assessmentId: $assessmentId,item:$item) { + addAssociationQuestion( + questionInput: $input + assessmentId: $assessmentId + item: $item + ) { questionPool { itemId type # without type and number, the question will not appear properly and be deletable until a page reload number ...AssociationQuestionPreviewFragment } - item{ + item { id associatedSkills { id skillName } associatedBloomLevels - } + } } } } `); - const handleSubmit = (data: AssociationQuestionData, item:ItemData, newSkillAdded?:boolean) => { + const handleSubmit = ( + data: AssociationQuestionData, + item: ItemData, + newSkillAdded?: boolean + ) => { addQuestion({ variables: { assessmentId, @@ -61,7 +69,7 @@ export function AddAssociationQuestionModal({ hint: data.hint, correctAssociations: data.correctAssociations, }, - item:item, + item: item, }, onCompleted: () => onClose(), onError: setError, @@ -69,7 +77,7 @@ export function AddAssociationQuestionModal({ store, { mutateQuiz: { - addAssociationQuestion: { questionPool,item }, + addAssociationQuestion: { questionPool, item }, }, } ) { @@ -89,9 +97,9 @@ export function AddAssociationQuestionModal({ quiz.setLinkedRecords(allQuestions, "questionPool"); const items = store - .getRoot() - .getLinkedRecord("items") - ?.getLinkedRecords("elements"); + .getRoot() + .getLinkedRecord("items") + ?.getLinkedRecords("elements"); const newItem = store.get(item!.id); if (!items || !newItem) return; @@ -102,9 +110,9 @@ export function AddAssociationQuestionModal({ }, }); }; - const initialItem: ItemData={ - associatedSkills:[], - associatedBloomLevels:[], + const initialItem: ItemData = { + associatedSkills: [], + associatedBloomLevels: [], }; const initialValue: AssociationQuestionData = { text: "", diff --git a/components/quiz/AddClozeQuestionModal.tsx b/components/quiz/AddClozeQuestionModal.tsx index 579ad18..3731975 100644 --- a/components/quiz/AddClozeQuestionModal.tsx +++ b/components/quiz/AddClozeQuestionModal.tsx @@ -14,7 +14,7 @@ export function AddClozeQuestionModal({ }: { _allRecords: MediaRecordSelector$key; assessmentId: string; - courseId:string; + courseId: string; open: boolean; onClose: () => void; }) { @@ -25,11 +25,15 @@ export function AddClozeQuestionModal({ mutation AddClozeQuestionModalMutation( $assessmentId: UUID! $questionInput: CreateClozeQuestionInput! - $item:ItemInput! + $item: ItemInput! ) { mutateQuiz(assessmentId: $assessmentId) { assessmentId - addClozeQuestion(assessmentId: $assessmentId,questionInput:$questionInput,item:$item) { + addClozeQuestion( + assessmentId: $assessmentId + questionInput: $questionInput + item: $item + ) { assessmentId questionPool { itemId @@ -38,20 +42,24 @@ export function AddClozeQuestionModal({ ...EditClozeQuestionButtonFragment ...ClozeQuestionPreviewFragment } - item{ + item { id associatedSkills { id skillName } associatedBloomLevels - } + } } } } `); - const handleSubmit = (data: ClozeQuestionData,item:ItemData,newSkillAdded?:boolean) => { + const handleSubmit = ( + data: ClozeQuestionData, + item: ItemData, + newSkillAdded?: boolean + ) => { addQuestion({ variables: { assessmentId, @@ -69,14 +77,14 @@ export function AddClozeQuestionModal({ } ), }, - item:item + item: item, }, onCompleted: () => onClose(), updater( store, { mutateQuiz: { - addClozeQuestion: { questionPool,item }, + addClozeQuestion: { questionPool, item }, }, } ) { @@ -96,9 +104,9 @@ export function AddClozeQuestionModal({ quiz.setLinkedRecords(allQuestions, "questionPool"); const items = store - .getRoot() - .getLinkedRecord("items") - ?.getLinkedRecords("elements"); + .getRoot() + .getLinkedRecord("items") + ?.getLinkedRecords("elements"); const newItem = store.get(item!.id); if (!items || !newItem) return; @@ -117,10 +125,10 @@ export function AddClozeQuestionModal({ additionalWrongAnswers: [], clozeElements: [], }; - const initialItem: ItemData={ - associatedSkills:[], - associatedBloomLevels:[], - } + const initialItem: ItemData = { + associatedSkills: [], + associatedBloomLevels: [], + }; return ( void; }) { @@ -27,11 +27,15 @@ export function AddMultipleChoiceQuestionModal({ mutation AddMultipleChoiceQuestionModalMutation( $assessmentId: UUID! $input: CreateMultipleChoiceQuestionInput! - $item:ItemInput! + $item: ItemInput! ) { mutateQuiz(assessmentId: $assessmentId) { assessmentId - addMultipleChoiceQuestion( questionInput:$input , assessmentId:$assessmentId, item:$item) { + addMultipleChoiceQuestion( + questionInput: $input + assessmentId: $assessmentId + item: $item + ) { assessmentId questionPool { itemId @@ -40,20 +44,24 @@ export function AddMultipleChoiceQuestionModal({ ...EditMultipleChoiceQuestionButtonFragment ...MultipleChoiceQuestionPreviewFragment } - item{ + item { id associatedSkills { id skillName } associatedBloomLevels - } + } } } } `); - const handleSubmit = (data: MultipleChoiceQuestionData,item:ItemData,newSkillAdded?:boolean) => { + const handleSubmit = ( + data: MultipleChoiceQuestionData, + item: ItemData, + newSkillAdded?: boolean + ) => { addQuestion({ variables: { assessmentId, @@ -66,14 +74,14 @@ export function AddMultipleChoiceQuestionModal({ feedback: answer.feedback, })), }, - item:item, + item: item, }, onCompleted: () => onClose(), updater( store, { mutateQuiz: { - addMultipleChoiceQuestion: { questionPool,item }, + addMultipleChoiceQuestion: { questionPool, item }, }, } ) { @@ -93,11 +101,11 @@ export function AddMultipleChoiceQuestionModal({ } quiz.setLinkedRecords(allQuestions, "questionPool"); - console.log("updatedQuestion"); + console.log("updatedQuestion"); const items = store - .getRoot() - .getLinkedRecord("items") - ?.getLinkedRecords("elements"); + .getRoot() + .getLinkedRecord("items") + ?.getLinkedRecords("elements"); const newItem = store.get(item!.id); if (!items || !newItem) return; @@ -116,9 +124,9 @@ export function AddMultipleChoiceQuestionModal({ hint: null, answers: [], }; - const initialItem: ItemData={ - associatedSkills:[], - associatedBloomLevels:[], + const initialItem: ItemData = { + associatedSkills: [], + associatedBloomLevels: [], }; return ( diff --git a/components/quiz/AddQuestionButton.tsx b/components/quiz/AddQuestionButton.tsx index 23e32b0..d6bbbcc 100644 --- a/components/quiz/AddQuestionButton.tsx +++ b/components/quiz/AddQuestionButton.tsx @@ -22,11 +22,11 @@ import { AddAssociationQuestionModal } from "./AddAssociationQuestionModal"; export function AddQuestionButton({ _allRecords, assessmentId, - courseId + courseId, }: { _allRecords: MediaRecordSelector$key; assessmentId: string; - courseId:string; + courseId: string; }) { const [open, setOpen] = useState(false); const [addMultipleChoice, setAddMultipleChoice] = useState(false); diff --git a/components/quiz/AssociationQuestionModal.tsx b/components/quiz/AssociationQuestionModal.tsx index 6f67b5a..8e1bbcb 100644 --- a/components/quiz/AssociationQuestionModal.tsx +++ b/components/quiz/AssociationQuestionModal.tsx @@ -15,7 +15,7 @@ import { FormErrors } from "../FormErrors"; import { RichTextEditor, serializeToText } from "../RichTextEditor"; import { EditRichTextButton } from "./EditRichTextButton"; import { HintFormSection } from "./HintFormSection"; -import { ItemFormSection, ItemData} from "../ItemFormSection"; +import { ItemFormSection, ItemData } from "../ItemFormSection"; export type AssociationQuestionData = { hint: string | null; @@ -46,16 +46,20 @@ export function AssociationQuestionModal({ open: boolean; title: string; error: any; - item:ItemData; - courseId:string, + item: ItemData; + courseId: string; initialValue: AssociationQuestionData; isLoading: boolean; - onSave: (data: AssociationQuestionData,item:ItemData,newSkillAdded?:boolean) => void; + onSave: ( + data: AssociationQuestionData, + item: ItemData, + newSkillAdded?: boolean + ) => void; onClose: () => void; clearError: () => void; }) { const [data, setData] = useState(initialValue); - const[itemForQuestion,setItem]=useState(item); + const [itemForQuestion, setItem] = useState(item); const updateElement = (index: number, value: SingleAssociationData) => { setData((oldValue) => ({ ...oldValue, @@ -97,22 +101,25 @@ export function AssociationQuestionModal({ [data.correctAssociations] ); - const valid = hasTitle && atLeastTwoItems && allItemsFilled &&itemForQuestion.associatedBloomLevels.length > 0 && itemForQuestion.associatedSkills.length > 0; + const valid = + hasTitle && + atLeastTwoItems && + allItemsFilled && + itemForQuestion.associatedBloomLevels.length > 0 && + itemForQuestion.associatedSkills.length > 0; useEffect(() => { if (!open) { setData(initialValue); setItem(item); } - }, [open, initialValue,item]); + }, [open, initialValue, item]); - - function handleItem(itemInput:ItemData|null){ - if(itemInput){ + function handleItem(itemInput: ItemData | null) { + if (itemInput) { setItem(itemInput); - } - else{ - setItem({associatedBloomLevels:[],associatedSkills:[]}); + } else { + setItem({ associatedBloomLevels: [], associatedSkills: [] }); } console.log("finished"); } @@ -122,7 +129,11 @@ export function AssociationQuestionModal({ - + All items need a text
    )} {!hasTitle &&
    A title is required
    } - {(itemForQuestion.associatedBloomLevels.length<1) &&
    Level of Blooms Taxonomy are required
    } - {(itemForQuestion.associatedSkills.length<1) &&
    At least one skill is required
    } + {itemForQuestion.associatedBloomLevels.length < 1 && ( +
    Level of Blooms Taxonomy are required
    + )} + {itemForQuestion.associatedSkills.length < 1 && ( +
    At least one skill is required
    + )}
    ))} diff --git a/components/content-link/ContentBase.tsx b/components/content-link/ContentBase.tsx deleted file mode 100644 index a84a7dd..0000000 --- a/components/content-link/ContentBase.tsx +++ /dev/null @@ -1,105 +0,0 @@ -"use client"; - -import { Chip, Typography } from "@mui/material"; -import { - MouseEventHandler, - ReactElement, - ReactNode, - createContext, - useContext, -} from "react"; - -export type ContentSize = "small" | "normal"; -export type ContentChip = { - key: string; - label: string; - color?: string; -}; - -export const ContentLinkProps = createContext({ - disabled: false, - chips: [] as ContentChip[], - size: "normal" as ContentSize, -}); - -export function ContentBase({ - type, - title, - icon, - color, - iconFrame, - className = "", - onClick = undefined, - action, - square = false, -}: { - type?: string; - title: string; - icon: ReactElement; - color?: string; - iconFrame: ReactElement; - className?: string; - onClick?: MouseEventHandler | undefined; - action?: ReactNode; - square?: boolean; -}) { - const { disabled, chips, size } = useContext(ContentLinkProps); - const chips_ = [ - ...(type ? [{ key: "type", label: type, color }] : []), - ...chips, - ]; - - const gap = size == "small" ? "gap-2" : "gap-4"; - const rounding = !square - ? "rounded-full" - : size == "small" - ? "rounded" - : "rounded-xl"; - const cursor = !disabled ? "cursor-pointer" : "cursor-default"; - const frameSize = size == "small" ? "w-10 h-10" : "w-16 h-16"; - - return ( - - ); -} diff --git a/components/content-link/ContentLink.tsx b/components/content-link/ContentLink.tsx index fc69c05..71fd7b6 100644 --- a/components/content-link/ContentLink.tsx +++ b/components/content-link/ContentLink.tsx @@ -1,11 +1,51 @@ "use client"; -import { ContentLinkFragment$key } from "@/__generated__/ContentLinkFragment.graphql"; +import { + ContentLinkFragment$key, + MediaType, +} from "@/__generated__/ContentLinkFragment.graphql"; +import { + ArrowRight, + Description, + Earbuds, + Image, + Language, + PersonalVideo, + QuestionAnswerRounded, + Quiz, +} from "@mui/icons-material"; +import { Chip, Typography } from "@mui/material"; +import { useRouter } from "next/navigation"; import { graphql, useFragment } from "react-relay"; -import { QuizContent } from "./QuizContentLink"; -import { FlashcardContentLink } from "./FlashcardContentLink"; -import { MediaContentLink } from "./MediaContentLink"; -import { ContentChip, ContentLinkProps, ContentSize } from "./ContentBase"; +import colors from "tailwindcss/colors"; +import { ContentChip, ContentSize } from "./ContentBase"; +import { ProgressFrame } from "./ProgressFrame"; + +export const ContentTypeToColor: Record = { + MediaContent: colors.violet[200], + FlashcardSetAssessment: colors.emerald[200], + QuizAssessment: colors.rose[200], +}; + +export function MediaRecordIcon({ type }: { type: MediaType }) { + const style = { color: "text.secondary", width: "100%", height: "100%" }; + switch (type) { + case "AUDIO": + return ; + case "DOCUMENT": + return ; + case "IMAGE": + return ; + case "PRESENTATION": + return ; + case "VIDEO": + return ; + case "URL": + return ; + default: + return <>; + } +} export function ContentLink({ disabled = false, @@ -28,37 +68,143 @@ export function ContentLink({ id metadata { type + name } - ...MediaContentLinkFragment - ...FlashcardContentLinkFragment - ...QuizContentLinkFragment + userProgressData { + ...ProgressFrameFragment + } + ... on MediaContent { + mediaRecords { + type + aiProcessingProgress { + queuePosition + state + } + } + aiProcessingProgress { + queuePosition + state + } + } + + __typename } `, _content ); - - function getContentNode() { - switch (content.metadata.type) { - case "MEDIA": - return ; - case "FLASHCARDS": - return ( - - ); - case "QUIZ": - return ; - } - return null; - } - + const isProcessing = + content.aiProcessingProgress?.state !== "DONE" || + content.mediaRecords?.some((x) => x.aiProcessingProgress.state !== "DONE"); + const typeString = + content.__typename === "MediaContent" + ? "Media" + : content.__typename === "FlashcardSetAssessment" + ? "Flashcard" + : content.__typename === "QuizAssessment" + ? "Quiz" + : "Unknown"; + const router = useRouter(); const chips = [ ...(optional ? [{ key: "optional", label: "optional" }] : []), + { + key: "type", + label: typeString, + color: ContentTypeToColor[content.__typename], + }, + ...(isProcessing ? [{ key: "processing", label: "Processing..." }] : []), ...extra_chips, ]; + const gap = size == "small" ? "gap-2" : "gap-4"; + + const cursor = !disabled ? "cursor-pointer" : "cursor-default"; + const frameSize = size == "small" ? "w-10 h-10" : "w-16 h-16"; + + let icon = + content.__typename === "MediaContent" ? ( +
    1 + ? "grid grid-cols-2 max-w-[50%] max-h-[50%]" + : "" + } + > + {content.mediaRecords?.slice(0, 4).map((x) => ( + + ))} +
    + ) : content.__typename === "FlashcardSetAssessment" ? ( + + ) : content.__typename === "QuizAssessment" ? ( + + ) : ( +
    unknown
    + ); + + let link = + content.__typename === "MediaContent" + ? `/courses/${courseId}/media/${content.id}` + : content.__typename === "FlashcardSetAssessment" + ? `/courses/${courseId}/flashcards/${content.id}` + : content.__typename === "QuizAssessment" + ? `/courses/${courseId}/quiz/${content.id}` + : "-"; + return ( - - {getContentNode()} - + ); } diff --git a/components/content-link/DeletedContentLink.tsx b/components/content-link/DeletedContentLink.tsx deleted file mode 100644 index 78778a8..0000000 --- a/components/content-link/DeletedContentLink.tsx +++ /dev/null @@ -1,33 +0,0 @@ -"use client"; - -import { DeleteForever } from "@mui/icons-material"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { StaticFrame } from "./StaticFrame"; -import { ContentSize, ContentLinkProps } from "./ContentBase"; - -export function DeletedContentLink({ - size = "normal", -}: { - size?: ContentSize; -}) { - return ( - - - } - iconFrame={} - square - /> - - ); -} diff --git a/components/content-link/DocumentContentLink.tsx b/components/content-link/DocumentContentLink.tsx deleted file mode 100644 index 3ca0d29..0000000 --- a/components/content-link/DocumentContentLink.tsx +++ /dev/null @@ -1,57 +0,0 @@ -"use client"; - -import { DocumentContentLinkFragment$key } from "@/__generated__/DocumentContentLinkFragment.graphql"; -import { Description } from "@mui/icons-material"; -import { useContext } from "react"; -import { graphql, useFragment } from "react-relay"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { ProgressFrame } from "./ProgressFrame"; -import { ContentLinkProps } from "./ContentBase"; - -export function DocumentContentLink({ - title, - onClick, - _media, -}: { - title: string; - onClick: () => void; - _media: DocumentContentLinkFragment$key; -}) { - const { disabled } = useContext(ContentLinkProps); - const media = useFragment( - graphql` - fragment DocumentContentLinkFragment on MediaContent { - id - userProgressData { - ...ProgressFrameFragment - } - } - `, - _media - ); - - return ( - - } - iconFrame={ - - } - /> - ); -} diff --git a/components/content-link/FlashcardContentLink.tsx b/components/content-link/FlashcardContentLink.tsx deleted file mode 100644 index 7e54dfc..0000000 --- a/components/content-link/FlashcardContentLink.tsx +++ /dev/null @@ -1,88 +0,0 @@ -"use client"; - -import { FlashcardContentLinkFragment$key } from "@/__generated__/FlashcardContentLinkFragment.graphql"; -import { PageView, usePageView } from "@/src/currentView"; -import { QuestionAnswerRounded } from "@mui/icons-material"; -import { useRouter } from "next/navigation"; -import { useContext, useState } from "react"; -import { graphql, useFragment } from "react-relay"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { ProgressFrame } from "./ProgressFrame"; -import { ContentLinkProps } from "./ContentBase"; -import { EarlyRepeatWarnModal } from "./EarlyRepeatWarnModal"; - -export function FlashcardContentLink({ - _flashcard, - courseId, -}: { - _flashcard: FlashcardContentLinkFragment$key; - courseId: string; -}) { - const flashcard = useFragment( - graphql` - fragment FlashcardContentLinkFragment on FlashcardSetAssessment { - id - metadata { - name - } - - userProgressData { - nextLearnDate - ...EarlyRepeatWarnModalFragment - ...ProgressFrameFragment - } - } - `, - _flashcard - ); - - const [showWarnModal, setShowWarnModal] = useState(false); - const { disabled } = useContext(ContentLinkProps); - - const [pageView] = usePageView(); - - const { push } = useRouter(); - const href = `/courses/${courseId}/flashcards/${flashcard.id}`; - return ( - <> - setShowWarnModal(false)} - _progress={flashcard.userProgressData} - /> - { - if ( - pageView === PageView.Student && - flashcard.userProgressData.nextLearnDate && - new Date(flashcard.userProgressData.nextLearnDate) > new Date() - ) { - setShowWarnModal(true); - } else { - push(href); - } - }} - icon={ - - } - iconFrame={ - - } - /> - - ); -} diff --git a/components/content-link/ImageContentLink.tsx b/components/content-link/ImageContentLink.tsx deleted file mode 100644 index c50caa0..0000000 --- a/components/content-link/ImageContentLink.tsx +++ /dev/null @@ -1,57 +0,0 @@ -"use client"; - -import { ImageContentLinkFragment$key } from "@/__generated__/ImageContentLinkFragment.graphql"; -import { Image as ImageIcon } from "@mui/icons-material"; -import { useContext } from "react"; -import { graphql, useFragment } from "react-relay"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { ProgressFrame } from "./ProgressFrame"; -import { ContentLinkProps } from "./ContentBase"; - -export function ImageContentLink({ - title, - onClick, - _media, -}: { - title: string; - onClick: () => void; - _media: ImageContentLinkFragment$key; -}) { - const { disabled } = useContext(ContentLinkProps); - const media = useFragment( - graphql` - fragment ImageContentLinkFragment on MediaContent { - id - userProgressData { - ...ProgressFrameFragment - } - } - `, - _media - ); - - return ( - - } - iconFrame={ - - } - /> - ); -} diff --git a/components/content-link/InvalidContentLink.tsx b/components/content-link/InvalidContentLink.tsx deleted file mode 100644 index 19869c7..0000000 --- a/components/content-link/InvalidContentLink.tsx +++ /dev/null @@ -1,88 +0,0 @@ -"use client"; - -import { InvalidContentLinkDeleteMutation } from "@/__generated__/InvalidContentLinkDeleteMutation.graphql"; -import { PageView, usePageView } from "@/src/currentView"; -import { Delete, QuestionMark } from "@mui/icons-material"; -import { IconButton } from "@mui/material"; -import { useContext, useState } from "react"; -import { graphql, useMutation } from "react-relay"; -import colors from "tailwindcss/colors"; -import { ContentBase, ContentLinkProps } from "./ContentBase"; -import { StaticFrame } from "./StaticFrame"; - -export function InvalidContentLink({ - type, - title, - id, - chapterId, -}: { - type: string; - title: string; - id: string; - chapterId: string; -}) { - const { disabled } = useContext(ContentLinkProps); - const [del, deleting] = useMutation(graphql` - mutation InvalidContentLinkDeleteMutation($id: UUID!) { - mutateContent(contentId: $id) { - deleteContent - } - } - `); - - // this workaround is required because we are deleting the record without actually navigating, so "invalidateRecord" won't trigger re-evaluation of the query - const [deleted, setDeleted] = useState(false); - - const [pageView] = usePageView(); - if (pageView === PageView.Student) { - return null; - } - - if (deleted) { - return null; - } - - return ( - { - e.stopPropagation(); - if (!deleting) { - del({ - variables: { id }, - updater(store) { - store.get(id)?.invalidateRecord(); - }, - onCompleted() { - setDeleted(true); - }, - }); - } - }} - > - - - ) : undefined - } - icon={ - - } - iconFrame={ - - } - square - /> - ); -} diff --git a/components/content-link/MaterialContentLink.tsx b/components/content-link/MaterialContentLink.tsx deleted file mode 100644 index ea87868..0000000 --- a/components/content-link/MaterialContentLink.tsx +++ /dev/null @@ -1,37 +0,0 @@ -"use client"; - -import { Download } from "@mui/icons-material"; -import { MouseEventHandler, useContext } from "react"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { StaticFrame } from "./StaticFrame"; -import { ContentLinkProps } from "./ContentBase"; - -export function MaterialContentLink({ - title, - onClick = undefined, -}: { - title: string; - disabled?: boolean; - onClick?: MouseEventHandler | undefined; -}) { - const { disabled } = useContext(ContentLinkProps); - return ( - - } - iconFrame={ - - } - square - /> - ); -} diff --git a/components/content-link/MediaContentLink.tsx b/components/content-link/MediaContentLink.tsx deleted file mode 100644 index c430d88..0000000 --- a/components/content-link/MediaContentLink.tsx +++ /dev/null @@ -1,128 +0,0 @@ -"use client"; - -import { MediaContentLinkFragment$key } from "@/__generated__/MediaContentLinkFragment.graphql"; -import { useRouter } from "next/navigation"; -import { graphql, useFragment } from "react-relay"; -import { DocumentContentLink } from "./DocumentContentLink"; -import { UrlContentLink } from "./UrlContentLink"; -import { PresentationContentLink } from "./PresentationContentLink"; -import { InvalidContentLink } from "./InvalidContentLink"; -import { VideoContentLink } from "./VideoContentLink"; -import { UnknownMediaContentLink } from "./UnknownMediaContentLink"; -import { ImageContentLink } from "./ImageContentLink"; - -export function MediaContentLink({ - recordId, - replace = false, - _media, - courseId, -}: { - recordId?: string; - replace?: boolean; - _media: MediaContentLinkFragment$key; - courseId: string; -}) { - const router = useRouter(); - const media = useFragment( - graphql` - fragment MediaContentLinkFragment on MediaContent { - id - metadata { - name - chapterId - } - ...VideoContentLinkFragment - ...PresentationContentLinkFragment - ...DocumentContentLinkFragment - ...UnknownMediaContentLinkFragment - ...ImageContentLinkFragment - mediaRecords { - id - type - name - } - } - `, - _media - ); - - // if (media.mediaRecords.length == 0) { - // return ( - // - // ); - // } - const record = recordId - ? media.mediaRecords.find((record) => record.id === recordId) - : media.mediaRecords[0]; - - function onClick() { - const recordSelection = record ? `?recordId=${record.id}` : ""; - const path = `/courses/${courseId}/media/${media.id}${recordSelection}`; - if (replace) { - router.replace(path); - } else { - router.push(path); - } - } - - if (!record) { - return ( - - ); - } - - switch (record.type) { - case "VIDEO": - return ( - - ); - case "PRESENTATION": - return ( - - ); - case "DOCUMENT": - return ( - - ); - case "IMAGE": - return ( - - ); - case "URL": - return ; - default: - return ( - - ); - } -} diff --git a/components/content-link/PresentationContentLink.tsx b/components/content-link/PresentationContentLink.tsx deleted file mode 100644 index f8cd6f6..0000000 --- a/components/content-link/PresentationContentLink.tsx +++ /dev/null @@ -1,57 +0,0 @@ -"use client"; - -import { PresentationContentLinkFragment$key } from "@/__generated__/PresentationContentLinkFragment.graphql"; -import { PersonalVideo } from "@mui/icons-material"; -import { useContext } from "react"; -import { graphql, useFragment } from "react-relay"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { ProgressFrame } from "./ProgressFrame"; -import { ContentLinkProps } from "./ContentBase"; - -export function PresentationContentLink({ - title, - onClick, - _media, -}: { - title: string; - onClick: () => void; - _media: PresentationContentLinkFragment$key; -}) { - const { disabled } = useContext(ContentLinkProps); - const media = useFragment( - graphql` - fragment PresentationContentLinkFragment on MediaContent { - id - userProgressData { - ...ProgressFrameFragment - } - } - `, - _media - ); - - return ( - - } - iconFrame={ - - } - /> - ); -} diff --git a/components/content-link/QuizContentLink.tsx b/components/content-link/QuizContentLink.tsx deleted file mode 100644 index 42b684c..0000000 --- a/components/content-link/QuizContentLink.tsx +++ /dev/null @@ -1,87 +0,0 @@ -"use client"; - -import { QuizContentLinkFragment$key } from "@/__generated__/QuizContentLinkFragment.graphql"; -import { PageView, usePageView } from "@/src/currentView"; -import { Quiz } from "@mui/icons-material"; -import { useRouter } from "next/navigation"; -import { useContext, useState } from "react"; -import { graphql, useFragment } from "react-relay"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { ProgressFrame } from "./ProgressFrame"; -import { ContentLinkProps } from "./ContentBase"; -import { EarlyRepeatWarnModal } from "./EarlyRepeatWarnModal"; - -export function QuizContent({ - _quiz, - courseId, -}: { - _quiz: QuizContentLinkFragment$key; - courseId: string; -}) { - const quiz = useFragment( - graphql` - fragment QuizContentLinkFragment on QuizAssessment { - id - metadata { - name - } - userProgressData { - nextLearnDate - ...EarlyRepeatWarnModalFragment - ...ProgressFrameFragment - } - } - `, - _quiz - ); - const [showWarnModal, setShowWarnModal] = useState(false); - const [pageView] = usePageView(); - const { disabled } = useContext(ContentLinkProps); - - const { push } = useRouter(); - const href = `/courses/${courseId}/quiz/${quiz.id}`; - - return ( - <> - setShowWarnModal(false)} - _progress={quiz.userProgressData} - /> - - { - if ( - pageView === PageView.Student && - quiz.userProgressData.nextLearnDate && - new Date(quiz.userProgressData.nextLearnDate) > new Date() - ) { - setShowWarnModal(true); - } else { - push(href); - } - }} - icon={ - - } - iconFrame={ - - } - /> - - ); -} diff --git a/components/content-link/UnknownMediaContentLink.tsx b/components/content-link/UnknownMediaContentLink.tsx deleted file mode 100644 index cffac4b..0000000 --- a/components/content-link/UnknownMediaContentLink.tsx +++ /dev/null @@ -1,57 +0,0 @@ -"use client"; - -import { UnknownMediaContentLinkFragment$key } from "@/__generated__/UnknownMediaContentLinkFragment.graphql"; -import { QuestionMark } from "@mui/icons-material"; -import { useContext } from "react"; -import { graphql, useFragment } from "react-relay"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { ProgressFrame } from "./ProgressFrame"; -import { ContentLinkProps } from "./ContentBase"; - -export function UnknownMediaContentLink({ - title, - onClick, - _media, -}: { - title: string; - onClick: () => void; - _media: UnknownMediaContentLinkFragment$key; -}) { - const { disabled } = useContext(ContentLinkProps); - const media = useFragment( - graphql` - fragment UnknownMediaContentLinkFragment on MediaContent { - id - userProgressData { - ...ProgressFrameFragment - } - } - `, - _media - ); - - return ( - - } - iconFrame={ - - } - /> - ); -} diff --git a/components/content-link/UrlContentLink.tsx b/components/content-link/UrlContentLink.tsx deleted file mode 100644 index b80993d..0000000 --- a/components/content-link/UrlContentLink.tsx +++ /dev/null @@ -1,32 +0,0 @@ -"use client"; - -import { Language } from "@mui/icons-material"; -import { useContext } from "react"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { StaticFrame } from "./StaticFrame"; -import { ContentLinkProps } from "./ContentBase"; - -export function UrlContentLink({ title }: { title: string }) { - const { disabled } = useContext(ContentLinkProps); - return ( - - } - iconFrame={ - - } - square - /> - ); -} diff --git a/components/content-link/VideoContentLink.tsx b/components/content-link/VideoContentLink.tsx deleted file mode 100644 index d5f2d8a..0000000 --- a/components/content-link/VideoContentLink.tsx +++ /dev/null @@ -1,57 +0,0 @@ -"use client"; - -import { VideoContentLinkFragment$key } from "@/__generated__/VideoContentLinkFragment.graphql"; -import { ArrowRight } from "@mui/icons-material"; -import { useContext } from "react"; -import { graphql, useFragment } from "react-relay"; -import colors from "tailwindcss/colors"; -import { ContentBase } from "./ContentBase"; -import { ProgressFrame } from "./ProgressFrame"; -import { ContentLinkProps } from "./ContentBase"; - -export function VideoContentLink({ - title, - onClick, - _media, -}: { - title: string; - onClick: () => void; - _media: VideoContentLinkFragment$key; -}) { - const { disabled } = useContext(ContentLinkProps); - const media = useFragment( - graphql` - fragment VideoContentLinkFragment on MediaContent { - id - userProgressData { - ...ProgressFrameFragment - } - } - `, - _media - ); - - return ( - - } - iconFrame={ - - } - /> - ); -} diff --git a/src/schema.graphql b/src/schema.graphql index 1174003..84d4fad 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -101,6 +101,19 @@ directive @resolveTo( resultType: String ) on FIELD_DEFINITION +type AiEntityProcessingProgress { + entityId: UUID! + state: AiEntityProcessingState! + queuePosition: Int +} + +enum AiEntityProcessingState { + UNKNOWN + ENQUEUED + PROCESSING + DONE +} + interface Assessment { # Assessment metadata assessmentMetadata: AssessmentMetadata! @@ -1069,7 +1082,6 @@ input FlashcardSideInput { input GenerateMediaRecordLinksInput { contentId: UUID! - mediaRecordIds: [UUID!]! } enum GlobalUserRole { @@ -1170,6 +1182,7 @@ type MediaContent implements Content { # The media records linked to this media content. mediaRecords: [MediaRecord!]! segmentLinks: [MediaRecordSegmentLink!]! + aiProcessingProgress: AiEntityProcessingProgress! } # schema file of the microservice @@ -1224,6 +1237,12 @@ type MediaRecord { # Returns a closed captions string formatted in WebVTT format for the media record if it is of type video, # returns null otherwise. closedCaptions: String + + # The progress of the AI processing of this media record's content. + aiProcessingProgress: AiEntityProcessingProgress! + + # Tags suggested for this media record by the AI system. + suggestedTags: [String!]! } type MediaRecordProgressData { @@ -1311,16 +1330,45 @@ type MultipleChoiceQuestion implements Question { hint: JSON } +# Mutations for the flashcard service. Provides mutations for creating, updating, and deleting flashcard as well as +# creating and deleting flashcard sets. To update a flashcard set, update, delete, and create flashcards individually. type Mutation { - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the reward score of the user. - # This is done automatically at some time in the night. + # Creates a new media record + # 🔒 The user must have the "course-creator" role to perform this action. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. + createMediaRecord(input: CreateMediaRecordInput!): MediaRecord! + + # Updates an existing media record with the given UUID + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + updateMediaRecord(input: UpdateMediaRecordInput!): MediaRecord! + + # Deletes the media record with the given UUID + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + deleteMediaRecord(id: UUID!): UUID! + + # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. + # This means that for the content, all already linked media records are removed and replaced by the given ones. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + setLinkedMediaRecordsForContent( + contentId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! + + # Logs that a media has been worked on by the current user. + # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html # - # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! - @deprecated(reason: "Only for testing purposes. Will be removed.") + # Possible side effects: + # When all media records of a content have been worked on by a user, + # a user-progress event is emitted for the content. + # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. + logMediaRecordWorkedOn(mediaRecordId: UUID!): MediaRecord! + + # Add the MediaRecords with the given UUIDS to the Course with the given UUID. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + setMediaRecordsForCourse( + courseId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1366,23 +1414,6 @@ type Mutation { # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! - # Deletes a flashcard set. Throws an error if the flashcard set does not exist. - # The contained flashcards are deleted as well. - deleteFlashcardSet(input: UUID!): UUID! - @deprecated( - reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead." - ) - - # Modify a flashcard set. - # 🔒 The user must be an admin the course the flashcard set is in to perform this action. - mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! - - # Logs that a user has learned a flashcard. - # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned( - input: LogFlashcardLearnedInput! - ): FlashcardLearnedFeedback! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. # # Triggers the recalculation of the skill level of the user. @@ -1393,42 +1424,15 @@ type Mutation { recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") - # Creates a new media record - # 🔒 The user must have the "course-creator" role to perform this action. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. - createMediaRecord(input: CreateMediaRecordInput!): MediaRecord! - - # Updates an existing media record with the given UUID - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - updateMediaRecord(input: UpdateMediaRecordInput!): MediaRecord! - - # Deletes the media record with the given UUID - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - deleteMediaRecord(id: UUID!): UUID! - - # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. - # This means that for the content, all already linked media records are removed and replaced by the given ones. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setLinkedMediaRecordsForContent( - contentId: UUID! - mediaRecordIds: [UUID!]! - ): [MediaRecord!]! - - # Logs that a media has been worked on by the current user. - # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. # - # Possible side effects: - # When all media records of a content have been worked on by a user, - # a user-progress event is emitted for the content. - # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. - logMediaRecordWorkedOn(mediaRecordId: UUID!): MediaRecord! - - # Add the MediaRecords with the given UUIDS to the Course with the given UUID. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setMediaRecordsForCourse( - courseId: UUID! - mediaRecordIds: [UUID!]! - ): [MediaRecord!]! + # Triggers the recalculation of the reward score of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! + @deprecated(reason: "Only for testing purposes. Will be removed.") # Modify a quiz. # 🔒 The user must be an admin the course the quiz is in to perform this action. @@ -1452,6 +1456,23 @@ type Mutation { # 🔒 The user must have admin access to the course containing the section to perform this action. mutateSection(sectionId: UUID!): SectionMutation! + # Deletes a flashcard set. Throws an error if the flashcard set does not exist. + # The contained flashcards are deleted as well. + deleteFlashcardSet(input: UUID!): UUID! + @deprecated( + reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead." + ) + + # Modify a flashcard set. + # 🔒 The user must be an admin the course the flashcard set is in to perform this action. + mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! + + # Logs that a user has learned a flashcard. + # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. + logFlashcardLearned( + input: LogFlashcardLearnedInput! + ): FlashcardLearnedFeedback! + # Creates a new media content and links the given media records to it. createMediaContentAndLinkRecords( contentInput: CreateMediaContentInput! @@ -1561,62 +1582,6 @@ type PublicUserInfo { } type Query { - # Gets the publicly available information for a list of users with the specified IDs. - # If a user does not exist, null is returned for that user. - findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - - # Gets the user information of the currently authorized user. - currentUserInfo: UserInfo! - - # Gets all of the users' information for a list of users with the specified IDs. - # Only available to privileged users. - # If a user does not exist, null is returned for that user. - findUserInfos(ids: [UUID!]!): [UserInfo]! - - # Get the reward score of the current user for the specified course. - # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. - userCourseRewardScores(courseId: UUID!): RewardScores! - - # Get the reward score of the specified user for the specified course. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! - - # Gets the power scores for each user in the course, ordered by power score descending. - # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. - scoreboard(courseId: UUID!): [ScoreboardItem!]! - - # Get a list of courses. Can be filtered, sorted and paginated. - # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. - courses( - filter: CourseFilter - - # The fields to sort by. - # Throws an error if no field with the given name exists. - sortBy: [String!] - - # The sort direction for each field. If not specified, defaults to ASC. - sortDirection: [SortDirection!]! = [ASC] - pagination: Pagination - ): CoursePayload! - - # Returns the courses with the given ids. - # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. - coursesByIds(ids: [UUID!]!): [Course!]! - - # Get flashcards by their ids. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! - - # Get flashcard sets by their assessment ids. - # Returns a list of flashcard sets in the same order as the provided ids. - # Each element is null if the corresponding id is not found. - # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. - findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! - - # Get flashcards of a course that are due to be reviewed. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! - # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID # cannot be found. # @@ -1656,6 +1621,48 @@ type Query { # Returns all media records which were created by the users. mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! + # Gets the publicly available information for a list of users with the specified IDs. + # If a user does not exist, null is returned for that user. + findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! + + # Gets the user information of the currently authorized user. + currentUserInfo: UserInfo! + + # Gets all of the users' information for a list of users with the specified IDs. + # Only available to privileged users. + # If a user does not exist, null is returned for that user. + findUserInfos(ids: [UUID!]!): [UserInfo]! + + # Get a list of courses. Can be filtered, sorted and paginated. + # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. + courses( + filter: CourseFilter + + # The fields to sort by. + # Throws an error if no field with the given name exists. + sortBy: [String!] + + # The sort direction for each field. If not specified, defaults to ASC. + sortDirection: [SortDirection!]! = [ASC] + pagination: Pagination + ): CoursePayload! + + # Returns the courses with the given ids. + # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. + coursesByIds(ids: [UUID!]!): [Course!]! + + # Get the reward score of the current user for the specified course. + # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. + userCourseRewardScores(courseId: UUID!): RewardScores! + + # Get the reward score of the specified user for the specified course. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! + + # Gets the power scores for each user in the course, ordered by power score descending. + # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. + scoreboard(courseId: UUID!): [ScoreboardItem!]! + # Get quiz by assessment ID. # If any of the assessment IDs are not found, the corresponding quiz will be null. # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for @@ -1700,6 +1707,20 @@ type Query { skillTypes: [SkillType!]! = [] ): [Suggestion!]! + # Get flashcards by their ids. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! + + # Get flashcard sets by their assessment ids. + # Returns a list of flashcard sets in the same order as the provided ids. + # Each element is null if the corresponding id is not found. + # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. + findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! + + # Get flashcards of a course that are due to be reviewed. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! + # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. semanticSearch( From c0b9dc819e5c4b9bd39fc8300125869364ff7456 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Fri, 18 Oct 2024 10:45:23 +0200 Subject: [PATCH 19/33] fix --- components/RewardScoreHistoryTable.tsx | 11 +---------- components/content-link/ContentLink.tsx | 13 ++++++++++--- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/components/RewardScoreHistoryTable.tsx b/components/RewardScoreHistoryTable.tsx index 99a14cb..a940757 100644 --- a/components/RewardScoreHistoryTable.tsx +++ b/components/RewardScoreHistoryTable.tsx @@ -20,7 +20,6 @@ import lodash from "lodash"; import { useCallback, useState } from "react"; import { graphql, useFragment } from "react-relay"; import { ContentLink } from "./content-link/ContentLink"; -import { DeletedContentLink } from "./content-link/DeletedContentLink"; import { FitnessIcon, GrowthIcon, HealthIcon, PowerIcon } from "./RewardScores"; const reasons: { [k in RewardChangeReason]?: string } = { @@ -168,15 +167,7 @@ export function RewardScoreHistoryTable({
    {content ? ( - ) : ( - - )} + ) : null}
    ))}
    diff --git a/components/content-link/ContentLink.tsx b/components/content-link/ContentLink.tsx index 71fd7b6..9debbe8 100644 --- a/components/content-link/ContentLink.tsx +++ b/components/content-link/ContentLink.tsx @@ -18,7 +18,6 @@ import { Chip, Typography } from "@mui/material"; import { useRouter } from "next/navigation"; import { graphql, useFragment } from "react-relay"; import colors from "tailwindcss/colors"; -import { ContentChip, ContentSize } from "./ContentBase"; import { ProgressFrame } from "./ProgressFrame"; export const ContentTypeToColor: Record = { @@ -27,6 +26,9 @@ export const ContentTypeToColor: Record = { QuizAssessment: colors.rose[200], }; +export type ContentChip = { key: string; label: string; color?: string }; +export type ContentSize = "small" | "normal"; + export function MediaRecordIcon({ type }: { type: MediaType }) { const style = { color: "text.secondary", width: "100%", height: "100%" }; switch (type) { @@ -93,8 +95,13 @@ export function ContentLink({ _content ); const isProcessing = - content.aiProcessingProgress?.state !== "DONE" || - content.mediaRecords?.some((x) => x.aiProcessingProgress.state !== "DONE"); + content.aiProcessingProgress?.state === "PROCESSING" || + content.aiProcessingProgress?.state === "ENQUEUED" || + content.mediaRecords?.some( + (x) => + x.aiProcessingProgress.state === "ENQUEUED" || + x.aiProcessingProgress.state === "PROCESSING" + ); const typeString = content.__typename === "MediaContent" ? "Media" From 75df3571d88646b40063b7957bd97cc6f1379d2b Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Fri, 18 Oct 2024 13:11:38 +0200 Subject: [PATCH 20/33] qs --- components/Navbar.tsx | 13 +- src/schema.graphql | 310 +++++++++++++++++++++--------------------- 2 files changed, 161 insertions(+), 162 deletions(-) diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 5235d7f..8e3861f 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -14,7 +14,6 @@ import { import { Autocomplete, Avatar, - Box, Button, CircularProgress, ClickAwayListener, @@ -34,7 +33,6 @@ import { } from "@mui/material"; import dayjs from "dayjs"; import { chain, debounce } from "lodash"; -import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import { ReactElement, useCallback, useState, useTransition } from "react"; import { useAuth } from "react-oidc-context"; @@ -183,10 +181,13 @@ function NavbarBase({ open={isSearchPopupOpen} value={null} onChange={(x, newVal) => { - if (typeof newVal == "string") return; - router.push( - `/courses/${newVal?.content?.metadata.course.id}/media/${newVal?.content?.id}?recordId=${newVal?.mediaRecordSegment.mediaRecord?.id}` - ); + if (typeof newVal == "string") { + router.push(`/search?query=${newVal}`); + } else { + router.push( + `/courses/${newVal?.content?.metadata.course.id}/media/${newVal?.content?.id}?recordId=${newVal?.mediaRecordSegment.mediaRecord?.id}` + ); + } }} filterOptions={(x) => x} groupBy={(x) => diff --git a/src/schema.graphql b/src/schema.graphql index 84d4fad..0a02874 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -1330,45 +1330,14 @@ type MultipleChoiceQuestion implements Question { hint: JSON } -# Mutations for the flashcard service. Provides mutations for creating, updating, and deleting flashcard as well as -# creating and deleting flashcard sets. To update a flashcard set, update, delete, and create flashcards individually. type Mutation { - # Creates a new media record - # 🔒 The user must have the "course-creator" role to perform this action. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. - createMediaRecord(input: CreateMediaRecordInput!): MediaRecord! - - # Updates an existing media record with the given UUID - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - updateMediaRecord(input: UpdateMediaRecordInput!): MediaRecord! - - # Deletes the media record with the given UUID - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - deleteMediaRecord(id: UUID!): UUID! - - # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. - # This means that for the content, all already linked media records are removed and replaced by the given ones. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setLinkedMediaRecordsForContent( - contentId: UUID! - mediaRecordIds: [UUID!]! - ): [MediaRecord!]! - - # Logs that a media has been worked on by the current user. - # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html - # - # Possible side effects: - # When all media records of a content have been worked on by a user, - # a user-progress event is emitted for the content. - # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. - logMediaRecordWorkedOn(mediaRecordId: UUID!): MediaRecord! + # Modify Content + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateContent(contentId: UUID!): ContentMutation! - # Add the MediaRecords with the given UUIDS to the Course with the given UUID. - # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setMediaRecordsForCourse( - courseId: UUID! - mediaRecordIds: [UUID!]! - ): [MediaRecord!]! + # Modify the section with the given id. + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateSection(sectionId: UUID!): SectionMutation! # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1414,25 +1383,22 @@ type Mutation { # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the skill level of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. - # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! - @deprecated(reason: "Only for testing purposes. Will be removed.") + # Deletes a flashcard set. Throws an error if the flashcard set does not exist. + # The contained flashcards are deleted as well. + deleteFlashcardSet(input: UUID!): UUID! + @deprecated( + reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead." + ) - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the reward score of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! - @deprecated(reason: "Only for testing purposes. Will be removed.") + # Modify a flashcard set. + # 🔒 The user must be an admin the course the flashcard set is in to perform this action. + mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! + + # Logs that a user has learned a flashcard. + # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. + logFlashcardLearned( + input: LogFlashcardLearnedInput! + ): FlashcardLearnedFeedback! # Modify a quiz. # 🔒 The user must be an admin the course the quiz is in to perform this action. @@ -1448,30 +1414,62 @@ type Mutation { # 🔒 The user must be enrolled in the course the quiz is in to perform this action. logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! - # Modify Content - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateContent(contentId: UUID!): ContentMutation! + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the skill level of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. + # 🔒 The user must be a super-user, otherwise an exception is thrown. + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! + @deprecated(reason: "Only for testing purposes. Will be removed.") - # Modify the section with the given id. - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateSection(sectionId: UUID!): SectionMutation! + # Creates a new media record + # 🔒 The user must have the "course-creator" role to perform this action. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. + createMediaRecord(input: CreateMediaRecordInput!): MediaRecord! - # Deletes a flashcard set. Throws an error if the flashcard set does not exist. - # The contained flashcards are deleted as well. - deleteFlashcardSet(input: UUID!): UUID! - @deprecated( - reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead." - ) + # Updates an existing media record with the given UUID + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + updateMediaRecord(input: UpdateMediaRecordInput!): MediaRecord! - # Modify a flashcard set. - # 🔒 The user must be an admin the course the flashcard set is in to perform this action. - mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! + # Deletes the media record with the given UUID + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + deleteMediaRecord(id: UUID!): UUID! - # Logs that a user has learned a flashcard. - # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned( - input: LogFlashcardLearnedInput! - ): FlashcardLearnedFeedback! + # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. + # This means that for the content, all already linked media records are removed and replaced by the given ones. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + setLinkedMediaRecordsForContent( + contentId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! + + # Logs that a media has been worked on by the current user. + # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html + # + # Possible side effects: + # When all media records of a content have been worked on by a user, + # a user-progress event is emitted for the content. + # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. + logMediaRecordWorkedOn(mediaRecordId: UUID!): MediaRecord! + + # Add the MediaRecords with the given UUIDS to the Course with the given UUID. + # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. + setMediaRecordsForCourse( + courseId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! + + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the reward score of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! + @deprecated(reason: "Only for testing purposes. Will be removed.") # Creates a new media content and links the given media records to it. createMediaContentAndLinkRecords( @@ -1582,44 +1580,43 @@ type PublicUserInfo { } type Query { - # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID - # cannot be found. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - mediaRecordsByIds(ids: [UUID!]!): [MediaRecord!]! + # Retrieves all existing contents for a given course. + # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. + contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] - # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID - # cannot be found, it instead returns NULL for that media record. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - findMediaRecordsByIds(ids: [UUID!]!): [MediaRecord]! + # Get contents by ids. Throws an error if any of the ids are not found. + # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, + # otherwise an error is thrown. + contentsByIds(ids: [UUID!]!): [Content!]! - # Returns all media records of the system. - # - # 🔒 The user must be a super-user, otherwise an exception is thrown. - mediaRecords: [MediaRecord!]! - @deprecated( - reason: "In production there should probably be no way to get all media records of the system." - ) + # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. + # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned + # for the respective contents. + findContentsByIds(ids: [UUID!]!): [Content]! - # Returns all media records which the current user created. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - userMediaRecords: [MediaRecord!]! + # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents + # associated with that chapter + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! - # Returns the media records associated the given content IDs as a list of lists where each sublist contains - # the media records associated with the content ID at the same index in the input list + # Generates user specific suggestions for multiple chapters. # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! - - # Returns all media records for the given CourseIds + # Only content that the user can access will be considered. + # The contents will be ranked by suggested date, with the most overdue or most urgent content first. # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - mediaRecordsForCourses(courseIds: [UUID!]!): [[MediaRecord!]!]! + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + suggestionsByChapterIds( + # The ids of the chapters for which suggestions should be generated. + chapterIds: [UUID!]! - # Returns all media records which were created by the users. - mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! + # The amount of suggestions to generate in total. + amount: Int! + + # Only suggestions for these skill types will be generated. + # If no skill types are given, suggestions for all skill types will be generated, + # also containing suggestions for media content (which do not have a skill type). + skillTypes: [SkillType!]! = [] + ): [Suggestion!]! # Gets the publicly available information for a list of users with the specified IDs. # If a user does not exist, null is returned for that user. @@ -1651,17 +1648,19 @@ type Query { # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. coursesByIds(ids: [UUID!]!): [Course!]! - # Get the reward score of the current user for the specified course. - # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. - userCourseRewardScores(courseId: UUID!): RewardScores! + # Get flashcards by their ids. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! - # Get the reward score of the specified user for the specified course. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! + # Get flashcard sets by their assessment ids. + # Returns a list of flashcard sets in the same order as the provided ids. + # Each element is null if the corresponding id is not found. + # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. + findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! - # Gets the power scores for each user in the course, ordered by power score descending. - # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. - scoreboard(courseId: UUID!): [ScoreboardItem!]! + # Get flashcards of a course that are due to be reviewed. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! # Get quiz by assessment ID. # If any of the assessment IDs are not found, the corresponding quiz will be null. @@ -1669,57 +1668,56 @@ type Query { # an quiz if the user has no access to it. findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! - # Retrieves all existing contents for a given course. - # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. - contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] - - # Get contents by ids. Throws an error if any of the ids are not found. - # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, - # otherwise an error is thrown. - contentsByIds(ids: [UUID!]!): [Content!]! + # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID + # cannot be found. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + mediaRecordsByIds(ids: [UUID!]!): [MediaRecord!]! - # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. - # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned - # for the respective contents. - findContentsByIds(ids: [UUID!]!): [Content]! + # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID + # cannot be found, it instead returns NULL for that media record. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + findMediaRecordsByIds(ids: [UUID!]!): [MediaRecord]! - # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents - # associated with that chapter - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. - contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! + # Returns all media records of the system. + # + # 🔒 The user must be a super-user, otherwise an exception is thrown. + mediaRecords: [MediaRecord!]! + @deprecated( + reason: "In production there should probably be no way to get all media records of the system." + ) - # Generates user specific suggestions for multiple chapters. + # Returns all media records which the current user created. # - # Only content that the user can access will be considered. - # The contents will be ranked by suggested date, with the most overdue or most urgent content first. + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + userMediaRecords: [MediaRecord!]! + + # Returns the media records associated the given content IDs as a list of lists where each sublist contains + # the media records associated with the content ID at the same index in the input list # - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. - suggestionsByChapterIds( - # The ids of the chapters for which suggestions should be generated. - chapterIds: [UUID!]! + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! - # The amount of suggestions to generate in total. - amount: Int! + # Returns all media records for the given CourseIds + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + mediaRecordsForCourses(courseIds: [UUID!]!): [[MediaRecord!]!]! - # Only suggestions for these skill types will be generated. - # If no skill types are given, suggestions for all skill types will be generated, - # also containing suggestions for media content (which do not have a skill type). - skillTypes: [SkillType!]! = [] - ): [Suggestion!]! + # Returns all media records which were created by the users. + mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! - # Get flashcards by their ids. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! + # Get the reward score of the current user for the specified course. + # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. + userCourseRewardScores(courseId: UUID!): RewardScores! - # Get flashcard sets by their assessment ids. - # Returns a list of flashcard sets in the same order as the provided ids. - # Each element is null if the corresponding id is not found. - # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. - findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! + # Get the reward score of the specified user for the specified course. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! - # Get flashcards of a course that are due to be reviewed. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! + # Gets the power scores for each user in the course, ordered by power score descending. + # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. + scoreboard(courseId: UUID!): [ScoreboardItem!]! # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. From aea6f59c139e6a76367388f15c54272e9f8b6d38 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Fri, 18 Oct 2024 13:12:36 +0200 Subject: [PATCH 21/33] fix --- components/content-link/ContentLink.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/content-link/ContentLink.tsx b/components/content-link/ContentLink.tsx index 9debbe8..23ee85c 100644 --- a/components/content-link/ContentLink.tsx +++ b/components/content-link/ContentLink.tsx @@ -136,8 +136,8 @@ export function ContentLink({ : "" } > - {content.mediaRecords?.slice(0, 4).map((x) => ( - + {content.mediaRecords?.slice(0, 4).map((x, idx) => ( + ))}
    ) : content.__typename === "FlashcardSetAssessment" ? ( From 5a41b2ce329b01e15fa3e07c7004d62f6156c819 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Fri, 18 Oct 2024 13:15:41 +0200 Subject: [PATCH 22/33] fix --- app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx b/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx index 54d0016..9a0ec36 100644 --- a/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx +++ b/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx @@ -185,6 +185,7 @@ export function DocumentSide({ Referenced at: {linkedRecords.map((linkedRecord) => (
    dispatch({ type: "jumpTo", time: linkedRecord.startTime }) } From bc6e7fc740a6c9aceda2eec55bbbc948d0c49ee0 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Fri, 18 Oct 2024 14:59:44 +0200 Subject: [PATCH 23/33] similar content for quizzes --- .../media/[mediaId]/SimilarSegments.tsx | 26 +- .../[courseId]/media/[mediaId]/VideoSide.tsx | 2 +- .../[courseId]/quiz/[quizId]/student.tsx | 70 +++-- components/Navbar.tsx | 54 ++-- components/search/SearchResultsBox.tsx | 80 +++--- src/schema.graphql | 270 +++++++++++------- 6 files changed, 288 insertions(+), 214 deletions(-) diff --git a/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx b/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx index 6bc4e82..38fcb16 100644 --- a/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx +++ b/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx @@ -6,33 +6,31 @@ import { graphql, useLazyLoadQuery } from "react-relay"; import useBus from "use-bus"; export function SimilarSegments() { - const [segmentId, setsegmentId] = useState(null); + const [entityId, setentityId] = useState(null); const [isLoading, startTransition] = useTransition(); - useBus("searchSimilarSegment", (e) => { - if ("segmentId" in e) { - startTransition(() => setsegmentId(e.segmentId)); + useBus("searchSimilarEntity", (e) => { + if ("entityId" in e) { + startTransition(() => setentityId(e.entityId)); } }); const segments = useLazyLoadQuery( graphql` - query SimilarSegmentsQuery($segmentId: UUID!, $skip: Boolean!) { - getSemanticallySimilarMediaRecordSegments( - mediaRecordSegmentId: $segmentId - count: 10 - ) @skip(if: $skip) { + query SimilarSegmentsQuery($entityId: UUID!, $skip: Boolean!) { + getSemanticallySimilarEntities(entityId: $entityId, count: 10) + @skip(if: $skip) { ...SearchResultsBox } } `, - { segmentId: segmentId!, skip: !segmentId } + { entityId: entityId!, skip: !entityId } ); return ( setsegmentId(null)} + open={!!entityId || isLoading} + onClose={() => setentityId(null)} anchor="right" >
    @@ -41,9 +39,9 @@ export function SimilarSegments() {
    )} - {segments.getSemanticallySimilarMediaRecordSegments && ( + {segments.getSemanticallySimilarEntities && ( )}
    diff --git a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx index 8db3bf6..9d238dd 100644 --- a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx +++ b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx @@ -435,7 +435,7 @@ function CurrentSegment({
    { - dispatch({ type: "searchSimilarSegment", segmentId: segment.id }); + dispatch({ type: "searchSimilarEntity", entityId: segment.id }); e.stopPropagation(); }} > diff --git a/app/courses/[courseId]/quiz/[quizId]/student.tsx b/app/courses/[courseId]/quiz/[quizId]/student.tsx index c662353..a01dc76 100644 --- a/app/courses/[courseId]/quiz/[quizId]/student.tsx +++ b/app/courses/[courseId]/quiz/[quizId]/student.tsx @@ -14,7 +14,7 @@ import { PageError } from "@/components/PageError"; import { AssociationQuestion } from "@/components/quiz/AssociationQuestion"; import { ClozeQuestion } from "@/components/quiz/ClozeQuestion"; import { MultipleChoiceQuestion } from "@/components/quiz/MultipleChoiceQuestion"; -import { Check, Close } from "@mui/icons-material"; +import { Check, Close, Search } from "@mui/icons-material"; import { Button, CircularProgress, @@ -25,7 +25,7 @@ import { Typography, } from "@mui/material"; import useResizeObserver from "@react-hook/resize-observer"; -import { useParams, useRouter } from "next/navigation"; +import { useParams } from "next/navigation"; import { useEffect, useState } from "react"; import Confetti from "react-confetti"; import { @@ -34,6 +34,8 @@ import { useLazyLoadQuery, useMutation, } from "react-relay"; +import { dispatch } from "use-bus"; +import { SimilarSegments } from "../../media/[mediaId]/SimilarSegments"; export default function StudentQuiz() { // Get course id from url @@ -156,6 +158,8 @@ export default function StudentQuiz() { return (
    + + setError(null)} /> @@ -178,27 +182,48 @@ export default function StudentQuiz() {
    {checkAnswers && ( -
    - {correct ? ( - Correct answer - ) : ( - Oops, wrong answer - )} -
    + <> +
    + {correct ? ( + Correct answer + ) : ( + Oops, wrong answer + )} +
    + )} - +
    + {checkAnswers && ( + + )} + +
    {feedback && }
    @@ -268,7 +293,6 @@ function Feedback({ feedback: studentQuizTrackCompletedMutation$data["logQuizCompleted"]; courseId: string; }) { - const router = useRouter(); const [[width, height], setDimensions] = useState([0, 0]); const [divRef, setDivRef] = useState(null); const color = success ? "green" : "red"; diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 8e3861f..d849dfc 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -74,38 +74,40 @@ function NavbarBase({ query NavbarSemanticSearchQuery($term: String!, $skip: Boolean!) { semanticSearch(queryText: $term, count: 5) @skip(if: $skip) { score - mediaRecordSegment { - __typename - ... on VideoRecordSegment { - startTime - mediaRecord { - id - name - - contents { + ... on MediaRecordSegmentSemanticSearchResult { + mediaRecordSegment { + __typename + ... on VideoRecordSegment { + startTime + mediaRecord { id - metadata { - name - course { - id - title + name + + contents { + id + metadata { + name + course { + id + title + } } } } } - } - ... on DocumentRecordSegment { - page - mediaRecord { - id - name - contents { + ... on DocumentRecordSegment { + page + mediaRecord { id - metadata { - name - course { - id - title + name + contents { + id + metadata { + name + course { + id + title + } } } } diff --git a/components/search/SearchResultsBox.tsx b/components/search/SearchResultsBox.tsx index f8e20ce..f94acfc 100644 --- a/components/search/SearchResultsBox.tsx +++ b/components/search/SearchResultsBox.tsx @@ -15,50 +15,52 @@ export default function SearchResultsBox({ graphql` fragment SearchResultsBox on SemanticSearchResult @relay(plural: true) { score - mediaRecordSegment { - __typename - id - thumbnail - mediaRecordId - ... on VideoRecordSegment { - startTime - screenText - transcript - mediaRecord { - id - name - type - contents { - metadata { - name - chapter { - title - } - course { - title + ... on MediaRecordSegmentSemanticSearchResult { + mediaRecordSegment { + __typename + id + thumbnail + mediaRecordId + ... on VideoRecordSegment { + startTime + screenText + transcript + mediaRecord { + id + name + type + contents { + metadata { + name + chapter { + title + } + course { + title + } } } } } - } - ... on DocumentRecordSegment { - page - text - mediaRecord { - id - name - type - contents { + ... on DocumentRecordSegment { + page + text + mediaRecord { id - metadata { - name - chapter { - id - title - } - course { - id - title + name + type + contents { + id + metadata { + name + chapter { + id + title + } + course { + id + title + } } } } diff --git a/src/schema.graphql b/src/schema.graphql index 0a02874..b802495 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -132,6 +132,14 @@ interface Assessment { # the items that belong to the Assessment items: [Item!]! + + # For the current user, returns true if this content could be worked on by the user (i.e. it is not locked), false + # if content is not available to be worked on (e.g. because previous stage has not been completed) + isAvailableToBeWorkedOn: Boolean! +} + +type AssessmentContentReference { + assessmentId: UUID! } type AssessmentMetadata { @@ -164,6 +172,14 @@ input AssessmentMetadataInput { initialLearningInterval: Int } +type AssessmentSemanticSearchResult implements SemanticSearchResult { + # The similarity score of the search result. + score: Float! + + # ID of the assessment this search result is referencing. + assessmentId: UUID! +} + input AssociationInput { # id of the corresponding item itemId: UUID @@ -371,6 +387,10 @@ interface Content { # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! + + # For the current user, returns true if this content could be worked on by the user (i.e. it is not locked), false + # if content is not available to be worked on (e.g. because previous stage has not been completed) + isAvailableToBeWorkedOn: Boolean! } type ContentMetadata { @@ -1006,6 +1026,10 @@ type FlashcardSetAssessment implements Assessment & Content { # the items that belong to the Flashcard items: [Item!]! + # For the current user, returns true if this content could be worked on by the user (i.e. it is not locked), false + # if content is not available to be worked on (e.g. because previous stage has not been completed) + isAvailableToBeWorkedOn: Boolean! + # The FlashcardSet of the assessment. flashcardSet: FlashcardSet } @@ -1179,9 +1203,22 @@ type MediaContent implements Content { # Progress data of the specified user. progressDataForUser(userId: UUID!): UserProgressData! + # For the current user, returns true if this content could be worked on by the user (i.e. it is not locked), false + # if content is not available to be worked on (e.g. because previous stage has not been completed) + isAvailableToBeWorkedOn: Boolean! + # The media records linked to this media content. mediaRecords: [MediaRecord!]! + + # Links between segments of the media records that are part of this media content. + # A link is created if the segments show the same thing, i.e. a video segment and a + # PDF page are linked if the graphics match (i.e. the PDF is shown on-screen in the + # video.) segmentLinks: [MediaRecordSegmentLink!]! + + # The progress of processing the media content. In particular when processing is done, + # links between segments of the content's media records will have been created (the ones + # which can be retrieved via the MediaContent.segmentLinks field). aiProcessingProgress: AiEntityProcessingProgress! } @@ -1273,6 +1310,14 @@ type MediaRecordSegmentLink { segment2: MediaRecordSegment! } +type MediaRecordSegmentSemanticSearchResult implements SemanticSearchResult { + # The similarity score of the search result. + score: Float! + + # The media record segment this search result is referencing. + mediaRecordSegment: MediaRecordSegment! +} + # The type of the media record enum MediaType { VIDEO @@ -1331,13 +1376,25 @@ type MultipleChoiceQuestion implements Question { } type Mutation { - # Modify Content - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateContent(contentId: UUID!): ContentMutation! + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the reward score of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! + @deprecated(reason: "Only for testing purposes. Will be removed.") - # Modify the section with the given id. - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateSection(sectionId: UUID!): SectionMutation! + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the skill level of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. + # 🔒 The user must be a super-user, otherwise an exception is thrown. + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! + @deprecated(reason: "Only for testing purposes. Will be removed.") # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1383,23 +1440,6 @@ type Mutation { # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! - # Deletes a flashcard set. Throws an error if the flashcard set does not exist. - # The contained flashcards are deleted as well. - deleteFlashcardSet(input: UUID!): UUID! - @deprecated( - reason: "Only for development, will be removed in production. Use deleteAssessment in contents service instead." - ) - - # Modify a flashcard set. - # 🔒 The user must be an admin the course the flashcard set is in to perform this action. - mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! - - # Logs that a user has learned a flashcard. - # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned( - input: LogFlashcardLearnedInput! - ): FlashcardLearnedFeedback! - # Modify a quiz. # 🔒 The user must be an admin the course the quiz is in to perform this action. mutateQuiz(assessmentId: UUID!): QuizMutation! @@ -1414,16 +1454,6 @@ type Mutation { # 🔒 The user must be enrolled in the course the quiz is in to perform this action. logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the skill level of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. - # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! - @deprecated(reason: "Only for testing purposes. Will be removed.") - # Creates a new media record # 🔒 The user must have the "course-creator" role to perform this action. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. @@ -1461,15 +1491,23 @@ type Mutation { mediaRecordIds: [UUID!]! ): [MediaRecord!]! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the reward score of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! - @deprecated(reason: "Only for testing purposes. Will be removed.") + # Modify a flashcard set. + # 🔒 The user must be an admin the course the flashcard set is in to perform this action. + mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! + + # Logs that a user has learned a flashcard. + # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. + logFlashcardLearned( + input: LogFlashcardLearnedInput! + ): FlashcardLearnedFeedback! + + # Modify Content + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateContent(contentId: UUID!): ContentMutation! + + # Modify the section with the given id. + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateSection(sectionId: UUID!): SectionMutation! # Creates a new media content and links the given media records to it. createMediaContentAndLinkRecords( @@ -1580,44 +1618,6 @@ type PublicUserInfo { } type Query { - # Retrieves all existing contents for a given course. - # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. - contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] - - # Get contents by ids. Throws an error if any of the ids are not found. - # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, - # otherwise an error is thrown. - contentsByIds(ids: [UUID!]!): [Content!]! - - # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. - # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned - # for the respective contents. - findContentsByIds(ids: [UUID!]!): [Content]! - - # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents - # associated with that chapter - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. - contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! - - # Generates user specific suggestions for multiple chapters. - # - # Only content that the user can access will be considered. - # The contents will be ranked by suggested date, with the most overdue or most urgent content first. - # - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. - suggestionsByChapterIds( - # The ids of the chapters for which suggestions should be generated. - chapterIds: [UUID!]! - - # The amount of suggestions to generate in total. - amount: Int! - - # Only suggestions for these skill types will be generated. - # If no skill types are given, suggestions for all skill types will be generated, - # also containing suggestions for media content (which do not have a skill type). - skillTypes: [SkillType!]! = [] - ): [Suggestion!]! - # Gets the publicly available information for a list of users with the specified IDs. # If a user does not exist, null is returned for that user. findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! @@ -1630,6 +1630,18 @@ type Query { # If a user does not exist, null is returned for that user. findUserInfos(ids: [UUID!]!): [UserInfo]! + # Get the reward score of the current user for the specified course. + # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. + userCourseRewardScores(courseId: UUID!): RewardScores! + + # Get the reward score of the specified user for the specified course. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! + + # Gets the power scores for each user in the course, ordered by power score descending. + # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. + scoreboard(courseId: UUID!): [ScoreboardItem!]! + # Get a list of courses. Can be filtered, sorted and paginated. # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. courses( @@ -1648,20 +1660,6 @@ type Query { # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. coursesByIds(ids: [UUID!]!): [Course!]! - # Get flashcards by their ids. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! - - # Get flashcard sets by their assessment ids. - # Returns a list of flashcard sets in the same order as the provided ids. - # Each element is null if the corresponding id is not found. - # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. - findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! - - # Get flashcards of a course that are due to be reviewed. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! - # Get quiz by assessment ID. # If any of the assessment IDs are not found, the corresponding quiz will be null. # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for @@ -1696,7 +1694,7 @@ type Query { # Returns the media records associated the given content IDs as a list of lists where each sublist contains # the media records associated with the content ID at the same index in the input list # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! # Returns all media records for the given CourseIds @@ -1707,17 +1705,57 @@ type Query { # Returns all media records which were created by the users. mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! - # Get the reward score of the current user for the specified course. - # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. - userCourseRewardScores(courseId: UUID!): RewardScores! + # Get flashcards by their ids. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! - # Get the reward score of the specified user for the specified course. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! + # Get flashcard sets by their assessment ids. + # Returns a list of flashcard sets in the same order as the provided ids. + # Each element is null if the corresponding id is not found. + # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. + findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! - # Gets the power scores for each user in the course, ordered by power score descending. - # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. - scoreboard(courseId: UUID!): [ScoreboardItem!]! + # Get flashcards of a course that are due to be reviewed. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! + + # Retrieves all existing contents for a given course. + # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. + contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] + + # Get contents by ids. Throws an error if any of the ids are not found. + # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, + # otherwise an error is thrown. + contentsByIds(ids: [UUID!]!): [Content!]! + + # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. + # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned + # for the respective contents. + findContentsByIds(ids: [UUID!]!): [Content]! + + # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents + # associated with that chapter + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! + + # Generates user specific suggestions for multiple chapters. + # + # Only content that the user can access will be considered. + # The contents will be ranked by suggested date, with the most overdue or most urgent content first. + # + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + suggestionsByChapterIds( + # The ids of the chapters for which suggestions should be generated. + chapterIds: [UUID!]! + + # The amount of suggestions to generate in total. + amount: Int! + + # Only suggestions for these skill types will be generated. + # If no skill types are given, suggestions for all skill types will be generated, + # also containing suggestions for media content (which do not have a skill type). + skillTypes: [SkillType!]! = [] + ): [Suggestion!]! # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. @@ -1727,13 +1765,14 @@ type Query { courseWhitelist: [UUID!] ): [SemanticSearchResult!]! - # Returns the media record segments that are semantically similar to the media record segment with the specified ID. - # Returns at most `count` results. If `excludeOwnMediaRecord` is true, segments from the same media record as the + # Returns semantic search results of entities that are semantically similar to the entity with the specified ID. + # Returns at most `count` results. If `excludeEntitiesWithSameParent` is true, segments from the same entity as the # specified segment will be excluded from the results. - getSemanticallySimilarMediaRecordSegments( - mediaRecordSegmentId: UUID! + getSemanticallySimilarEntities( + entityId: UUID! count: Int! = 10 - excludeOwnMediaRecord: Boolean + excludeEntitiesWithSameParent: Boolean + courseWhitelist: [UUID!] ): [SemanticSearchResult!]! } @@ -1840,6 +1879,10 @@ type QuizAssessment implements Assessment & Content { # the items that belong to the Quiz items: [Item!]! + # For the current user, returns true if this content could be worked on by the user (i.e. it is not locked), false + # if content is not available to be worked on (e.g. because previous stage has not been completed) + isAvailableToBeWorkedOn: Boolean! + # The quiz of the assessment. # If this is null the system is in an inconsistent state and the assessment should be deleted. quiz: Quiz @@ -2164,6 +2207,8 @@ type Section { # List of Stages contained in a Section stages: [Stage!]! + + # The chapter this section is part of. chapter: Chapter! } @@ -2214,10 +2259,9 @@ type SelfAssessmentQuestion implements Question { hint: JSON } -type SemanticSearchResult { +interface SemanticSearchResult { # The similarity score of the search result. score: Float! - mediaRecordSegment: MediaRecordSegment! } type SingleAssociation { @@ -2345,6 +2389,10 @@ type Stage { # Percentage of Progress made to optional Content optionalContentsProgress: Float! + + # For the current user, returns true if this stage could be worked on by the user (i.e. it is not locked), false + # if stage is not available to be worked on (e.g. because previous stage has not been completed) + isAvailableToBeWorkedOn: Boolean! } # Filter for string values. From 5ffdef6d7f5eec02ad72e56b4977d07bfd534bfc Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Mon, 21 Oct 2024 13:59:49 +0200 Subject: [PATCH 24/33] similar segments for quizzes --- .../media/[mediaId]/SimilarSegments.tsx | 16 +- .../[courseId]/media/[mediaId]/VideoSide.tsx | 2 +- .../[courseId]/quiz/[quizId]/student.tsx | 2 +- app/layout.tsx | 3 + components/Navbar.tsx | 10 +- components/StudentFlashcardSet.tsx | 19 + components/content-link/ContentLink.tsx | 2 +- components/search/SearchResultGroup.tsx | 6 +- components/search/SearchResultItem.tsx | 16 +- components/search/SearchResultsBox.tsx | 7 +- src/schema.graphql | 416 ++++++------------ 11 files changed, 182 insertions(+), 317 deletions(-) diff --git a/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx b/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx index 38fcb16..097bacf 100644 --- a/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx +++ b/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx @@ -6,31 +6,31 @@ import { graphql, useLazyLoadQuery } from "react-relay"; import useBus from "use-bus"; export function SimilarSegments() { - const [entityId, setentityId] = useState(null); + const [segmentId, setSegmentId] = useState(null); const [isLoading, startTransition] = useTransition(); useBus("searchSimilarEntity", (e) => { - if ("entityId" in e) { - startTransition(() => setentityId(e.entityId)); + if ("segmentId" in e) { + startTransition(() => setSegmentId(e.segmentId)); } }); const segments = useLazyLoadQuery( graphql` - query SimilarSegmentsQuery($entityId: UUID!, $skip: Boolean!) { - getSemanticallySimilarEntities(entityId: $entityId, count: 10) + query SimilarSegmentsQuery($segmentId: UUID!, $skip: Boolean!) { + getSemanticallySimilarEntities(segmentId: $segmentId, count: 10) @skip(if: $skip) { ...SearchResultsBox } } `, - { entityId: entityId!, skip: !entityId } + { segmentId: segmentId!, skip: !segmentId } ); return ( setentityId(null)} + open={!!segmentId || isLoading} + onClose={() => setSegmentId(null)} anchor="right" >
    diff --git a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx index 9d238dd..63f06dd 100644 --- a/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx +++ b/app/courses/[courseId]/media/[mediaId]/VideoSide.tsx @@ -435,7 +435,7 @@ function CurrentSegment({
    { - dispatch({ type: "searchSimilarEntity", entityId: segment.id }); + dispatch({ type: "searchSimilarEntity", segmentId: segment.id }); e.stopPropagation(); }} > diff --git a/app/courses/[courseId]/quiz/[quizId]/student.tsx b/app/courses/[courseId]/quiz/[quizId]/student.tsx index a01dc76..2c9fb4d 100644 --- a/app/courses/[courseId]/quiz/[quizId]/student.tsx +++ b/app/courses/[courseId]/quiz/[quizId]/student.tsx @@ -201,7 +201,7 @@ export default function StudentQuiz() { onClick={(e) => { dispatch({ type: "searchSimilarEntity", - entityId: currentQuestion.itemId, + segmentId: currentQuestion.itemId, }); }} className="mb-6" diff --git a/app/layout.tsx b/app/layout.tsx index 7885764..cc79277 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -60,6 +60,9 @@ const theme = createTheme({ export default function App({ children }: { children: React.ReactNode }) { return ( + + MEITREX + diff --git a/components/Navbar.tsx b/components/Navbar.tsx index d849dfc..529c247 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -74,6 +74,10 @@ function NavbarBase({ query NavbarSemanticSearchQuery($term: String!, $skip: Boolean!) { semanticSearch(queryText: $term, count: 5) @skip(if: $skip) { score + ... on AssessmentSemanticSearchResult { + assessmentId + score + } ... on MediaRecordSegmentSemanticSearchResult { mediaRecordSegment { __typename @@ -134,7 +138,7 @@ function NavbarBase({ .flatMap((x) => { const seg = x.mediaRecordSegment; - return seg.__typename !== "%other" + return seg?.__typename !== "%other" && seg?.mediaRecord ? seg?.mediaRecord?.contents.map((content) => ({ content, ...x, @@ -200,10 +204,10 @@ function NavbarBase({
    {option?.mediaRecordSegment.mediaRecord?.name}
    - {option.mediaRecordSegment.__typename === + {option?.mediaRecordSegment.__typename === "DocumentRecordSegment" ? `Page ${option.mediaRecordSegment.page}` - : `Page ${option.mediaRecordSegment.startTime}`} + : `Page ${option?.mediaRecordSegment.startTime}`}
    diff --git a/components/StudentFlashcardSet.tsx b/components/StudentFlashcardSet.tsx index c3a80b4..50a5395 100644 --- a/components/StudentFlashcardSet.tsx +++ b/components/StudentFlashcardSet.tsx @@ -1,8 +1,11 @@ import { StudentFlashcard$key } from "@/__generated__/StudentFlashcard.graphql"; import { StudentFlashcardSetLogProgressMutation } from "@/__generated__/StudentFlashcardSetLogProgressMutation.graphql"; +import { SimilarSegments } from "@/app/courses/[courseId]/media/[mediaId]/SimilarSegments"; +import { Search } from "@mui/icons-material"; import { Button, CircularProgress } from "@mui/material"; import { useState } from "react"; import { graphql, useMutation } from "react-relay"; +import { dispatch } from "use-bus"; import { DisplayError } from "./PageError"; import { StudentFlashcard } from "./StudentFlashcard"; @@ -63,6 +66,7 @@ export function StudentFlashcardSet({ return (
    + +
    ); diff --git a/components/content-link/ContentLink.tsx b/components/content-link/ContentLink.tsx index 23ee85c..7dc3488 100644 --- a/components/content-link/ContentLink.tsx +++ b/components/content-link/ContentLink.tsx @@ -133,7 +133,7 @@ export function ContentLink({ className={ content.mediaRecords && content.mediaRecords.length > 1 ? "grid grid-cols-2 max-w-[50%] max-h-[50%]" - : "" + : "max-w-[50%] max-h-[50%]" } > {content.mediaRecords?.slice(0, 4).map((x, idx) => ( diff --git a/components/search/SearchResultGroup.tsx b/components/search/SearchResultGroup.tsx index 135b70f..dc65783 100644 --- a/components/search/SearchResultGroup.tsx +++ b/components/search/SearchResultGroup.tsx @@ -34,7 +34,7 @@ export default function SearchResultGroup({ } // media record is the same for all results in the group, just get the first segment's media record - const mediaRecord = searchResults[0].mediaRecordSegment.mediaRecord; + const mediaRecord = searchResults[0].mediaRecordSegment?.mediaRecord; if (mediaRecord === null || mediaRecord === undefined) { return null; } @@ -54,7 +54,7 @@ export default function SearchResultGroup({ .slice(0, collapsedResultCount) .map((result, index: number) => { return ( - + {index > 0 && } @@ -84,7 +84,7 @@ export default function SearchResultGroup({ .slice(collapsedResultCount, searchResults.length) .map((result, index: number) => { return ( - + {index > 0 && } diff --git a/components/search/SearchResultItem.tsx b/components/search/SearchResultItem.tsx index 33c5b63..f27a7fe 100644 --- a/components/search/SearchResultItem.tsx +++ b/components/search/SearchResultItem.tsx @@ -8,11 +8,11 @@ import Tooltip, { tooltipClasses, TooltipProps } from "@mui/material/Tooltip"; function getSegmentContents( mediaRecordSegment: SearchResultsBox$data[0]["mediaRecordSegment"] ): string { - switch (mediaRecordSegment.__typename) { + switch (mediaRecordSegment?.__typename) { case "VideoRecordSegment": - return mediaRecordSegment.transcript ?? ""; + return mediaRecordSegment?.transcript ?? ""; case "DocumentRecordSegment": - return mediaRecordSegment.text ?? ""; + return mediaRecordSegment?.text ?? ""; default: return "Unknown media type"; } @@ -21,9 +21,9 @@ function getSegmentContents( function getSegmentTitle( mediaRecordSegment: SearchResultsBox$data[0]["mediaRecordSegment"] ) { - switch (mediaRecordSegment.__typename) { + switch (mediaRecordSegment?.__typename) { case "VideoRecordSegment": - const date = new Date(mediaRecordSegment.startTime! * 1000); + const date = new Date(mediaRecordSegment?.startTime! * 1000); return ( Time {date.toISOString().slice(11, 19)} @@ -32,7 +32,7 @@ function getSegmentTitle( case "DocumentRecordSegment": return ( - Page {mediaRecordSegment.page! + 1} + Page {mediaRecordSegment?.page! + 1} ); default: @@ -61,7 +61,7 @@ export default function SearchResultItem({ placement="right" title={ result.mediaRecordSegment.mediaRecord?.id ?? "unknown") + .groupBy( + (result) => result.mediaRecordSegment?.mediaRecord?.id ?? "unknown" + ) .forEach((group) => group.sort((a, b) => a.score - b.score)) .sortBy((group) => group[0].score) .value(); @@ -89,7 +91,8 @@ export default function SearchResultsBox({ searchResults={resultGroup} collapsedResultCount={3} key={ - resultGroup?.[0].mediaRecordSegment.mediaRecordId ?? "undefined" + resultGroup?.[0].mediaRecordSegment?.mediaRecordId ?? + "undefined" } /> ); diff --git a/src/schema.graphql b/src/schema.graphql index b802495..e09c1b8 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -5,78 +5,35 @@ directive @specifiedBy( ) on SCALAR # see also https://github.com/graphql-java/graphql-java-extended-validation/blob/master/README.md -directive @DecimalMax( - value: String! - inclusive: Boolean! = true - message: String = "graphql.validation.DecimalMax.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @DecimalMin( - value: String! - inclusive: Boolean! = true - message: String = "graphql.validation.DecimalMin.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Max( - value: Int! = 2147483647 - message: String = "graphql.validation.Max.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Min( - value: Int! = 0 - message: String = "graphql.validation.Min.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Negative( - message: String = "graphql.validation.Negative.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NegativeOrZero( - message: String = "graphql.validation.NegativeOrZero.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotBlank( - message: String = "graphql.validation.NotBlank.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotEmpty( - message: String = "graphql.validation.NotEmpty.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerNotEmpty( - message: String = "graphql.validation.ContainerNotEmpty.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Pattern( - regexp: String! = ".*" - message: String = "graphql.validation.Pattern.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Positive( - message: String = "graphql.validation.Positive.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @PositiveOrZero( - message: String = "graphql.validation.PositiveOrZero.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Range( - min: Int = 0 - max: Int = 2147483647 - message: String = "graphql.validation.Range.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Size( - min: Int = 0 - max: Int = 2147483647 - message: String = "graphql.validation.Size.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerSize( - min: Int = 0 - max: Int = 2147483647 - message: String = "graphql.validation.ContainerSize.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION +directive @DecimalMax(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMax.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @DecimalMin(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMin.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Max(value: Int! = 2147483647, message: String = "graphql.validation.Max.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Min(value: Int! = 0, message: String = "graphql.validation.Min.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Negative(message: String = "graphql.validation.Negative.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NegativeOrZero(message: String = "graphql.validation.NegativeOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotBlank(message: String = "graphql.validation.NotBlank.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotEmpty(message: String = "graphql.validation.NotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerNotEmpty(message: String = "graphql.validation.ContainerNotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Pattern(regexp: String! = ".*", message: String = "graphql.validation.Pattern.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Positive(message: String = "graphql.validation.Positive.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @PositiveOrZero(message: String = "graphql.validation.PositiveOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Range(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Range.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Size(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Size.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerSize(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.ContainerSize.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION # The @OnDemand directive is used to mark fields that are only internally resolved when requested. # Implementation Note: This will cause the code generator to omit the field from the generated DTOs. @@ -85,21 +42,7 @@ directive @OnDemand on FIELD_DEFINITION # Indicates an Input Object is a OneOf Input Object. directive @oneOf on INPUT_OBJECT -directive @resolveTo( - requiredSelectionSet: String - sourceName: String! - sourceTypeName: String! - sourceFieldName: String! - sourceSelectionSet: String - sourceArgs: ResolveToSourceArgs - keyField: String - keysArg: String - pubsubTopic: String - filterBy: String - additionalArgs: ResolveToSourceArgs - result: String - resultType: String -) on FIELD_DEFINITION +directive @resolveTo(requiredSelectionSet: String, sourceName: String!, sourceTypeName: String!, sourceFieldName: String!, sourceSelectionSet: String, sourceArgs: ResolveToSourceArgs, keyField: String, keysArg: String, pubsubTopic: String, filterBy: String, additionalArgs: ResolveToSourceArgs, result: String, resultType: String) on FIELD_DEFINITION type AiEntityProcessingProgress { entityId: UUID! @@ -178,6 +121,9 @@ type AssessmentSemanticSearchResult implements SemanticSearchResult { # ID of the assessment this search result is referencing. assessmentId: UUID! + + # The assessment this search result is referencing. + assessment: Assessment! } input AssociationInput { @@ -1052,18 +998,10 @@ type FlashcardSetMutation { deleteFlashcard(id: UUID!): UUID! # Creates a new flashcard and the linked item - createFlashcard( - item: ItemInput! - assessmentId: UUID! - flashcardInput: CreateFlashcardInput! - ): FlashcardOutput! + createFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: CreateFlashcardInput!): FlashcardOutput! # Creates a new flashcard and the linked item - updateFlashcard( - item: ItemInput! - assessmentId: UUID! - flashcardInput: UpdateFlashcardInput! - ): FlashcardOutput! + updateFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: UpdateFlashcardInput!): FlashcardOutput! } type FlashcardSetProgress { @@ -1376,26 +1314,6 @@ type MultipleChoiceQuestion implements Question { } type Mutation { - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the reward score of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! - @deprecated(reason: "Only for testing purposes. Will be removed.") - - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the skill level of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. - # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! - @deprecated(reason: "Only for testing purposes. Will be removed.") - # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1440,20 +1358,6 @@ type Mutation { # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! - # Modify a quiz. - # 🔒 The user must be an admin the course the quiz is in to perform this action. - mutateQuiz(assessmentId: UUID!): QuizMutation! - - # Delete a quiz. - deleteQuiz(assessmentId: UUID!): UUID! - @deprecated( - reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead." - ) - - # Log that a multiple choice quiz is completed. - # 🔒 The user must be enrolled in the course the quiz is in to perform this action. - logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! - # Creates a new media record # 🔒 The user must have the "course-creator" role to perform this action. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. @@ -1470,10 +1374,7 @@ type Mutation { # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. # This means that for the content, all already linked media records are removed and replaced by the given ones. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setLinkedMediaRecordsForContent( - contentId: UUID! - mediaRecordIds: [UUID!]! - ): [MediaRecord!]! + setLinkedMediaRecordsForContent(contentId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! # Logs that a media has been worked on by the current user. # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html @@ -1486,10 +1387,36 @@ type Mutation { # Add the MediaRecords with the given UUIDS to the Course with the given UUID. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setMediaRecordsForCourse( - courseId: UUID! - mediaRecordIds: [UUID!]! - ): [MediaRecord!]! + setMediaRecordsForCourse(courseId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! + + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the reward score of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") + + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the skill level of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. + # 🔒 The user must be a super-user, otherwise an exception is thrown. + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") + + # Modify a quiz. + # 🔒 The user must be an admin the course the quiz is in to perform this action. + mutateQuiz(assessmentId: UUID!): QuizMutation! + + # Delete a quiz. + deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") + + # Log that a multiple choice quiz is completed. + # 🔒 The user must be enrolled in the course the quiz is in to perform this action. + logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! # Modify a flashcard set. # 🔒 The user must be an admin the course the flashcard set is in to perform this action. @@ -1497,9 +1424,7 @@ type Mutation { # Logs that a user has learned a flashcard. # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned( - input: LogFlashcardLearnedInput! - ): FlashcardLearnedFeedback! + logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! # Modify Content # 🔒 The user must have admin access to the course containing the section to perform this action. @@ -1510,22 +1435,13 @@ type Mutation { mutateSection(sectionId: UUID!): SectionMutation! # Creates a new media content and links the given media records to it. - createMediaContentAndLinkRecords( - contentInput: CreateMediaContentInput! - mediaRecordIds: [UUID!]! - ): MediaContent! + createMediaContentAndLinkRecords(contentInput: CreateMediaContentInput!, mediaRecordIds: [UUID!]!): MediaContent! # Creates a new quiz assessment and a new, linked quiz with the given properties. - createQuizAssessment( - assessmentInput: CreateAssessmentInput! - quizInput: CreateQuizInput! - ): QuizAssessment! + createQuizAssessment(assessmentInput: CreateAssessmentInput!, quizInput: CreateQuizInput!): QuizAssessment! # Creates a new flashcard set assessment and a new, linked flashcard set with the given properties. - createFlashcardSetAssessment( - assessmentInput: CreateAssessmentInput! - flashcardSetInput: CreateFlashcardSetInput! - ): FlashcardSetAssessment + createFlashcardSetAssessment(assessmentInput: CreateAssessmentInput!, flashcardSetInput: CreateFlashcardSetInput!): FlashcardSetAssessment # Creates a new section in a chapter. createSection(input: CreateSectionInput!): Section! @@ -1618,30 +1534,6 @@ type PublicUserInfo { } type Query { - # Gets the publicly available information for a list of users with the specified IDs. - # If a user does not exist, null is returned for that user. - findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - - # Gets the user information of the currently authorized user. - currentUserInfo: UserInfo! - - # Gets all of the users' information for a list of users with the specified IDs. - # Only available to privileged users. - # If a user does not exist, null is returned for that user. - findUserInfos(ids: [UUID!]!): [UserInfo]! - - # Get the reward score of the current user for the specified course. - # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. - userCourseRewardScores(courseId: UUID!): RewardScores! - - # Get the reward score of the specified user for the specified course. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! - - # Gets the power scores for each user in the course, ordered by power score descending. - # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. - scoreboard(courseId: UUID!): [ScoreboardItem!]! - # Get a list of courses. Can be filtered, sorted and paginated. # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. courses( @@ -1660,12 +1552,6 @@ type Query { # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. coursesByIds(ids: [UUID!]!): [Course!]! - # Get quiz by assessment ID. - # If any of the assessment IDs are not found, the corresponding quiz will be null. - # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for - # an quiz if the user has no access to it. - findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! - # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID # cannot be found. # @@ -1681,10 +1567,7 @@ type Query { # Returns all media records of the system. # # 🔒 The user must be a super-user, otherwise an exception is thrown. - mediaRecords: [MediaRecord!]! - @deprecated( - reason: "In production there should probably be no way to get all media records of the system." - ) + mediaRecords: [MediaRecord!]! @deprecated(reason: "In production there should probably be no way to get all media records of the system.") # Returns all media records which the current user created. # @@ -1705,6 +1588,36 @@ type Query { # Returns all media records which were created by the users. mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! + # Gets the publicly available information for a list of users with the specified IDs. + # If a user does not exist, null is returned for that user. + findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! + + # Gets the user information of the currently authorized user. + currentUserInfo: UserInfo! + + # Gets all of the users' information for a list of users with the specified IDs. + # Only available to privileged users. + # If a user does not exist, null is returned for that user. + findUserInfos(ids: [UUID!]!): [UserInfo]! + + # Get the reward score of the current user for the specified course. + # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. + userCourseRewardScores(courseId: UUID!): RewardScores! + + # Get the reward score of the specified user for the specified course. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! + + # Gets the power scores for each user in the course, ordered by power score descending. + # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. + scoreboard(courseId: UUID!): [ScoreboardItem!]! + + # Get quiz by assessment ID. + # If any of the assessment IDs are not found, the corresponding quiz will be null. + # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for + # an quiz if the user has no access to it. + findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! + # Get flashcards by their ids. # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! @@ -1757,23 +1670,14 @@ type Query { skillTypes: [SkillType!]! = [] ): [Suggestion!]! - # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is + # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. - semanticSearch( - queryText: String! - count: Int! = 10 - courseWhitelist: [UUID!] - ): [SemanticSearchResult!]! + semanticSearch(queryText: String!, count: Int! = 10, courseWhitelist: [UUID!]): [SemanticSearchResult!]! # Returns semantic search results of entities that are semantically similar to the entity with the specified ID. # Returns at most `count` results. If `excludeEntitiesWithSameParent` is true, segments from the same entity as the # specified segment will be excluded from the results. - getSemanticallySimilarEntities( - entityId: UUID! - count: Int! = 10 - excludeEntitiesWithSameParent: Boolean - courseWhitelist: [UUID!] - ): [SemanticSearchResult!]! + getSemanticallySimilarEntities(segmentId: UUID!, count: Int! = 10, excludeEntitiesWithSameParent: Boolean, courseWhitelist: [UUID!]): [SemanticSearchResult!]! } # Generic question interface. @@ -1915,16 +1819,12 @@ type QuizMutation { # Add a multiple choice question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addMultipleChoiceQuestion( - input: CreateMultipleChoiceQuestionInput! - ): Quiz! + _internal_noauth_addMultipleChoiceQuestion(input: CreateMultipleChoiceQuestionInput!): Quiz! # Update a multiple choice question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateMultipleChoiceQuestion( - input: UpdateMultipleChoiceQuestionInput! - ): Quiz! + _internal_noauth_updateMultipleChoiceQuestion(input: UpdateMultipleChoiceQuestionInput!): Quiz! # Add a cloze question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without @@ -1939,30 +1839,22 @@ type QuizMutation { # Add an association question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addAssociationQuestion( - input: CreateAssociationQuestionInput! - ): Quiz! + _internal_noauth_addAssociationQuestion(input: CreateAssociationQuestionInput!): Quiz! # Update an association question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateAssociationQuestion( - input: UpdateAssociationQuestionInput! - ): Quiz! + _internal_noauth_updateAssociationQuestion(input: UpdateAssociationQuestionInput!): Quiz! # Add an free text question with exact answer to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addExactAnswerQuestion( - input: CreateExactAnswerQuestionInput! - ): Quiz! + _internal_noauth_addExactAnswerQuestion(input: CreateExactAnswerQuestionInput!): Quiz! # Update an free text question with exact answer in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateExactAnswerQuestion( - input: UpdateExactAnswerQuestionInput! - ): Quiz! + _internal_noauth_updateExactAnswerQuestion(input: UpdateExactAnswerQuestionInput!): Quiz! # Add a numeric question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without @@ -1972,23 +1864,17 @@ type QuizMutation { # Update a numeric question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateNumericQuestion( - input: UpdateNumericQuestionInput! - ): Quiz! + _internal_noauth_updateNumericQuestion(input: UpdateNumericQuestionInput!): Quiz! # Add a self assessment question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addSelfAssessmentQuestion( - input: CreateSelfAssessmentQuestionInput! - ): Quiz! + _internal_noauth_addSelfAssessmentQuestion(input: CreateSelfAssessmentQuestionInput!): Quiz! # Update a self assessment question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateSelfAssessmentQuestion( - input: UpdateSelfAssessmentQuestionInput! - ): Quiz! + _internal_noauth_updateSelfAssessmentQuestion(input: UpdateSelfAssessmentQuestionInput!): Quiz! # Removes the question with the given number from the quiz. # This will also update the numbers of the following questions. @@ -2005,93 +1891,43 @@ type QuizMutation { # Set the number of questions that are randomly selected from the list of questions. # Will only be considered if questionPoolingMode is RANDOM. - setNumberOfRandomlySelectedQuestions( - numberOfRandomlySelectedQuestions: Int! - ): Quiz! + setNumberOfRandomlySelectedQuestions(numberOfRandomlySelectedQuestions: Int!): Quiz! # Add a multiple choice question to the quiz questions, at the end of the list. - addMultipleChoiceQuestion( - questionInput: CreateMultipleChoiceQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addMultipleChoiceQuestion(questionInput: CreateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update a multiple choice question in the quiz questions. - updateMultipleChoiceQuestion( - questionInput: UpdateMultipleChoiceQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateMultipleChoiceQuestion(questionInput: UpdateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add a cloze question to the quiz questions, at the end of the list. - addClozeQuestion( - questionInput: CreateClozeQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addClozeQuestion(questionInput: CreateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update a cloze question in the quiz questions. - updateClozeQuestion( - questionInput: UpdateClozeQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateClozeQuestion(questionInput: UpdateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add an association question to the quiz questions, at the end of the list. - addAssociationQuestion( - questionInput: CreateAssociationQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addAssociationQuestion(questionInput: CreateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update an association question in the quiz questions. - updateAssociationQuestion( - questionInput: UpdateAssociationQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateAssociationQuestion(questionInput: UpdateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add an free text question with exact answer to the quiz questions, at the end of the list. - addExactAnswerQuestion( - questionInput: CreateExactAnswerQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addExactAnswerQuestion(questionInput: CreateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update an free text question with exact answer in the quiz questions. - updateExactAnswerQuestion( - questionInput: UpdateExactAnswerQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateExactAnswerQuestion(questionInput: UpdateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add a numeric question to the quiz questions, at the end of the list. - addNumericQuestion( - questionInput: CreateNumericQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addNumericQuestion(questionInput: CreateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update a numeric question in the quiz questions. - updateNumericQuestion( - questionInput: UpdateNumericQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateNumericQuestion(questionInput: UpdateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add a self assessment question to the quiz questions, at the end of the list. - addSelfAssessmentQuestion( - questionInput: CreateSelfAssessmentQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addSelfAssessmentQuestion(questionInput: CreateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update a self assessment question in the quiz questions. - updateSelfAssessmentQuestion( - questionInput: UpdateSelfAssessmentQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateSelfAssessmentQuestion(questionInput: UpdateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! } type QuizOutput { From cbea52883ff77ff6b87596ad0374a1cb60200f16 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Thu, 24 Oct 2024 12:09:06 +0200 Subject: [PATCH 25/33] assessment search results --- app/courses/[courseId]/student.tsx | 6 +- components/Navbar.tsx | 127 ++++++++--- components/StudentChapter.tsx | 34 ++- components/content-link/ContentLink.tsx | 2 + components/search/SearchResultGroup.tsx | 273 ++++++++++++++++++++---- components/search/SearchResultItem.tsx | 113 ++++++---- components/search/SearchResultsBox.tsx | 102 ++++----- src/schema.graphql | 160 +++++++------- 8 files changed, 552 insertions(+), 265 deletions(-) diff --git a/app/courses/[courseId]/student.tsx b/app/courses/[courseId]/student.tsx index fa66a08..010075c 100644 --- a/app/courses/[courseId]/student.tsx +++ b/app/courses/[courseId]/student.tsx @@ -15,17 +15,17 @@ import TableRow from "@mui/material/TableRow"; import { studentCourseLeaveMutation } from "@/__generated__/studentCourseLeaveMutation.graphql"; import { FormErrors } from "@/components/FormErrors"; +import { LightTooltip } from "@/components/LightTooltip"; import { PageError } from "@/components/PageError"; import { RewardScores } from "@/components/RewardScores"; +import { RewardScoresHelpButton } from "@/components/RewardScoresHelpButton"; +import { StudentChapter } from "@/components/StudentChapter"; import { Suggestion } from "@/components/Suggestion"; import { Info, Repeat } from "@mui/icons-material"; import ExitToAppIcon from "@mui/icons-material/ExitToApp"; import NavigateNextIcon from "@mui/icons-material/NavigateNext"; import Link from "next/link"; import { useState } from "react"; -import { StudentChapter } from "@/components/StudentChapter"; -import { LightTooltip } from "@/components/LightTooltip"; -import { RewardScoresHelpButton } from "@/components/RewardScoresHelpButton"; interface Data { name: string; diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 529c247..18da8b8 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -3,6 +3,10 @@ import { NavbarIsTutor$key } from "@/__generated__/NavbarIsTutor.graphql"; import { NavbarSemanticSearchQuery } from "@/__generated__/NavbarSemanticSearchQuery.graphql"; import { NavbarStudentQuery } from "@/__generated__/NavbarStudentQuery.graphql"; import logo from "@/assets/logo.svg"; +import duration from "dayjs/plugin/duration"; + +dayjs.extend(duration); + import { PageView, usePageView } from "@/src/currentView"; import { CollectionsBookmark, @@ -59,6 +63,13 @@ function useIsTutor(_frag: NavbarIsTutor$key) { ); } +type SearchResultType = { + breadcrumbs: string; + title: string; + position?: string; + url: string; +}; + function NavbarBase({ children, _isTutor, @@ -72,11 +83,34 @@ function NavbarBase({ const searchResults = useLazyLoadQuery( graphql` query NavbarSemanticSearchQuery($term: String!, $skip: Boolean!) { - semanticSearch(queryText: $term, count: 5) @skip(if: $skip) { + semanticSearch(queryText: $term, count: 30) @skip(if: $skip) { score ... on AssessmentSemanticSearchResult { assessmentId score + assessment { + ... on FlashcardSetAssessment { + metadata { + name + courseId + course { + title + } + } + + __typename + } + ... on QuizAssessment { + metadata { + name + courseId + course { + title + } + } + __typename + } + } } ... on MediaRecordSegmentSemanticSearchResult { mediaRecordSegment { @@ -135,16 +169,59 @@ function NavbarBase({ const results = chain(searchResults.semanticSearch) .orderBy((x) => x?.score) .slice(0, 15) - .flatMap((x) => { - const seg = x.mediaRecordSegment; - - return seg?.__typename !== "%other" && seg?.mediaRecord - ? seg?.mediaRecord?.contents.map((content) => ({ - content, - ...x, - mediaRecordSegment: seg, - })) - : []; + .flatMap((x): SearchResultType[] => { + if ( + x.mediaRecordSegment && + x.mediaRecordSegment.__typename === "DocumentRecordSegment" + ) { + const seg = x.mediaRecordSegment; + return seg.mediaRecord.contents + .filter((x) => !!x) + .map((content) => ({ + breadcrumbs: `${content.metadata.course.title} › ${content.metadata.name}`, + title: seg.mediaRecord.name, + position: `Page ${seg.page + 1}`, + url: `/courses/${content.metadata.course.id}/media/${ + content.id + }?selectedDocument=${seg.mediaRecord.id}&page=${seg.page + 1}`, + })); + } else if ( + x.mediaRecordSegment && + x.mediaRecordSegment.__typename === "VideoRecordSegment" + ) { + const seg = x.mediaRecordSegment; + return seg.mediaRecord.contents + .filter((x) => !!x) + .map((content) => ({ + breadcrumbs: `${content.metadata.course.title} › ${content.metadata.name}`, + title: seg.mediaRecord.name, + position: dayjs + .duration(seg.startTime ?? 0, "seconds") + .format("HH:mm:ss"), + url: `/courses/${content.metadata.course.id}/media/${content.id}?selectedVideo=${seg.mediaRecord.id}&videoPosition=${seg.startTime}`, + })); + } else if ( + x.assessment && + x.assessment.__typename === "FlashcardSetAssessment" + ) { + return [ + { + breadcrumbs: `${x.assessment.metadata.course.title}`, + title: x.assessment.metadata.name, + url: `/courses/${x.assessment.metadata.courseId}/flashcards/${x.assessmentId}`, + }, + ]; + } else if (x.assessment && x.assessment.__typename === "QuizAssessment") { + return [ + { + breadcrumbs: `${x.assessment.metadata.course.title}`, + title: x.assessment.metadata.name, + url: `/courses/${x.assessment.metadata.courseId}/flashcards/${x.assessmentId}`, + }, + ]; + } else { + return []; + } }) .value(); @@ -186,29 +263,27 @@ function NavbarBase({ autoHighlight open={isSearchPopupOpen} value={null} - onChange={(x, newVal) => { + onChange={(_, newVal) => { if (typeof newVal == "string") { router.push(`/search?query=${newVal}`); - } else { - router.push( - `/courses/${newVal?.content?.metadata.course.id}/media/${newVal?.content?.id}?recordId=${newVal?.mediaRecordSegment.mediaRecord?.id}` - ); + } else if (newVal) { + setSearchPopupOpen(false); + router.push(newVal.url); } }} filterOptions={(x) => x} - groupBy={(x) => - `${x?.content?.metadata.course.title} › ${x?.content?.metadata.name}` - } renderOption={(props, option) => ( -
  • +
  • - {option?.mediaRecordSegment.mediaRecord?.name} -
    - {option?.mediaRecordSegment.__typename === - "DocumentRecordSegment" - ? `Page ${option.mediaRecordSegment.page}` - : `Page ${option?.mediaRecordSegment.startTime}`} +
    + {option.breadcrumbs}
    + {option.title} + {option.position && ( +
    + {option.position} +
    + )}
  • )} diff --git a/components/StudentChapter.tsx b/components/StudentChapter.tsx index 96a293e..e7e734f 100644 --- a/components/StudentChapter.tsx +++ b/components/StudentChapter.tsx @@ -1,19 +1,22 @@ +import { StudentChapterFragment$key } from "@/__generated__/StudentChapterFragment.graphql"; +import { Collapse } from "@mui/material"; import dayjs from "dayjs"; -import { useParams } from "next/navigation"; -import { useState } from "react"; +import { useParams, useSearchParams } from "next/navigation"; +import { useCallback, useState } from "react"; import { graphql, useFragment } from "react-relay"; -import { ChapterHeader } from "./ChapterHeader"; -import { Collapse } from "@mui/material"; import { ChapterContent } from "./ChapterContent"; -import { StudentSection } from "./StudentSection"; -import { StudentChapterFragment$key } from "@/__generated__/StudentChapterFragment.graphql"; +import { ChapterHeader } from "./ChapterHeader"; import { OtherContent } from "./OtherContent"; +import { StudentSection } from "./StudentSection"; export function StudentChapter({ _chapter, }: { _chapter: StudentChapterFragment$key; }) { + const searchParams = useSearchParams(); + const selectedChapter = searchParams.get("chapterId"); + const { courseId } = useParams(); const chapter = useFragment( graphql` @@ -33,12 +36,27 @@ export function StudentChapter({ `, _chapter ); + + const handleRef = useCallback( + (node: HTMLDivElement | null) => { + if (node && selectedChapter === chapter.id) { + node.scrollIntoView({ behavior: "smooth" }); + } + }, + [chapter, selectedChapter] + ); + const [expanded, setExpanded] = useState( - dayjs().isBetween(chapter.suggestedStartDate, chapter.suggestedEndDate) + (!selectedChapter && + dayjs().isBetween( + chapter.suggestedStartDate, + chapter.suggestedEndDate + )) || + chapter.id === selectedChapter ); return ( -
    +
    ; } - const userAccessibleContent = mediaRecord.contents.find( + const mediaRecord = searchResults[0].mediaRecordSegment?.mediaRecord; + const content = mediaRecord?.contents.find( (x) => x !== undefined && x !== null ); - if (userAccessibleContent === null || userAccessibleContent === undefined) { - return null; - } + + if (!content) return <>; function renderResultsIfExpanded() { if (isExpanded) { @@ -54,9 +117,13 @@ export default function SearchResultGroup({ .slice(0, collapsedResultCount) .map((result, index: number) => { return ( - + {index > 0 && } - + ); })} @@ -82,11 +149,15 @@ export default function SearchResultGroup({ {doShowMoreResults && searchResults .slice(collapsedResultCount, searchResults.length) - .map((result, index: number) => { + .map((result, index) => { return ( - + {index > 0 && } - + ); })} @@ -102,6 +173,15 @@ export default function SearchResultGroup({ className="bg-slate-200" > + + + {isExpanded ? : } + + - - - {isExpanded ? : } - - + + {content.metadata.course.title} + - {userAccessibleContent.metadata.course.title} - - - {userAccessibleContent.metadata.chapter.title} + {content.metadata.chapter.title} - {userAccessibleContent.metadata.name} + {content.metadata.name} - {mediaRecord.name} + {searchResults[0].mediaRecordSegment.mediaRecord?.name} - - - - - - - + + + + + {renderResultsIfExpanded()} @@ -156,3 +239,103 @@ export default function SearchResultGroup({ ); } + +export function AssessmentSearchResultGroup({ + _searchResults, +}: { + _searchResults: SearchResultGroupAssessmentFragment$key; +}) { + const { assessment } = useFragment( + graphql` + fragment SearchResultGroupAssessmentFragment on AssessmentSemanticSearchResult { + assessment { + __typename + metadata { + name + chapter { + title + id + } + course { + title + id + } + } + id + } + __typename + } + `, + _searchResults + ); + + return ( + + +
    + + + {assessment.metadata.course.title} + + + {assessment.metadata.chapter.title} + + +
    + + +
    + {assessment.__typename === "FlashcardSetAssessment" ? ( + + ) : assessment.__typename === "QuizAssessment" ? ( + + ) : ( +
    {assessment.__typename}
    + )} +
    + +
    + + {assessment.metadata.name} + +
    +
    +
    + ); +} diff --git a/components/search/SearchResultItem.tsx b/components/search/SearchResultItem.tsx index f27a7fe..c8a0c6f 100644 --- a/components/search/SearchResultItem.tsx +++ b/components/search/SearchResultItem.tsx @@ -1,44 +1,15 @@ "use client"; -import { SearchResultsBox$data } from "@/__generated__/SearchResultsBox.graphql"; +import { SearchResultItemFragmentMedia$key } from "@/__generated__/SearchResultItemFragmentMedia.graphql"; import ExpandableText from "@/components/ExpandableText"; -import { Box, styled, Typography } from "@mui/material"; +import { Box, styled } from "@mui/material"; import Tooltip, { tooltipClasses, TooltipProps } from "@mui/material/Tooltip"; +import dayjs from "dayjs"; +import duration from "dayjs/plugin/duration"; +import Link from "next/link"; +import { graphql, useFragment } from "react-relay"; -function getSegmentContents( - mediaRecordSegment: SearchResultsBox$data[0]["mediaRecordSegment"] -): string { - switch (mediaRecordSegment?.__typename) { - case "VideoRecordSegment": - return mediaRecordSegment?.transcript ?? ""; - case "DocumentRecordSegment": - return mediaRecordSegment?.text ?? ""; - default: - return "Unknown media type"; - } -} - -function getSegmentTitle( - mediaRecordSegment: SearchResultsBox$data[0]["mediaRecordSegment"] -) { - switch (mediaRecordSegment?.__typename) { - case "VideoRecordSegment": - const date = new Date(mediaRecordSegment?.startTime! * 1000); - return ( - - Time {date.toISOString().slice(11, 19)} - - ); - case "DocumentRecordSegment": - return ( - - Page {mediaRecordSegment?.page! + 1} - - ); - default: - return Unknown media type; - } -} +dayjs.extend(duration); export const NoMaxWidthTooltip = styled( ({ className, ...props }: TooltipProps) => ( @@ -50,18 +21,56 @@ export const NoMaxWidthTooltip = styled( }, }); -export default function SearchResultItem({ - searchResult, +export function SearchResultMediaItem({ + _searchResult, + courseId, + contentId, }: { - searchResult: NonNullable; + _searchResult: SearchResultItemFragmentMedia$key; + courseId: string; + contentId: string; }) { + const { mediaRecordSegment } = useFragment( + graphql` + fragment SearchResultItemFragmentMedia on MediaRecordSegmentSemanticSearchResult { + mediaRecordSegment { + ... on VideoRecordSegment { + thumbnail + transcript + startTime + mediaRecordId + __typename + } + ... on DocumentRecordSegment { + thumbnail + text + page + mediaRecordId + __typename + } + } + } + `, + _searchResult + ); + + if (mediaRecordSegment.__typename === "%other") { + return <>; + } + + const href = + mediaRecordSegment.__typename === "VideoRecordSegment" + ? `/courses/${courseId}/media/${contentId}?selectedVideo=${mediaRecordSegment.mediaRecordId}` + : `/courses/${courseId}/media/${contentId}?selectedDocument=${mediaRecordSegment.mediaRecordId}`; + return ( - {getSegmentTitle(searchResult.mediaRecordSegment)} + + {mediaRecordSegment.__typename === "VideoRecordSegment" + ? dayjs + .duration(mediaRecordSegment.startTime, "seconds") + .format("HH:mm:ss") + : `Page ${mediaRecordSegment.page + 1}`} + diff --git a/components/search/SearchResultsBox.tsx b/components/search/SearchResultsBox.tsx index 7f36db6..2675d23 100644 --- a/components/search/SearchResultsBox.tsx +++ b/components/search/SearchResultsBox.tsx @@ -2,9 +2,12 @@ import { SearchResultsBox$key } from "@/__generated__/SearchResultsBox.graphql"; import { Box } from "@mui/material"; -import lodash from "lodash"; +import lodash, { orderBy } from "lodash"; import { graphql, useFragment } from "react-relay"; -import SearchResultGroup from "./SearchResultGroup"; +import { + AssessmentSearchResultGroup, + MediaRecordSearchResultGroup, +} from "./SearchResultGroup"; export default function SearchResultsBox({ searchResults: _searchResults, @@ -14,58 +17,20 @@ export default function SearchResultsBox({ const searchResults = useFragment( graphql` fragment SearchResultsBox on SemanticSearchResult @relay(plural: true) { - score ... on MediaRecordSegmentSemanticSearchResult { + score + __typename mediaRecordSegment { - __typename - id - thumbnail mediaRecordId - ... on VideoRecordSegment { - startTime - screenText - transcript - mediaRecord { - id - name - type - contents { - metadata { - name - chapter { - title - } - course { - title - } - } - } - } - } - ... on DocumentRecordSegment { - page - text - mediaRecord { - id - name - type - contents { - id - metadata { - name - chapter { - id - title - } - course { - id - title - } - } - } - } - } } + ...SearchResultGroupMediaFragment + } + ... on AssessmentSemanticSearchResult { + score + + __typename + assessmentId + ...SearchResultGroupAssessmentFragment } } `, @@ -75,27 +40,42 @@ export default function SearchResultsBox({ // Group the search results const semanticSearchResultGroups = lodash .chain(searchResults ?? []) - .groupBy( - (result) => result.mediaRecordSegment?.mediaRecord?.id ?? "unknown" + .groupBy((result) => + "mediaRecordSegment" in result + ? result.mediaRecordSegment!.mediaRecordId + : "assessmentId" in result + ? result.assessmentId + : "unknown" ) - .forEach((group) => group.sort((a, b) => a.score - b.score)) - .sortBy((group) => group[0].score) + .forEach((group) => + orderBy(group, (x) => ("score" in x ? x.score : 0), "asc") + ) + .orderBy((x) => ("score" in x[0] ? x[0].score : 0), "asc") .value(); return ( {Object.values(semanticSearchResultGroups).map((resultGroup) => { - if (resultGroup !== undefined) + if ( + resultGroup[0].__typename === "MediaRecordSegmentSemanticSearchResult" + ) { return ( - ); + } else if ( + resultGroup[0].__typename === "AssessmentSemanticSearchResult" + ) { + return ( + + ); + } })} ); diff --git a/src/schema.graphql b/src/schema.graphql index e09c1b8..e475f10 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -1313,7 +1313,18 @@ type MultipleChoiceQuestion implements Question { hint: JSON } +# Mutations for the flashcard service. Provides mutations for creating, updating, and deleting flashcard as well as +# creating and deleting flashcard sets. To update a flashcard set, update, delete, and create flashcards individually. type Mutation { + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the reward score of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") + # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1358,6 +1369,26 @@ type Mutation { # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the skill level of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. + # 🔒 The user must be a super-user, otherwise an exception is thrown. + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") + + # Modify a quiz. + # 🔒 The user must be an admin the course the quiz is in to perform this action. + mutateQuiz(assessmentId: UUID!): QuizMutation! + + # Delete a quiz. + deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") + + # Log that a multiple choice quiz is completed. + # 🔒 The user must be enrolled in the course the quiz is in to perform this action. + logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! + # Creates a new media record # 🔒 The user must have the "course-creator" role to perform this action. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of all courses or a super-user. @@ -1389,34 +1420,13 @@ type Mutation { # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. setMediaRecordsForCourse(courseId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the reward score of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") - - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the skill level of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. - # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") - - # Modify a quiz. - # 🔒 The user must be an admin the course the quiz is in to perform this action. - mutateQuiz(assessmentId: UUID!): QuizMutation! - - # Delete a quiz. - deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") + # Modify Content + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateContent(contentId: UUID!): ContentMutation! - # Log that a multiple choice quiz is completed. - # 🔒 The user must be enrolled in the course the quiz is in to perform this action. - logQuizCompleted(input: QuizCompletedInput!): QuizCompletionFeedback! + # Modify the section with the given id. + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateSection(sectionId: UUID!): SectionMutation! # Modify a flashcard set. # 🔒 The user must be an admin the course the flashcard set is in to perform this action. @@ -1426,14 +1436,6 @@ type Mutation { # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! - # Modify Content - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateContent(contentId: UUID!): ContentMutation! - - # Modify the section with the given id. - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateSection(sectionId: UUID!): SectionMutation! - # Creates a new media content and links the given media records to it. createMediaContentAndLinkRecords(contentInput: CreateMediaContentInput!, mediaRecordIds: [UUID!]!): MediaContent! @@ -1534,6 +1536,30 @@ type PublicUserInfo { } type Query { + # Gets the publicly available information for a list of users with the specified IDs. + # If a user does not exist, null is returned for that user. + findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! + + # Gets the user information of the currently authorized user. + currentUserInfo: UserInfo! + + # Gets all of the users' information for a list of users with the specified IDs. + # Only available to privileged users. + # If a user does not exist, null is returned for that user. + findUserInfos(ids: [UUID!]!): [UserInfo]! + + # Get the reward score of the current user for the specified course. + # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. + userCourseRewardScores(courseId: UUID!): RewardScores! + + # Get the reward score of the specified user for the specified course. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! + + # Gets the power scores for each user in the course, ordered by power score descending. + # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. + scoreboard(courseId: UUID!): [ScoreboardItem!]! + # Get a list of courses. Can be filtered, sorted and paginated. # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. courses( @@ -1552,6 +1578,12 @@ type Query { # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. coursesByIds(ids: [UUID!]!): [Course!]! + # Get quiz by assessment ID. + # If any of the assessment IDs are not found, the corresponding quiz will be null. + # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for + # an quiz if the user has no access to it. + findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! + # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID # cannot be found. # @@ -1588,50 +1620,6 @@ type Query { # Returns all media records which were created by the users. mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! - # Gets the publicly available information for a list of users with the specified IDs. - # If a user does not exist, null is returned for that user. - findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - - # Gets the user information of the currently authorized user. - currentUserInfo: UserInfo! - - # Gets all of the users' information for a list of users with the specified IDs. - # Only available to privileged users. - # If a user does not exist, null is returned for that user. - findUserInfos(ids: [UUID!]!): [UserInfo]! - - # Get the reward score of the current user for the specified course. - # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. - userCourseRewardScores(courseId: UUID!): RewardScores! - - # Get the reward score of the specified user for the specified course. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! - - # Gets the power scores for each user in the course, ordered by power score descending. - # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. - scoreboard(courseId: UUID!): [ScoreboardItem!]! - - # Get quiz by assessment ID. - # If any of the assessment IDs are not found, the corresponding quiz will be null. - # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for - # an quiz if the user has no access to it. - findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! - - # Get flashcards by their ids. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! - - # Get flashcard sets by their assessment ids. - # Returns a list of flashcard sets in the same order as the provided ids. - # Each element is null if the corresponding id is not found. - # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. - findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! - - # Get flashcards of a course that are due to be reviewed. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! - # Retrieves all existing contents for a given course. # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] @@ -1670,6 +1658,20 @@ type Query { skillTypes: [SkillType!]! = [] ): [Suggestion!]! + # Get flashcards by their ids. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! + + # Get flashcard sets by their assessment ids. + # Returns a list of flashcard sets in the same order as the provided ids. + # Each element is null if the corresponding id is not found. + # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. + findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! + + # Get flashcards of a course that are due to be reviewed. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! + # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. semanticSearch(queryText: String!, count: Int! = 10, courseWhitelist: [UUID!]): [SemanticSearchResult!]! From 7f265f06dd5e24035993c13f4eb15e95cf3c37b5 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Fri, 25 Oct 2024 10:14:08 +0200 Subject: [PATCH 26/33] suggested tags (mock) --- components/AddFlashcardSetModal.tsx | 5 +- components/ContentMetadataFormSection.tsx | 19 + components/EditFlashcardSetModal.tsx | 1 + components/MediaContentModal.tsx | 1 + components/QuizModal.tsx | 1 + components/content-link/ContentLink.tsx | 18 +- src/schema.graphql | 489 +++++++++++++++------- 7 files changed, 370 insertions(+), 164 deletions(-) diff --git a/components/AddFlashcardSetModal.tsx b/components/AddFlashcardSetModal.tsx index 81b264f..84a8863 100644 --- a/components/AddFlashcardSetModal.tsx +++ b/components/AddFlashcardSetModal.tsx @@ -138,7 +138,10 @@ export function AddFlashcardSetModal({ ))} - + diff --git a/components/ContentMetadataFormSection.tsx b/components/ContentMetadataFormSection.tsx index e5d6268..e8cfff9 100644 --- a/components/ContentMetadataFormSection.tsx +++ b/components/ContentMetadataFormSection.tsx @@ -20,9 +20,11 @@ export type ContentMetadataPayload = { export function ContentMetadataFormSection({ onChange, metadata, + suggestedTags, }: { onChange: (side: ContentMetadataPayload | null) => void; metadata?: ContentMetadataPayload | null; + suggestedTags: string[]; }) { const [name, setName] = useState(metadata?.name ?? ""); const [suggestedDate, setSuggestedDate] = useState( @@ -51,6 +53,8 @@ export function ContentMetadataFormSection({ ); }, [name, suggestedDate, tags, rewardPoints, valid, onChange]); + const suggestedTagsF = suggestedTags.filter((x) => !tags.includes(x)); + return ( } /> + + {suggestedTagsF.length > 0 && ( + <> +
    Suggested Tags
    +
    + {suggestedTagsF.map((tag) => ( + setTags([...tags, tag])} + key={tag} + label={tag} + > + ))} +
    + + )}
    ); } diff --git a/components/EditFlashcardSetModal.tsx b/components/EditFlashcardSetModal.tsx index 7bd4f04..77b4ba9 100644 --- a/components/EditFlashcardSetModal.tsx +++ b/components/EditFlashcardSetModal.tsx @@ -63,6 +63,7 @@ export function EditFlashcardSetModal({
    diff --git a/components/MediaContentModal.tsx b/components/MediaContentModal.tsx index 8fef5f1..eff5a7a 100644 --- a/components/MediaContentModal.tsx +++ b/components/MediaContentModal.tsx @@ -215,6 +215,7 @@ export function MediaContentModal({ ))} diff --git a/components/QuizModal.tsx b/components/QuizModal.tsx index fe67ca7..5d28e2d 100644 --- a/components/QuizModal.tsx +++ b/components/QuizModal.tsx @@ -268,6 +268,7 @@ export function QuizModal({ x.suggestedTags.length > 0) ?? false; + const [pageView] = usePageView(); + const typeString = content.__typename === "MediaContent" ? "Media" @@ -120,7 +126,17 @@ export function ContentLink({ label: typeString, color: ContentTypeToColor[content.__typename], }, - ...(isProcessing ? [{ key: "processing", label: "Processing..." }] : []), + ...(pageView === PageView.Lecturer && isProcessing + ? [{ key: "processing", label: "Processing..." }] + : []), + ...(pageView === PageView.Lecturer && hasSuggestedTags + ? [ + { + key: "tags", + label: "New tags available", + }, + ] + : []), ...extra_chips, ]; diff --git a/src/schema.graphql b/src/schema.graphql index e475f10..df11075 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -5,35 +5,78 @@ directive @specifiedBy( ) on SCALAR # see also https://github.com/graphql-java/graphql-java-extended-validation/blob/master/README.md -directive @DecimalMax(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMax.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @DecimalMin(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMin.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Max(value: Int! = 2147483647, message: String = "graphql.validation.Max.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Min(value: Int! = 0, message: String = "graphql.validation.Min.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Negative(message: String = "graphql.validation.Negative.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NegativeOrZero(message: String = "graphql.validation.NegativeOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotBlank(message: String = "graphql.validation.NotBlank.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotEmpty(message: String = "graphql.validation.NotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerNotEmpty(message: String = "graphql.validation.ContainerNotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Pattern(regexp: String! = ".*", message: String = "graphql.validation.Pattern.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Positive(message: String = "graphql.validation.Positive.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @PositiveOrZero(message: String = "graphql.validation.PositiveOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Range(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Range.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Size(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Size.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerSize(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.ContainerSize.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION +directive @DecimalMax( + value: String! + inclusive: Boolean! = true + message: String = "graphql.validation.DecimalMax.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @DecimalMin( + value: String! + inclusive: Boolean! = true + message: String = "graphql.validation.DecimalMin.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Max( + value: Int! = 2147483647 + message: String = "graphql.validation.Max.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Min( + value: Int! = 0 + message: String = "graphql.validation.Min.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Negative( + message: String = "graphql.validation.Negative.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NegativeOrZero( + message: String = "graphql.validation.NegativeOrZero.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotBlank( + message: String = "graphql.validation.NotBlank.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotEmpty( + message: String = "graphql.validation.NotEmpty.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerNotEmpty( + message: String = "graphql.validation.ContainerNotEmpty.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Pattern( + regexp: String! = ".*" + message: String = "graphql.validation.Pattern.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Positive( + message: String = "graphql.validation.Positive.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @PositiveOrZero( + message: String = "graphql.validation.PositiveOrZero.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Range( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.Range.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Size( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.Size.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerSize( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.ContainerSize.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION # The @OnDemand directive is used to mark fields that are only internally resolved when requested. # Implementation Note: This will cause the code generator to omit the field from the generated DTOs. @@ -42,7 +85,21 @@ directive @OnDemand on FIELD_DEFINITION # Indicates an Input Object is a OneOf Input Object. directive @oneOf on INPUT_OBJECT -directive @resolveTo(requiredSelectionSet: String, sourceName: String!, sourceTypeName: String!, sourceFieldName: String!, sourceSelectionSet: String, sourceArgs: ResolveToSourceArgs, keyField: String, keysArg: String, pubsubTopic: String, filterBy: String, additionalArgs: ResolveToSourceArgs, result: String, resultType: String) on FIELD_DEFINITION +directive @resolveTo( + requiredSelectionSet: String + sourceName: String! + sourceTypeName: String! + sourceFieldName: String! + sourceSelectionSet: String + sourceArgs: ResolveToSourceArgs + keyField: String + keysArg: String + pubsubTopic: String + filterBy: String + additionalArgs: ResolveToSourceArgs + result: String + resultType: String +) on FIELD_DEFINITION type AiEntityProcessingProgress { entityId: UUID! @@ -998,10 +1055,18 @@ type FlashcardSetMutation { deleteFlashcard(id: UUID!): UUID! # Creates a new flashcard and the linked item - createFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: CreateFlashcardInput!): FlashcardOutput! + createFlashcard( + item: ItemInput! + assessmentId: UUID! + flashcardInput: CreateFlashcardInput! + ): FlashcardOutput! # Creates a new flashcard and the linked item - updateFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: UpdateFlashcardInput!): FlashcardOutput! + updateFlashcard( + item: ItemInput! + assessmentId: UUID! + flashcardInput: UpdateFlashcardInput! + ): FlashcardOutput! } type FlashcardSetProgress { @@ -1313,18 +1378,7 @@ type MultipleChoiceQuestion implements Question { hint: JSON } -# Mutations for the flashcard service. Provides mutations for creating, updating, and deleting flashcard as well as -# creating and deleting flashcard sets. To update a flashcard set, update, delete, and create flashcards individually. type Mutation { - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. - # - # Triggers the recalculation of the reward score of the user. - # This is done automatically at some time in the night. - # - # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") - # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1369,6 +1423,16 @@ type Mutation { # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! + # Modify a flashcard set. + # 🔒 The user must be an admin the course the flashcard set is in to perform this action. + mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! + + # Logs that a user has learned a flashcard. + # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. + logFlashcardLearned( + input: LogFlashcardLearnedInput! + ): FlashcardLearnedFeedback! + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. # # Triggers the recalculation of the skill level of the user. @@ -1376,14 +1440,36 @@ type Mutation { # # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! + @deprecated(reason: "Only for testing purposes. Will be removed.") + + # Modify Content + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateContent(contentId: UUID!): ContentMutation! + + # Modify the section with the given id. + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateSection(sectionId: UUID!): SectionMutation! + + # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. + # + # Triggers the recalculation of the reward score of the user. + # This is done automatically at some time in the night. + # + # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! + @deprecated(reason: "Only for testing purposes. Will be removed.") # Modify a quiz. # 🔒 The user must be an admin the course the quiz is in to perform this action. mutateQuiz(assessmentId: UUID!): QuizMutation! # Delete a quiz. - deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") + deleteQuiz(assessmentId: UUID!): UUID! + @deprecated( + reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead." + ) # Log that a multiple choice quiz is completed. # 🔒 The user must be enrolled in the course the quiz is in to perform this action. @@ -1405,7 +1491,10 @@ type Mutation { # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. # This means that for the content, all already linked media records are removed and replaced by the given ones. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setLinkedMediaRecordsForContent(contentId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! + setLinkedMediaRecordsForContent( + contentId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! # Logs that a media has been worked on by the current user. # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html @@ -1418,32 +1507,28 @@ type Mutation { # Add the MediaRecords with the given UUIDS to the Course with the given UUID. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setMediaRecordsForCourse(courseId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! - - # Modify Content - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateContent(contentId: UUID!): ContentMutation! - - # Modify the section with the given id. - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateSection(sectionId: UUID!): SectionMutation! - - # Modify a flashcard set. - # 🔒 The user must be an admin the course the flashcard set is in to perform this action. - mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! - - # Logs that a user has learned a flashcard. - # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! + setMediaRecordsForCourse( + courseId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! # Creates a new media content and links the given media records to it. - createMediaContentAndLinkRecords(contentInput: CreateMediaContentInput!, mediaRecordIds: [UUID!]!): MediaContent! + createMediaContentAndLinkRecords( + contentInput: CreateMediaContentInput! + mediaRecordIds: [UUID!]! + ): MediaContent! # Creates a new quiz assessment and a new, linked quiz with the given properties. - createQuizAssessment(assessmentInput: CreateAssessmentInput!, quizInput: CreateQuizInput!): QuizAssessment! + createQuizAssessment( + assessmentInput: CreateAssessmentInput! + quizInput: CreateQuizInput! + ): QuizAssessment! # Creates a new flashcard set assessment and a new, linked flashcard set with the given properties. - createFlashcardSetAssessment(assessmentInput: CreateAssessmentInput!, flashcardSetInput: CreateFlashcardSetInput!): FlashcardSetAssessment + createFlashcardSetAssessment( + assessmentInput: CreateAssessmentInput! + flashcardSetInput: CreateFlashcardSetInput! + ): FlashcardSetAssessment # Creates a new section in a chapter. createSection(input: CreateSectionInput!): Section! @@ -1536,30 +1621,6 @@ type PublicUserInfo { } type Query { - # Gets the publicly available information for a list of users with the specified IDs. - # If a user does not exist, null is returned for that user. - findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - - # Gets the user information of the currently authorized user. - currentUserInfo: UserInfo! - - # Gets all of the users' information for a list of users with the specified IDs. - # Only available to privileged users. - # If a user does not exist, null is returned for that user. - findUserInfos(ids: [UUID!]!): [UserInfo]! - - # Get the reward score of the current user for the specified course. - # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. - userCourseRewardScores(courseId: UUID!): RewardScores! - - # Get the reward score of the specified user for the specified course. - # 🔒 The user be an admin in the course with the given courseId to perform this action. - courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! - - # Gets the power scores for each user in the course, ordered by power score descending. - # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. - scoreboard(courseId: UUID!): [ScoreboardItem!]! - # Get a list of courses. Can be filtered, sorted and paginated. # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. courses( @@ -1578,47 +1639,31 @@ type Query { # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. coursesByIds(ids: [UUID!]!): [Course!]! - # Get quiz by assessment ID. - # If any of the assessment IDs are not found, the corresponding quiz will be null. - # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for - # an quiz if the user has no access to it. - findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! - - # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID - # cannot be found. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - mediaRecordsByIds(ids: [UUID!]!): [MediaRecord!]! - - # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID - # cannot be found, it instead returns NULL for that media record. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - findMediaRecordsByIds(ids: [UUID!]!): [MediaRecord]! + # Get flashcards by their ids. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! - # Returns all media records of the system. - # - # 🔒 The user must be a super-user, otherwise an exception is thrown. - mediaRecords: [MediaRecord!]! @deprecated(reason: "In production there should probably be no way to get all media records of the system.") + # Get flashcard sets by their assessment ids. + # Returns a list of flashcard sets in the same order as the provided ids. + # Each element is null if the corresponding id is not found. + # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. + findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! - # Returns all media records which the current user created. - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - userMediaRecords: [MediaRecord!]! + # Get flashcards of a course that are due to be reviewed. + # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. + dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! - # Returns the media records associated the given content IDs as a list of lists where each sublist contains - # the media records associated with the content ID at the same index in the input list - # - # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. - mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! + # Gets the publicly available information for a list of users with the specified IDs. + # If a user does not exist, null is returned for that user. + findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - # Returns all media records for the given CourseIds - # - # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. - mediaRecordsForCourses(courseIds: [UUID!]!): [[MediaRecord!]!]! + # Gets the user information of the currently authorized user. + currentUserInfo: UserInfo! - # Returns all media records which were created by the users. - mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! + # Gets all of the users' information for a list of users with the specified IDs. + # Only available to privileged users. + # If a user does not exist, null is returned for that user. + findUserInfos(ids: [UUID!]!): [UserInfo]! # Retrieves all existing contents for a given course. # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. @@ -1658,28 +1703,80 @@ type Query { skillTypes: [SkillType!]! = [] ): [Suggestion!]! - # Get flashcards by their ids. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - flashcardsByIds(itemIds: [UUID!]!): [Flashcard!]! + # Get the reward score of the current user for the specified course. + # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. + userCourseRewardScores(courseId: UUID!): RewardScores! - # Get flashcard sets by their assessment ids. - # Returns a list of flashcard sets in the same order as the provided ids. - # Each element is null if the corresponding id is not found. - # 🔒 The user must be enrolled in the course the flashcard sets belong to. Otherwise for that element null is returned. - findFlashcardSetsByAssessmentIds(assessmentIds: [UUID!]!): [FlashcardSet]! + # Get the reward score of the specified user for the specified course. + # 🔒 The user be an admin in the course with the given courseId to perform this action. + courseRewardScoresForUser(courseId: UUID!, userId: UUID!): RewardScores! - # Get flashcards of a course that are due to be reviewed. - # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. - dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! + # Gets the power scores for each user in the course, ordered by power score descending. + # 🔒 The user must have access to the course with the given id to access the scoreboard, otherwise an error is thrown. + scoreboard(courseId: UUID!): [ScoreboardItem!]! + + # Get quiz by assessment ID. + # If any of the assessment IDs are not found, the corresponding quiz will be null. + # 🔒 The user must be enrolled in the course the quizzes belong to to access them. Otherwise null is returned for + # an quiz if the user has no access to it. + findQuizzesByAssessmentIds(assessmentIds: [UUID!]!): [Quiz]! + + # Returns the media records with the given IDs. Throws an error if a MediaRecord corresponding to a given ID + # cannot be found. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + mediaRecordsByIds(ids: [UUID!]!): [MediaRecord!]! + + # Like mediaRecordsByIds() returns the media records with the given IDs, but instead of throwing an error if an ID + # cannot be found, it instead returns NULL for that media record. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + findMediaRecordsByIds(ids: [UUID!]!): [MediaRecord]! + + # Returns all media records of the system. + # + # 🔒 The user must be a super-user, otherwise an exception is thrown. + mediaRecords: [MediaRecord!]! + @deprecated( + reason: "In production there should probably be no way to get all media records of the system." + ) + + # Returns all media records which the current user created. + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + userMediaRecords: [MediaRecord!]! + + # Returns the media records associated the given content IDs as a list of lists where each sublist contains + # the media records associated with the content ID at the same index in the input list + # + # 🔒 If the mediaRecord is associated with courses the user must be a member of at least one of the courses. + mediaRecordsByContentIds(contentIds: [UUID!]!): [[MediaRecord!]!]! + + # Returns all media records for the given CourseIds + # + # 🔒 If the mediaRecord is associated with coursed the user must be a member of at least one of the courses. + mediaRecordsForCourses(courseIds: [UUID!]!): [[MediaRecord!]!]! + + # Returns all media records which were created by the users. + mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! - # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is + # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. - semanticSearch(queryText: String!, count: Int! = 10, courseWhitelist: [UUID!]): [SemanticSearchResult!]! + semanticSearch( + queryText: String! + count: Int! = 10 + courseWhitelist: [UUID!] + ): [SemanticSearchResult!]! # Returns semantic search results of entities that are semantically similar to the entity with the specified ID. # Returns at most `count` results. If `excludeEntitiesWithSameParent` is true, segments from the same entity as the # specified segment will be excluded from the results. - getSemanticallySimilarEntities(segmentId: UUID!, count: Int! = 10, excludeEntitiesWithSameParent: Boolean, courseWhitelist: [UUID!]): [SemanticSearchResult!]! + getSemanticallySimilarEntities( + segmentId: UUID! + count: Int! = 10 + excludeEntitiesWithSameParent: Boolean + courseWhitelist: [UUID!] + ): [SemanticSearchResult!]! } # Generic question interface. @@ -1821,12 +1918,16 @@ type QuizMutation { # Add a multiple choice question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addMultipleChoiceQuestion(input: CreateMultipleChoiceQuestionInput!): Quiz! + _internal_noauth_addMultipleChoiceQuestion( + input: CreateMultipleChoiceQuestionInput! + ): Quiz! # Update a multiple choice question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateMultipleChoiceQuestion(input: UpdateMultipleChoiceQuestionInput!): Quiz! + _internal_noauth_updateMultipleChoiceQuestion( + input: UpdateMultipleChoiceQuestionInput! + ): Quiz! # Add a cloze question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without @@ -1841,22 +1942,30 @@ type QuizMutation { # Add an association question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addAssociationQuestion(input: CreateAssociationQuestionInput!): Quiz! + _internal_noauth_addAssociationQuestion( + input: CreateAssociationQuestionInput! + ): Quiz! # Update an association question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateAssociationQuestion(input: UpdateAssociationQuestionInput!): Quiz! + _internal_noauth_updateAssociationQuestion( + input: UpdateAssociationQuestionInput! + ): Quiz! # Add an free text question with exact answer to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addExactAnswerQuestion(input: CreateExactAnswerQuestionInput!): Quiz! + _internal_noauth_addExactAnswerQuestion( + input: CreateExactAnswerQuestionInput! + ): Quiz! # Update an free text question with exact answer in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateExactAnswerQuestion(input: UpdateExactAnswerQuestionInput!): Quiz! + _internal_noauth_updateExactAnswerQuestion( + input: UpdateExactAnswerQuestionInput! + ): Quiz! # Add a numeric question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without @@ -1866,17 +1975,23 @@ type QuizMutation { # Update a numeric question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateNumericQuestion(input: UpdateNumericQuestionInput!): Quiz! + _internal_noauth_updateNumericQuestion( + input: UpdateNumericQuestionInput! + ): Quiz! # Add a self assessment question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addSelfAssessmentQuestion(input: CreateSelfAssessmentQuestionInput!): Quiz! + _internal_noauth_addSelfAssessmentQuestion( + input: CreateSelfAssessmentQuestionInput! + ): Quiz! # Update a self assessment question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateSelfAssessmentQuestion(input: UpdateSelfAssessmentQuestionInput!): Quiz! + _internal_noauth_updateSelfAssessmentQuestion( + input: UpdateSelfAssessmentQuestionInput! + ): Quiz! # Removes the question with the given number from the quiz. # This will also update the numbers of the following questions. @@ -1893,43 +2008,93 @@ type QuizMutation { # Set the number of questions that are randomly selected from the list of questions. # Will only be considered if questionPoolingMode is RANDOM. - setNumberOfRandomlySelectedQuestions(numberOfRandomlySelectedQuestions: Int!): Quiz! + setNumberOfRandomlySelectedQuestions( + numberOfRandomlySelectedQuestions: Int! + ): Quiz! # Add a multiple choice question to the quiz questions, at the end of the list. - addMultipleChoiceQuestion(questionInput: CreateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addMultipleChoiceQuestion( + questionInput: CreateMultipleChoiceQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a multiple choice question in the quiz questions. - updateMultipleChoiceQuestion(questionInput: UpdateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateMultipleChoiceQuestion( + questionInput: UpdateMultipleChoiceQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a cloze question to the quiz questions, at the end of the list. - addClozeQuestion(questionInput: CreateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addClozeQuestion( + questionInput: CreateClozeQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a cloze question in the quiz questions. - updateClozeQuestion(questionInput: UpdateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateClozeQuestion( + questionInput: UpdateClozeQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add an association question to the quiz questions, at the end of the list. - addAssociationQuestion(questionInput: CreateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addAssociationQuestion( + questionInput: CreateAssociationQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update an association question in the quiz questions. - updateAssociationQuestion(questionInput: UpdateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateAssociationQuestion( + questionInput: UpdateAssociationQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add an free text question with exact answer to the quiz questions, at the end of the list. - addExactAnswerQuestion(questionInput: CreateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addExactAnswerQuestion( + questionInput: CreateExactAnswerQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update an free text question with exact answer in the quiz questions. - updateExactAnswerQuestion(questionInput: UpdateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateExactAnswerQuestion( + questionInput: UpdateExactAnswerQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a numeric question to the quiz questions, at the end of the list. - addNumericQuestion(questionInput: CreateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addNumericQuestion( + questionInput: CreateNumericQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a numeric question in the quiz questions. - updateNumericQuestion(questionInput: UpdateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateNumericQuestion( + questionInput: UpdateNumericQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a self assessment question to the quiz questions, at the end of the list. - addSelfAssessmentQuestion(questionInput: CreateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addSelfAssessmentQuestion( + questionInput: CreateSelfAssessmentQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a self assessment question in the quiz questions. - updateSelfAssessmentQuestion(questionInput: UpdateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateSelfAssessmentQuestion( + questionInput: UpdateSelfAssessmentQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! } type QuizOutput { From f4304f45ab936aed884e0bb0e8cf432894afa512 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Tue, 29 Oct 2024 10:15:12 +0100 Subject: [PATCH 27/33] finish tags --- components/ContentMetadataFormSection.tsx | 2 +- components/MediaContentModal.tsx | 6 +- components/content-link/ContentLink.tsx | 42 +- src/schema.graphql | 466 ++++++++-------------- 4 files changed, 200 insertions(+), 316 deletions(-) diff --git a/components/ContentMetadataFormSection.tsx b/components/ContentMetadataFormSection.tsx index e8cfff9..342b285 100644 --- a/components/ContentMetadataFormSection.tsx +++ b/components/ContentMetadataFormSection.tsx @@ -126,7 +126,7 @@ export function ContentMetadataFormSection({ {suggestedTagsF.length > 0 && ( <>
    Suggested Tags
    -
    +
    {suggestedTagsF.map((tag) => ( setTags([...tags, tag])} diff --git a/components/MediaContentModal.tsx b/components/MediaContentModal.tsx index eff5a7a..1460b3d 100644 --- a/components/MediaContentModal.tsx +++ b/components/MediaContentModal.tsx @@ -57,6 +57,7 @@ export function MediaContentModal({ } mediaRecords { id + suggestedTags __id uploadUrl name @@ -215,7 +216,10 @@ export function MediaContentModal({ ))} x.suggestedTags) ?? + [] + } metadata={metadata} onChange={setMetadata} /> diff --git a/components/content-link/ContentLink.tsx b/components/content-link/ContentLink.tsx index d390b52..f84e9a1 100644 --- a/components/content-link/ContentLink.tsx +++ b/components/content-link/ContentLink.tsx @@ -20,6 +20,7 @@ import { Chip, Typography } from "@mui/material"; import { useRouter } from "next/navigation"; import { graphql, useFragment } from "react-relay"; import colors from "tailwindcss/colors"; +import { NoMaxWidthTooltip } from "../search/SearchResultItem"; import { ProgressFrame } from "./ProgressFrame"; export const ContentTypeToColor: Record = { @@ -73,6 +74,7 @@ export function ContentLink({ metadata { type name + tagNames } userProgressData { ...ProgressFrameFragment @@ -80,12 +82,15 @@ export function ContentLink({ ... on MediaContent { mediaRecords { + id + name type aiProcessingProgress { queuePosition state } - # suggestedTags + suggestedTags + summary } aiProcessingProgress { queuePosition @@ -106,8 +111,9 @@ export function ContentLink({ x.aiProcessingProgress.state === "ENQUEUED" || x.aiProcessingProgress.state === "PROCESSING" ); - const hasSuggestedTags = true; - //content.mediaRecords?.some((x) => x.suggestedTags.length > 0) ?? false; + const hasSuggestedTags = + content.metadata.tagNames.length === 0 && + (content.mediaRecords?.some((x) => x.suggestedTags.length > 0) ?? false); const [pageView] = usePageView(); const typeString = @@ -185,7 +191,7 @@ export function ContentLink({ ? `/courses/${courseId}/quiz/${content.id}` : "-"; - return ( + const body = (
    ); + + if (content.mediaRecords?.some((x) => true)) { + return ( + +
    Summary
    + {content.mediaRecords + .filter((x) => true) + .map((rec) => ( +
    +
    {rec.name}
    +
    {rec.summary || "No summary"}
    +
    + ))} + +
    + Summaries are generated automatically and may contain inaccuracies +
    +
    + } + > + {body} + + ); + } else { + return body; + } } diff --git a/src/schema.graphql b/src/schema.graphql index df11075..e8ac369 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -5,78 +5,35 @@ directive @specifiedBy( ) on SCALAR # see also https://github.com/graphql-java/graphql-java-extended-validation/blob/master/README.md -directive @DecimalMax( - value: String! - inclusive: Boolean! = true - message: String = "graphql.validation.DecimalMax.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @DecimalMin( - value: String! - inclusive: Boolean! = true - message: String = "graphql.validation.DecimalMin.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Max( - value: Int! = 2147483647 - message: String = "graphql.validation.Max.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Min( - value: Int! = 0 - message: String = "graphql.validation.Min.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Negative( - message: String = "graphql.validation.Negative.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NegativeOrZero( - message: String = "graphql.validation.NegativeOrZero.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotBlank( - message: String = "graphql.validation.NotBlank.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotEmpty( - message: String = "graphql.validation.NotEmpty.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerNotEmpty( - message: String = "graphql.validation.ContainerNotEmpty.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Pattern( - regexp: String! = ".*" - message: String = "graphql.validation.Pattern.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Positive( - message: String = "graphql.validation.Positive.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @PositiveOrZero( - message: String = "graphql.validation.PositiveOrZero.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Range( - min: Int = 0 - max: Int = 2147483647 - message: String = "graphql.validation.Range.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Size( - min: Int = 0 - max: Int = 2147483647 - message: String = "graphql.validation.Size.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerSize( - min: Int = 0 - max: Int = 2147483647 - message: String = "graphql.validation.ContainerSize.message" -) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION +directive @DecimalMax(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMax.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @DecimalMin(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMin.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Max(value: Int! = 2147483647, message: String = "graphql.validation.Max.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Min(value: Int! = 0, message: String = "graphql.validation.Min.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Negative(message: String = "graphql.validation.Negative.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NegativeOrZero(message: String = "graphql.validation.NegativeOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotBlank(message: String = "graphql.validation.NotBlank.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotEmpty(message: String = "graphql.validation.NotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerNotEmpty(message: String = "graphql.validation.ContainerNotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Pattern(regexp: String! = ".*", message: String = "graphql.validation.Pattern.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Positive(message: String = "graphql.validation.Positive.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @PositiveOrZero(message: String = "graphql.validation.PositiveOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Range(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Range.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Size(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Size.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerSize(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.ContainerSize.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION # The @OnDemand directive is used to mark fields that are only internally resolved when requested. # Implementation Note: This will cause the code generator to omit the field from the generated DTOs. @@ -85,21 +42,7 @@ directive @OnDemand on FIELD_DEFINITION # Indicates an Input Object is a OneOf Input Object. directive @oneOf on INPUT_OBJECT -directive @resolveTo( - requiredSelectionSet: String - sourceName: String! - sourceTypeName: String! - sourceFieldName: String! - sourceSelectionSet: String - sourceArgs: ResolveToSourceArgs - keyField: String - keysArg: String - pubsubTopic: String - filterBy: String - additionalArgs: ResolveToSourceArgs - result: String - resultType: String -) on FIELD_DEFINITION +directive @resolveTo(requiredSelectionSet: String, sourceName: String!, sourceTypeName: String!, sourceFieldName: String!, sourceSelectionSet: String, sourceArgs: ResolveToSourceArgs, keyField: String, keysArg: String, pubsubTopic: String, filterBy: String, additionalArgs: ResolveToSourceArgs, result: String, resultType: String) on FIELD_DEFINITION type AiEntityProcessingProgress { entityId: UUID! @@ -1035,6 +978,10 @@ type FlashcardSetAssessment implements Assessment & Content { # The FlashcardSet of the assessment. flashcardSet: FlashcardSet + + # The progress of processing the assessment. In particular when processing is done, + # the assessment's task contents will have been indexed for search. + aiProcessingProgress: AiEntityProcessingProgress! } type FlashcardSetMutation { @@ -1055,18 +1002,10 @@ type FlashcardSetMutation { deleteFlashcard(id: UUID!): UUID! # Creates a new flashcard and the linked item - createFlashcard( - item: ItemInput! - assessmentId: UUID! - flashcardInput: CreateFlashcardInput! - ): FlashcardOutput! + createFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: CreateFlashcardInput!): FlashcardOutput! # Creates a new flashcard and the linked item - updateFlashcard( - item: ItemInput! - assessmentId: UUID! - flashcardInput: UpdateFlashcardInput! - ): FlashcardOutput! + updateFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: UpdateFlashcardInput!): FlashcardOutput! } type FlashcardSetProgress { @@ -1283,6 +1222,11 @@ type MediaRecord { # Tags suggested for this media record by the AI system. suggestedTags: [String!]! + + # Gets a short summary/overview of the contents of the media record. Returns a list of strings, + # where each string can be treated as a paragraph. + # If no summary is available, returns an empty list. + summary: [String!]! } type MediaRecordProgressData { @@ -1379,6 +1323,14 @@ type MultipleChoiceQuestion implements Question { } type Mutation { + # Modify a flashcard set. + # 🔒 The user must be an admin the course the flashcard set is in to perform this action. + mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! + + # Logs that a user has learned a flashcard. + # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. + logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! + # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1423,16 +1375,6 @@ type Mutation { # 🔒 The calling user must be an admin in this course to perform this action. deleteMembership(input: CourseMembershipInput!): CourseMembership! - # Modify a flashcard set. - # 🔒 The user must be an admin the course the flashcard set is in to perform this action. - mutateFlashcardSet(assessmentId: UUID!): FlashcardSetMutation! - - # Logs that a user has learned a flashcard. - # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned( - input: LogFlashcardLearnedInput! - ): FlashcardLearnedFeedback! - # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. # # Triggers the recalculation of the skill level of the user. @@ -1440,16 +1382,7 @@ type Mutation { # # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! - @deprecated(reason: "Only for testing purposes. Will be removed.") - - # Modify Content - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateContent(contentId: UUID!): ContentMutation! - - # Modify the section with the given id. - # 🔒 The user must have admin access to the course containing the section to perform this action. - mutateSection(sectionId: UUID!): SectionMutation! + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. # @@ -1458,18 +1391,14 @@ type Mutation { # # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! - @deprecated(reason: "Only for testing purposes. Will be removed.") + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") # Modify a quiz. # 🔒 The user must be an admin the course the quiz is in to perform this action. mutateQuiz(assessmentId: UUID!): QuizMutation! # Delete a quiz. - deleteQuiz(assessmentId: UUID!): UUID! - @deprecated( - reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead." - ) + deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") # Log that a multiple choice quiz is completed. # 🔒 The user must be enrolled in the course the quiz is in to perform this action. @@ -1491,10 +1420,7 @@ type Mutation { # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. # This means that for the content, all already linked media records are removed and replaced by the given ones. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setLinkedMediaRecordsForContent( - contentId: UUID! - mediaRecordIds: [UUID!]! - ): [MediaRecord!]! + setLinkedMediaRecordsForContent(contentId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! # Logs that a media has been worked on by the current user. # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html @@ -1507,28 +1433,24 @@ type Mutation { # Add the MediaRecords with the given UUIDS to the Course with the given UUID. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setMediaRecordsForCourse( - courseId: UUID! - mediaRecordIds: [UUID!]! - ): [MediaRecord!]! + setMediaRecordsForCourse(courseId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! + + # Modify Content + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateContent(contentId: UUID!): ContentMutation! + + # Modify the section with the given id. + # 🔒 The user must have admin access to the course containing the section to perform this action. + mutateSection(sectionId: UUID!): SectionMutation! # Creates a new media content and links the given media records to it. - createMediaContentAndLinkRecords( - contentInput: CreateMediaContentInput! - mediaRecordIds: [UUID!]! - ): MediaContent! + createMediaContentAndLinkRecords(contentInput: CreateMediaContentInput!, mediaRecordIds: [UUID!]!): MediaContent! # Creates a new quiz assessment and a new, linked quiz with the given properties. - createQuizAssessment( - assessmentInput: CreateAssessmentInput! - quizInput: CreateQuizInput! - ): QuizAssessment! + createQuizAssessment(assessmentInput: CreateAssessmentInput!, quizInput: CreateQuizInput!): QuizAssessment! # Creates a new flashcard set assessment and a new, linked flashcard set with the given properties. - createFlashcardSetAssessment( - assessmentInput: CreateAssessmentInput! - flashcardSetInput: CreateFlashcardSetInput! - ): FlashcardSetAssessment + createFlashcardSetAssessment(assessmentInput: CreateAssessmentInput!, flashcardSetInput: CreateFlashcardSetInput!): FlashcardSetAssessment # Creates a new section in a chapter. createSection(input: CreateSectionInput!): Section! @@ -1621,23 +1543,17 @@ type PublicUserInfo { } type Query { - # Get a list of courses. Can be filtered, sorted and paginated. - # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. - courses( - filter: CourseFilter - - # The fields to sort by. - # Throws an error if no field with the given name exists. - sortBy: [String!] + # Gets the publicly available information for a list of users with the specified IDs. + # If a user does not exist, null is returned for that user. + findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - # The sort direction for each field. If not specified, defaults to ASC. - sortDirection: [SortDirection!]! = [ASC] - pagination: Pagination - ): CoursePayload! + # Gets the user information of the currently authorized user. + currentUserInfo: UserInfo! - # Returns the courses with the given ids. - # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. - coursesByIds(ids: [UUID!]!): [Course!]! + # Gets all of the users' information for a list of users with the specified IDs. + # Only available to privileged users. + # If a user does not exist, null is returned for that user. + findUserInfos(ids: [UUID!]!): [UserInfo]! # Get flashcards by their ids. # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. @@ -1653,55 +1569,23 @@ type Query { # 🔒 The user must be enrolled in the course the flashcards belong to. Otherwise an error is thrown. dueFlashcardsByCourseId(courseId: UUID!): [Flashcard!]! - # Gets the publicly available information for a list of users with the specified IDs. - # If a user does not exist, null is returned for that user. - findPublicUserInfos(ids: [UUID!]!): [PublicUserInfo]! - - # Gets the user information of the currently authorized user. - currentUserInfo: UserInfo! - - # Gets all of the users' information for a list of users with the specified IDs. - # Only available to privileged users. - # If a user does not exist, null is returned for that user. - findUserInfos(ids: [UUID!]!): [UserInfo]! - - # Retrieves all existing contents for a given course. - # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. - contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] - - # Get contents by ids. Throws an error if any of the ids are not found. - # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, - # otherwise an error is thrown. - contentsByIds(ids: [UUID!]!): [Content!]! - - # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. - # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned - # for the respective contents. - findContentsByIds(ids: [UUID!]!): [Content]! - - # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents - # associated with that chapter - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. - contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! + # Get a list of courses. Can be filtered, sorted and paginated. + # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. + courses( + filter: CourseFilter - # Generates user specific suggestions for multiple chapters. - # - # Only content that the user can access will be considered. - # The contents will be ranked by suggested date, with the most overdue or most urgent content first. - # - # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. - suggestionsByChapterIds( - # The ids of the chapters for which suggestions should be generated. - chapterIds: [UUID!]! + # The fields to sort by. + # Throws an error if no field with the given name exists. + sortBy: [String!] - # The amount of suggestions to generate in total. - amount: Int! + # The sort direction for each field. If not specified, defaults to ASC. + sortDirection: [SortDirection!]! = [ASC] + pagination: Pagination + ): CoursePayload! - # Only suggestions for these skill types will be generated. - # If no skill types are given, suggestions for all skill types will be generated, - # also containing suggestions for media content (which do not have a skill type). - skillTypes: [SkillType!]! = [] - ): [Suggestion!]! + # Returns the courses with the given ids. + # Courses and their basic data can be queried by any user, even if they are not enrolled in the course. + coursesByIds(ids: [UUID!]!): [Course!]! # Get the reward score of the current user for the specified course. # 🔒 The user must have access to the course with the given id to access their scores, otherwise an error is thrown. @@ -1736,10 +1620,7 @@ type Query { # Returns all media records of the system. # # 🔒 The user must be a super-user, otherwise an exception is thrown. - mediaRecords: [MediaRecord!]! - @deprecated( - reason: "In production there should probably be no way to get all media records of the system." - ) + mediaRecords: [MediaRecord!]! @deprecated(reason: "In production there should probably be no way to get all media records of the system.") # Returns all media records which the current user created. # @@ -1760,23 +1641,52 @@ type Query { # Returns all media records which were created by the users. mediaRecordsForUsers(userIds: [UUID!]!): [[MediaRecord!]!]! - # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is + # Retrieves all existing contents for a given course. + # 🔒 The user must have access to the courses with the given ids to access their contents, otherwise an error is thrown. + contentsByCourseIds(courseIds: [UUID!]!): [[Content!]!] + + # Get contents by ids. Throws an error if any of the ids are not found. + # 🔒 The user must have access to the courses containing the contents with the given ids to access their contents, + # otherwise an error is thrown. + contentsByIds(ids: [UUID!]!): [Content!]! + + # Get contents by ids. If any of the given ids are not found, the corresponding element in the result list will be null. + # 🔒 The user must have access to the courses containing the contents with the given ids, otherwise null is returned + # for the respective contents. + findContentsByIds(ids: [UUID!]!): [Content]! + + # Get contents by chapter ids. Returns a list containing sublists, where each sublist contains all contents + # associated with that chapter + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + contentsByChapterIds(chapterIds: [UUID!]!): [[Content!]!]! + + # Generates user specific suggestions for multiple chapters. + # + # Only content that the user can access will be considered. + # The contents will be ranked by suggested date, with the most overdue or most urgent content first. + # + # 🔒 The user must have access to the courses containing the chapters with the given ids, otherwise an error is thrown. + suggestionsByChapterIds( + # The ids of the chapters for which suggestions should be generated. + chapterIds: [UUID!]! + + # The amount of suggestions to generate in total. + amount: Int! + + # Only suggestions for these skill types will be generated. + # If no skill types are given, suggestions for all skill types will be generated, + # also containing suggestions for media content (which do not have a skill type). + skillTypes: [SkillType!]! = [] + ): [Suggestion!]! + + # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. - semanticSearch( - queryText: String! - count: Int! = 10 - courseWhitelist: [UUID!] - ): [SemanticSearchResult!]! + semanticSearch(queryText: String!, count: Int! = 10, courseWhitelist: [UUID!]): [SemanticSearchResult!]! # Returns semantic search results of entities that are semantically similar to the entity with the specified ID. # Returns at most `count` results. If `excludeEntitiesWithSameParent` is true, segments from the same entity as the # specified segment will be excluded from the results. - getSemanticallySimilarEntities( - segmentId: UUID! - count: Int! = 10 - excludeEntitiesWithSameParent: Boolean - courseWhitelist: [UUID!] - ): [SemanticSearchResult!]! + getSemanticallySimilarEntities(segmentId: UUID!, count: Int! = 10, excludeEntitiesWithSameParent: Boolean, courseWhitelist: [UUID!]): [SemanticSearchResult!]! } # Generic question interface. @@ -1889,6 +1799,10 @@ type QuizAssessment implements Assessment & Content { # The quiz of the assessment. # If this is null the system is in an inconsistent state and the assessment should be deleted. quiz: Quiz + + # The progress of processing the assessment. In particular when processing is done, + # the assessment's task contents will have been indexed for search. + aiProcessingProgress: AiEntityProcessingProgress! } input QuizCompletedInput { @@ -1918,16 +1832,12 @@ type QuizMutation { # Add a multiple choice question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addMultipleChoiceQuestion( - input: CreateMultipleChoiceQuestionInput! - ): Quiz! + _internal_noauth_addMultipleChoiceQuestion(input: CreateMultipleChoiceQuestionInput!): Quiz! # Update a multiple choice question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateMultipleChoiceQuestion( - input: UpdateMultipleChoiceQuestionInput! - ): Quiz! + _internal_noauth_updateMultipleChoiceQuestion(input: UpdateMultipleChoiceQuestionInput!): Quiz! # Add a cloze question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without @@ -1942,30 +1852,22 @@ type QuizMutation { # Add an association question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addAssociationQuestion( - input: CreateAssociationQuestionInput! - ): Quiz! + _internal_noauth_addAssociationQuestion(input: CreateAssociationQuestionInput!): Quiz! # Update an association question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateAssociationQuestion( - input: UpdateAssociationQuestionInput! - ): Quiz! + _internal_noauth_updateAssociationQuestion(input: UpdateAssociationQuestionInput!): Quiz! # Add an free text question with exact answer to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addExactAnswerQuestion( - input: CreateExactAnswerQuestionInput! - ): Quiz! + _internal_noauth_addExactAnswerQuestion(input: CreateExactAnswerQuestionInput!): Quiz! # Update an free text question with exact answer in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateExactAnswerQuestion( - input: UpdateExactAnswerQuestionInput! - ): Quiz! + _internal_noauth_updateExactAnswerQuestion(input: UpdateExactAnswerQuestionInput!): Quiz! # Add a numeric question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without @@ -1975,23 +1877,17 @@ type QuizMutation { # Update a numeric question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateNumericQuestion( - input: UpdateNumericQuestionInput! - ): Quiz! + _internal_noauth_updateNumericQuestion(input: UpdateNumericQuestionInput!): Quiz! # Add a self assessment question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addSelfAssessmentQuestion( - input: CreateSelfAssessmentQuestionInput! - ): Quiz! + _internal_noauth_addSelfAssessmentQuestion(input: CreateSelfAssessmentQuestionInput!): Quiz! # Update a self assessment question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateSelfAssessmentQuestion( - input: UpdateSelfAssessmentQuestionInput! - ): Quiz! + _internal_noauth_updateSelfAssessmentQuestion(input: UpdateSelfAssessmentQuestionInput!): Quiz! # Removes the question with the given number from the quiz. # This will also update the numbers of the following questions. @@ -2008,93 +1904,43 @@ type QuizMutation { # Set the number of questions that are randomly selected from the list of questions. # Will only be considered if questionPoolingMode is RANDOM. - setNumberOfRandomlySelectedQuestions( - numberOfRandomlySelectedQuestions: Int! - ): Quiz! + setNumberOfRandomlySelectedQuestions(numberOfRandomlySelectedQuestions: Int!): Quiz! # Add a multiple choice question to the quiz questions, at the end of the list. - addMultipleChoiceQuestion( - questionInput: CreateMultipleChoiceQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addMultipleChoiceQuestion(questionInput: CreateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update a multiple choice question in the quiz questions. - updateMultipleChoiceQuestion( - questionInput: UpdateMultipleChoiceQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateMultipleChoiceQuestion(questionInput: UpdateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add a cloze question to the quiz questions, at the end of the list. - addClozeQuestion( - questionInput: CreateClozeQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addClozeQuestion(questionInput: CreateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update a cloze question in the quiz questions. - updateClozeQuestion( - questionInput: UpdateClozeQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateClozeQuestion(questionInput: UpdateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add an association question to the quiz questions, at the end of the list. - addAssociationQuestion( - questionInput: CreateAssociationQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addAssociationQuestion(questionInput: CreateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update an association question in the quiz questions. - updateAssociationQuestion( - questionInput: UpdateAssociationQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateAssociationQuestion(questionInput: UpdateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add an free text question with exact answer to the quiz questions, at the end of the list. - addExactAnswerQuestion( - questionInput: CreateExactAnswerQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addExactAnswerQuestion(questionInput: CreateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update an free text question with exact answer in the quiz questions. - updateExactAnswerQuestion( - questionInput: UpdateExactAnswerQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateExactAnswerQuestion(questionInput: UpdateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add a numeric question to the quiz questions, at the end of the list. - addNumericQuestion( - questionInput: CreateNumericQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addNumericQuestion(questionInput: CreateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update a numeric question in the quiz questions. - updateNumericQuestion( - questionInput: UpdateNumericQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateNumericQuestion(questionInput: UpdateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Add a self assessment question to the quiz questions, at the end of the list. - addSelfAssessmentQuestion( - questionInput: CreateSelfAssessmentQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + addSelfAssessmentQuestion(questionInput: CreateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! # Update a self assessment question in the quiz questions. - updateSelfAssessmentQuestion( - questionInput: UpdateSelfAssessmentQuestionInput! - assessmentId: UUID! - item: ItemInput! - ): QuizOutput! + updateSelfAssessmentQuestion(questionInput: UpdateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! } type QuizOutput { From 615e5bf5584b8d867ecca1369200c7b85349d897 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Wed, 30 Oct 2024 10:18:43 +0100 Subject: [PATCH 28/33] course whitelist toggle --- .../media/[mediaId]/SimilarSegments.tsx | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx b/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx index 097bacf..0baa105 100644 --- a/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx +++ b/app/courses/[courseId]/media/[mediaId]/SimilarSegments.tsx @@ -1,6 +1,12 @@ import { SimilarSegmentsQuery } from "@/__generated__/SimilarSegmentsQuery.graphql"; import SearchResultsBox from "@/components/search/SearchResultsBox"; -import { CircularProgress, Drawer } from "@mui/material"; +import { + CircularProgress, + Drawer, + FormControlLabel, + Switch, +} from "@mui/material"; +import { useParams } from "next/navigation"; import { useState, useTransition } from "react"; import { graphql, useLazyLoadQuery } from "react-relay"; import useBus from "use-bus"; @@ -15,16 +21,30 @@ export function SimilarSegments() { } }); + const params = useParams(); + const [onlySameCourse, setOnlySameCourse] = useState(true); + const segments = useLazyLoadQuery( graphql` - query SimilarSegmentsQuery($segmentId: UUID!, $skip: Boolean!) { - getSemanticallySimilarEntities(segmentId: $segmentId, count: 10) - @skip(if: $skip) { + query SimilarSegmentsQuery( + $segmentId: UUID! + $skip: Boolean! + $whitelist: [UUID!] + ) { + getSemanticallySimilarEntities( + segmentId: $segmentId + count: 10 + courseWhitelist: $whitelist + ) @skip(if: $skip) { ...SearchResultsBox } } `, - { segmentId: segmentId!, skip: !segmentId } + { + segmentId: segmentId!, + skip: !segmentId, + whitelist: onlySameCourse ? [params.courseId] : undefined, + } ); return ( @@ -33,7 +53,20 @@ export function SimilarSegments() { onClose={() => setSegmentId(null)} anchor="right" > -
    +
    + {params.courseId && ( + setOnlySameCourse(e.target.checked)} + /> + } + label="Only search the current course" + /> + )} + {isLoading && (
    From c81ba49ff899a7856fa486e3276ca6512d034d24 Mon Sep 17 00:00:00 2001 From: Rick Zolnierek Date: Thu, 31 Oct 2024 12:40:05 +0100 Subject: [PATCH 29/33] fix some issues with mediarecords --- components/MediaContentModal.tsx | 1 + components/MediaRecordSelector.tsx | 4 ++++ components/Navbar.tsx | 10 +++++----- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/components/MediaContentModal.tsx b/components/MediaContentModal.tsx index 1460b3d..1a8ee4a 100644 --- a/components/MediaContentModal.tsx +++ b/components/MediaContentModal.tsx @@ -106,6 +106,7 @@ export function MediaContentModal({ name downloadUrl type + suggestedTags } __typename } diff --git a/components/MediaRecordSelector.tsx b/components/MediaRecordSelector.tsx index 66f2369..d137225 100644 --- a/components/MediaRecordSelector.tsx +++ b/components/MediaRecordSelector.tsx @@ -85,6 +85,7 @@ export function MediaRecordSelector({ downloadUrl contentIds type + suggestedTags } } @@ -98,6 +99,7 @@ export function MediaRecordSelector({ downloadUrl contentIds type + suggestedTags } } } @@ -118,6 +120,7 @@ export function MediaRecordSelector({ downloadUrl contentIds type + suggestedTags } } `); @@ -288,6 +291,7 @@ export function MediaRecordSelector({ downloadUrl contentIds type + suggestedTags } } `); diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 18da8b8..bc10846 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -178,11 +178,11 @@ function NavbarBase({ return seg.mediaRecord.contents .filter((x) => !!x) .map((content) => ({ - breadcrumbs: `${content.metadata.course.title} › ${content.metadata.name}`, + breadcrumbs: `${content!.metadata.course.title} › ${content!.metadata.name}`, title: seg.mediaRecord.name, position: `Page ${seg.page + 1}`, - url: `/courses/${content.metadata.course.id}/media/${ - content.id + url: `/courses/${content!.metadata.course.id}/media/${ + content!.id }?selectedDocument=${seg.mediaRecord.id}&page=${seg.page + 1}`, })); } else if ( @@ -193,12 +193,12 @@ function NavbarBase({ return seg.mediaRecord.contents .filter((x) => !!x) .map((content) => ({ - breadcrumbs: `${content.metadata.course.title} › ${content.metadata.name}`, + breadcrumbs: `${content!.metadata.course.title} › ${content!.metadata.name}`, title: seg.mediaRecord.name, position: dayjs .duration(seg.startTime ?? 0, "seconds") .format("HH:mm:ss"), - url: `/courses/${content.metadata.course.id}/media/${content.id}?selectedVideo=${seg.mediaRecord.id}&videoPosition=${seg.startTime}`, + url: `/courses/${content!.metadata.course.id}/media/${content!.id}?selectedVideo=${seg.mediaRecord.id}&videoPosition=${seg.startTime}`, })); } else if ( x.assessment && From 8cf1076c07a885bbcfc8cb69d1966b48e990921a Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Sat, 2 Nov 2024 10:15:45 +0100 Subject: [PATCH 30/33] use standardized download url --- .../media/[mediaId]/DocumentSide.tsx | 6 +- src/schema.graphql | 311 ++++++++++++++---- 2 files changed, 248 insertions(+), 69 deletions(-) diff --git a/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx b/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx index 9a0ec36..cc4b15a 100644 --- a/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx +++ b/app/courses/[courseId]/media/[mediaId]/DocumentSide.tsx @@ -53,7 +53,9 @@ export function DocumentSide({ ...ContentMediaDisplayFragment type name - downloadUrl + + standardizedDownloadUrl + userProgressData { dateWorkedOn } @@ -167,7 +169,7 @@ export function DocumentSide({
    } > diff --git a/src/schema.graphql b/src/schema.graphql index e8ac369..84d4d36 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -5,35 +5,78 @@ directive @specifiedBy( ) on SCALAR # see also https://github.com/graphql-java/graphql-java-extended-validation/blob/master/README.md -directive @DecimalMax(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMax.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @DecimalMin(value: String!, inclusive: Boolean! = true, message: String = "graphql.validation.DecimalMin.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Max(value: Int! = 2147483647, message: String = "graphql.validation.Max.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Min(value: Int! = 0, message: String = "graphql.validation.Min.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Negative(message: String = "graphql.validation.Negative.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NegativeOrZero(message: String = "graphql.validation.NegativeOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotBlank(message: String = "graphql.validation.NotBlank.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @NotEmpty(message: String = "graphql.validation.NotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerNotEmpty(message: String = "graphql.validation.ContainerNotEmpty.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Pattern(regexp: String! = ".*", message: String = "graphql.validation.Pattern.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Positive(message: String = "graphql.validation.Positive.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @PositiveOrZero(message: String = "graphql.validation.PositiveOrZero.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Range(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Range.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @Size(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.Size.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION - -directive @ContainerSize(min: Int = 0, max: Int = 2147483647, message: String = "graphql.validation.ContainerSize.message") on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION +directive @DecimalMax( + value: String! + inclusive: Boolean! = true + message: String = "graphql.validation.DecimalMax.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @DecimalMin( + value: String! + inclusive: Boolean! = true + message: String = "graphql.validation.DecimalMin.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Max( + value: Int! = 2147483647 + message: String = "graphql.validation.Max.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Min( + value: Int! = 0 + message: String = "graphql.validation.Min.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Negative( + message: String = "graphql.validation.Negative.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NegativeOrZero( + message: String = "graphql.validation.NegativeOrZero.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotBlank( + message: String = "graphql.validation.NotBlank.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @NotEmpty( + message: String = "graphql.validation.NotEmpty.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerNotEmpty( + message: String = "graphql.validation.ContainerNotEmpty.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Pattern( + regexp: String! = ".*" + message: String = "graphql.validation.Pattern.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Positive( + message: String = "graphql.validation.Positive.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @PositiveOrZero( + message: String = "graphql.validation.PositiveOrZero.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Range( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.Range.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @Size( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.Size.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION + +directive @ContainerSize( + min: Int = 0 + max: Int = 2147483647 + message: String = "graphql.validation.ContainerSize.message" +) on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION # The @OnDemand directive is used to mark fields that are only internally resolved when requested. # Implementation Note: This will cause the code generator to omit the field from the generated DTOs. @@ -42,7 +85,21 @@ directive @OnDemand on FIELD_DEFINITION # Indicates an Input Object is a OneOf Input Object. directive @oneOf on INPUT_OBJECT -directive @resolveTo(requiredSelectionSet: String, sourceName: String!, sourceTypeName: String!, sourceFieldName: String!, sourceSelectionSet: String, sourceArgs: ResolveToSourceArgs, keyField: String, keysArg: String, pubsubTopic: String, filterBy: String, additionalArgs: ResolveToSourceArgs, result: String, resultType: String) on FIELD_DEFINITION +directive @resolveTo( + requiredSelectionSet: String + sourceName: String! + sourceTypeName: String! + sourceFieldName: String! + sourceSelectionSet: String + sourceArgs: ResolveToSourceArgs + keyField: String + keysArg: String + pubsubTopic: String + filterBy: String + additionalArgs: ResolveToSourceArgs + result: String + resultType: String +) on FIELD_DEFINITION type AiEntityProcessingProgress { entityId: UUID! @@ -1002,10 +1059,18 @@ type FlashcardSetMutation { deleteFlashcard(id: UUID!): UUID! # Creates a new flashcard and the linked item - createFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: CreateFlashcardInput!): FlashcardOutput! + createFlashcard( + item: ItemInput! + assessmentId: UUID! + flashcardInput: CreateFlashcardInput! + ): FlashcardOutput! # Creates a new flashcard and the linked item - updateFlashcard(item: ItemInput!, assessmentId: UUID!, flashcardInput: UpdateFlashcardInput!): FlashcardOutput! + updateFlashcard( + item: ItemInput! + assessmentId: UUID! + flashcardInput: UpdateFlashcardInput! + ): FlashcardOutput! } type FlashcardSetProgress { @@ -1193,6 +1258,16 @@ type MediaRecord { # Temporary download url for the media record downloadUrl: String! + """ + Temporary download url for the media record where, if the media record is uploaded in a non-standardized format, a + converted version of that file is served. + + For documents, this is a PDF version of the document. + + May be NULL if no standardized version is available. + """ + standardizedDownloadUrl: String + # Temporary upload url for the media record which can only be used from within the system. # (This is necessary because the MinIO pre-signed URLs cannot be changed, meaning we cannot use the same URL for both # internal and external access because the hostname changes.) @@ -1329,7 +1404,9 @@ type Mutation { # Logs that a user has learned a flashcard. # 🔒 The user must be enrolled in the course the flashcard set is in to perform this action. - logFlashcardLearned(input: LogFlashcardLearnedInput!): FlashcardLearnedFeedback! + logFlashcardLearned( + input: LogFlashcardLearnedInput! + ): FlashcardLearnedFeedback! # Creates a new course with the given input and returns the created course. createCourse(input: CreateCourseInput!): Course! @@ -1382,7 +1459,8 @@ type Mutation { # # The purpose of this mutation is to allow testing of the skill level score and demonstrate the functionality. # 🔒 The user must be a super-user, otherwise an exception is thrown. - recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! @deprecated(reason: "Only for testing purposes. Will be removed.") + recalculateLevels(chapterId: UUID!, userId: UUID!): SkillLevels! + @deprecated(reason: "Only for testing purposes. Will be removed.") # ONLY FOR TESTING PURPOSES. DO NOT USE IN FRONTEND. WILL BE REMOVED. # @@ -1391,14 +1469,18 @@ type Mutation { # # The purpose of this mutation is to allow testing of the reward score and demonstrate the functionality. # 🔒 The user be an admin in the course with the given courseId to perform this action. - recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! @deprecated(reason: "Only for testing purposes. Will be removed.") + recalculateScores(courseId: UUID!, userId: UUID!): RewardScores! + @deprecated(reason: "Only for testing purposes. Will be removed.") # Modify a quiz. # 🔒 The user must be an admin the course the quiz is in to perform this action. mutateQuiz(assessmentId: UUID!): QuizMutation! # Delete a quiz. - deleteQuiz(assessmentId: UUID!): UUID! @deprecated(reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead.") + deleteQuiz(assessmentId: UUID!): UUID! + @deprecated( + reason: "Only use if you specifically only want to delete the quiz and not the whole assessment. Otherwise, use deleteAssessment in contents service instead." + ) # Log that a multiple choice quiz is completed. # 🔒 The user must be enrolled in the course the quiz is in to perform this action. @@ -1420,7 +1502,10 @@ type Mutation { # For a given MediaContent, sets the linked media records of it to the ones with the given UUIDs. # This means that for the content, all already linked media records are removed and replaced by the given ones. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setLinkedMediaRecordsForContent(contentId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! + setLinkedMediaRecordsForContent( + contentId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! # Logs that a media has been worked on by the current user. # See https://gits-enpro.readthedocs.io/en/latest/dev-manuals/gamification/userProgress.html @@ -1433,7 +1518,10 @@ type Mutation { # Add the MediaRecords with the given UUIDS to the Course with the given UUID. # 🔒 If the mediaRecord is associated with courses the user must be an administrator of at least one of the courses. - setMediaRecordsForCourse(courseId: UUID!, mediaRecordIds: [UUID!]!): [MediaRecord!]! + setMediaRecordsForCourse( + courseId: UUID! + mediaRecordIds: [UUID!]! + ): [MediaRecord!]! # Modify Content # 🔒 The user must have admin access to the course containing the section to perform this action. @@ -1444,13 +1532,22 @@ type Mutation { mutateSection(sectionId: UUID!): SectionMutation! # Creates a new media content and links the given media records to it. - createMediaContentAndLinkRecords(contentInput: CreateMediaContentInput!, mediaRecordIds: [UUID!]!): MediaContent! + createMediaContentAndLinkRecords( + contentInput: CreateMediaContentInput! + mediaRecordIds: [UUID!]! + ): MediaContent! # Creates a new quiz assessment and a new, linked quiz with the given properties. - createQuizAssessment(assessmentInput: CreateAssessmentInput!, quizInput: CreateQuizInput!): QuizAssessment! + createQuizAssessment( + assessmentInput: CreateAssessmentInput! + quizInput: CreateQuizInput! + ): QuizAssessment! # Creates a new flashcard set assessment and a new, linked flashcard set with the given properties. - createFlashcardSetAssessment(assessmentInput: CreateAssessmentInput!, flashcardSetInput: CreateFlashcardSetInput!): FlashcardSetAssessment + createFlashcardSetAssessment( + assessmentInput: CreateAssessmentInput! + flashcardSetInput: CreateFlashcardSetInput! + ): FlashcardSetAssessment # Creates a new section in a chapter. createSection(input: CreateSectionInput!): Section! @@ -1620,7 +1717,10 @@ type Query { # Returns all media records of the system. # # 🔒 The user must be a super-user, otherwise an exception is thrown. - mediaRecords: [MediaRecord!]! @deprecated(reason: "In production there should probably be no way to get all media records of the system.") + mediaRecords: [MediaRecord!]! + @deprecated( + reason: "In production there should probably be no way to get all media records of the system." + ) # Returns all media records which the current user created. # @@ -1679,14 +1779,23 @@ type Query { skillTypes: [SkillType!]! = [] ): [Suggestion!]! - # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is + # Performs a semantic search with the specified search term. Returns at most `count` results. If a courseWhitelist is # provided, only results from the specified courses will be returned. - semanticSearch(queryText: String!, count: Int! = 10, courseWhitelist: [UUID!]): [SemanticSearchResult!]! + semanticSearch( + queryText: String! + count: Int! = 10 + courseWhitelist: [UUID!] + ): [SemanticSearchResult!]! # Returns semantic search results of entities that are semantically similar to the entity with the specified ID. # Returns at most `count` results. If `excludeEntitiesWithSameParent` is true, segments from the same entity as the # specified segment will be excluded from the results. - getSemanticallySimilarEntities(segmentId: UUID!, count: Int! = 10, excludeEntitiesWithSameParent: Boolean, courseWhitelist: [UUID!]): [SemanticSearchResult!]! + getSemanticallySimilarEntities( + segmentId: UUID! + count: Int! = 10 + excludeEntitiesWithSameParent: Boolean + courseWhitelist: [UUID!] + ): [SemanticSearchResult!]! } # Generic question interface. @@ -1832,12 +1941,16 @@ type QuizMutation { # Add a multiple choice question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addMultipleChoiceQuestion(input: CreateMultipleChoiceQuestionInput!): Quiz! + _internal_noauth_addMultipleChoiceQuestion( + input: CreateMultipleChoiceQuestionInput! + ): Quiz! # Update a multiple choice question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateMultipleChoiceQuestion(input: UpdateMultipleChoiceQuestionInput!): Quiz! + _internal_noauth_updateMultipleChoiceQuestion( + input: UpdateMultipleChoiceQuestionInput! + ): Quiz! # Add a cloze question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without @@ -1852,22 +1965,30 @@ type QuizMutation { # Add an association question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addAssociationQuestion(input: CreateAssociationQuestionInput!): Quiz! + _internal_noauth_addAssociationQuestion( + input: CreateAssociationQuestionInput! + ): Quiz! # Update an association question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateAssociationQuestion(input: UpdateAssociationQuestionInput!): Quiz! + _internal_noauth_updateAssociationQuestion( + input: UpdateAssociationQuestionInput! + ): Quiz! # Add an free text question with exact answer to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addExactAnswerQuestion(input: CreateExactAnswerQuestionInput!): Quiz! + _internal_noauth_addExactAnswerQuestion( + input: CreateExactAnswerQuestionInput! + ): Quiz! # Update an free text question with exact answer in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateExactAnswerQuestion(input: UpdateExactAnswerQuestionInput!): Quiz! + _internal_noauth_updateExactAnswerQuestion( + input: UpdateExactAnswerQuestionInput! + ): Quiz! # Add a numeric question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without @@ -1877,17 +1998,23 @@ type QuizMutation { # Update a numeric question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateNumericQuestion(input: UpdateNumericQuestionInput!): Quiz! + _internal_noauth_updateNumericQuestion( + input: UpdateNumericQuestionInput! + ): Quiz! # Add a self assessment question to the quiz questions, at the end of the list. # ️⚠️ This query is only accessible internally in the system and allows the caller to create a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_addSelfAssessmentQuestion(input: CreateSelfAssessmentQuestionInput!): Quiz! + _internal_noauth_addSelfAssessmentQuestion( + input: CreateSelfAssessmentQuestionInput! + ): Quiz! # Update a self assessment question in the quiz questions. # ️⚠️ This query is only accessible internally in the system and allows the caller to update a Question without # any permissions check and should not be called without any validation of the caller's permissions. ⚠️ - _internal_noauth_updateSelfAssessmentQuestion(input: UpdateSelfAssessmentQuestionInput!): Quiz! + _internal_noauth_updateSelfAssessmentQuestion( + input: UpdateSelfAssessmentQuestionInput! + ): Quiz! # Removes the question with the given number from the quiz. # This will also update the numbers of the following questions. @@ -1904,43 +2031,93 @@ type QuizMutation { # Set the number of questions that are randomly selected from the list of questions. # Will only be considered if questionPoolingMode is RANDOM. - setNumberOfRandomlySelectedQuestions(numberOfRandomlySelectedQuestions: Int!): Quiz! + setNumberOfRandomlySelectedQuestions( + numberOfRandomlySelectedQuestions: Int! + ): Quiz! # Add a multiple choice question to the quiz questions, at the end of the list. - addMultipleChoiceQuestion(questionInput: CreateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addMultipleChoiceQuestion( + questionInput: CreateMultipleChoiceQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a multiple choice question in the quiz questions. - updateMultipleChoiceQuestion(questionInput: UpdateMultipleChoiceQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateMultipleChoiceQuestion( + questionInput: UpdateMultipleChoiceQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a cloze question to the quiz questions, at the end of the list. - addClozeQuestion(questionInput: CreateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addClozeQuestion( + questionInput: CreateClozeQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a cloze question in the quiz questions. - updateClozeQuestion(questionInput: UpdateClozeQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateClozeQuestion( + questionInput: UpdateClozeQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add an association question to the quiz questions, at the end of the list. - addAssociationQuestion(questionInput: CreateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addAssociationQuestion( + questionInput: CreateAssociationQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update an association question in the quiz questions. - updateAssociationQuestion(questionInput: UpdateAssociationQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateAssociationQuestion( + questionInput: UpdateAssociationQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add an free text question with exact answer to the quiz questions, at the end of the list. - addExactAnswerQuestion(questionInput: CreateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addExactAnswerQuestion( + questionInput: CreateExactAnswerQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update an free text question with exact answer in the quiz questions. - updateExactAnswerQuestion(questionInput: UpdateExactAnswerQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateExactAnswerQuestion( + questionInput: UpdateExactAnswerQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a numeric question to the quiz questions, at the end of the list. - addNumericQuestion(questionInput: CreateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addNumericQuestion( + questionInput: CreateNumericQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a numeric question in the quiz questions. - updateNumericQuestion(questionInput: UpdateNumericQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateNumericQuestion( + questionInput: UpdateNumericQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Add a self assessment question to the quiz questions, at the end of the list. - addSelfAssessmentQuestion(questionInput: CreateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + addSelfAssessmentQuestion( + questionInput: CreateSelfAssessmentQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! # Update a self assessment question in the quiz questions. - updateSelfAssessmentQuestion(questionInput: UpdateSelfAssessmentQuestionInput!, assessmentId: UUID!, item: ItemInput!): QuizOutput! + updateSelfAssessmentQuestion( + questionInput: UpdateSelfAssessmentQuestionInput! + assessmentId: UUID! + item: ItemInput! + ): QuizOutput! } type QuizOutput { From 6b6ebbfa31eae44ff0bef5b5774c022bd55aaaa0 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Sat, 2 Nov 2024 10:45:51 +0100 Subject: [PATCH 31/33] fixes --- components/MediaRecordSelector.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/MediaRecordSelector.tsx b/components/MediaRecordSelector.tsx index 66f2369..d476d79 100644 --- a/components/MediaRecordSelector.tsx +++ b/components/MediaRecordSelector.tsx @@ -85,6 +85,7 @@ export function MediaRecordSelector({ downloadUrl contentIds type + suggestedTags } } @@ -98,6 +99,7 @@ export function MediaRecordSelector({ downloadUrl contentIds type + suggestedTags } } } @@ -118,6 +120,7 @@ export function MediaRecordSelector({ downloadUrl contentIds type + suggestedTags } } `); From 7d31b377ac5c81e1452a5c166b278e949799d6c3 Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Sat, 2 Nov 2024 13:38:00 +0100 Subject: [PATCH 32/33] fmt --- components/Navbar.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/components/Navbar.tsx b/components/Navbar.tsx index bc10846..b171994 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -178,7 +178,9 @@ function NavbarBase({ return seg.mediaRecord.contents .filter((x) => !!x) .map((content) => ({ - breadcrumbs: `${content!.metadata.course.title} › ${content!.metadata.name}`, + breadcrumbs: `${content!.metadata.course.title} › ${ + content!.metadata.name + }`, title: seg.mediaRecord.name, position: `Page ${seg.page + 1}`, url: `/courses/${content!.metadata.course.id}/media/${ @@ -193,12 +195,18 @@ function NavbarBase({ return seg.mediaRecord.contents .filter((x) => !!x) .map((content) => ({ - breadcrumbs: `${content!.metadata.course.title} › ${content!.metadata.name}`, + breadcrumbs: `${content!.metadata.course.title} › ${ + content!.metadata.name + }`, title: seg.mediaRecord.name, position: dayjs .duration(seg.startTime ?? 0, "seconds") .format("HH:mm:ss"), - url: `/courses/${content!.metadata.course.id}/media/${content!.id}?selectedVideo=${seg.mediaRecord.id}&videoPosition=${seg.startTime}`, + url: `/courses/${content!.metadata.course.id}/media/${ + content!.id + }?selectedVideo=${seg.mediaRecord.id}&videoPosition=${ + seg.startTime + }`, })); } else if ( x.assessment && @@ -263,6 +271,7 @@ function NavbarBase({ autoHighlight open={isSearchPopupOpen} value={null} + getOptionLabel={(x) => ""} onChange={(_, newVal) => { if (typeof newVal == "string") { router.push(`/search?query=${newVal}`); From 9a017f9ae3f6d083d8fc9c8d08dd8204e72af27e Mon Sep 17 00:00:00 2001 From: Valentin Morlock Date: Sun, 3 Nov 2024 13:11:58 +0100 Subject: [PATCH 33/33] standardized url --- .../[courseId]/media/[mediaId]/ContentMediaDisplay.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay.tsx b/app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay.tsx index a8de06c..8903a3b 100644 --- a/app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay.tsx +++ b/app/courses/[courseId]/media/[mediaId]/ContentMediaDisplay.tsx @@ -24,6 +24,7 @@ export function ContentMediaDisplay({ fragment ContentMediaDisplayFragment on MediaRecord { type name + standardizedDownloadUrl downloadUrl ...ContentMediaDisplayVideoFragment } @@ -39,7 +40,7 @@ export function ContentMediaDisplay({ return ( ); case "IMAGE": @@ -47,7 +48,7 @@ export function ContentMediaDisplay({ return ( {mediaRecord.name} ); @@ -66,6 +67,7 @@ export function VideoPlayer({ fragment ContentMediaDisplayVideoFragment on MediaRecord { type name + standardizedDownloadUrl downloadUrl segments { id @@ -82,7 +84,9 @@ export function VideoPlayer({ ); return ( - +