From 400525debb53b71ab2cdff693ff5809c9f3bf531 Mon Sep 17 00:00:00 2001 From: nxglabs Date: Mon, 7 Jul 2025 18:07:24 +0000 Subject: [PATCH 01/12] Merge pull request #960 from nxglabs/fix_customlogo fix: custom applogo not visible in header --- apps/OpenSign/src/components/Header.jsx | 28 +++++++++++-------------- apps/OpenSign/src/constant/Utils.jsx | 5 ++++- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/apps/OpenSign/src/components/Header.jsx b/apps/OpenSign/src/components/Header.jsx index bad3eef04f..84f175fd53 100644 --- a/apps/OpenSign/src/components/Header.jsx +++ b/apps/OpenSign/src/components/Header.jsx @@ -21,6 +21,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { const image = localStorage.getItem("profileImg") || dp; const [isOpen, setIsOpen] = useState(false); const [applogo, setAppLogo] = useState(""); + const [isDarkTheme, setIsDarkTheme] = useState(); const toggleDropdown = () => { setIsOpen(!isOpen); @@ -88,22 +89,15 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { useEffect(() => { - const updateLogoForTheme = () => { - const isDarkMode = + const updateThemeStatus = () => { + const isDarkTheme = document.documentElement.getAttribute("data-theme") === "opensigndark"; - const logo = isDarkMode - ? "/static/js/assets/images/logo-dark.png" // Path to the dark mode logo - : appInfo.applogo; // Use current logo for light mode - if (applogo !== logo) { - setAppLogo(logo); - } + setIsDarkTheme(isDarkTheme); }; - - // Set the logo immediately based on the current theme - updateLogoForTheme(); + updateThemeStatus(); const observer = new MutationObserver(() => { - updateLogoForTheme(); + updateThemeStatus(); }); observer.observe(document.documentElement, { @@ -112,7 +106,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { }); return () => observer.disconnect(); - }, [applogo]); + }, []); return (
@@ -129,9 +123,11 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => {
{applogo && ( logo )}
diff --git a/apps/OpenSign/src/constant/Utils.jsx b/apps/OpenSign/src/constant/Utils.jsx index eec11dcc5c..af01d46e61 100644 --- a/apps/OpenSign/src/constant/Utils.jsx +++ b/apps/OpenSign/src/constant/Utils.jsx @@ -2414,7 +2414,10 @@ export const getAppLogo = async () => { }); if (tenant) { localStorage.setItem("appname", "OpenSign™"); - return { logo: tenant?.logo, user: tenant?.user }; + return { + logo: tenant?.logo, + user: tenant?.user + }; } } catch (err) { console.log("err in getlogo ", err); From fda9fb534b71c39aa5ff3dfda74d96830967a1ad Mon Sep 17 00:00:00 2001 From: nxglabs Date: Tue, 8 Jul 2025 13:27:37 +0000 Subject: [PATCH 02/12] Merge pull request #963 from nxglabs/staging v2.26.1 --- .../public/locales/de/translation.json | 1 + .../public/locales/en/translation.json | 1 + .../public/locales/es/translation.json | 1 + .../public/locales/fr/translation.json | 1 + .../public/locales/hi/translation.json | 1 + .../public/locales/it/translation.json | 1 + apps/OpenSign/src/components/Header.jsx | 2 + .../src/components/pdf/PlaceholderType.jsx | 8 +- .../src/components/pdf/WidgetsValueModal.jsx | 68 +++--- apps/OpenSign/src/constant/Utils.jsx | 199 ++++++++++++------ 10 files changed, 181 insertions(+), 102 deletions(-) diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index 6752f2a1eb..293fa9b412 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -379,6 +379,7 @@ "certificate": "Zertifikat", "decline": "Ablehnen", "finish": "Fertigstellen", + "done": "Fertig", "mail": "E-Mail", "sign-now": "Jetzt unterzeichnen", "successfully-signed": "Erfolgreich unterzeichnet!", diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 631c208151..2b1359f8f8 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -379,6 +379,7 @@ "certificate": "Certificate", "decline": "Decline", "finish": "Finish", + "done": "Done", "mail": "Mail", "sign-now": "Sign now", "successfully-signed": "Successfully signed!", diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index 4107b314ae..6a6166eb18 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -380,6 +380,7 @@ "certificate": "Certificado", "decline": "Rechazar", "finish": "Finalizar", + "done": "Hecho", "mail": "Correo", "sign-now": "Firmar ahora", "successfully-signed": "¡Firmado exitosamente!", diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index 47880ca684..3462048f5d 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -379,6 +379,7 @@ "certificate": "Certificat", "decline": "refusé", "finish": "terminé", + "done": "Terminé", "mail": "Mail", "sign-now": "Signez maintenant", "successfully-signed": "Signé avec succès !", diff --git a/apps/OpenSign/public/locales/hi/translation.json b/apps/OpenSign/public/locales/hi/translation.json index ce5dcf1278..4ef0783ad8 100644 --- a/apps/OpenSign/public/locales/hi/translation.json +++ b/apps/OpenSign/public/locales/hi/translation.json @@ -379,6 +379,7 @@ "certificate": "प्रमाण पत्र", "decline": "अस्वीकार करें", "finish": "समाप्त करें", + "done": "हो गया", "mail": "मेल", "sign-now": "अभी हस्ताक्षर करें", "successfully-signed": "सफलतापूर्वक हस्ताक्षर किए गए!", diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index 660ddeeb47..425140fd7b 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -379,6 +379,7 @@ "certificate": "Certificato", "decline": "Rifiuta", "finish": "Completa", + "done": "Fatto", "mail": "Email", "sign-now": "Firma ora", "successfully-signed": "Firmato con successo!", diff --git a/apps/OpenSign/src/components/Header.jsx b/apps/OpenSign/src/components/Header.jsx index 84f175fd53..e189b4a6cb 100644 --- a/apps/OpenSign/src/components/Header.jsx +++ b/apps/OpenSign/src/components/Header.jsx @@ -123,11 +123,13 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => {
{applogo && ( logo )}
diff --git a/apps/OpenSign/src/components/pdf/PlaceholderType.jsx b/apps/OpenSign/src/components/pdf/PlaceholderType.jsx index d69ba20077..84f06d7917 100644 --- a/apps/OpenSign/src/components/pdf/PlaceholderType.jsx +++ b/apps/OpenSign/src/components/pdf/PlaceholderType.jsx @@ -108,7 +108,7 @@ function PlaceholderType(props) { alt="signature" draggable="false" src={props.pos.SignUrl} - className="w-full h-full select-none-cls " + className={`${props.pos.signatureType !== "type" ? "object-contain" : ""} w-full h-full select-none-cls`} /> ) : (
@@ -132,7 +132,7 @@ function PlaceholderType(props) { alt="stamp" draggable="false" src={props.pos.SignUrl} - className="w-full h-full select-none-cls" + className="w-full h-full select-none-cls object-contain" /> ) : (
@@ -253,7 +253,7 @@ function PlaceholderType(props) { alt="initials" draggable="false" src={props.pos.SignUrl} - className="w-full h-full select-none-cls" + className={`${props.pos.signatureType !== "type" ? "object-contain" : ""} w-full h-full select-none-cls`} /> ) : (
@@ -402,7 +402,7 @@ function PlaceholderType(props) { alt="image" draggable="false" src={props.pos.SignUrl} - className="w-full h-full select-none-cls" + className="w-full h-full select-none-cls object-contain" /> ) : (
diff --git a/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx b/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx index fb1cc4fe08..4beff60106 100644 --- a/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx +++ b/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx @@ -18,7 +18,8 @@ import { cellsWidget, textWidget, years, - convertTextToImg + convertTextToImg, + convertJpegToPng } from "../../constant/Utils"; import CellsWidget from "./CellsWidget"; import DatePicker from "react-datepicker"; @@ -110,7 +111,6 @@ function WidgetsValueModal(props) { const [signature, setSignature] = useState(); const [isImageSelect, setIsImageSelect] = useState(false); const [isFinish, setIsFinish] = useState(false); - const [imgWH, setImgWH] = useState({}); const [fontSelect, setFontSelect] = useState(fontOptions[0].value); const [isSavedSign, setIsSavedSign] = useState(false); const [isAutoSign, setIsAutoSign] = useState(false); @@ -257,11 +257,11 @@ function WidgetsValueModal(props) { setOriginalImage(null); // Reset original image when a new file is selected setRemoveBgEnabled(false); // Optionally reset toggle // Ensure compressedFileSize calls setImage, which then triggers the useEffect for BG removal. - compressedFileSize(file, setImgWH, setImage); + compressedFileSize(file, setImage); } }; //function is used to save image,stamp widgets data - const handleSaveImage = () => { + const handleSaveImage = (signatureType) => { const widgetsType = currWidgetsDetails?.type; //`isApplyAll` is used when user edit stamp then updated signature apply all existing drawn signatures const isApplyAll = true; @@ -278,10 +278,10 @@ function WidgetsValueModal(props) { // Get updated placeholder list const updatedPlaceholders = onSaveImage( + signatureType, signer.placeHolder, index, currWidgetsDetails?.key, - imgWH, image, isAutoSign, widgetsType, @@ -299,11 +299,13 @@ function WidgetsValueModal(props) { return object.pageNumber === pageNumber; }); const getImage = onSaveImage( + signatureType, props?.xyPosition, index, currWidgetsDetails?.key, - imgWH, - image + image, + false, + widgetsType ); setXyPosition(getImage); } @@ -311,36 +313,28 @@ function WidgetsValueModal(props) { }; //function is used to save draw type or initial type signature - const handleSaveSignature = ( - type, + const handleSaveSignature = async ( + signType, isDefaultSign, width, height, typedSignature ) => { - //get current click widget type + // get current click widget type const widgetsType = currWidgetsDetails?.type; - //if there are any width and height then it will typed signature + // if there are any width and height then it will typed signature const isTypeText = width && height ? true : false; - //final getting signature url via default select sign/default initial sign/self draw sign - const signatureImg = isDefaultSign + // final getting signature url via default select sign/default initial sign/self draw sign + const signUrl = isDefaultSign ? isDefaultSign === "initials" - ? myInitial - : defaultSignImg - : signature; - + ? await convertJpegToPng(myInitial, "myinitials") // default initials set through my signature tab + : await convertJpegToPng(defaultSignImg, "mysign") // default signature set through my signature tab + : signature; // signature done by user thorugh draw, upload, typed + const signatureImg = signUrl; let imgWH = { width: width ? width : "", height: height ? height : "" }; setIsImageSelect(false); setImage(); - //set default signature image width and height - if (isDefaultSign) { - const img = new Image(); - img.src = defaultSignImg; - if (img.complete) { - imgWH = { width: img.width, height: img.height }; - } - } - //`isApplyAll` is used when user edit signature/initial then updated signature apply all existing drawn signatures + // `isApplyAll` is used when user edit signature/initial then updated signature apply all existing drawn signatures const isApplyAll = true; if (uniqueId) { setXyPosition((prevState) => @@ -351,13 +345,12 @@ function WidgetsValueModal(props) { (x) => x.pageNumber === pageNumber ); const updatedPlaceholders = onSaveSign( - type, + signType, signer.placeHolder, placeholderIndex, currWidgetsDetails?.key, signatureImg, imgWH, - isDefaultSign, isTypeText, typedSignature, isAutoSign, @@ -377,13 +370,12 @@ function WidgetsValueModal(props) { return object.pageNumber === pageNumber; }); const getUpdatePosition = onSaveSign( - type, + signType, props?.xyPosition, index, currWidgetsDetails?.key, signatureImg, imgWH, - isDefaultSign, isTypeText, typedSignature, false, @@ -535,7 +527,7 @@ function WidgetsValueModal(props) { } }; - // `handlesavesign` is used to save signaute, initials, stamp as a default + // `handlesavesign` is used to save signature, initials, stamp as a default const handleSaveSign = async () => { if (signature || image?.src) { setIsLoader(true); @@ -556,7 +548,7 @@ function WidgetsValueModal(props) { objectId: User?.id }; if (imageUrl) { - // below code is used to save or update default signaute, initials, stamp + // below code is used to save or update default signature, initials, stamp try { const signCls = new Parse.Object("contracts_Signature"); if (props?.saveSignCheckbox?.signId) { @@ -642,13 +634,14 @@ function WidgetsValueModal(props) { } else { setSignature(""); canvasRef?.current?.clear(); - handleSaveSignature(isTab); + const tab = isTab === "uploadImage" ? "image" : isTab; + handleSaveSignature(tab); } } setPenColor("blue"); } else { setSignature(""); - handleSaveImage(); + handleSaveImage("image"); } setIsImageSelect(false); setIsDefaultSign(false); @@ -1178,7 +1171,9 @@ function WidgetsValueModal(props) { hidden /> -
{t("upload")}
+
+ {t("upload")} +
) : ( @@ -1324,7 +1319,6 @@ function WidgetsValueModal(props) { dotSize={1} />
-
@@ -1988,7 +1982,7 @@ function WidgetsValueModal(props) { handleClickOnNext(isFinishDoc); }} > - {t("finish")} + {t("done")} ) : (
{isShowAgreeTerms && ( state.widget.defaultSignImg); - const myInitial = useSelector((state) => state.widget.myInitial) + const defaultSignImg = useSelector((state) => state.widget.defaultSignImg); + const myInitial = useSelector((state) => state.widget.myInitial); const tabName = ["my-signature", "my-initials"]; const [activeTab, setActiveTab] = useState(0); const confirmToaddDefaultSign = (type) => { - if (!props.isAgree) { - props.setIsAgreeTour(true); - } else { - if (props?.xyPosition.length > 0) { - //check signature or initial widgets exist or not for auto signing - const getCurrentSignerXY = props?.xyPosition.filter( - (data) => data.Id === props.uniqueId - ); - const checkIsSignInitialExist = getCurrentSignerXY?.every( - (placeholderObj) => - placeholderObj?.placeHolder?.some((placeholder) => - placeholder?.pos?.some((posItem) => posItem?.type === type) - ) - ); - if (checkIsSignInitialExist) { - props?.setDefaultSignAlert({ - isShow: true, - alertMessage: t("default-sign-alert", { widgetsType: type }), - type: type - }); - } else { - props?.setDefaultSignAlert({ - isShow: true, - alertMessage: t("defaultSign-alert", { widgetsType: type }) - }); - } + if (props?.xyPosition.length > 0) { + //check signature or initial widgets exist or not for auto signing + const getCurrentSignerXY = props?.xyPosition.filter( + (data) => data.Id === props.uniqueId + ); + const checkIsSignInitialExist = getCurrentSignerXY?.every( + (placeholderObj) => + placeholderObj?.placeHolder?.some((placeholder) => + placeholder?.pos?.some((posItem) => posItem?.type === type) + ) + ); + if (checkIsSignInitialExist) { + props?.setDefaultSignAlert({ + isShow: true, + alertMessage: t("default-sign-alert", { widgetsType: type }), + type: type + }); } else { props?.setDefaultSignAlert({ isShow: true, - alertMessage: t("please-select-position!") + alertMessage: t("defaultSign-alert", { widgetsType: type }) }); } + } else { + props?.setDefaultSignAlert({ + isShow: true, + alertMessage: t("please-select-position!") + }); } }; diff --git a/apps/OpenSign/src/components/pdf/Placeholder.jsx b/apps/OpenSign/src/components/pdf/Placeholder.jsx index d765bffb34..bf7b817427 100644 --- a/apps/OpenSign/src/components/pdf/Placeholder.jsx +++ b/apps/OpenSign/src/components/pdf/Placeholder.jsx @@ -180,13 +180,8 @@ function Placeholder(props) { const widgetClickHandler = () => { props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); - //condition to check in request signing flow user click on agree or not if (props?.data?.signerObjId === props?.signerObjId && !props.isDragging) { - if (!props.isAgree && !props.isSelfSign) { - props.setIsAgreeTour && props.setIsAgreeTour(true); - } else { - handleWidgetIdandPopup(); - } + handleWidgetIdandPopup(); } //condition for open contact details popup when sign templet from public signing flow else if (props?.uniqueId && props.data?.Id === props?.uniqueId) { handleWidgetIdandPopup(); diff --git a/apps/OpenSign/src/components/pdf/RenderPdf.jsx b/apps/OpenSign/src/components/pdf/RenderPdf.jsx index 0d6aa6b40d..f27bba92a5 100644 --- a/apps/OpenSign/src/components/pdf/RenderPdf.jsx +++ b/apps/OpenSign/src/components/pdf/RenderPdf.jsx @@ -160,8 +160,6 @@ function RenderPdf(props) { ispublicTemplate={props.ispublicTemplate} handleUserDetails={props.handleUserDetails} isResize={props.isResize} - setIsAgreeTour={props.setIsAgreeTour} - isAgree={props.isAgree} handleTabDrag={props.handleTabDrag} handleStop={props.handleStop} setUniqueId={props.setUniqueId} diff --git a/apps/OpenSign/src/pages/Login.jsx b/apps/OpenSign/src/pages/Login.jsx index 554033ea47..c1f0c95900 100644 --- a/apps/OpenSign/src/pages/Login.jsx +++ b/apps/OpenSign/src/pages/Login.jsx @@ -125,7 +125,11 @@ function Login() { } } catch (error) { console.error("Error while logging in user", error); - showToast("danger", "Invalid username/password or region"); + if (error?.code === 1001) { + showToast("danger", t("action-prohibited")); + } else { + showToast("danger", "Invalid username/password or region"); + } } }; const handleLoginBtn = async (event) => { diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.jsx b/apps/OpenSign/src/pages/PdfRequestFiles.jsx index b898e8836d..bd59c5ee0a 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.jsx +++ b/apps/OpenSign/src/pages/PdfRequestFiles.jsx @@ -144,7 +144,6 @@ function PdfRequestFiles( const [signatureType, setSignatureType] = useState([]); const [pdfBase64Url, setPdfBase64Url] = useState(""); const [isAgree, setIsAgree] = useState(false); - const [isAgreeTour, setIsAgreeTour] = useState(false); const [redirectTimeLeft, setRedirectTimeLeft] = useState(5); const [isredirectCanceled, setIsredirectCanceled] = useState(true); const [isDragging, setIsDragging] = useState(false); @@ -1378,18 +1377,7 @@ function PdfRequestFiles( setIsUiLoading(false); alert(t("expiry-date-error")); } - }; - const AgreementTour = [ - { - selector: '[data-tut="IsAgree"]', - content: () =>

{t("agrrement-alert")}

, - position: "top", - style: { fontSize: "13px" } - } - ]; - const handleCloseAgreeTour = () => { - setIsAgreeTour(false); - }; + }; // `handleRedirectCancel` is used to cancel redirecting to redirectUrl const handleRedirectCancel = () => { setIsredirectCanceled(true); @@ -1599,7 +1587,7 @@ function PdfRequestFiles( } } }; - //function to get first widget and page number to assign currect signer and tour message + //function to get first widget id and page number to assign correct signer and show tour message const showFirstWidget = () => { if (!requestSignTour) { const getCurrentUserPlaceholder = signerPos?.find( @@ -1644,21 +1632,9 @@ function PdfRequestFiles( !isDecline?.isDeclined && ( )} - - {isUiLoading && (
@@ -2011,8 +1987,6 @@ function PdfRequestFiles( scale={scale} uniqueId={uniqueId} pdfBase64Url={pdfBase64Url} - setIsAgreeTour={setIsAgreeTour} - isAgree={isAgree} handleTabDrag={handleTabDrag} handleStop={handleStop} isDragging={isDragging} @@ -2095,8 +2069,6 @@ function PdfRequestFiles( signatureType?.find((x) => x.name === "default") ?.enabled || false } - isAgree={isAgree} - setIsAgreeTour={setIsAgreeTour} /> )}
diff --git a/apps/OpenSignServer/cloud/parsefunction/usersignup.js b/apps/OpenSignServer/cloud/parsefunction/usersignup.js index 118f76ef37..b5c4a20228 100644 --- a/apps/OpenSignServer/cloud/parsefunction/usersignup.js +++ b/apps/OpenSignServer/cloud/parsefunction/usersignup.js @@ -43,9 +43,9 @@ async function saveUser(userDetails) { } export default async function usersignup(request) { const userDetails = request.params.userDetails; - const user = await saveUser(userDetails); try { + const user = await saveUser(userDetails); const extClass = userDetails.role.split('_')[0]; const extQuery = new Parse.Query(extClass + '_Users'); diff --git a/apps/OpenSignServer/logo.png b/apps/OpenSignServer/logo.png index b7241b8a80bbec495f066a5cf92fb2966f2bf35f..8db5381242d1dafd321f1e8137d246b0b9d72cd7 100644 GIT binary patch literal 88554 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 diff --git a/apps/OpenSignServer/public/assets/images/parse-logo.png b/apps/OpenSignServer/public/assets/images/parse-logo.png index ac5141cb7237fd33b23aaf013d30bdbf8b1add02..17f2684db72c91fb8f1c6228eb2012c6d68c084b 100644 GIT binary patch literal 5281 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 LbX4n<--rJX+6@-Y literal 3897 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 TZi-XTD*&MROh>&^%_ibM&S94N From e7d3453744511db9f43d3d5f750bf8969f225875 Mon Sep 17 00:00:00 2001 From: nxglabs Date: Tue, 29 Jul 2025 13:30:45 +0000 Subject: [PATCH 05/12] Merge pull request #1064 from nxglabs/signers_completed_main --- apps/OpenSign/package-lock.json | 28 +++- .../src/primitives/GetReportDisplay.jsx | 72 +++++---- apps/OpenSignServer/package-lock.json | 147 ++++++------------ apps/OpenSignServer/package.json | 3 +- 4 files changed, 107 insertions(+), 143 deletions(-) diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 7c375a0aae..19f5dd0b1a 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -2730,19 +2730,32 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", - "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.14.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@floating-ui/core": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", @@ -8655,14 +8668,15 @@ } }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.jsx b/apps/OpenSign/src/primitives/GetReportDisplay.jsx index ebc0d45be0..0e99f34fb3 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.jsx +++ b/apps/OpenSign/src/primitives/GetReportDisplay.jsx @@ -994,6 +994,7 @@ const ReportTable = (props) => { const timezone = extClass?.[0]?.Timezone || ""; const DateFormat = extClass?.[0]?.DateFormat || "MM/DD/YYYY"; const Is12Hr = extClass?.[0]?.Is12HourTime || false; + const isCompletedReport = props?.ReportName === "Completed Documents"; const signers = item?.Placeholders?.map((x, i) => { const audit = item?.AuditTrail?.find( (audit) => audit?.UserPtr?.objectId === x.signerObjId @@ -1021,20 +1022,22 @@ const ReportTable = (props) => { key={i} className="text-sm font-medium flex flex-row gap-2 items-center" > - + {!isCompletedReport && ( + + )}
{x?.Email || "-"}
- {isModal[`${item.objectId}_${i}`] && ( + {!isCompletedReport && isModal[`${item.objectId}_${i}`] && ( { {t(`report-heading.${item}`)} - {props.ReportName === "Contactbook" && item === "Name" && ( - - )} + {props.ReportName === "Contactbook" && + item === "Name" && ( + + )} ))} @@ -1807,12 +1811,16 @@ const ReportTable = (props) => { )} {props.heading.includes("Signers") && - ["In-progress documents", "Need your sign"].includes( - props.ReportName - ) ? ( + [ + "In-progress documents", + "Need your sign", + "Completed Documents" + ].includes(props.ReportName) ? ( - {!item?.IsSignyourself && item?.Placeholders && ( + {!item?.IsSignyourself && item?.Placeholders ? ( <>{formatStatusRow(item)} + ) : ( + <>- )} ) : ( diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 07892ac2c2..f4383df9af 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -105,9 +105,10 @@ } }, "node_modules/@apollo/server": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.12.0.tgz", - "integrity": "sha512-Z5RNTCnIia+dFsP5HW2ugQMrIOWgyNWyKP+jMVXthp/ECjYyyRYPC41ukCDwxHQY4vNZ3rgbgqroWVQUGFt2gA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.12.1.tgz", + "integrity": "sha512-jceK1LK6l074in4mWu8XkwzDjvxdSzkmk8M7YpVLOGjQ6PmlaChcGRJ9BUwB46r22MxdPCXdC/6U5Vi8gzYbvQ==", + "deprecated": "Apollo Server v4 is deprecated and will transition to end-of-life on January 26, 2026. As long as you are already using a non-EOL version of Node.js, upgrading to v5 should take only a few minutes. See https://www.apollographql.com/docs/apollo-server/previous-versions for details.", "license": "MIT", "dependencies": { "@apollo/cache-control-types": "^1.0.3", @@ -146,6 +147,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@apollo/server-gateway-interface/-/server-gateway-interface-1.1.1.tgz", "integrity": "sha512-pGwCl/po6+rxRmDMFgozKQo2pbsSwE91TpsDBAOgf74CRDPXHHtM88wbwjab0wMMZh95QfR45GGyDIdhY24bkQ==", + "deprecated": "@apollo/server-gateway-interface v1 is part of Apollo Server v4, which is deprecated and will transition to end-of-life on January 26, 2026. As long as you are already using a non-EOL version of Node.js, upgrading to v2 should take only a few minutes. See https://www.apollographql.com/docs/apollo-server/previous-versions for details.", "license": "MIT", "dependencies": { "@apollo/usage-reporting-protobuf": "^4.1.1", @@ -6119,18 +6121,30 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", - "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.14.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@fastify/busboy": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", @@ -10978,23 +10992,6 @@ "form-data": "^2.5.0" } }, - "node_modules/@types/request/node_modules/form-data": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz", - "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.35", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -13468,9 +13465,9 @@ } }, "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -15737,9 +15734,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz", - "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -16476,13 +16473,13 @@ } }, "node_modules/parse-server": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-8.2.1.tgz", - "integrity": "sha512-Z0k0a6UAmcbWTt21naacGDjNRNQpe3vrS+EM/cjSlXHPVAxYFnXuXK8R3kSCWKXU49tYkhep6A4KbtcFr2NsVw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-8.2.2.tgz", + "integrity": "sha512-qFP5QpJW0NL6s3GhIonlmdCg5lJHwDCnTlxkINCsxnsoeKJVsFou0xy2x6dNquMIU0RJi3qolQaFbNGICZV3NA==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@apollo/server": "4.12.0", + "@apollo/server": "4.12.1", "@babel/eslint-parser": "7.27.1", "@graphql-tools/merge": "9.0.24", "@graphql-tools/schema": "10.0.23", @@ -16508,7 +16505,7 @@ "lodash": "4.17.21", "lru-cache": "10.4.0", "mime": "4.0.7", - "mongodb": "6.16.0", + "mongodb": "6.17.0", "mustache": "4.2.0", "otpauth": "9.4.0", "parse": "6.1.1", @@ -16589,52 +16586,6 @@ "node": ">=18" } }, - "node_modules/parse-server/node_modules/mongodb": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", - "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.3", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, "node_modules/parse-server/node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", @@ -17645,20 +17596,6 @@ "node": ">= 4" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/request/node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -17985,16 +17922,23 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/shebang-command": { @@ -18701,7 +18645,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", - "dev": true, "license": "MIT", "dependencies": { "isarray": "^2.0.5", @@ -18716,7 +18659,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, "license": "MIT" }, "node_modules/to-regex-range": { @@ -18868,7 +18810,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 91695218b4..cef69beae1 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -66,7 +66,8 @@ }, "overrides": { "ws": "$ws", - "parse": "$parse" + "parse": "$parse", + "form-data": "$form-data" }, "engines": { "node": "18 || 20 || 22" From 378c0f057b53a2033767753246cf4a1ae921d2be Mon Sep 17 00:00:00 2001 From: nxglabs Date: Tue, 29 Jul 2025 13:54:44 +0000 Subject: [PATCH 06/12] Merge pull request #1066 from nxglabs/signers_completed_main --- apps/OpenSign/src/components/pdf/RecipientList.jsx | 14 +++++++------- .../src/components/pdf/SignerListComponent.jsx | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/RecipientList.jsx b/apps/OpenSign/src/components/pdf/RecipientList.jsx index c616bac37e..59ca1839bd 100644 --- a/apps/OpenSign/src/components/pdf/RecipientList.jsx +++ b/apps/OpenSign/src/components/pdf/RecipientList.jsx @@ -129,9 +129,9 @@ const RecipientList = (props) => { } }} > -
+
{
{obj.Name ? ( { props.isSelectListId === ind ? "text-[#424242]" : "text-base-content" - } text-[12px] font-bold w-[100px] whitespace-nowrap overflow-hidden text-ellipsis`} + } text-[12px] font-bold truncate whitespace-nowrap`} > {obj.Name} @@ -173,7 +173,7 @@ const RecipientList = (props) => { props.isSelectListId === ind ? "text-[#424242]" : "text-base-content" - } text-[12px] font-bold w-[100px] whitespace-nowrap overflow-hidden text-ellipsis cursor-pointer`} + } text-[12px] font-bold truncate whitespace-nowrap cursor-pointer`} onClick={() => { setIsEdit({ [obj.Id]: true }); props.setRoleName(obj.Role); @@ -182,7 +182,7 @@ const RecipientList = (props) => { {isEdit?.[obj.Id] && props.handleRoleChange ? ( props.handleRoleChange(e, obj.Id)} onBlur={() => { @@ -210,7 +210,7 @@ const RecipientList = (props) => { props.isSelectListId === ind ? "text-[#424242]" : "text-base-content" - } text-[10px] font-medium w-[100px] whitespace-nowrap overflow-hidden text-ellipsis`} + } text-[10px] font-medium truncate whitespace-nowrap`} > {obj?.Role || obj?.Email} diff --git a/apps/OpenSign/src/components/pdf/SignerListComponent.jsx b/apps/OpenSign/src/components/pdf/SignerListComponent.jsx index dea4b40b5f..b46cd7508a 100644 --- a/apps/OpenSign/src/components/pdf/SignerListComponent.jsx +++ b/apps/OpenSign/src/components/pdf/SignerListComponent.jsx @@ -27,12 +27,12 @@ function SignerListComponent(props) { return (
{getFirstLetter( @@ -40,11 +40,11 @@ function SignerListComponent(props) { )}
-
- +
+ {props.obj?.Name || props?.obj?.Role} - + {props.obj?.Email || props.obj?.email}
From fe93be8be7a801eedb986fb3173888893c242bbe Mon Sep 17 00:00:00 2001 From: nxglabs Date: Wed, 30 Jul 2025 14:22:07 +0000 Subject: [PATCH 07/12] Merge pull request #1070 from nxglabs/signers_completed_main --- apps/OpenSign/public/locales/de/translation.json | 3 ++- apps/OpenSign/public/locales/en/translation.json | 5 +++-- apps/OpenSign/public/locales/es/translation.json | 5 +++-- apps/OpenSign/public/locales/fr/translation.json | 5 +++-- apps/OpenSign/public/locales/hi/translation.json | 5 +++-- apps/OpenSign/public/locales/it/translation.json | 5 +++-- apps/OpenSign/src/components/pdf/EditTemplate.jsx | 2 +- apps/OpenSign/src/pages/Preferences.jsx | 4 ++-- apps/OpenSign/src/primitives/GetReportDisplay.jsx | 8 +++++--- 9 files changed, 25 insertions(+), 17 deletions(-) diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index 7eeea2ffa9..f6f4364d33 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -1043,5 +1043,6 @@ "horizontal": "Horizontal", "billing": "Abrechnung", "console": "Konsole", - "action-prohibited": "Diese Aktion ist für Ihre E-Mail-Domain nicht erlaubt. Bitte wenden Sie sich an Ihren Administrator, um Hilfe zu erhalten." + "action-prohibited": "Diese Aktion ist für Ihre E-Mail-Domain nicht erlaubt. Bitte wenden Sie sich an Ihren Administrator, um Hilfe zu erhalten.", + "browse-or-drag-to-replace-existing-file": "Durchsuchen oder per Drag & Drop eine neue Datei ziehen, um die vorhandene zu ersetzen" } diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 06d491ecc3..938f243de8 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -472,7 +472,7 @@ "placeholder-alert-3": " Are you sure you want to send out this document for signatures?", "placeholder-alert-4": "You have successfully sent mails to all recipients!", "placeholder-mail-alert": "You have successfully sent email to {{name}}. Subsequent signers will get email(s) once {{name}} signs the document", - "placeholder-mail-alert-you": "Subsequent signers will get email(s) once you signs the document.", + "placeholder-mail-alert-you": "Subsequent signers will get email(s) once you sign the document.", "placeholder-alert-5": "Do you want to sign the document right now?", "placeholder-alert-6": "Please setup mail adapter to send mail!", "placeholder-alert-7": "Please select signer for add placeholder!", @@ -1043,5 +1043,6 @@ "horizontal": "Horizontal", "billing": "Billing", "console": "Console", - "action-prohibited": "This action isn't allowed for your email domain. Please contact your administrator for assistance." + "action-prohibited": "This action isn't allowed for your email domain. Please contact your administrator for assistance.", + "browse-or-drag-to-replace-existing-file": "Browse or drag & drop a new file to replace the existing one" } \ No newline at end of file diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index aa981aee9f..2548d259b0 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -472,7 +472,7 @@ "placeholder-alert-3": " ¿En definitiva quieres enviar este documento para ser firmado?", "placeholder-alert-4": "¡Has enviado exitosamente correos a todos los destinatarios!", "placeholder-mail-alert": "Has enviado un correo electrónico con éxito a {{name}}. Los siguientes firmantes recibirán un correo electrónico una vez que {{name}} firme el documento.", - "placeholder-mail-alert-you": "Los firmantes posteriores recibirán correos electrónicos una vez que firme el documento.", + "placeholder-mail-alert-you": "Los firmantes siguientes recibirán un correo electrónico una vez que usted firme el documento.", "placeholder-alert-5": "¿Quieres firmar documentos ahora mismo?", "placeholder-alert-6": "¡Por favor, configura el adaptador de correo para enviar correos!", "placeholder-alert-7": "¡Por favor, selecciona un firmante para agregar un marcador de posición!", @@ -1043,5 +1043,6 @@ "horizontal": "Horizontal", "billing": "Facturación", "console": "Consola", - "action-prohibited": "Esta acción no está permitida para su dominio de correo electrónico. Por favor, contacte con su administrador para obtener ayuda." + "action-prohibited": "Esta acción no está permitida para su dominio de correo electrónico. Por favor, contacte con su administrador para obtener ayuda.", + "browse-or-drag-to-replace-existing-file": "Busque o arrastre y suelte un nuevo archivo para reemplazar el existente" } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index e06076f09d..df027c141f 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -472,7 +472,7 @@ "placeholder-alert-3": "Etes-vous sûr de vouloir envoyer ce document pour signature ? ", "placeholder-alert-4": "Vous avez envoyé avec succès des mails à tous les", "placeholder-mail-alert": "Vous avez envoyé un e-mail avec succès à {{name}}. Les signataires suivants recevront un e-mail une fois que {{name}} aura signé le document.", - "placeholder-mail-alert-you": "Les signataires suivants recevront un e-mail dès que vous signez le document.", + "placeholder-mail-alert-you": "Les signataires suivants recevront un e-mail une fois que vous aurez signé le document.", "placeholder-alert-5": "Voulez-vous signer des documents maintenant ?", "placeholder-alert-6": "Veuillez configurer l'adaptateur de messagerie pour envoyer du courrier !", "placeholder-alert-7": "Veuillez sélectionner le signataire pour ajouter un espace réservé !", @@ -1043,5 +1043,6 @@ "horizontal": "Horizontal", "billing": "Facturation", "console": "Console", - "action-prohibited": "Cette action n'est pas autorisée pour votre domaine de messagerie. Veuillez contacter votre administrateur pour obtenir de l'aide." + "action-prohibited": "Cette action n'est pas autorisée pour votre domaine de messagerie. Veuillez contacter votre administrateur pour obtenir de l'aide.", + "browse-or-drag-to-replace-existing-file": "Parcourez ou faites glisser un nouveau fichier pour remplacer l'existant" } diff --git a/apps/OpenSign/public/locales/hi/translation.json b/apps/OpenSign/public/locales/hi/translation.json index 5bf318cc68..c21f3c042a 100644 --- a/apps/OpenSign/public/locales/hi/translation.json +++ b/apps/OpenSign/public/locales/hi/translation.json @@ -472,7 +472,7 @@ "placeholder-alert-3": " क्या आप वाकई इस दस्तावेज़ को हस्ताक्षर के लिए भेजना चाहते हैं?", "placeholder-alert-4": "आपने सभी प्राप्तकर्ताओं को सफलतापूर्वक मेल भेज दिए हैं!", "placeholder-mail-alert": "आपने {{name}} को सफलतापूर्वक ईमेल भेज दिया है। {{name}} द्वारा दस्तावेज़ पर हस्ताक्षर करने के बाद बाद के हस्ताक्षरकर्ताओं को ईमेल प्राप्त होंगे", - "placeholder-mail-alert-you": "आपके द्वारा दस्तावेज़ पर हस्ताक्षर करने के बाद बाद के हस्ताक्षरकर्ताओं को ईमेल प्राप्त होंगे।", + "placeholder-mail-alert-you": "आपके दस्तावेज़ पर हस्ताक्षर करने के बाद अगले हस्ताक्षरकर्ता को ईमेल प्राप्त होगा।", "placeholder-alert-5": "क्या आप अभी दस्तावेज़ पर हस्ताक्षर करना चाहते हैं?", "placeholder-alert-6": "मेल भेजने के लिए कृपया मेल एडॉप्टर सेटअप करें!", "placeholder-alert-7": "प्लेसहोल्डर जोड़ने के लिए कृपया हस्ताक्षरकर्ता चुनें!", @@ -1043,5 +1043,6 @@ "horizontal": "हॉरिज़ॉन्टल", "billing": "बिलिंग", "console": "कंसोल", - "action-prohibited": "यह क्रिया आपके ईमेल डोमेन के लिए अनुमत नहीं है। कृपया सहायता के लिए अपने व्यवस्थापक से संपर्क करें।" + "action-prohibited": "यह क्रिया आपके ईमेल डोमेन के लिए अनुमत नहीं है। कृपया सहायता के लिए अपने व्यवस्थापक से संपर्क करें।", + "browse-or-drag-to-replace-existing-file": "नई फ़ाइल ब्राउज़ करें या खींचकर छोड़ें ताकि मौजूदा फ़ाइल को बदला जा सके" } diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index 2b1667c336..b406c82c39 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -472,7 +472,7 @@ "placeholder-alert-3": "Sei sicuro di voler inviare questo documento per le firme?", "placeholder-alert-4": "Hai inviato con successo le mail a tutti i destinatari!", "placeholder-mail-alert": "Hai inviato con successo un'e-mail a {{name}}. I firmatari successivi riceveranno un'e-mail una volta che {{name}} avrà firmato il documento.", - "placeholder-mail-alert-you": "I firmatari successivi riceveranno un'email non appena firmi il documento.", + "placeholder-mail-alert-you": "I firmatari successivi riceveranno un'email dopo che avrai firmato il documento.", "placeholder-alert-5": "Vuoi firmare i documenti ora?", "placeholder-alert-6": "Configura l'adattatore email per inviare mail!", "placeholder-alert-7": "Seleziona il firmatario per aggiungere un segnaposto!", @@ -1043,5 +1043,6 @@ "horizontal": "Orizzontale", "billing": "Fatturazione", "console": "Console", - "action-prohibited": "Questa azione non è consentita per il tuo dominio email. Contatta il tuo amministratore per ricevere assistenza." + "action-prohibited": "Questa azione non è consentita per il tuo dominio email. Contatta il tuo amministratore per ricevere assistenza.", + "browse-or-drag-to-replace-existing-file": "Sfoglia o trascina un nuovo file per sostituire quello esistente" } diff --git a/apps/OpenSign/src/components/pdf/EditTemplate.jsx b/apps/OpenSign/src/components/pdf/EditTemplate.jsx index c9213adc29..3b5cd92dd7 100644 --- a/apps/OpenSign/src/components/pdf/EditTemplate.jsx +++ b/apps/OpenSign/src/components/pdf/EditTemplate.jsx @@ -286,7 +286,7 @@ const EditTemplate = ({ htmlFor="fileUpload" className="cursor-pointer text-center mb-0" > - Browse or drag & drop a new file to replace the existng one + {t("browse-or-drag-to-replace-existing-file")}
{ localStorage.setItem("Extand_Class", JSON.stringify([_extUser])); } } catch (err) { - console.log("Err in reseting request mail", err); + console.log("Err in resetting request mail", err); } } else if (completion && !isDefaultMail?.completionMail) { setCompletionSubject(defaultCompHtml?.subject); @@ -361,7 +361,7 @@ const Preferences = () => { localStorage.setItem("Extand_Class", JSON.stringify([_extUser])); } } catch (err) { - console.log("Err in reseting completion mail", err); + console.log("Err in resetting completion mail", err); } } }; diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.jsx b/apps/OpenSign/src/primitives/GetReportDisplay.jsx index 0e99f34fb3..2ae4b1ff81 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.jsx +++ b/apps/OpenSign/src/primitives/GetReportDisplay.jsx @@ -1020,7 +1020,9 @@ const ReportTable = (props) => { {displaySigners?.map((x, i) => (
{!isCompletedReport && ( )} -
{x?.Email || "-"}
+
{x?.Email || "-"}
{!isCompletedReport && isModal[`${item.objectId}_${i}`] && ( { [item.objectId]: !isShowAllSigners[item.objectId] }) } - className="ml-2 text-xs font-medium text-blue-500 underline focus:outline-none" + className="ml-2 mt-1 text-xs font-medium text-blue-500 underline focus:outline-none" > {isShowAllSigners[item.objectId] ? "Hide" : "Show More"} From a5b9d8178c92244da47df7f41945749bddbfa0ba Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 1 Aug 2025 14:46:44 +0000 Subject: [PATCH 08/12] Merge pull request #1084 from nxglabs/signers_completed_main feat: allow preferences menu for all user and add smtp setting in it --- .../public/locales/de/translation.json | 117 +++++++++++++++-- .../public/locales/en/translation.json | 118 +++++++++++++++-- .../public/locales/es/translation.json | 118 +++++++++++++++-- .../public/locales/fr/translation.json | 119 ++++++++++++++++-- .../public/locales/hi/translation.json | 117 +++++++++++++++-- .../public/locales/it/translation.json | 116 +++++++++++++++-- .../src/components/sidebar/Sidebar.jsx | 47 ++----- apps/OpenSign/src/pages/Preferences.jsx | 6 +- 8 files changed, 660 insertions(+), 98 deletions(-) diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index f6f4364d33..cd410074fe 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -26,6 +26,8 @@ "Name": "Name", "Date": "Datum" }, + "folder": "Ordner", + "pdf": "Pdf", "context-menu": { "Download": "Herunterladen", "Rename": "Umbenennen", @@ -44,6 +46,10 @@ "contact-now": "Jetzt kontaktieren", "upgrade-to": "Upgrade zu", "plan": "Plan", + "connect": "Verbinden", + "connect-to-g-drive": "Mit Google Drive verbinden", + "reconnect-to-g-drive": "Erneut mit Google Drive verbinden", + "gdrive-info-connect": "Wenn Google Drive verbunden ist, wird das abgeschlossene Dokument im Ordner {{appName}} auf Google Drive gespeichert.", "subscription-renew-warning": "Ihr Abonnement läuft in {{remainingDays}} Tagen ab. Bitte verlängern Sie Ihr Abonnement.", "subscribe-card-teamplan": "Entfesseln Sie die volle Kraft der Zusammenarbeit! Erstellen Sie unbegrenzt Organisationen, Teams und Hierarchien. Teilen Sie Vorlagen nahtlos zwischen Teams und weisen Sie benutzerdefinierte Benutzerrollen zu. Optimieren Sie Ihren Workflow noch heute!", "subscribe-card-plan": "Entsperren Sie Premium-Funktionen ab nur {{premiumPrice}}/Monat. Genießen Sie eine verbesserte Leistung und zahlen Sie nur {{addonPrice}} pro zusätzlichem Credit nach den enthaltenen Premium-Credits.", @@ -58,7 +64,7 @@ "welcome": "Willkommen zurück!", "Login-to-your-account": "Melden Sie sich bei Ihrem Konto an", "password": "Passwort", - "forgot-password": "Passwort vergessen?", + "forgot-password": "Passwort vergessen", "loading": "Wird geladen...", "of": "von", "sign-SSO": "Mit SSO anmelden", @@ -181,7 +187,9 @@ "created-date": "Erstellungsdatum", "Type": "Type", "Logs": "Protokolle", - "Expiry-date": "Ablaufdatum" + "Expiry-date": "Ablaufdatum", + "Company": "Unternehmen", + "JobTitle": "Berufsbezeichnung" }, "report-help": { "Draft Documents": "Dies sind Dokumente, die Sie begonnen, aber noch nicht zum Versenden fertiggestellt haben.", @@ -193,16 +201,15 @@ "Contactbook": "Dies ist eine Liste von Kontakten/Unterzeichnern, die Sie hinzugefügt haben. Diese erscheinen als Vorschläge, wenn Sie neue Unterzeichner hinzufügen möchten.", "Templates": "Dies ist eine Liste von Vorlagen, die Ihnen zur Verfügung stehen, um Dokumente zu erstellen. Sie können die Schaltfläche 'Verwenden' anklicken, um ein neues Dokument mit einer Vorlage zu erstellen, das Dokument zu ändern und Unterzeichner im nächsten Schritt hinzuzufügen." }, - "form-name": { - "Sign Yourself": "Selbst unterschreiben", - "Request Signatures": "Signaturen anfordern", - "New Template": "Neue Vorlage" - }, + "Sign Yourself": "Selbst unterschreiben", + "Request Signatures": "Signaturen anfordern", + "New Template": "Neue Vorlage", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "Datei ausgewählt", "template-title": "Vorlagentitel", "document-title": "Dokumenttitel", + "title": "Titel", "description": "Beschreibung", "time-to-complete": "Bearbeitungszeit (Tage)", "send-in-order": "In der Reihenfolge senden", @@ -389,6 +396,10 @@ "Email-verified-alert-1": "E-Mail wurde verifiziert.", "Email-verified-alert-2": "E-Mail wurde bereits verifiziert.", "upload-stamp-image": "Stempelbild hochladen", + "draw-signature": "Unterschrift zeichnen", + "draw-initials": "Initialen zeichnen", + "enter-text": "Text eingeben", + "enter-widgettype": "{{widgetType}} eingeben", "draw": "Zeichnen", "type": "Schreiben", "color-type": { @@ -729,7 +740,7 @@ "public-tour-message": "Die Vorlage muss öffentlich sein, bevor Sie einen teilbaren Link generieren können.", "add-user-template": "Sie müssen eine Rolle hinzufügen, bevor Sie Felder dafür hinzufügen können.", "pdf-uncompatible": "Diese PDF-Datei ist nicht kompatibel, bitte kontaktieren Sie {{appName}}", - "text-field-tour": "Felder vom Typ 'Text' müssen im Voraus ausgefüllt werden, bevor das Dokument versendet wird. Wenn Sie möchten, dass die Unterzeichner Eingaben machen, verwenden Sie das Feld 'Texteingabe'.", + "text-field-tour": "Felder zum Vorabfüllen müssen vor dem Senden des Dokuments ausgefüllt werden. Wenn Sie Eingaben von den Unterzeichnern benötigen, verwenden Sie stattdessen die Felder für Unterzeichner.", "attach-signer-tour": "Sie müssen einen Unterzeichner jeder Rolle zuweisen. Dies können Sie durch Klicken auf dieses Symbol tun. Sobald Sie einen Unterzeichner auswählen, wird er allen Feldern der zugehörigen Rolle zugewiesen, die in derselben Farbe erscheinen.", "allowed-signature-types": "Erlaubte Signaturtypen", "at-least-one-signature-type": "Mindestens ein Signaturtyp sollte aktiviert sein.", @@ -777,7 +788,7 @@ "agree-p1": "Ich bestätige, dass ich die ", "agree-p2": "Offenlegung elektronischer Aufzeichnungen und Signaturen", "agree-p3": "gelesen und verstanden habe und der Verwendung elektronischer Aufzeichnungen und Signaturen zustimme.", - "agrre-button": "Zustimmen & Fortfahren", + "agrre-button": "Ich bestätige und stimme zu, fortzufahren", "term-cond-title": "Allgemeine Geschäftsbedingungen", "term-cond-h": "OFFENLEGUNG ELEKTRONISCHER AUFZEICHNUNGEN UND SIGNATUREN", "term-cond-p1": "Diese Offenlegung elektronischer Aufzeichnungen und Signaturen ('Offenlegung') ist eine Vereinbarung zwischen dem Dokumentersteller ('Sender') und dem Unterzeichner ('Ihnen'), bereitgestellt über die {{appName}} Plattform ('Plattform'). Durch das Signieren von Dokumenten über {{appName}} stimmen Sie den in dieser Offenlegung beschriebenen Bedingungen zu. Bitte lesen Sie sie sorgfältig durch, bevor Sie fortfahren.", @@ -1037,12 +1048,98 @@ "search-templates": "Vorlagen durchsuchen…", "search-documents": "Dokumente suchen…", "search-contacts": "Kontakte durchsuchen…", + "edit-draft": "Entwurf bearbeiten", + "add-role-alert": "Bitte fügen Sie mindestens eine Rolle hinzu", "invalid-email-found": "Ungültige E-Mail gefunden: {{email}}", "duplicate-email-found": "Doppelte E-Mail gefunden: {{email}}", "vertical": "Vertikal", "horizontal": "Horizontal", "billing": "Abrechnung", "console": "Konsole", + "prefill-widget": "Vorausgefüllte Widgets", "action-prohibited": "Diese Aktion ist für Ihre E-Mail-Domain nicht erlaubt. Bitte wenden Sie sich an Ihren Administrator, um Hilfe zu erhalten.", - "browse-or-drag-to-replace-existing-file": "Durchsuchen oder per Drag & Drop eine neue Datei ziehen, um die vorhandene zu ersetzen" + "must-have-at-least-one-vacant-role": "Mindestens eine Rolle muss unzugewiesen sein, bevor Sie ein template auf 'public' setzen.", + "remove-duplicate": "Bitte doppelte Option entfernen", + "prefill-bulk-error": "Der Massenversand ist nicht erlaubt, wenn Prefill-Widgets hinzugefügt wurden. Bitte entfernen Sie die Prefill-Widgets, um fortzufahren.", + "session-expired-title": "Sitzung abgelaufen", + "access-denied": "Zugriff verweigert", + "upgrade": "Upgrade", + "do-not-access-app": "Sie haben keinen Zugriff auf diese Anwendung.", + "dont-have-access": "Sie haben keinen Zugriff.", + "valid-email-alert": "Bitte geben Sie eine gültige E-Mail-Adresse ein.", + "otp-not-validate": "OTP ist ungültig.", + "domain-not-allowed": "Diese Domain ist nicht erlaubt", + "atleast-one-recipient-alert": "Bitte fügen Sie mindestens einen Empfänger hinzu!", + "incorrect-password-or-decryption-failed": "Falsches Passwort oder Entschlüsselung fehlgeschlagen.", + "incorrect-password-for-file": "Falsches Passwort für Datei: {{file}}", + "error-uploading-pdf": "Fehler beim Hochladen der PDF.", + "provide-password": "Bitte geben Sie das Passwort an.", + "only-pdf-allowed": "Nur PDF-Dateien sind erlaubt.", + "invalid-username-password-region": "Ungültiger Benutzername/Passwort oder Region.", + "pfx-extension-alert": "Bitte laden Sie eine Datei mit der Endung .pfx hoch.", + "email-already-exist": "E-Mail existiert bereits", + "branding": "Markenbildung", + "branding-help": "Branding ermöglicht White-Labeling für Ihre App", + "custom-sub-domain": "Benutzerdefinierte Subdomain", + "app-name": "App Name", + "provide-domain-name": "Geben Sie Ihren Domainnamen an", + "provide-app-name": "Geben Sie Ihren App-Namen an", + "logo": "Logo", + "upload-app-logo": "Laden Sie Ihr App-Logo hoch", + "prefill-unfilled-widget": "Die folgenden Pflichtfelder dürfen nicht leer sein: {{emptyWidget}}. Bitte füllen Sie diese aus, um fortzufahren.", + "Dashboard": "Armaturenbrett", + "Analytics": "Analytik", + "Templates": "Vorlagen", + "Need your sign": "Benötigt Ihre Unterschrift", + "In Progress": "In Bearbeitung", + "Completed": "Abgeschlossen", + "Drafts": "Entwürfe", + "Declined": "Abgelehnt", + "Expired": "Abgelaufen", + "Contactbook": "Kontaktbuch", + "My Signature": "Meine Unterschrift", + "API Token": "API-Token", + "Webhook": "Webhook", + "Preferences": "Einstellungen", + "Teams": "Teams", + "Users": "Benutzer", + "Drive": "Drive", + "Branding": "Markenbildung", + "Mail": "Mail", + "Storage": "Speicher", + "Signing certificate": "Signierzertifikat", + "General": "Allgemein", + "Organizations": "Organisationen", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "PDF debuggen", + "New Document": "Neues Dokument", + "subscription": "Abonnement", + "Draft document": "Dokumententwurf", + "Draft template": "Vorlagenentwurf", + "Public sign": "Öffentliche Signatur", + "Signup": "Registrieren", + "delete-contact": "Kontakt löschen", + "total-records-found": "Gesamtanzahl gefundener Einträge: {{count}}", + "Invalid-records-found": "Ungültige Einträge gefunden: {{records}}", + "previous": "Zurück", + "page-n-of-n": "Seite {{currentPage}} von {{totalPages}}", + "import": "Importieren", + "search": "Suchen", + "viewed-on": "Angesehen am: {{ViewedOn}}", + "signed-on": "Unterschrieben am: {{SignedOn}}", + "hide": "Ausblenden", + "show-more": "Mehr anzeigen", + "browse-or-drag-to-replace-existing-file": "Durchsuchen oder per Drag & Drop eine neue Datei ziehen, um die vorhandene zu ersetzen", + "optional-details": "Optionale Angaben", + "mail-adapter-subscription-alert": "Bitte upgraden Sie auf den Professional- oder Team-Plan, um den Mail-Adapter einzurichten.", + "connect-to-mail": "Mit Gmail verbinden", + "custom-smtp": "Benutzerdefiniertes SMTP", + "default-smtp": "{{appName}} Standard-SMTP", + "host": "Host", + "port": "Port", + "sender-email": "Absender-E-Mail", + "username": "Benutzername", + "use-default-mail-adapter": "Möchten Sie wirklich die Standard-Mailserver von {{appName}} verwenden, um Ihre Signaturanfragen zu versenden? Wir empfehlen, Ihre eigenen Gmail- oder SMTP-Server zu verwenden, um die Zustellbarkeit zu verbessern.", + "verification-code-sent-registered-email": "Ein Bestätigungscode wurde an Ihre registrierte E-Mail-Adresse <1>{{useremail}} gesendet. Bitte geben Sie den Code unten ein, um Ihre Einstellungen zu bestätigen.", + "smpt-credentials": "SMTP-Zugangsdaten" } diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 938f243de8..cd2c981c22 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -26,6 +26,8 @@ "Name": "Name", "Date": "Date" }, + "folder": "Folder", + "pdf": "Pdf", "context-menu": { "Download": "Download", "Rename": "Rename", @@ -44,6 +46,10 @@ "contact-now": "Contact now", "upgrade-to": "Upgrade to", "plan": "Plan", + "connect": "connect", + "connect-to-g-drive": "Connect to Google Drive", + "reconnect-to-g-drive": "Reconnect to Google Drive", + "gdrive-info-connect": "When Google Drive is connected, the completed document will be saved in the {{appName}} folder on Google Drive.", "subscription-renew-warning": "Your subscription will expire in {{remainingDays}} days. Please renew your subscription.", "subscribe-card-teamplan": "Unlock the full power of collaboration! Create unlimited organizations, teams, and hierarchies. Share templates seamlessly across teams and assign custom user roles. Elevate your workflow today!", "subscribe-card-plan": "Unlock premium features starting at just {{premiumPrice}}/month. Enjoy enhanced performance and only {{addonPrice}} per additional credit after your included premium credits.", @@ -58,7 +64,7 @@ "welcome": "Welcome back!", "Login-to-your-account": "Login to your account", "password": "Password", - "forgot-password": "Forgot password?", + "forgot-password": "Forgot password", "loading": "Loading...", "of": "of", "sign-SSO": "Sign in with SSO", @@ -181,7 +187,9 @@ "created-date": "Created date", "Type": "Type", "Logs": "Logs", - "Expiry-date": "Expiry date" + "Expiry-date": "Expiry date", + "Company": "Company", + "JobTitle": "Job title" }, "report-help": { "Draft Documents": "These are documents you have started but have not finalized for sending.", @@ -193,16 +201,15 @@ "Contactbook": "This is a list of contacts/signers added by you. These will appear as suggestions when you try to add signers to a new document.", "Templates": "This is a list of templates that are available to you for creating documents. You can click the 'use' button to create a new document using a template, modify the document & add signers in the next step." }, - "form-name": { - "Sign Yourself": "Sign yourself", - "Request Signatures": "Request signatures", - "New Template": "New template" - }, + "Sign Yourself": "Sign yourself", + "Request Signatures": "Request signatures", + "New Template": "New template", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "file(s) selected", "template-title": "Template title", "document-title": "Document title", + "title": "Title", "description": "Description", "time-to-complete": "Time to complete (Days)", "send-in-order": "Send in order", @@ -389,6 +396,10 @@ "Email-verified-alert-1": "Email is verified.", "Email-verified-alert-2": "Email is already verified.", "upload-stamp-image": "Upload stamp image", + "draw-signature": "Draw signature", + "draw-initials": "Draw initials", + "enter-text": "Enter text", + "enter-widgettype": "Enter {{widgetType}}", "draw": "Draw", "type": "Type", "color-type": { @@ -409,6 +420,7 @@ "reset-password-alert-3": "Reset Your Password", "faild-animation": "Failed to load animation", "apply": "Apply", + "select-columns": "Select columns", "copy-type": { "All pages": "All pages", "All pages but last": "All pages but last", @@ -729,7 +741,7 @@ "public-tour-message": "The template needs to be public before you can generate a shareable link.", "add-user-template": "You need to add a role before you can add fields for it.", "pdf-uncompatible": "This pdf is not compatible, please contact {{appName}}", - "text-field-tour": "Fields of type 'Text' must be filled in advance before the document is sent. If you need the signers to provide input, use the 'Text Input' field instead.", + "text-field-tour": "'Prefill' fields must be filled in advance before the document is sent. If you need the signers to provide input, use signers fields instead.", "attach-signer-tour": "You need to attach a Signer to every role. You can do that by clicking this icon. Once you select a Signer it will be attached to all the fields associated with that role which appear in the same colour.", "allowed-signature-types": "Allowed signature types", "at-least-one-signature-type": "At least one signature type should be enabled.", @@ -777,7 +789,7 @@ "agree-p1": "I confirm that I have read and understood the ", "agree-p2": "Electronic Record and Signature Disclosure", "agree-p3": "and consent to use electronic records and signatures.", - "agrre-button": " Agree & Continue", + "agrre-button": "I confirm & agree to continue", "term-cond-title": "Terms and conditions", "term-cond-h": "ELECTRONIC RECORD AND SIGNATURE DISCLOSURE", "term-cond-p1": "This Electronic Record and Signature Disclosure ('Disclosure') is an agreement between the Document Creator ('Sender') and the Signer ('You'), facilitated through the {{appName}} platform ('Platform'). By signing documents via {{appName}}, you agree to the terms outlined in this Disclosure. Please read it carefully before proceeding.", @@ -1037,12 +1049,98 @@ "search-templates": "Search templates…", "search-documents": "Search documents…", "search-contacts": "Search contacts…", + "add-role-alert":"Please add at least one role", + "edit-draft":"Edit draft", "invalid-email-found": "Invalid email found: {{email}}", "duplicate-email-found": "Duplicate email found: {{email}}", "vertical": "Vertical", "horizontal": "Horizontal", "billing": "Billing", "console": "Console", + "prefill-widget":"Prefill Widgets", "action-prohibited": "This action isn't allowed for your email domain. Please contact your administrator for assistance.", - "browse-or-drag-to-replace-existing-file": "Browse or drag & drop a new file to replace the existing one" + "must-have-at-least-one-vacant-role": "You must have at least one role unassigned before setting a template to 'public'.", + "remove-duplicate": "Please remove duplicate option", + "prefill-bulk-error":"Bulk send is not allowed when prefill widgets are added. Please remove the prefill widgets to proceed.", + "session-expired-title": "Session Expired", + "access-denied": "Access denied", + "upgrade": "Upgrade", + "do-not-access-app": "You don't have access to this application.", + "dont-have-access": "You don't have access.", + "valid-email-alert": "Please enter a valid email address.", + "otp-not-validate": "OTP is not valid.", + "domain-not-allowed": "This domain is not allowed", + "atleast-one-recipient-alert": "Please add at least one recipient!", + "incorrect-password-or-decryption-failed": "Incorrect password or decryption failed.", + "incorrect-password-for-file": "Incorrect password for file: {{file}}", + "error-uploading-pdf": "Error while uploading PDF.", + "provide-password": "Please provide password.", + "only-pdf-allowed": "Only PDF files are allowed.", + "invalid-username-password-region": "Invalid username/password or region.", + "pfx-extension-alert": "Please upload a file with a .pfx extension.", + "email-already-exist": "Email already exists", + "branding": "Branding", + "branding-help": "Branding provides white labelling to your app", + "custom-sub-domain": "Custom sub-domain", + "app-name": "App Name", + "provide-domain-name": "provide your domain name", + "provide-app-name": "provide your app name", + "logo":"Logo", + "upload-app-logo": "upload your app logo", + "prefill-unfilled-widget" :"The following required field(s) cannot be left empty: {{emptyWidget}} Please fill them out to proceed.", + "Dashboard": "Dashboard", + "Analytics": "Analytics", + "Templates": "Templates", + "Need your sign": "Need your sign", + "In Progress": "In progress", + "Completed": "Completed", + "Drafts": "Drafts", + "Declined": "Declined", + "Expired": "Expired", + "Contactbook": "Contactbook", + "My Signature": "My signature", + "API Token": "API token", + "Webhook": "Webhook", + "Preferences": "Preferences", + "Teams": "Teams", + "Users": "Users", + "Drive": "Drive", + "Branding": "Branding", + "Mail": "Mail", + "Storage": "Storage", + "Signing certificate": "Signing certificate", + "General": "General", + "Organizations": "Organizations", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "Debug Pdf", + "New Document": "New Document", + "subscription": "subscription", + "Draft document": "Draft document", + "Draft template": "Draft template", + "Public sign": "Public sign", + "Signup": "Signup", + "delete-contact": "Delete Contact", + "total-records-found": "Total records found: {{count}}", + "Invalid-records-found": "Invalid records found: {{records}}", + "previous": "Previous", + "page-n-of-n": "Page {{currentPage}} of {{totalPages}}", + "import": "Import", + "search": "Search", + "viewed-on": "Viewed on: {{ViewedOn}}", + "signed-on": "Signed on: {{SignedOn}}", + "hide": "Hide", + "show-more": "Show More", + "browse-or-drag-to-replace-existing-file": "Browse or drag & drop a new file to replace the existing one", + "optional-details": "Optional details", + "mail-adapter-subscription-alert": "Please upgrade to Professional or Team plan to setup custom SMTP.", + "connect-to-mail": "Connect to Gmail", + "custom-smtp": "Custom SMTP", + "default-smtp": "{{appName}} default SMTP", + "host":"Host", + "port":"Port", + "sender-email": "Sender Email", + "username": "Username", + "use-default-mail-adapter": "Are you sure you want to use {{appName}}'s default mail servers to send your signature request emails? We recommend using your own Gmail or SMTP servers for improved inbox deliverability.", + "verification-code-sent-registered-email": "A verification code has been sent to your registered email <1>{{useremail}} confirm your settings. Please enter the code below.", + "smpt-credentials": "SMTP Credentials" } \ No newline at end of file diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index 2548d259b0..34f0072535 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -26,6 +26,8 @@ "Name": "Nombre", "Date": "Fecha" }, + "folder": "Carpeta", + "pdf": "Pdf", "context-menu": { "Download": "Descargar", "Rename": "Renombrar", @@ -44,6 +46,10 @@ "contact-now": "Contactar ahora", "upgrade-to": "Mejorar a", "plan": "Plan", + "connect": "Conectar", + "connect-to-g-drive": "Conectar con Google Drive", + "reconnect-to-g-drive": "Volver a conectar con Google Drive", + "gdrive-info-connect": "Cuando Google Drive está conectado, el documento completado se guardará en la carpeta {{appName}} de Google Drive.", "subscription-renew-warning": "Su suscripción vencerá en {{remainingDays}} días. Por favor, renueve su suscripción.", "subscribe-card-teamplan": "¡Libera todo el poder de la colaboración! Crea organizaciones, equipos y jerarquías ilimitadas. Comparte plantillas sin problemas entre equipos y asigna funciones de usuario personalizadas. ¡Mejora tu flujo de trabajo hoy mismo!", "subscribe-card-plan": "Desbloquea funciones premium desde solo {{premiumPrice}}/mes. Disfruta de un rendimiento mejorado y solo {{addonPrice}} por crédito adicional después de tus créditos premium incluidos.", @@ -58,7 +64,7 @@ "welcome": "¡Bienvenido de nuevo!", "Login-to-your-account": "Ingresa a tu cuenta", "password": "Contraseña", - "forgot-password": "¿Olvidaste la contraseña?", + "forgot-password": "¿Olvidaste la contraseña", "loading": "Cargando...", "of": "de", "sign-SSO": "Ingresar con SSO", @@ -181,7 +187,9 @@ "created-date": "Fecha de creación", "Type": "Tipo", "Logs": "Registros", - "Expiry-date": "Date d'expiration" + "Expiry-date": "Date d'expiration", + "Company": "Compañía", + "JobTitle": "Título del puesto" }, "report-help": { "Draft Documents": "Estos son documentos que has iniciado pero no has finalizado para su envío.", @@ -193,16 +201,15 @@ "Contactbook": "Esta es una lista de contactos/firmantes añadidos por ti. Aparecerán como sugerencias cuando intentes añadir firmantes a un nuevo documento.", "Templates": "Esta es una lista de plantillas que están a tu disposición para crear documentos. Puedes hacer clic en el botón «usar» para crear un nuevo documento utilizando una plantilla, modifica el documento y añade firmantes en el siguiente paso." }, - "form-name": { - "Sign Yourself": "Firmar", - "Request Signatures": "Solicitar firmas", - "New Template": "Nueva plantilla" - }, + "Sign Yourself": "Firmar", + "Request Signatures": "Solicitar firmas", + "New Template": "Nueva plantilla", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "archivo seleccionado", "template-title": "Título de la plantilla", "document-title": "Título del documento", + "title": "Título", "description": "Descripción", "time-to-complete": "Plazo de finalización (días)", "send-in-order": "Enviar en orden", @@ -390,6 +397,10 @@ "Email-verified-alert-1": "El correo está verificado.", "Email-verified-alert-2": "El correo ya ha sido verificado.", "upload-stamp-image": "Subir imagen del sello", + "draw-signature": "Dibujar firma", + "draw-initials": "Dibujar iniciales", + "enter-text": "Introducir texto", + "enter-widgettype": "Introduzca {{widgetType}}", "draw": "Dibujar", "type": "Escribir", "color-type": { @@ -410,6 +421,7 @@ "reset-password-alert-3": "Restablece tu contraseña", "faild-animation": "Error al cargar la animación", "apply": "Aplicar", + "select-columns": "Seleccionar columnas", "copy-type": { "All pages": "Todas las páginas", "All pages but last": "Todas las páginas menos la última", @@ -729,7 +741,7 @@ }, "form-title-1": "Configuración del flujo de documentos", "form-title-2": "Configuración de seguridad", - "text-field-tour": "Los campos de tipo 'Texto' deben completarse con anticipación antes de enviar el documento. Si necesita que los firmantes proporcionen información, utilice el campo 'Entrada de texto'", + "text-field-tour": "Los campos de 'Rellenado previo' deben completarse antes de enviar el documento. Si necesita que los firmantes proporcionen información, utilice los campos de firmantes.", "attach-signer-tour": "Debe adjuntar un firmante a cada función. Puede hacerlo haciendo clic en este icono. Una vez que seleccione un Firmante, se adjuntará a todos los campos asociados con ese rol que aparecen en el mismo color.", "allowed-signature-types": "Tipos de firma permitidos", "at-least-one-signature-type": "Se debe habilitar al menos un tipo de firma.", @@ -777,7 +789,7 @@ "agree-p1": "Confirmo que he leído y comprendido el ", "agree-p2": "Registro Electrónico y Divulgación de Firma", "agree-p3": "y consentimiento para utilizar registros y firmas electrónicas.", - "agrre-button": "Aceptar y continuar", + "agrre-button": "Confirmo y acepto continuar", "term-cond-title": "Términos y condiciones", "term-cond-h": "DIVULGACIÓN DE REGISTRO ELECTRÓNICO Y FIRMA", "term-cond-p1": "Esta Divulgación de Firma y Registro Electrónico ('Divulgación') es un acuerdo entre el Creador del Documento ('Remitente') y el Firmante ('Usted'), facilitado a través de la plataforma {{appName}} ('Plataforma'). Al firmar documentos a través de {{appName}}, usted acepta los términos descritos en esta Divulgación. Léala detenidamente antes de continuar.", @@ -1040,9 +1052,95 @@ "invalid-email-found": "Correo electrónico no válido encontrado: {{email}}", "duplicate-email-found": "Correo electrónico duplicado encontrado: {{email}}", "vertical": "Vertical", + "add-role-alert": "Por favor, agregue al menos un rol", + "edit-draft": "Editar borrador", "horizontal": "Horizontal", "billing": "Facturación", "console": "Consola", + "prefill-widget": "Widgets de Relleno Previo", "action-prohibited": "Esta acción no está permitida para su dominio de correo electrónico. Por favor, contacte con su administrador para obtener ayuda.", - "browse-or-drag-to-replace-existing-file": "Busque o arrastre y suelte un nuevo archivo para reemplazar el existente" + "must-have-at-least-one-vacant-role": "Debe dejar al menos un rol sin asignar antes de establecer un template como 'public'.", + "remove-duplicate": "Por favor, elimina la opción duplicada", + "prefill-bulk-error": "El envío masivo no está permitido cuando se han agregado widgets de pre-rellenado. Por favor, elimine los widgets de pre-rellenado para continuar.", + "session-expired-title": "Sesión expirada", + "access-denied": "Acceso denegado", + "upgrade": "Actualizar", + "do-not-access-app": "No tienes acceso a esta aplicación.", + "dont-have-access": "No tienes acceso.", + "valid-email-alert": "Por favor ingresa una dirección de correo electrónico válida.", + "otp-not-validate": "OTP no es válido.", + "domain-not-allowed": "Este dominio no está permitido", + "atleast-one-recipient-alert": "¡Por favor agrega al menos un destinatario!", + "incorrect-password-or-decryption-failed": "Contraseña incorrecta o fallo de descifrado.", + "incorrect-password-for-file": "Contraseña incorrecta para el archivo: {{file}}", + "error-uploading-pdf": "Error al subir PDF.", + "provide-password": "Por favor proporciona la contraseña.", + "only-pdf-allowed": "Solo se permiten archivos PDF.", + "invalid-username-password-region": "Usuario/contraseña o región inválidos.", + "pfx-extension-alert": "Por favor sube un archivo con extensión .pfx.", + "email-already-exist": "El correo electrónico ya existe", + "branding": "Marca", + "branding-help": "El branding permite el white labelling de su aplicación", + "custom-sub-domain": "Subdominio personalizado", + "app-name": "Nombre de la aplicación", + "provide-domain-name": "Proporcione su nombre de dominio", + "provide-app-name": "Proporcione el nombre de su aplicación", + "logo": "Logo", + "upload-app-logo": "Suba el logotipo de su aplicación", + "prefill-unfilled-widget": "Los siguientes campos obligatorios no pueden quedar vacíos: {{emptyWidget}}. Por favor, complételos para continuar.", + "Dashboard": "Panel", + "Analytics": "Analítica", + "Templates": "Plantillas", + "Need your sign": "Necesitan tu firma", + "In Progress": "En progreso", + "Completed": "Completado", + "Drafts": "Borradores", + "Declined": "Rechazados", + "Expired": "Expirados", + "Contactbook": "Agenda de contactos", + "My Signature": "Mi firma", + "API Token": "Token API", + "Webhook": "Webhook", + "Preferences": "Preferencias", + "Teams": "Equipos", + "Users": "Usuarios", + "Drive": "Drive", + "Branding": "Marca", + "Mail": "Correo", + "Storage": "Almacenamiento", + "Signing certificate": "Certificado de firma", + "General": "General", + "Organizations": "Organizaciones", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "Depurar PDF", + "New Document": "Nuevo documento", + "subscription": "Suscripción", + "Draft document": "Borrador de documento", + "Draft template": "Borrador de plantilla", + "Public sign": "Firma pública", + "Signup": "Registrarse", + "delete-contact": "Eliminar contacto", + "total-records-found": "Total de registros encontrados: {{count}}", + "Invalid-records-found": "Registros inválidos encontrados: {{records}}", + "previous": "Anterior", + "page-n-of-n": "Página {{currentPage}} de {{totalPages}}", + "import": "Importar", + "search": "Buscar", + "viewed-on": "Visto el: {{ViewedOn}}", + "signed-on": "Firmado el: {{SignedOn}}", + "hide": "Ocultar", + "show-more": "Mostrar más", + "browse-or-drag-to-replace-existing-file": "Busque o arrastre y suelte un nuevo archivo para reemplazar el existente", + "optional-details": "Detalles opcionales", + "mail-adapter-subscription-alert": "Bitte upgraden Sie auf den Professional- oder Team-Plan, um ein benutzerdefiniertes SMTP einzurichten.", + "connect-to-mail": "Conectar con Gmail", + "custom-smtp": "SMTP personalizado", + "default-smtp": "SMTP predeterminado de {{appName}}", + "host": "Host", + "port": "Puerto", + "sender-email": "Correo del remitente", + "username": "Nombre de usuario", + "use-default-mail-adapter": "¿Está seguro de que desea usar los servidores de correo predeterminados de {{appName}} para enviar solicitudes de firma? Recomendamos usar su propio servidor de Gmail o SMTP para una mejor entregabilidad.", + "verification-code-sent-registered-email": "Se ha enviado un código de verificación a su correo registrado <1>{{useremail}}. Ingrese el código a continuación para confirmar su configuración.", + "smpt-credentials": "Credenciales SMTP" } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index df027c141f..d6b3688fff 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -26,6 +26,8 @@ "Name": "Nom et Prénom", "Date": "Date" }, + "folder": "Dossier", + "pdf": "Pdf", "context-menu": { "Download": "Télécharger", "Rename": "Renommer", @@ -45,6 +47,10 @@ "upgrade-to": "Mettre à niveau vers", "pro": "PRO", "plan": "Offre", + "connect": "Connecter", + "connect-to-g-drive": "Se connecter à Google Drive", + "reconnect-to-g-drive": "Se reconnecter à Google Drive", + "gdrive-info-connect": "Lorsque Google Drive est connecté, le document complété sera enregistré dans le dossier {{appName}} sur Google Drive.", "subscription-renew-warning": "Votre abonnement expirera dans {{remainingDays}} jours. Veuillez renouveler votre abonnement.", "subscribe-card-teamplan": "Libérez toute la puissance de la collaboration ! Créez un nombre illimité d'organisations, d'équipes et de hiérarchies. Partagez des modèles de manière transparente entre les équipes et attribuez des rôles d'utilisateur personnalisés. Améliorez votre flux de travail dès aujourd'hui !", "subscribe-card-plan": "Débloquez des fonctionnalités premium à partir de seulement {{premiumPrice}}/mois. Bénéficiez de performances améliorées et de seulement {{addonPrice}} par crédit supplémentaire après vos crédits premium inclus.", @@ -58,7 +64,7 @@ "welcome": "Content de te revoir!", "Login-to-your-account": "Se connecter à son compte", "password": "Mot de passe", - "forgot-password": "Mot de passe oublié?", + "forgot-password": "Mot de passe oublié", "loading": "Chargement...", "of": "de", "sign-SSO": "Connectez-vous avec SSO", @@ -155,7 +161,9 @@ "created-date": "Date de création", "Type": "Saisir", "Logs": "Journaux", - "Expiry-date": "Fecha de caducidad" + "Expiry-date": "Fecha de caducidad", + "Company": "Organisation", + "JobTitle": "Votre Fonction" }, "btnLabel": { "sign": "Signer", @@ -192,16 +200,15 @@ "Contactbook": "Il s'agit d'une liste de contacts/signataires que vous avez ajoutés. Ceux-ci apparaîtront sous forme de suggestions lorsque vous tenterez d'ajouter des signataires à un nouveau document.", "Templates": "Il s'agit d'une liste de modèles à votre disposition pour créer des documents. Vous pouvez cliquer sur le bouton 'Utiliser' pour créer un nouveau document à l'aide d'un modèle, modifier le document et ajouter des signataires à l'étape suivante." }, - "form-name": { - "Sign Yourself": "signez vous-même", - "Request Signatures": "Demander des signatures", - "New Template": "Nouveau modèle" - }, + "Sign Yourself": "signez vous-même", + "Request Signatures": "Demander des signatures", + "New Template": "Nouveau modèle", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "fichier sélectionné", "template-title": "Titre du modèle", "document-title": "Titre du document", + "title": "Titre", "description": "Description", "time-to-complete": "Temps de réalisation (jours)", "send-in-order": "Envoyer dans l'ordre ?", @@ -389,6 +396,10 @@ "Email-verified-alert-1": "L'e-mail est vérifié.", "Email-verified-alert-2": "L'e-mail est déjà vérifié.", "upload-stamp-image": "Télécharger l'image du tampon", + "draw-signature": "Dessiner la signature", + "draw-initials": "Dessiner les initiales", + "enter-text": "Saisir du texte", + "enter-widgettype": "Saisir {{widgetType}}", "draw": "Dessiner", "type": "Taper", "color-type": { @@ -697,7 +708,7 @@ "quota-mail-info": "Pour maintenir la qualité du service et prévenir le spam, OpenSign permet jusqu'à 15 e-mails par mois avec le plan gratuit. Passez à l'offre supérieure pour un envoi illimité d'e-mails.", "quota-mail-reset": "Les crédits de votre email de demande de signature seront réinitialisés le", "quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.", - "quota-mail-tip-tip": "Astuce: Vous pouvez toujours signer un nombre <1>illimité de documents en partageant manuellement le lien de demande de signature.", + "quota-mail-tip": "Astuce: Vous pouvez toujours signer un nombre <1>illimité de documents en partageant manuellement le lien de demande de signature.", "quota-mail-head": "Quota atteint", "unauthorized-modal": "Vous n'êtes pas autorisé à effectuer cette action, veuillez contacter {{adminEmail}}.", "sent-this-month": "envoyé ce mois-ci", @@ -729,7 +740,7 @@ "public-tour-message": "Le modèle doit être public avant que vous puissiez générer un lien partageable.", "add-user-template": "Vous devez ajouter un rôle avant de pouvoir lui ajouter des champs. ", "pdf-uncompatible": "PDF n'est pas compatible, veuillez contacter {{appName}}", - "text-field-tour": "Les champs de type 'Texte' doivent être remplis à l'avance avant l'envoi du document. Si vous avez besoin que les signataires fournissent des informations, utilisez plutôt le champ 'Saisie de texte'.", + "text-field-tour": "Les champs 'Pré-remplissage' doivent être remplis avant l'envoi du document. Si vous avez besoin de l'intervention des signataires, utilisez plutôt les champs réservés aux signataires.", "attach-signer-tour": "Vous devez associer un signataire à chaque rôle. Vous pouvez le faire en cliquant sur cette icône. Une fois que vous avez sélectionné un signataire, il sera attaché à tous les champs associés à ce rôle qui apparaissent dans la même couleur.", "allowed-signature-types": "Types de signature autorisés", "at-least-one-signature-type": "Au moins un type de signature doit être activé.", @@ -777,7 +788,7 @@ "agree-p1": "Je confirme avoir lu et compris les ", "agree-p2": "Divulgation des enregistrements électroniques et des signatures", "agree-p3": "et consentez à l'utilisation d'enregistrements et de signatures électroniques.", - "agrre-button": " Accepter et continuer ", + "agrre-button": "Je confirme et j'accepte de continuer", "term-cond-title": "Termes et conditions", "term-cond-h": "DIVULGATION D'ENREGISTREMENT ÉLECTRONIQUE ET DE SIGNATURE", "term-cond-p1": "Cette divulgation d'enregistrement électronique et de signature (' Divulgation ') est un accord entre le créateur du document (' Expéditeur ') et le signataire (' Vous '), facilité via la plateforme {{appName}} ( Plateforme ). En signant des documents via {{appName}}, vous acceptez les conditions décrites dans cette divulgation. Veuillez la lire attentivement avant de continuer.", @@ -1037,12 +1048,98 @@ "search-templates": "Rechercher des modèles…", "search-documents": "Rechercher des documents…", "search-contacts": "Rechercher des contacts…", + "add-role-alert": "Veuillez ajouter au moins un rôle", + "edit-draft": "Modifier le brouillon", "invalid-email-found": "Adresse e-mail invalide trouvée : {{email}}", "duplicate-email-found": "Adresse e-mail en double trouvée : {{email}}", "vertical": "Vertical", "horizontal": "Horizontal", "billing": "Facturation", "console": "Console", + "prefill-widget": "Widgets de Préremplissage", "action-prohibited": "Cette action n'est pas autorisée pour votre domaine de messagerie. Veuillez contacter votre administrateur pour obtenir de l'aide.", - "browse-or-drag-to-replace-existing-file": "Parcourez ou faites glisser un nouveau fichier pour remplacer l'existant" + "must-have-at-least-one-vacant-role": "Vous devez laisser au moins un rôle non attribué avant de définir un template comme 'public'.", + "remove-duplicate": "Veuillez supprimer l'option en double", + "prefill-bulk-error": "L'envoi en masse n'est pas autorisé lorsque des widgets de pré-remplissage sont ajoutés. Veuillez supprimer les widgets de pré-remplissage pour continuer.", + "session-expired-title": "Session expirée", + "access-denied": "Accès refusé", + "upgrade": "Mettre à jour", + "do-not-access-app": "Vous n'avez pas accès à cette application.", + "dont-have-access": "Vous n'avez pas accès.", + "valid-email-alert": "Veuillez saisir une adresse e-mail valide.", + "otp-not-validate": "OTP non valide.", + "domain-not-allowed": "Ce domaine n'est pas autorisé", + "atleast-one-recipient-alert": "Veuillez ajouter au moins un destinataire !", + "incorrect-password-or-decryption-failed": "Mot de passe incorrect ou échec du déchiffrement.", + "incorrect-password-for-file": "Mot de passe incorrect pour le fichier : {{file}}", + "error-uploading-pdf": "Erreur lors du téléchargement du PDF.", + "provide-password": "Veuillez fournir le mot de passe.", + "only-pdf-allowed": "Seuls les fichiers PDF sont autorisés.", + "invalid-username-password-region": "Nom d'utilisateur/mot de passe ou région invalide.", + "pfx-extension-alert": "Veuillez télécharger un fichier avec l'extension .pfx.", + "email-already-exist": "L'e-mail existe déjà", + "branding": "Image de marque", + "branding-help": "Le branding permet le white labelling de votre application", + "custom-sub-domain": "Sous-domaine personnalisé", + "app-name": "Nom de l'application", + "provide-domain-name": "Fournissez votre nom de domaine", + "provide-app-name": "Fournissez le nom de votre application", + "logo": "Logo", + "upload-app-logo": "Téléchargez le logo de votre application", + "prefill-unfilled-widget": "Les champs obligatoires suivants ne peuvent pas être vides : {{emptyWidget}}. Veuillez les remplir pour continuer.", + "Dashboard": "Tableau de bord", + "Analytics": "Analytique", + "Templates": "Modèles", + "Need your sign": "Besoin de votre signature", + "In Progress": "En cours", + "Completed": "Complété", + "Drafts": "Brouillons", + "Declined": "Signature refusé", + "Expired": "Expiré", + "Contactbook": "Carnet de contacts", + "My Signature": "Ma signature", + "API Token": "Jeton API", + "Webhook": "Webhook", + "Preferences": "Préférences", + "Teams": "Équipe", + "Users": "Utilisateurs", + "Drive": "Lecteur", + "Branding": "Image de marque", + "Mail": "Courrier", + "Storage": "Stockage", + "Signing certificate": "Certificat de signature", + "General": "Général", + "Organizations": "Organisations", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "Déboguer le PDF", + "New Document": "Nouveau document", + "subscription": "Abonnement", + "Draft document": "Brouillon de document", + "Draft template": "Brouillon de modèle", + "Public sign": "Signature publique", + "Signup": "Inscription", + "delete-contact": "Supprimer le contact", + "total-records-found": "Nombre total d'enregistrements trouvés : {{count}}", + "Invalid-records-found": "Enregistrements invalides trouvés : {{records}}", + "previous": "Précédent", + "page-n-of-n": "Page {{currentPage}} sur {{totalPages}}", + "import": "Importer", + "search": "Rechercher", + "viewed-on": "Consulté le : {{ViewedOn}}", + "signed-on": "Signé le : {{SignedOn}}", + "hide": "Masquer", + "show-more": "Afficher plus", + "browse-or-drag-to-replace-existing-file": "Parcourez ou faites glisser un nouveau fichier pour remplacer l'existant", + "optional-details": "Détails facultatifs", + "mail-adapter-subscription-alert": "Veuillez passer au plan Professionnel ou Équipe pour configurer un SMTP personnalisé.", + "connect-to-mail": "Se connecter à Gmail", + "custom-smtp": "SMTP personnalisé", + "default-smtp": "SMTP par défaut de {{appName}}", + "host": "Hôte", + "port": "Port", + "sender-email": "Email de l'expéditeur", + "username": "Nom d'utilisateur", + "use-default-mail-adapter": "Voulez-vous vraiment utiliser les serveurs de messagerie par défaut de {{appName}} pour envoyer vos demandes de signature ? Nous vous recommandons d'utiliser votre propre serveur Gmail ou SMTP pour une meilleure délivrabilité.", + "verification-code-sent-registered-email": "Un code de vérification a été envoyé à votre email enregistré <1>{{useremail}}. Veuillez entrer le code ci-dessous pour confirmer vos paramètres.", + "smpt-credentials": "Identifiants SMTP" } diff --git a/apps/OpenSign/public/locales/hi/translation.json b/apps/OpenSign/public/locales/hi/translation.json index c21f3c042a..e4930eaa6d 100644 --- a/apps/OpenSign/public/locales/hi/translation.json +++ b/apps/OpenSign/public/locales/hi/translation.json @@ -26,6 +26,8 @@ "Name": "नाम", "Date": "दिनांक" }, + "folder": "फ़ोल्डर", + "pdf": "पीडीएफ़", "context-menu": { "Download": "डाउनलोड करें", "Rename": "नाम बदलें", @@ -44,6 +46,10 @@ "contact-now": "अभी संपर्क करें", "upgrade-to": "इसमें अपग्रेड करें", "plan": "योजना", + "connect": "कनेक्ट करें", + "connect-to-g-drive": "Google Drive से कनेक्ट करें", + "reconnect-to-g-drive": "Google Drive से फिर से कनेक्ट करें", + "gdrive-info-connect": "जब Google Drive जुड़ा होता है, तो पूर्ण दस्तावेज़ {{appName}} फ़ोल्डर में Google Drive पर सहेजा जाएगा।", "subscription-renew-warning": "आपकी सदस्यता {{remainingDays}} दिनों में समाप्त हो जाएगी। कृपया अपनी सदस्यता नवीनीकृत करें।", "subscribe-card-teamplan": "सहयोग की पूरी शक्ति को अनलॉक करें! असीमित संगठन, टीम और पदानुक्रम बनाएं। टीमों में टेम्पलेट को निर्बाध रूप से साझा करें और कस्टम उपयोगकर्ता भूमिकाएँ असाइन करें। आज ही अपने वर्कफ़्लो को उन्नत करें!", "subscribe-card-plan": "केवल {{premiumPrice}}/माह से शुरू होने वाली प्रीमियम सुविधाओं को अनलॉक करें। अपने शामिल प्रीमियम क्रेडिट के बाद प्रति अतिरिक्त क्रेडिट केवल {{addonPrice}} पर बढ़ी हुई प्रदर्शन का आनंद लें।", @@ -58,7 +64,7 @@ "welcome": "वापसी पर स्वागत है!", "Login-to-your-account": "अपने खाते में प्रवेश करे", "password": "पासवर्ड", - "forgot-password": "पासवर्ड भूल गए?", + "forgot-password": "पासवर्ड भूल गए", "loading": "लोड हो रहा है...", "of": "का", "sign-SSO": "SSO के साथ साइन इन करें", @@ -181,7 +187,9 @@ "created-date": "निर्माण तिथि", "Type": "प्रकार", "Logs": "लॉग", - "Expiry-date": "समाप्ति तिथि" + "Expiry-date": "समाप्ति तिथि", + "Company": "कंपनी", + "JobTitle": "पद" }, "report-help": { "Draft Documents": "ये वे दस्तावेज़ हैं जिन्हें आपने शुरू तो किया है लेकिन भेजने के लिए अंतिम रूप नहीं दिया है।", @@ -193,16 +201,15 @@ "Contactbook": "यह आपके द्वारा जोड़े गए संपर्कों/हस्ताक्षरकर्ताओं की सूची है। जब आप किसी नए दस्तावेज़ में हस्ताक्षरकर्ताओं को जोड़ने का प्रयास करेंगे तो ये सुझावों के रूप में दिखाई देंगे।", "Templates": "यह उन टेम्पलेट्स की सूची है जो दस्तावेज़ बनाने के लिए आपके लिए उपलब्ध हैं। आप टेम्पलेट का उपयोग करके एक नया दस्तावेज़ बनाने के लिए 'उपयोग करें' बटन पर क्लिक कर सकते हैं, दस्तावेज़ को संशोधित कर सकते हैं और अगले चरण में हस्ताक्षरकर्ताओं को जोड़ सकते हैं।" }, - "form-name": { - "Sign Yourself": "स्वयं हस्ताक्षर करें", - "Request Signatures": "हस्ताक्षर का अनुरोध करें", - "New Template": "नया टेम्पलेट" - }, + "Sign Yourself": "स्वयं हस्ताक्षर करें", + "Request Signatures": "हस्ताक्षर का अनुरोध करें", + "New Template": "नया टेम्पलेट", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "फ़ाइल चयनित", "template-title": "टेम्पलेट शीर्षक", "document-title": "दस्तावेज़ शीर्षक", + "title": "शीर्षक", "description": "विवरण", "time-to-complete": "पूरा करने का समय (दिन)", "send-in-order": "क्रम से भेजें", @@ -389,6 +396,10 @@ "Email-verified-alert-1": "ईमेल सत्यापित है।", "Email-verified-alert-2": "ईमेल पहले से ही सत्यापित है।", "upload-stamp-image": "मोहर छवि अपलोड करें", + "draw-signature": "हस्ताक्षर बनाएं", + "draw-initials": "इनिशियल्स बनाएं", + "enter-text": "पाठ दर्ज करें", + "enter-widgettype": "{{widgetType}} दर्ज करें", "draw": "आरेखित करें", "type": "टाइप", "color-type": { @@ -729,7 +740,7 @@ "public-tour-message": "साझा करने योग्य लिंक उत्पन्न करने से पहले टेम्पलेट को सार्वजनिक होना चाहिए।", "add-user-template": "इसके लिए फ़ील्ड जोड़ने से पहले आपको एक भूमिका जोड़ने की आवश्यकता है।", "pdf-uncompatible": "यह पीडीएफ संगत नहीं है, कृपया {{appName}} से संपर्क करें", - "text-field-tour": "दस्तावेज़ भेजे जाने से पहले 'टेक्स्ट' प्रकार के फ़ील्ड पहले से भरे जाने चाहिए। यदि आपको हस्ताक्षरकर्ताओं से इनपुट प्रदान करने की आवश्यकता है, तो इसके बजाय 'टेक्स्ट इनपुट' फ़ील्ड का उपयोग करें।", + "text-field-tour": "दस्तावेज़ सबमिट करने से पहले 'प्रीफ़िल' फ़ील्ड को पहले से भरना होगा। यदि आपको हस्ताक्षरकर्ताओं से इनपुट की आवश्यकता है, तो इसके बजाय हस्ताक्षरकर्ता फ़ील्ड का उपयोग करें।", "attach-signer-tour": "आपको प्रत्येक भूमिका में एक हस्ताक्षरकर्ता संलग्न करने की आवश्यकता है। आप इस आइकन पर क्लिक करके ऐसा कर सकते हैं। एक बार जब आप एक हस्ताक्षरकर्ता का चयन कर लेते हैं तो यह उस भूमिका से जुड़े सभी फ़ील्ड से जुड़ जाएगा जो एक ही रंग में दिखाई देते हैं।", "allowed-signature-types": "अनुमत हस्ताक्षर प्रकार", "at-least-one-signature-type": "कम से कम एक हस्ताक्षर प्रकार सक्षम होना चाहिए।", @@ -777,7 +788,7 @@ "agree-p1": "मैं पुष्टि करता हूं कि मैंने पढ़ लिया है और समझ लिया है ", "agree-p2": "इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर प्रकटीकरण", "agree-p3": "और इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर का उपयोग करने के लिए सहमति।", - "agrre-button": " सहमत हूँ और जारी रखें", + "agrre-button": "मैं पुष्टि करता हूँ और आगे बढ़ने के लिए सहमत हूँ", "term-cond-title": "नियम और शर्तें", "term-cond-h": "इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर प्रकटीकरण", "term-cond-p1": "यह इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर प्रकटीकरण ('प्रकटीकरण') दस्तावेज़ निर्माता ('प्रेषक') और हस्ताक्षरकर्ता ('आप') के बीच एक समझौता है, जिसे {{appName}} प्लेटफ़ॉर्म ('प्लेटफ़ॉर्म') के माध्यम से सुगम बनाया गया है। {{appName}} के माध्यम से दस्तावेज़ों पर हस्ताक्षर करके, आप इस प्रकटीकरण में उल्लिखित शर्तों से सहमत होते हैं। कृपया आगे बढ़ने से पहले इसे ध्यान से पढ़ें।", @@ -1037,12 +1048,98 @@ "search-templates": "टेम्पलेट खोजें…", "search-documents": "दस्तावेज़ खोजें…", "search-contacts": "संपर्क खोजें…", + "add-role-alert": "कृपया कम से कम एक भूमिका जोड़ें", + "edit-draft": "ड्राफ्ट संपादित करें", "invalid-email-found": "अमान्य ईमेल पाया गया: {{email}}", "duplicate-email-found": "डुप्लिकेट ईमेल पाया गया: {{email}}", "vertical": "वर्टिकल", "horizontal": "हॉरिज़ॉन्टल", "billing": "बिलिंग", "console": "कंसोल", + "prefill-widget": "पूर्व भराव विजेट्स", "action-prohibited": "यह क्रिया आपके ईमेल डोमेन के लिए अनुमत नहीं है। कृपया सहायता के लिए अपने व्यवस्थापक से संपर्क करें।", - "browse-or-drag-to-replace-existing-file": "नई फ़ाइल ब्राउज़ करें या खींचकर छोड़ें ताकि मौजूदा फ़ाइल को बदला जा सके" + "must-have-at-least-one-vacant-role": "किसी टेम्पलेट को 'public' पर सेट करने से पहले कम से कम एक भूमिका खाली होनी चाहिए।", + "remove-duplicate": "कृपया डुप्लिकेट विकल्प हटाएं", + "prefill-bulk-error": "जब प्रीफ़िल विजेट जोड़े जाते हैं तो बल्क भेजना अनुमति नहीं है। कृपया आगे बढ़ने के लिए प्रीफ़िल विजेट हटा दें।", + "session-expired-title": "सत्र समाप्त हो गया", + "access-denied": "पहुंच अस्वीकृत", + "upgrade": "अपग्रेड", + "do-not-access-app": "आपको इस एप्लिकेशन तक पहुंच नहीं है।", + "dont-have-access": "आपको पहुंच नहीं है।", + "valid-email-alert": "कृपया एक मान्य ईमेल पता दर्ज करें।", + "otp-not-validate": "ओटीपी मान्य नहीं है।", + "domain-not-allowed": "यह डोमेन अनुमति नहीं है", + "atleast-one-recipient-alert": "कृपया कम से कम एक प्राप्तकर्ता जोड़ें!", + "incorrect-password-or-decryption-failed": "गलत पासवर्ड या डिक्रिप्शन विफल।", + "incorrect-password-for-file": "फ़ाइल के लिए गलत पासवर्ड: {{file}}", + "error-uploading-pdf": "PDF अपलोड करते समय त्रुटि।", + "provide-password": "कृपया पासवर्ड प्रदान करें।", + "only-pdf-allowed": "केवल PDF फ़ाइलें अनुमत हैं।", + "invalid-username-password-region": "अमान्य उपयोगकर्ता नाम/पासवर्ड या क्षेत्र।", + "pfx-extension-alert": ".pfx एक्सटेंशन वाली फ़ाइल अपलोड करें।", + "email-already-exist": "ईमेल पहले से मौजूद है", + "branding": "ब्रांडिंग", + "branding-help": "ब्रांडिंग आपकी ऐप में वाइट लेबलिंग की सुविधा देती है", + "custom-sub-domain": "कस्टम सब-डोमेन", + "app-name": "ऐप का नाम", + "provide-domain-name": "अपना डोमेन नाम दर्ज करें", + "provide-app-name": "अपना ऐप नाम दर्ज करें", + "logo": "लोगो", + "upload-app-logo": "अपने ऐप का लोगो अपलोड करें", + "prefill-unfilled-widget": "निम्न अनिवार्य फ़ील्ड खाली नहीं छोड़े जा सकते: {{emptyWidget}}। कृपया आगे बढ़ने के लिए इन्हें भरें।", + "Dashboard": "डैशबोर्ड", + "Analytics": "विश्लेषिकी", + "Templates": "टेम्पलेट्स", + "Need your sign": "आपके हस्ताक्षर की आवश्यकता है", + "In Progress": "प्रगति में है", + "Completed": "पूरा हुआ", + "Drafts": "ड्राफ्ट", + "Declined": "अस्वीकृत", + "Expired": "समाप्त", + "Contactbook": "संपर्क पुस्तिका", + "My Signature": "मेरा हस्ताक्षर", + "API Token": "एपीआई टोकन", + "Webhook": "वेबहूक", + "Preferences": "वरीयताएँ", + "Teams": "टीमें", + "Users": "उपयोगकर्ता", + "Drive": "ड्राइव", + "Branding": "ब्रांडिंग", + "Mail": "मेल", + "Storage": "भंडारण", + "Signing certificate": "हस्ताक्षर प्रमाण पत्र", + "General": "सामान्य", + "Organizations": "संगठन", + "OrgAdmins": "संगठन व्यवस्थापक", + "Debug Pdf": "पीडीएफ़ डीबग करें", + "New Document": "नया दस्तावेज़", + "subscription": "सब्सक्रिप्शन", + "Draft document": "ड्राफ्ट दस्तावेज़", + "Draft template": "ड्राफ्ट टेम्पलेट", + "Public sign": "पब्लिक साइन", + "Signup": "साइन अप करें", + "delete-contact": "संपर्क हटाएं", + "total-records-found": "कुल रिकॉर्ड मिले: {{count}}", + "Invalid-records-found": "अमान्य रिकॉर्ड मिले: {{records}}", + "previous": "पिछला", + "page-n-of-n": "पृष्ठ {{currentPage}} का {{totalPages}}", + "import": "आयात करें", + "search": "खोजें", + "viewed-on": "देखा गया: {{ViewedOn}}", + "signed-on": "हस्ताक्षर किया गया: {{SignedOn}}", + "hide": "छिपाएं", + "show-more": "और दिखाएं", + "browse-or-drag-to-replace-existing-file": "नई फ़ाइल ब्राउज़ करें या खींचकर छोड़ें ताकि मौजूदा फ़ाइल को बदला जा सके", + "optional-details": "वैकल्पिक विवरण", + "mail-adapter-subscription-alert": "कस्टम SMTP सेटअप करने के लिए कृपया प्रोफेशनल या टीम प्लान में अपग्रेड करें।", + "connect-to-mail": "Gmail से कनेक्ट करें", + "custom-smtp": "कस्टम SMTP", + "default-smtp": "{{appName}} डिफ़ॉल्ट SMTP", + "host": "होस्ट", + "port": "पोर्ट", + "sender-email": "प्रेषक ईमेल", + "username": "यूज़रनेम", + "use-default-mail-adapter": "क्या आप वाकई {{appName}} के डिफ़ॉल्ट मेल सर्वर का उपयोग करके सिग्नेचर अनुरोध भेजना चाहते हैं? बेहतर इनबॉक्स डिलीवरी के लिए हम अपने Gmail या SMTP सर्वर का उपयोग करने की सिफारिश करते हैं।", + "verification-code-sent-registered-email": "आपके पंजीकृत ईमेल <1>{{useremail}} पर एक सत्यापन कोड भेजा गया है। कृपया अपनी सेटिंग की पुष्टि के लिए नीचे कोड दर्ज करें।", + "smpt-credentials": "SMTP क्रेडेंशियल्स" } diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index b406c82c39..5f24e52ae4 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -26,6 +26,8 @@ "Name": "Nome", "Date": "Data" }, + "folder": "Cartella", + "pdf": "Pdf", "context-menu": { "Download": "Scarica", "Rename": "Rinomina", @@ -44,6 +46,10 @@ "contact-now": "Contatta ora", "upgrade-to": "Aggiorna a", "plan": "Piano", + "connect": "Connetti", + "connect-to-g-drive": "Connetti a Google Drive", + "reconnect-to-g-drive": "Riconnetti a Google Drive", + "gdrive-info-connect": "Quando Google Drive è connesso, il documento completato verrà salvato nella cartella {{appName}} su Google Drive.", "subscription-renew-warning": "Il tuo abbonamento scadrà tra {{remainingDays}} giorni. Ti preghiamo di rinnovarlo.", "subscribe-card-teamplan": "Sblocca tutto il potenziale della collaborazione! Crea organizzazioni, team e gerarchie illimitati. Condividi modelli senza problemi tra i team e assegna ruoli personalizzati agli utenti. Migliora il tuo flusso di lavoro oggi stesso!", "subscribe-card-plan": "Sblocca le funzionalità premium a partire da soli {{premiumPrice}}/mese. Approfitta di prestazioni migliorate e paga solo {{addonPrice}} per ogni credito aggiuntivo dopo quelli inclusi.", @@ -58,7 +64,7 @@ "welcome": "Bentornato!", "Login-to-your-account": "Accedi al tuo account", "password": "Password", - "forgot-password": "Password dimenticata?", + "forgot-password": "Password dimenticata", "loading": "Caricamento...", "of": "di", "sign-SSO": "Accedi con SSO", @@ -181,7 +187,9 @@ "created-date": "Data di creazione", "Type": "Tipo", "Logs": "Log", - "Expiry-date": "Data di scadenza" + "Expiry-date": "Data di scadenza", + "Company": "Azienda", + "JobTitle": "Titolo professionale" }, "report-help": { "Draft Documents": "Questi sono documenti che hai iniziato ma non hai ancora finalizzato per l'invio.", @@ -193,16 +201,15 @@ "Contactbook": "Questa è una lista di contatti/firmatari aggiunti da te. Appariranno come suggerimenti quando provi ad aggiungere firmatari a un nuovo documento.", "Templates": "Questa è una lista di modelli disponibili per creare documenti. Puoi fare clic sul pulsante 'Usa' per creare un nuovo documento utilizzando un modello, modificare il documento e aggiungere firmatari nel passaggio successivo." }, - "form-name": { - "Sign Yourself": "Firma tu stesso", - "Request Signatures": "Richiedi firme", - "New Template": "Nuovo modello" - }, + "Sign Yourself": "Firma tu stesso", + "Request Signatures": "Richiedi firme", + "New Template": "Nuovo modello", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "file selezionato", "template-title": "Titolo del modello", "document-title": "Titolo del documento", + "title": "Titolo", "description": "Descrizione", "time-to-complete": "Tempo per completare (giorni)", "send-in-order": "Invia in ordine", @@ -389,6 +396,10 @@ "Email-verified-alert-1": "Email verificata.", "Email-verified-alert-2": "Email già verificata.", "upload-stamp-image": "Carica immagine timbro", + "draw-signature": "Disegna la firma", + "draw-initials": "Disegna le iniziali", + "enter-text": "Inserisci testo", + "enter-widgettype": "Inserisci {{widgetType}}", "draw": "Disegno", "type": "Digitata", "color-type": { @@ -729,7 +740,7 @@ "public-tour-message": "Il modello deve essere pubblico prima di poter generare un link condivisibile.", "add-user-template": "Devi aggiungere un ruolo prima di poter aggiungere i campi per esso.", "pdf-uncompatible": "Questo PDF non è compatibile, contatta {{appName}}", - "text-field-tour": "I campi di tipo 'Testo' devono essere compilati in anticipo prima che il documento venga inviato. Se hai bisogno che i firmatari forniscano un input, usa invece il campo 'Testo di input'.", + "text-field-tour": "I campi 'Prefill' devono essere compilati in anticipo prima dell'invio del documento. Se hai bisogno che i firmatari forniscano input, usa invece i campi dei firmatari.", "attach-signer-tour": "Devi allegare un firmatario a ogni ruolo. Puoi farlo cliccando su questa icona. Una volta selezionato un firmatario, sarà associato a tutti i campi associati a quel ruolo che appariranno dello stesso colore.", "allowed-signature-types": "Tipi di firma consentiti", "at-least-one-signature-type": "Almeno un tipo di firma deve essere abilitato.", @@ -777,7 +788,7 @@ "agree-p1": "Confermo di aver letto e compreso il", "agree-p2": "Divulgazione sulle registrazioni e firme elettroniche", "agree-p3": "e acconsento all'uso di registrazioni e firme elettroniche.", - "agrre-button": "Accetta e Continua", + "agrre-button": "Confermo e accetto di continuare", "term-cond-title": "Termini e Condizioni", "term-cond-h": "DIVULGAZIONE SULLE REGISTRAZIONI E FIRME ELETTRONICHE", "term-cond-p1": "Questa Divulgazione sulle Registrazioni e Firme Elettroniche ('Divulgazione') è un accordo tra il Creatore del Documento ('Mittente') e il Firmatario ('Tu'), facilitato tramite la piattaforma {{appName}} (Piattaforma). Firmando documenti tramite {{appName}}, accetti i termini descritti in questa Divulgazione. Ti preghiamo di leggerla attentamente prima di procedere.", @@ -1037,12 +1048,97 @@ "search-templates": "Cerca modelli…", "search-documents": "Cerca documenti…", "search-contacts": "Cerca contatti…", + "add-role-alert": "Si prega di aggiungere almeno un ruolo", + "edit-draft": "Modifica bozza", "invalid-email-found": "Email non valida trovata: {{email}}", "duplicate-email-found": "Email duplicata trovata: {{email}}", "vertical": "Verticale", "horizontal": "Orizzontale", "billing": "Fatturazione", "console": "Console", + "prefill-widget": "Widget Precompilati", "action-prohibited": "Questa azione non è consentita per il tuo dominio email. Contatta il tuo amministratore per ricevere assistenza.", - "browse-or-drag-to-replace-existing-file": "Sfoglia o trascina un nuovo file per sostituire quello esistente" + "must-have-at-least-one-vacant-role": "Devi lasciare almeno un ruolo non assegnato prima di impostare un template su 'public'.", + "remove-duplicate": "Si prega di rimuovere l'opzione duplicata", + "prefill-bulk-error": "L'invio in blocco non è consentito quando sono stati aggiunti i widget di precompilazione. Si prega di rimuovere i widget di precompilazione per procedere.", + "session-expired-title": "Sessione scaduta", + "access-denied": "Accesso negato", + "upgrade": "Aggiorna", + "do-not-access-app": "Non hai accesso a questa applicazione.", + "dont-have-access": "Non hai accesso.", + "valid-email-alert": "Inserisci un indirizzo email valido.", + "otp-not-validate": "OTP non valido.", + "domain-not-allowed": "Questo dominio non è consentito", + "atleast-one-recipient-alert": "Aggiungi almeno un destinatario!", + "incorrect-password-or-decryption-failed": "Password errata o decrittazione non riuscita.", + "incorrect-password-for-file": "Password errata per il file: {{file}}", + "error-uploading-pdf": "Errore durante il caricamento del PDF.", + "provide-password": "Fornisci la password.", + "only-pdf-allowed": "Sono consentiti solo file PDF.", + "invalid-username-password-region": "Nome utente/password o regione non valida.", + "pfx-extension-alert": "Carica un file con estensione .pfx.", + "email-already-exist": "L'email esiste già", + "branding": "Marchio", + "branding-help": "Il branding consente il white labelling della tua app", + "custom-sub-domain": "Sottodominio personalizzato", + "app-name": "Nome dell'app", + "provide-domain-name": "Fornisci il tuo nome di dominio", + "provide-app-name": "Fornisci il nome della tua app", + "logo": "Logo", + "upload-app-logo": "Carica il logo della tua app", + "prefill-unfilled-widget": "I seguenti campi obbligatori non possono essere lasciati vuoti: {{emptyWidget}}. Per favore compilali per procedere.", + "Dashboard": "Dashboard", + "Analytics": "Analitica", + "Templates": "Modelli", + "Need your sign": "Necessita della tua firma", + "In Progress": "In corso", + "Completed": "Completati", + "Drafts": "Bozze", + "Declined": "Rifiutati", + "Expired": "Scaduti", + "Contactbook": "Rubrica", + "My Signature": "La mia firma", + "API Token": "Token API", + "Webhook": "Webhook", + "Preferences": "Preferenze", + "Teams": "Team", + "Users": "Utenti", + "Drive": "Drive", + "Branding": "Marchio", + "Mail": "Posta", + "Storage": "Archiviazione", + "Signing certificate": "Certificato di firma", + "General": "Generale", + "Organizations": "Organizzazioni", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "Debug PDF", + "New Document": "Nuovo documento", + "subscription": "Abbonamento", + "Draft document": "Bozza di documento", + "Draft template": "Bozza di modello", + "Public sign": "Firma pubblica", + "Signup": "Registrazione", + "delete-contact": "Elimina contatto", + "total-records-found": "Totale record trovati: {{count}}", + "Invalid-records-found": "Record non validi trovati: {{records}}", + "previous": "Precedente", + "page-n-of-n": "Pagina {{currentPage}} di {{totalPages}}", + "import": "Importa", + "search": "Cerca", + "viewed-on": "Visualizzato il: {{ViewedOn}}", + "signed-on": "Firmato il: {{SignedOn}}", + "hide": "Nascondi", + "show-more": "Mostra di più", + "browse-or-drag-to-replace-existing-file": "Sfoglia o trascina un nuovo file per sostituire quello esistente", + "optional-details": "Dettagli facoltativi", + "mail-adapter-subscription-alert": "Esegui l'upgrade al piano Professional o Team per configurare un SMTP personalizzato.", "connect-to-mail": "Connetti a Gmail", + "custom-smtp": "SMTP personalizzato", + "default-smtp": "SMTP predefinito di {{appName}}", + "host": "Host", + "port": "Porta", + "sender-email": "Email del mittente", + "username": "Nome utente", + "use-default-mail-adapter": "Sei sicuro di voler usare i server di posta predefiniti di {{appName}} per inviare le richieste di firma? Ti consigliamo di usare i tuoi server Gmail o SMTP per una migliore consegna in posta in arrivo.", + "verification-code-sent-registered-email": "Un codice di verifica è stato inviato alla tua email registrata <1>{{useremail}}. Inserisci il codice qui sotto per confermare le impostazioni.", + "smpt-credentials": "Credenziali SMTP" } diff --git a/apps/OpenSign/src/components/sidebar/Sidebar.jsx b/apps/OpenSign/src/components/sidebar/Sidebar.jsx index 547488ce43..1775f12b47 100644 --- a/apps/OpenSign/src/components/sidebar/Sidebar.jsx +++ b/apps/OpenSign/src/components/sidebar/Sidebar.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import { useState, useEffect } from "react"; import Menu from "./Menu"; import Submenu from "./SubMenu"; import SocialMedia from "../SocialMedia"; @@ -27,39 +27,18 @@ const Sidebar = ({ isOpen, closeSidebar }) => { if (localStorage.getItem("defaultmenuid")) { const Extand_Class = localStorage.getItem("Extand_Class"); const extClass = Extand_Class && JSON.parse(Extand_Class); - // console.log("extClass ", extClass); - let userRole = "contracts_User"; - if (extClass && extClass.length > 0) { - userRole = extClass[0].UserRole; - } - if ( - userRole === "contracts_Admin" || - userRole === "contracts_OrgAdmin" - ) { - const newSidebarList = sidebarList.map((item) => { - if (item.title === "Settings") { - // Make a shallow copy of the item - const newItem = { ...item }; - const arr = newItem.children.slice(0, 1); - newItem.children = [...arr, ...subSetting]; - return newItem; - } - return item; - }); - setmenuList(newSidebarList); - } else { - const newSidebarList = sidebarList.map((item) => { - if (item.title === "Settings") { - // Make a shallow copy of the item - const newItem = { ...item }; - const arr = newItem.children.slice(0, 1); - newItem.children = arr; - return newItem; - } - return item; - }); - setmenuList(newSidebarList); - } + const userRole = extClass?.[0]?.UserRole || "contracts_User"; + const isAdmin = + userRole === "contracts_Admin" || userRole === "contracts_OrgAdmin"; + const newSidebarList = sidebarList.map((item) => { + if (item.title !== "Settings") return item; + const newItem = { ...item }; + const baseChildren = isAdmin ? subSetting : subSetting?.slice(0, 1); + const mysignature = newItem.children.slice(0, 1); + newItem.children = [...mysignature, ...baseChildren]; + return newItem; + }); + setmenuList(newSidebarList); } } catch (e) { console.error("Problem", e); diff --git a/apps/OpenSign/src/pages/Preferences.jsx b/apps/OpenSign/src/pages/Preferences.jsx index 77a9249f5f..3e54209a93 100644 --- a/apps/OpenSign/src/pages/Preferences.jsx +++ b/apps/OpenSign/src/pages/Preferences.jsx @@ -217,7 +217,7 @@ const Preferences = () => { }; const tenantEmailTemplate = async (tenantRes) => { if (tenantRes === "user does not exist!") { - alert("User does not exist"); + alert(t("user-not-exist")); } else if (tenantRes) { setIsLoader(true); const updateRes = tenantRes; @@ -344,7 +344,7 @@ const Preferences = () => { localStorage.setItem("Extand_Class", JSON.stringify([_extUser])); } } catch (err) { - console.log("Err in resetting request mail", err); + console.log("Err in reseting request mail", err); } } else if (completion && !isDefaultMail?.completionMail) { setCompletionSubject(defaultCompHtml?.subject); @@ -361,7 +361,7 @@ const Preferences = () => { localStorage.setItem("Extand_Class", JSON.stringify([_extUser])); } } catch (err) { - console.log("Err in resetting completion mail", err); + console.log("Err in reseting completion mail", err); } } }; From 1b5c85fd5fc8320014acdac3cbee85e15c7cc5b8 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Fri, 1 Aug 2025 15:33:06 +0000 Subject: [PATCH 09/12] Merge pull request #1085 from nxglabs/signers_completed_main refactor: remove form-name from form title --- apps/OpenSign/src/pages/Form.jsx | 4 +--- apps/OpenSign/src/pages/Login.jsx | 2 +- apps/OpenSign/src/pages/Opensigndrive.jsx | 8 ++++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/OpenSign/src/pages/Form.jsx b/apps/OpenSign/src/pages/Form.jsx index 72673a1bfc..777ee89010 100644 --- a/apps/OpenSign/src/pages/Form.jsx +++ b/apps/OpenSign/src/pages/Form.jsx @@ -680,9 +680,7 @@ const Forms = (props) => {
-

- {t(`form-name.${props?.title}`)} -

+

{t(props?.title)}

{props.title === "Sign Yourself" && (
{t("signyour-self-description")} diff --git a/apps/OpenSign/src/pages/Login.jsx b/apps/OpenSign/src/pages/Login.jsx index c1f0c95900..3c7db81b7f 100644 --- a/apps/OpenSign/src/pages/Login.jsx +++ b/apps/OpenSign/src/pages/Login.jsx @@ -499,7 +499,7 @@ function Login() { to="/forgetpassword" className="text-[13px] op-link op-link-primary underline-offset-1 focus:outline-none ml-1" > - {t("forgot-password")} + {t("forgot-password")}?
diff --git a/apps/OpenSign/src/pages/Opensigndrive.jsx b/apps/OpenSign/src/pages/Opensigndrive.jsx index 0fc741ec94..12095d06e3 100644 --- a/apps/OpenSign/src/pages/Opensigndrive.jsx +++ b/apps/OpenSign/src/pages/Opensigndrive.jsx @@ -712,14 +712,14 @@ function Opensigndrive() { onClick={() => navigate("/form/sHAnZphf69")} > - {t("form-name.Sign Yourself")} + {t("Sign Yourself")} navigate("/form/8mZzFxbG1z")} > - {t("form-name.Request Signatures")} + {t("Request Signatures")}
@@ -840,14 +840,14 @@ function Opensigndrive() { onClick={() => navigate("/form/sHAnZphf69")} > - {t("form-name.Sign Yourself")} + {t("Sign Yourself")} navigate("/form/8mZzFxbG1z")} > - {t("form-name.Request Signatures")} + {t("Request Signatures")}
From 04543e826ae2a04ab2df2fa4a051d8ae567f4640 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Wed, 6 Aug 2025 07:35:09 +0000 Subject: [PATCH 10/12] Merge pull request #1105 from nxglabs/raktima-main-patch-2 fix: managesign report alignment and loader issue --- apps/OpenSign/src/pages/Managesign.jsx | 11 ++---- apps/OpenSign/src/styles/signature.css | 48 +++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/apps/OpenSign/src/pages/Managesign.jsx b/apps/OpenSign/src/pages/Managesign.jsx index 0655183017..6a1bbf68dc 100644 --- a/apps/OpenSign/src/pages/Managesign.jsx +++ b/apps/OpenSign/src/pages/Managesign.jsx @@ -324,13 +324,8 @@ const ManageSign = () => { hidden />
- {isLoader && ( -
- -
- )} {image ? ( -
+
signature { ref={canvasRef} penColor={penColor} canvasProps={{ - width: "456px", - height: "180px", className: - "signatureCanvas border-[2px] border-[#888] rounded-box" + "mysignatureCanvas border-[2px] border-[#888] rounded-box" }} onEnd={() => handleSignatureChange(canvasRef.current.toDataURL()) diff --git a/apps/OpenSign/src/styles/signature.css b/apps/OpenSign/src/styles/signature.css index 2365a2a9de..a028b65176 100644 --- a/apps/OpenSign/src/styles/signature.css +++ b/apps/OpenSign/src/styles/signature.css @@ -6,18 +6,21 @@ .react-datepicker__input-container { position: initial !important; } + .select-none-cls { -webkit-user-select: none; /* Disable text selection in WebKit browsers */ -moz-user-select: none; user-select: none; } + .widgets { -webkit-user-select: none; /* Disable text selection in WebKit browsers */ -moz-user-select: none; user-select: none; } + .radioButton { width: 100%; height: 100%; @@ -33,12 +36,18 @@ width: 440px; height: 167px; } + .tabWidth { border: 1px solid #f3f4f6; background-color: #f3f4f6; width: 440px; } +.mysignatureCanvas { + width: 456px; + height: 180px; +} + [data-theme="opensigndark"] .tabWidth { border: 1px solid #1f2937 !important; background-color: #1f2937 !important; @@ -48,6 +57,7 @@ width: 150px; height: 150px; } + .checked-radio::after { content: ""; position: absolute; @@ -56,14 +66,15 @@ width: 50%; height: 50%; border-radius: 9999px; - background-color: #111111; /* blue-500 */ + background-color: #111111; + /* blue-500 */ } .intialSignature { border: 2px solid #888; background-color: rgb(255, 255, 255); - width: 183px; - height: 183px; + width: 180px; + height: 180px; } /* Dark mode support for initials box in /managesign */ @@ -100,6 +111,12 @@ border-color: #4b5563 !important; } +/* Also support signature canvas for consistency */ +[data-theme="opensigndark"] .mysignatureCanvas { + background-color: #1f2937 !important; + border-color: #4b5563 !important; +} + .penContainerDefault { width: 460px; } @@ -115,6 +132,7 @@ .ScrollbarsCustom-TrackY { width: 4px !important; } + .ScrollbarsCustom-TrackX { height: 4px !important; } @@ -143,6 +161,7 @@ overflow: hidden !important; text-overflow: ellipsis; } + .disabled { opacity: 0.5; /* Example: reduce opacity to visually indicate disabled state */ @@ -431,7 +450,7 @@ option { to prevent sudden quick movement (as the navigation bar gets a new position at the top of the page (position:fixed and top:0) */ - .stickyHead + .content { + .stickyHead+.content { padding-top: 60px; } } @@ -441,6 +460,12 @@ option { width: 300px; height: 120px; } + + .mysignatureCanvas { + width: 300px; + height: 118px; + } + .tabWidth { width: 300px; } @@ -462,11 +487,18 @@ option { .scroll-hide::-webkit-scrollbar { display: none; } + @media screen and (max-width: 350px) and (min-width: 311px) { .signatureCanvas { width: 280px; height: 112px; } + + .mysignatureCanvas { + width: 280px; + height: 111px; + } + .tabWidth { width: 280px; } @@ -491,6 +523,12 @@ option { width: 230px; height: 92px; } + + .mysignatureCanvas { + width: 230px; + height: 91px; + } + .tabWidth { width: 230px; } @@ -507,4 +545,4 @@ option { .uploadImgLogo { font-size: 20px; } -} +} \ No newline at end of file From e8577245026ad47c8f4ca41d72eb6a1175be20e8 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Thu, 14 Aug 2025 06:53:43 +0000 Subject: [PATCH 11/12] Merge pull request #1137 from nxglabs/signers_completed_main fix: not able update public username and save sign, initials not working --- .../src/components/pdf/WidgetsValueModal.jsx | 4 ++-- apps/OpenSign/src/constant/Utils.jsx | 1 - apps/OpenSign/src/pages/PdfRequestFiles.jsx | 17 ++++---------- apps/OpenSign/src/pages/SignyourselfPdf.jsx | 23 +++++++++++-------- apps/OpenSign/src/pages/UserProfile.jsx | 4 +++- 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx b/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx index 4beff60106..58fbbadae4 100644 --- a/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx +++ b/apps/OpenSign/src/components/pdf/WidgetsValueModal.jsx @@ -551,8 +551,8 @@ function WidgetsValueModal(props) { // below code is used to save or update default signature, initials, stamp try { const signCls = new Parse.Object("contracts_Signature"); - if (props?.saveSignCheckbox?.signId) { - signCls.id = props.saveSignCheckbox.signId; + if (saveSignCheckbox?.signId) { + signCls.id = saveSignCheckbox.signId; } if (currWidgetsDetails?.type === "initials") { signCls.set("Initials", imageUrl); diff --git a/apps/OpenSign/src/constant/Utils.jsx b/apps/OpenSign/src/constant/Utils.jsx index 2db56cedbe..a960454ab2 100644 --- a/apps/OpenSign/src/constant/Utils.jsx +++ b/apps/OpenSign/src/constant/Utils.jsx @@ -3729,4 +3729,3 @@ export function convertJpegToPng(base64Image, filename) { }); } } - diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.jsx b/apps/OpenSign/src/pages/PdfRequestFiles.jsx index bd59c5ee0a..c7e7804f9f 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.jsx +++ b/apps/OpenSign/src/pages/PdfRequestFiles.jsx @@ -75,9 +75,6 @@ function PdfRequestFiles( const { t } = useTranslation(); const dispatch = useDispatch(); const isShowModal = useSelector((state) => state.widget.isShowModal); - const saveSignCheckbox = useSelector( - (state) => state.widget.saveSignCheckbox - ); const defaultSignImg = useSelector((state) => state.widget.defaultSignImg); const myInitial = useSelector((state) => state.widget.myInitial); const appName = @@ -484,12 +481,7 @@ function PdfRequestFiles( } else { setRequestSignTour(false); } - dispatch( - setSaveSignCheckbox({ - ...saveSignCheckbox, - isVisible: true - }) - ); + //function to get default signatur of current user from `contracts_Signature` class const defaultSignRes = await getDefaultSignature( jsonSender?.objectId @@ -497,7 +489,6 @@ function PdfRequestFiles( if (defaultSignRes?.status === "success") { dispatch( setSaveSignCheckbox({ - ...saveSignCheckbox, isVisible: true, signId: defaultSignRes?.res?.id }) @@ -506,6 +497,8 @@ function PdfRequestFiles( const initials = defaultSignRes?.res?.defaultInitial || ""; dispatch(setDefaultSignImg(sign)); dispatch(setMyInitial(initials)); + } else { + dispatch(setSaveSignCheckbox({ isVisible: true })); } } else if (res?.length === 0) { const res = await contactBook(currUserId); @@ -642,7 +635,7 @@ function PdfRequestFiles( (data) => data.signerObjId === signerObjectId ); if (checkUser && checkUser.length > 0) { - const status = handleCheckResponse(checkUser,setminRequiredCount) + const status = handleCheckResponse(checkUser, setminRequiredCount); if (status?.showAlert) { setUnSignedWidgetId(status?.widgetKey); setPageNumber(status?.tourPageNumber); @@ -1377,7 +1370,7 @@ function PdfRequestFiles( setIsUiLoading(false); alert(t("expiry-date-error")); } - }; + }; // `handleRedirectCancel` is used to cancel redirecting to redirectUrl const handleRedirectCancel = () => { setIsredirectCanceled(true); diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.jsx b/apps/OpenSign/src/pages/SignyourselfPdf.jsx index 81971123d3..6da6ab0c0a 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.jsx +++ b/apps/OpenSign/src/pages/SignyourselfPdf.jsx @@ -77,9 +77,6 @@ function SignYourSelf() { const { docId } = useParams(); const dispatch = useDispatch(); const isShowModal = useSelector((state) => state.widget.isShowModal); - const saveSignCheckbox = useSelector( - (state) => state.widget.saveSignCheckbox - ); const appName = "OpenSign™"; const divRef = useRef(null); @@ -268,13 +265,14 @@ function SignYourSelf() { if (defaultSignRes?.status === "success") { dispatch( setSaveSignCheckbox({ - ...saveSignCheckbox, isVisible: true, signId: defaultSignRes?.res?.id }) ); dispatch(setDefaultSignImg(defaultSignRes?.res?.defaultSignature)); dispatch(setMyInitial(defaultSignRes?.res?.defaultInitial)); + } else { + dispatch(setSaveSignCheckbox({ isVisible: true })); } const contractUsersRes = await contractUsers(); if (contractUsersRes === "Error: Something went wrong!") { @@ -283,8 +281,6 @@ function SignYourSelf() { } else if (contractUsersRes[0] && contractUsersRes.length > 0) { setContractName("_Users"); setSignerUserId(contractUsersRes[0].objectId); - dispatch(setSaveSignCheckbox({ ...saveSignCheckbox, isVisible: true })); - const tourstatuss = contractUsersRes[0].TourStatus && contractUsersRes[0].TourStatus; if (tourstatuss && tourstatuss.length > 0 && !isCompleted) { @@ -1046,12 +1042,18 @@ function SignYourSelf() { const setCellCount = (key, newCount) => { setXyPosition((prev) => { - const getPageNumer = prev.filter((data) => data.pageNumber === pageNumber); + const getPageNumer = prev.filter( + (data) => data.pageNumber === pageNumber + ); if (getPageNumer.length > 0) { const updatePos = getPageNumer[0].pos.map((p) => - p.key === key ? { ...p, options: { ...p.options, cellCount: newCount } } : p + p.key === key + ? { ...p, options: { ...p.options, cellCount: newCount } } + : p + ); + return prev.map((obj, ind) => + ind === index ? { ...obj, pos: updatePos } : obj ); - return prev.map((obj, ind) => (ind === index ? { ...obj, pos: updatePos } : obj)); } return prev; }); @@ -1082,7 +1084,8 @@ function SignYourSelf() { cellCount: count, defaultValue: (defaultdata?.defaultValue || "").slice(0, count), fontSize: newFontSize || position.options?.fontSize || 12, - fontColor: newFontColor || position.options?.fontColor || "black" + fontColor: + newFontColor || position.options?.fontColor || "black" } }; } else { diff --git a/apps/OpenSign/src/pages/UserProfile.jsx b/apps/OpenSign/src/pages/UserProfile.jsx index 17f286a3f1..a3e2670a13 100644 --- a/apps/OpenSign/src/pages/UserProfile.jsx +++ b/apps/OpenSign/src/pages/UserProfile.jsx @@ -286,7 +286,9 @@ function UserProfile() { style={{ width: `${percentage}%` }} >
- {percentage}% + + {percentage}% +
)}
From b01d8125d9ad63630e8517aa26df82b1f8426167 Mon Sep 17 00:00:00 2001 From: prafull-opensignlabs Date: Mon, 8 Sep 2025 04:57:25 +0000 Subject: [PATCH 12/12] Merge pull request #1250 from nxglabs/sync-to-public_repo-17512737859 Merge pull request --- apps/OpenSign/index.html | 6 +- apps/OpenSign/package-lock.json | 17834 ---------------- apps/OpenSign/package.json | 54 +- apps/OpenSign/public/favicon.ico | Bin 15406 -> 0 bytes .../public/locales/de/translation.json | 111 +- .../public/locales/en/translation.json | 147 +- .../public/locales/es/translation.json | 111 +- .../public/locales/fr/translation.json | 117 +- .../public/locales/hi/translation.json | 107 +- .../public/locales/it/translation.json | 120 +- apps/OpenSign/public/logo192.png | Bin 2181 -> 0 bytes apps/OpenSign/public/logo512.png | Bin 10982 -> 0 bytes apps/OpenSign/public/sample_contacts.csv | 8 +- .../static/js/assets/images/logo-dark.png | Bin 97499 -> 20522 bytes .../logo.2a7bff0c1189183fafe71d7d5b94e0cd.png | Bin 88554 -> 0 bytes apps/OpenSign/public/version.txt | Bin 20 -> 20 bytes apps/OpenSign/src/App.jsx | 142 +- apps/OpenSign/src/assets/images/dp.png | Bin 13142 -> 4350 bytes apps/OpenSign/src/assets/images/folder.png | Bin 4496 -> 1976 bytes apps/OpenSign/src/assets/images/login_img.svg | 185 +- apps/OpenSign/src/assets/images/logo.png | Bin 88554 -> 16183 bytes apps/OpenSign/src/assets/images/pad.svg | 2 +- apps/OpenSign/src/assets/images/pdf3.png | Bin 11944 -> 10008 bytes .../src/assets/images/recreatedoc.png | Bin 41662 -> 41045 bytes apps/OpenSign/src/components/AddSigner.jsx | 2 +- apps/OpenSign/src/components/AddUser.jsx | 17 +- apps/OpenSign/src/components/BulkSendUi.jsx | 14 +- .../src/components/ColumnSelector.jsx | 63 + apps/OpenSign/src/components/DragProivder.jsx | 51 + apps/OpenSign/src/components/Header.jsx | 38 +- apps/OpenSign/src/components/RotateAlert.jsx | 2 +- apps/OpenSign/src/components/Title.jsx | 84 +- .../components/dashboard/DashboardReport.jsx | 12 +- .../src/components/dashboard/GetDashboard.jsx | 9 +- .../components/opensigndrive/DriveBody.jsx | 34 +- .../src/components/pdf/AddRoleModal.jsx | 2 +- .../src/components/pdf/AgreementContent.jsx | 2 +- .../src/components/pdf/AgreementSign.jsx | 2 +- .../src/components/pdf/CustomizeMail.jsx | 155 + .../src/components/pdf/DragElement.jsx | 4 +- .../components/pdf/DropdownWidgetOption.jsx | 78 +- .../src/components/pdf/EditTemplate.jsx | 9 +- .../OpenSign/src/components/pdf/EmailBody.jsx | 8 +- .../src/components/pdf/Guidelines.jsx | 30 + .../src/components/pdf/PageReorderModal.jsx | 6 +- .../OpenSign/src/components/pdf/PdfHeader.jsx | 122 +- .../pdf/{PdfZoom.jsx => PdfTools.jsx} | 77 +- .../src/components/pdf/Placeholder.jsx | 380 +- .../src/components/pdf/PlaceholderCopy.jsx | 28 +- .../src/components/pdf/PlaceholderType.jsx | 56 +- .../components/pdf/PrefillWidgetsModal.jsx | 768 + apps/OpenSign/src/components/pdf/PrevNext.jsx | 4 +- .../src/components/pdf/RecipientList.jsx | 94 +- .../src/components/pdf/RenderAllPdfPage.jsx | 16 +- .../OpenSign/src/components/pdf/RenderPdf.jsx | 194 +- .../src/components/pdf/SignerListPlace.jsx | 17 +- .../src/components/pdf/WidgetComponent.jsx | 73 +- .../src/components/pdf/WidgetList.jsx | 7 +- .../src/components/pdf/WidgetNameModal.jsx | 190 +- .../src/components/pdf/WidgetsValueModal.jsx | 488 +- .../src/components/pdf/getWidgetType.jsx | 21 + .../DateFormatSelector.jsx | 6 +- .../preferences/FilenameFormatSelector.jsx | 99 + .../TimezoneSelector.jsx | 0 .../components/shared/fields/FolderModal.jsx | 2 +- .../components/shared/fields/SelectFolder.jsx | 4 +- .../shared/fields/SelectSigners.jsx | 4 + .../components/shared/fields/SignersInput.jsx | 1 + .../src/components/sidebar/Sidebar.jsx | 20 +- .../src/constant/{Utils.jsx => Utils.js} | 778 +- apps/OpenSign/src/constant/saveFileSize.js | 14 +- .../src/context/GuidelinesContext.jsx | 43 + apps/OpenSign/src/hook/useManifestUrl.js | 34 + apps/OpenSign/src/index.css | 105 +- apps/OpenSign/src/index.jsx | 52 +- apps/OpenSign/src/json/ReportJson.js | 95 +- apps/OpenSign/src/json/ReportTour.jsx | 47 + apps/OpenSign/src/layout/HomeLayout.jsx | 103 +- apps/OpenSign/src/pages/AddAdmin.jsx | 8 +- apps/OpenSign/src/pages/ChangePassword.jsx | 4 +- apps/OpenSign/src/pages/Dashboard.jsx | 2 - apps/OpenSign/src/pages/DebugPdf.jsx | 8 +- apps/OpenSign/src/pages/DocSuccessPage.jsx | 4 +- apps/OpenSign/src/pages/ForgetPassword.jsx | 6 +- apps/OpenSign/src/pages/Form.jsx | 23 +- apps/OpenSign/src/pages/GuestLogin.jsx | 107 +- apps/OpenSign/src/pages/Login.jsx | 20 +- apps/OpenSign/src/pages/Managesign.jsx | 11 +- apps/OpenSign/src/pages/Opensigndrive.jsx | 111 +- apps/OpenSign/src/pages/PageNotFound.jsx | 8 +- apps/OpenSign/src/pages/PdfRequestFiles.jsx | 541 +- apps/OpenSign/src/pages/PlaceHolderSign.jsx | 1828 +- apps/OpenSign/src/pages/Preferences.jsx | 29 +- apps/OpenSign/src/pages/Report.jsx | 158 +- apps/OpenSign/src/pages/SignyourselfPdf.jsx | 157 +- .../src/pages/TemplatePlaceholder.jsx | 1565 +- .../src/pages/UpdateExistUserAdmin.jsx | 6 +- apps/OpenSign/src/pages/UserList.jsx | 130 +- apps/OpenSign/src/pages/UserProfile.jsx | 104 +- apps/OpenSign/src/pages/VerifyDocument.jsx | 1133 +- apps/OpenSign/src/polyfills.js | 2 +- apps/OpenSign/src/primitives/AddContact.jsx | 96 +- .../src/primitives/DeleteUserModal.jsx | 127 + .../src/primitives/DownloadPdfZip.jsx | 12 +- .../src/primitives/GetReportDisplay.jsx | 2617 --- .../OpenSign/src/primitives/LinkUserModal.jsx | 8 +- .../OpenSign/src/primitives/LoaderWithMsg.jsx | 2 +- apps/OpenSign/src/primitives/Modal.jsx | 28 - apps/OpenSign/src/primitives/ModalUi.jsx | 8 +- .../src/primitives/PdfDeclineModal.jsx | 17 +- .../src/primitives/RenderReportCell.jsx | 165 + apps/OpenSign/src/primitives/ShareButton.jsx | 2 +- apps/OpenSign/src/primitives/SignerCell.jsx | 184 + apps/OpenSign/src/primitives/Tour.jsx | 2 +- .../src/primitives/TourContentWithBtn.jsx | 29 +- .../OpenSign/src/primitives/ValidateRoute.jsx | 4 +- .../src/primitives/ValidateSession.jsx | 2 +- .../OpenSign/src/redux/reducers/ShowTenant.js | 6 +- .../OpenSign/src/redux/reducers/showHeader.js | 14 - .../src/redux/reducers/sidebarReducer.js | 20 + .../src/redux/reducers/widgetSlice.js | 31 +- apps/OpenSign/src/redux/store.js | 6 +- .../src/reports/contact/Contactbook.jsx | 505 + .../contact}/EditContactForm.jsx | 48 +- .../src/reports/contact/ImportContact.jsx | 310 + .../src/reports/document/DocumentsReport.jsx | 1841 ++ .../src/reports/template/TemplatesReport.jsx | 1677 ++ apps/OpenSign/src/utils/fileUtils.js | 125 + apps/OpenSign/src/utils/index.js | 6 + apps/OpenSign/src/utils/lazyWithRetry.js | 19 + apps/OpenSign/src/utils/prefillUtils.js | 223 + .../{primitives => utils}/sanitizeFileName.js | 3 +- apps/OpenSign/src/utils/upgradeProgress.js | 49 + apps/OpenSign/src/utils/widgetUtils.js | 43 + apps/OpenSign/vite.config.js | 36 +- apps/OpenSignServer/Utils.js | 132 +- apps/OpenSignServer/auth/authadapter.js | 2 +- .../cloud/customRoute/customApp.js | 6 +- .../cloud/customRoute/deleteFileUrl.js | 192 + .../cloud/customRoute/deleteUser.js | 464 + .../cloud/customRoute/docxtopdf.js | 5 + .../cloud/customRoute/sendMailToSupport.js | 83 + .../cloud/customRoute/uploadFile.js | 2 +- apps/OpenSignServer/cloud/main.js | 2 + .../cloud/parsefunction/DocumentAfterFind.js | 46 +- .../cloud/parsefunction/ForwardDoc.js | 1 - .../cloud/parsefunction/TemplateAfterFind.js | 46 +- .../cloud/parsefunction/createBatchContact.js | 4 +- .../cloud/parsefunction/editContact.js | 12 +- .../generateCertificatebydocId.js | 2 +- .../cloud/parsefunction/getDocument.js | 4 + .../cloud/parsefunction/getSignedUrl.js | 54 +- .../cloud/parsefunction/getSigners.js | 3 +- .../cloud/parsefunction/getTenant.js | 4 +- .../cloud/parsefunction/getUserDetails.js | 3 +- .../parsefunction/isUserInContactBook.js | 1 - .../cloud/parsefunction/linkContactToDoc.js | 16 +- .../cloud/parsefunction/pdf/PDF.js | 23 +- .../cloud/parsefunction/reportsJson.js | 105 +- .../cloud/parsefunction/saveAsTemplate.js | 8 +- .../cloud/parsefunction/saveFile.js | 44 +- .../cloud/parsefunction/savecontact.js | 20 +- .../cloud/parsefunction/sendDeleteUserMail.js | 103 + .../cloud/parsefunction/updatePreferences.js | 3 + .../cloud/parsefunction/updateTourStatus.js | 3 +- ...50621215000-add_creditalertlevel_field.cjs | 19 - .../20250801113339-add_contact_field.cjs | 19 + .../20250811191810-add_datafiles_field.cjs | 19 + apps/OpenSignServer/index.js | 2 +- apps/OpenSignServer/logo.png | Bin 88554 -> 25429 bytes .../migrationdb/createContactIndex.js | 2 +- apps/OpenSignServer/package-lock.json | 5272 +++-- apps/OpenSignServer/package.json | 34 +- .../public/assets/images/parse-logo.png | Bin 5281 -> 3897 bytes apps/OpenSignServer/spec/helper.js | 9 +- apps/OpenSignServer/utils/fileUtils.js | 77 + 176 files changed, 16858 insertions(+), 27726 deletions(-) delete mode 100644 apps/OpenSign/package-lock.json delete mode 100644 apps/OpenSign/public/favicon.ico delete mode 100644 apps/OpenSign/public/logo192.png delete mode 100644 apps/OpenSign/public/logo512.png delete mode 100644 apps/OpenSign/public/static/js/assets/images/logo.2a7bff0c1189183fafe71d7d5b94e0cd.png create mode 100644 apps/OpenSign/src/components/ColumnSelector.jsx create mode 100644 apps/OpenSign/src/components/DragProivder.jsx create mode 100644 apps/OpenSign/src/components/pdf/CustomizeMail.jsx create mode 100644 apps/OpenSign/src/components/pdf/Guidelines.jsx rename apps/OpenSign/src/components/pdf/{PdfZoom.jsx => PdfTools.jsx} (79%) create mode 100644 apps/OpenSign/src/components/pdf/PrefillWidgetsModal.jsx create mode 100644 apps/OpenSign/src/components/pdf/getWidgetType.jsx rename apps/OpenSign/src/components/{shared/fields => preferences}/DateFormatSelector.jsx (95%) create mode 100644 apps/OpenSign/src/components/preferences/FilenameFormatSelector.jsx rename apps/OpenSign/src/components/{shared/fields => preferences}/TimezoneSelector.jsx (100%) rename apps/OpenSign/src/constant/{Utils.jsx => Utils.js} (85%) create mode 100644 apps/OpenSign/src/context/GuidelinesContext.jsx create mode 100644 apps/OpenSign/src/hook/useManifestUrl.js create mode 100644 apps/OpenSign/src/json/ReportTour.jsx create mode 100644 apps/OpenSign/src/primitives/DeleteUserModal.jsx delete mode 100644 apps/OpenSign/src/primitives/GetReportDisplay.jsx delete mode 100644 apps/OpenSign/src/primitives/Modal.jsx create mode 100644 apps/OpenSign/src/primitives/RenderReportCell.jsx create mode 100644 apps/OpenSign/src/primitives/SignerCell.jsx delete mode 100644 apps/OpenSign/src/redux/reducers/showHeader.js create mode 100644 apps/OpenSign/src/redux/reducers/sidebarReducer.js create mode 100644 apps/OpenSign/src/reports/contact/Contactbook.jsx rename apps/OpenSign/src/{components => reports/contact}/EditContactForm.jsx (72%) create mode 100644 apps/OpenSign/src/reports/contact/ImportContact.jsx create mode 100644 apps/OpenSign/src/reports/document/DocumentsReport.jsx create mode 100644 apps/OpenSign/src/reports/template/TemplatesReport.jsx create mode 100644 apps/OpenSign/src/utils/fileUtils.js create mode 100644 apps/OpenSign/src/utils/index.js create mode 100644 apps/OpenSign/src/utils/lazyWithRetry.js create mode 100644 apps/OpenSign/src/utils/prefillUtils.js rename apps/OpenSign/src/{primitives => utils}/sanitizeFileName.js (74%) create mode 100644 apps/OpenSign/src/utils/upgradeProgress.js create mode 100644 apps/OpenSign/src/utils/widgetUtils.js create mode 100644 apps/OpenSignServer/cloud/customRoute/deleteFileUrl.js create mode 100644 apps/OpenSignServer/cloud/customRoute/deleteUser.js create mode 100644 apps/OpenSignServer/cloud/customRoute/sendMailToSupport.js create mode 100644 apps/OpenSignServer/cloud/parsefunction/sendDeleteUserMail.js delete mode 100644 apps/OpenSignServer/databases/migrations/20250621215000-add_creditalertlevel_field.cjs create mode 100644 apps/OpenSignServer/databases/migrations/20250801113339-add_contact_field.cjs create mode 100644 apps/OpenSignServer/databases/migrations/20250811191810-add_datafiles_field.cjs create mode 100644 apps/OpenSignServer/utils/fileUtils.js diff --git a/apps/OpenSign/index.html b/apps/OpenSign/index.html index 67720ba6a2..c023d35d55 100644 --- a/apps/OpenSign/index.html +++ b/apps/OpenSign/index.html @@ -3,20 +3,20 @@ - - ...Loading +
- + + \ No newline at end of file diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json deleted file mode 100644 index 19f5dd0b1a..0000000000 --- a/apps/OpenSign/package-lock.json +++ /dev/null @@ -1,17834 +0,0 @@ -{ - "name": "open_sign", - "version": "2.21.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "open_sign", - "version": "2.21.1", - "dependencies": { - "@formkit/auto-animate": "^0.8.2", - "@imgly/background-removal": "^1.6.0", - "@lottiefiles/dotlottie-react": "^0.14.2", - "@pdf-lib/fontkit": "^1.1.1", - "@radix-ui/themes": "^3.2.1", - "@reduxjs/toolkit": "^2.8.2", - "axios": "^1.10.0", - "date-fns-tz": "^3.2.0", - "file-saver": "^2.0.5", - "i18next": "^25.3.0", - "i18next-browser-languagedetector": "^8.2.0", - "i18next-http-backend": "^3.0.2", - "jszip": "^3.10.1", - "jwt-decode": "^4.0.0", - "moment": "^2.30.1", - "parse": "^6.1.1", - "pdf-lib": "^1.17.1", - "pkijs": "^3.0.8", - "print-js": "^1.6.0", - "prismjs": "^1.30.0", - "quill-html-edit-button": "^3.0.0", - "radix-ui": "^1.4.2", - "react": "^18.3.1", - "react-bootstrap": "^2.10.10", - "react-confetti": "^6.4.0", - "react-datepicker": "^8.4.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dnd-multi-backend": "^9.0.0", - "react-dnd-touch-backend": "^16.0.1", - "react-dom": "^18.3.1", - "react-gtm-module": "^2.0.11", - "react-helmet": "^6.1.0", - "react-i18next": "^15.5.3", - "react-konva": "^18.2.10", - "react-pdf": "^9.2.1", - "react-quill-new": "^3.4.6", - "react-redux": "^9.2.0", - "react-rnd": "^10.5.2", - "react-router": "^7.6.3", - "react-scrollbars-custom": "^4.1.1", - "react-select": "^5.10.1", - "react-signature-canvas": "^1.1.0-alpha.2", - "react-timezone-select": "^3.2.8", - "react-tooltip": "^5.29.1", - "reactour": "^1.19.4", - "redux": "^5.0.1", - "regex-parser": "^2.3.1", - "serve": "^14.2.4", - "styled-components": "^5.3.11", - "web-vitals": "^5.0.3", - "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" - }, - "devDependencies": { - "@babel/core": "^7.27.7", - "@babel/preset-env": "^7.27.2", - "@babel/preset-react": "^7.27.1", - "@babel/runtime-corejs2": "^7.27.6", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/react": "^18.3.23", - "@vitejs/plugin-react": "^4.6.0", - "@vitejs/plugin-react-swc": "^3.10.2", - "@vitest/ui": "^3.2.4", - "autoprefixer": "^10.4.21", - "babel-loader": "^10.0.0", - "commitizen": "^4.3.1", - "concurrently": "^9.2.0", - "css-loader": "^7.1.2", - "daisyui": "^4.12.24", - "dotenv": "^16.6.1", - "eslint": "^9.30.0", - "eslint-plugin-prettier": "^5.5.1", - "eslint-plugin-react": "^7.37.5", - "jsdom": "^26.1.0", - "lint-staged": "^16.1.2", - "postcss": "^8.5.6", - "prettier": "^3.6.2", - "pretty-quick": "^4.2.2", - "rollup-plugin-node-polyfills": "^0.2.1", - "tailwindcss": "^3.4.17", - "vite": "^6.3.5", - "vite-plugin-svgr": "^4.3.0", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.2.4" - }, - "engines": { - "node": "18 || 20 || 22" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", - "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", - "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", - "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", - "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", - "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", - "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.27.1", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs2": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.27.6.tgz", - "integrity": "sha512-WgvlQpGnm1rmvgrm+H+cVcAckEPlwURUCvv1ZVSFr9J9yixgFbNlu7+CjVKKAd4xQtMijPwxwcSi5SFFHKlmDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^2.6.12" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz", - "integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", - "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@commitlint/types": "^19.8.1", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", - "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", - "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/execute-rule": "^19.8.1", - "@commitlint/resolve-extends": "^19.8.1", - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0", - "cosmiconfig": "^9.0.0", - "cosmiconfig-typescript-loader": "^6.1.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", - "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/types": "^19.8.1", - "global-directory": "^4.0.1", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", - "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", - "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", - "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", - "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", - "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", - "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.14.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", - "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "license": "MIT" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", - "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/js": { - "version": "9.30.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.0.tgz", - "integrity": "sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.15.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", - "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", - "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.0", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.8.tgz", - "integrity": "sha512-EQJ4Th328y2wyHR3KzOUOoTW2UKjFk53fmyahfwExnFQ8vnsMYqKc+fFPOkeYtj5tcp1DUMiNJ7BFhed7e9ONw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.2", - "@floating-ui/utils": "^0.2.9", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", - "license": "MIT" - }, - "node_modules/@formkit/auto-animate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@formkit/auto-animate/-/auto-animate-0.8.2.tgz", - "integrity": "sha512-SwPWfeRa5veb1hOIBMdzI+73te5puUBHmqqaF1Bu7FjvxlYSz/kJcZKSa9Cg60zL0uRNeJL2SbRxV6Jp6Q1nFQ==", - "license": "MIT" - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@imgly/background-removal": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@imgly/background-removal/-/background-removal-1.6.0.tgz", - "integrity": "sha512-nmqOBDE9dQpDEJg73XrKNUoWugyyDHEVh+U1akjYdUW85ILh9UilvKu/kdv1MI822rKExwgLNuVLVulzAzgZJg==", - "dependencies": { - "lodash-es": "^4.17.21", - "ndarray": "~1.0.0", - "zod": "^3.23.8" - }, - "peerDependencies": { - "onnxruntime-web": "1.21.0-dev.20250206-d981b153d3" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lottiefiles/dotlottie-react": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.2.tgz", - "integrity": "sha512-RR4r0HrKQbOAw6iS6C3mRARS2iu+yI+G1vICoUsRMHzlUUk1/26l3WyAjhcG+KoaGoKmORx8FgHjTNr4Sr/2Ug==", - "license": "MIT", - "dependencies": { - "@lottiefiles/dotlottie-web": "0.47.0" - }, - "peerDependencies": { - "react": "^17 || ^18 || ^19" - } - }, - "node_modules/@lottiefiles/dotlottie-web": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.47.0.tgz", - "integrity": "sha512-YN6wSB4iYZBYEAFKEs/taufrPH3rfNlUA632Ib61WoR58TALAJ1ZX8yDIGUBT28byMJhZR4+xdpRX4v7X8OeBQ==", - "license": "MIT" - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pdf-lib/fontkit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/fontkit/-/fontkit-1.1.1.tgz", - "integrity": "sha512-KjMd7grNapIWS/Dm0gvfHEilSyAmeLvrEGVcqLGi0VYebuqqzTbgF29efCx7tvx+IEbG3zQciRSWl3GkUSvjZg==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", - "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "peer": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "peer": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "peer": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "peer": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "peer": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "peer": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "peer": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "peer": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "peer": true - }, - "node_modules/@radix-ui/colors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", - "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==", - "license": "MIT" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@radix-ui/themes": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/themes/-/themes-3.2.1.tgz", - "integrity": "sha512-WJL2YKAGItkunwm3O4cLTFKCGJTfAfF6Hmq7f5bCo1ggqC9qJQ/wfg/25AAN72aoEM1yqXZQ+pslsw48AFR0Xg==", - "license": "MIT", - "dependencies": { - "@radix-ui/colors": "^3.0.0", - "classnames": "^2.3.2", - "radix-ui": "^1.1.3", - "react-remove-scroll-bar": "^2.3.8" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.9.8", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz", - "integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-dnd/asap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==", - "license": "MIT" - }, - "node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==", - "license": "MIT" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==", - "license": "MIT" - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", - "integrity": "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==", - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@standard-schema/utils": "^0.3.0", - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@restart/hooks": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", - "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@restart/ui": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz", - "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@popperjs/core": "^2.11.8", - "@react-aria/ssr": "^3.5.0", - "@restart/hooks": "^0.5.0", - "@types/warning": "^3.0.3", - "dequal": "^2.0.3", - "dom-helpers": "^5.2.0", - "uncontrollable": "^8.0.4", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/@restart/ui/node_modules/@restart/hooks": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz", - "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@restart/ui/node_modules/uncontrollable": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", - "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.14.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", - "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", - "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", - "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", - "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", - "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", - "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", - "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", - "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", - "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", - "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", - "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", - "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", - "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", - "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", - "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", - "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", - "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", - "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", - "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", - "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rooks/use-mutation-observer": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@rooks/use-mutation-observer/-/use-mutation-observer-4.11.2.tgz", - "integrity": "sha512-vpsdrZdr6TkB1zZJcHx+fR1YC/pHs2BaqcuYiEGjBVbwY5xcC49+h0hAUtQKHth3oJqXfIX/Ng8S7s5HFHdM/A==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "license": "MIT" - }, - "node_modules/@standard-schema/utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", - "license": "MIT" - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@swc/core": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.7.tgz", - "integrity": "sha512-bcpllEihyUSnqp0UtXTvXc19CT4wp3tGWLENhWnjr4B5iEOkzqMu+xHGz1FI5IBatjfqOQb29tgIfv6IL05QaA==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.23" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.12.7", - "@swc/core-darwin-x64": "1.12.7", - "@swc/core-linux-arm-gnueabihf": "1.12.7", - "@swc/core-linux-arm64-gnu": "1.12.7", - "@swc/core-linux-arm64-musl": "1.12.7", - "@swc/core-linux-x64-gnu": "1.12.7", - "@swc/core-linux-x64-musl": "1.12.7", - "@swc/core-win32-arm64-msvc": "1.12.7", - "@swc/core-win32-ia32-msvc": "1.12.7", - "@swc/core-win32-x64-msvc": "1.12.7" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.7.tgz", - "integrity": "sha512-w6BBT0hBRS56yS+LbReVym0h+iB7/PpCddqrn1ha94ra4rZ4R/A91A/rkv+LnQlPqU/+fhqdlXtCJU9mrhCBtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.7.tgz", - "integrity": "sha512-jN6LhFfGOpm4DY2mXPgwH4aa9GLOwublwMVFFZ/bGnHYYCRitLZs9+JWBbyWs7MyGcA246Ew+EREx36KVEAxjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.7.tgz", - "integrity": "sha512-rHn8XXi7G2StEtZRAeJ6c7nhJPDnqsHXmeNrAaYwk8Tvpa6ZYG2nT9E1OQNXj1/dfbSFTjdiA8M8ZvGYBlpBoA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.7.tgz", - "integrity": "sha512-N15hKizSSh+hkZ2x3TDVrxq0TDcbvDbkQJi2ZrLb9fK+NdFUV/x+XF16ZDPlbxtrGXl1CT7VD439SNaMN9F7qw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.7.tgz", - "integrity": "sha512-jxyINtBezpxd3eIUDiDXv7UQ87YWlPsM9KumOwJk09FkFSO4oYxV2RT+Wu+Nt5tVWue4N0MdXT/p7SQsDEk4YA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.7.tgz", - "integrity": "sha512-PR4tPVwU1BQBfFDk2XfzXxsEIjF3x/bOV1BzZpYvrlkU0TKUDbR4t2wzvsYwD/coW7/yoQmlL70/qnuPtTp1Zw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.7.tgz", - "integrity": "sha512-zy7JWfQtQItgMfUjSbbcS3DZqQUn2d9VuV0LSGpJxtTXwgzhRpF1S2Sj7cU9hGpbM27Y8RJ4DeFb3qbAufjbrw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.7.tgz", - "integrity": "sha512-52PeF0tyX04ZFD8nibNhy/GjMFOZWTEWPmIB3wpD1vIJ1po+smtBnEdRRll5WIXITKoiND8AeHlBNBPqcsdcwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.7.tgz", - "integrity": "sha512-WzQwkNMuhB1qQShT9uUgz/mX2j7NIEPExEtzvGsBT7TlZ9j1kGZ8NJcZH/fwOFcSJL4W7DnkL7nAhx6DBlSPaA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.7.tgz", - "integrity": "sha512-R52ivBi2lgjl+Bd3XCPum0YfgbZq/W1AUExITysddP9ErsNSwnreYyNB3exEijiazWGcqHEas2ChiuMOP7NYrA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@swc/helpers/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@swc/types": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", - "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", - "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/react": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", - "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, - "node_modules/@types/conventional-commits-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", - "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.15.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", - "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.28.9", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", - "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", - "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/signature_pad": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@types/signature_pad/-/signature_pad-2.3.6.tgz", - "integrity": "sha512-v3j92gCQJoxomHhd+yaG4Vsf8tRS/XbzWKqDv85UsqjMGy4zhokuwKe4b6vhbgncKkh+thF+gpz6+fypTtnFqQ==", - "license": "MIT" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" - }, - "node_modules/@types/warning": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", - "license": "MIT" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", - "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.19", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - } - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.10.2.tgz", - "integrity": "sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.11", - "@swc/core": "^1.11.31" - }, - "peerDependencies": { - "vite": "^4 || ^5 || ^6 || ^7.0.0-beta.0" - } - }, - "node_modules/@vitejs/plugin-react-swc/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", - "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@vitest/mocker/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz", - "integrity": "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "fflate": "^0.8.2", - "flatted": "^3.3.3", - "pathe": "^2.0.3", - "sirv": "^3.0.1", - "tinyglobby": "^0.2.14", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "3.2.4" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@zeit/schemas": { - "version": "2.36.0", - "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", - "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==", - "license": "MIT" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-hidden/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asn1js": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz", - "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/asn1js/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-loader": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", - "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5.61.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-plugin-macros/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-styled-components": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", - "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "lodash": "^4.17.21", - "picomatch": "^2.3.1" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/canvas": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.1.0.tgz", - "integrity": "sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": "^18.12.0 || >= 20.9.0" - } - }, - "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "optional": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", - "license": "MIT", - "dependencies": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/clipboardy/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/clipboardy/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/clipboardy/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clipboardy/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/clipboardy/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cnbuilder": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cnbuilder/-/cnbuilder-3.1.0.tgz", - "integrity": "sha512-9sxWwwprkPNTVQnx92WYPEWCmyZRqbf9VWUYABU4rl0mLL17VAV2MvvOApkMA6bQVXRLJ8jN//8Yp6drElpLWA==", - "license": "MIT", - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/xobotyi" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/commitizen": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", - "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.5", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.7", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" - }, - "bin": { - "commitizen": "bin/commitizen", - "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", - "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-commit-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", - "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", - "dev": true, - "license": "ISC" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true, - "license": "MIT" - }, - "node_modules/core-js-compat": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", - "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", - "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz", - "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "jiti": "^2.4.1" - }, - "engines": { - "node": ">=v18" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=9", - "typescript": ">=5" - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT", - "optional": true - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-selector-tokenizer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", - "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", - "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^3.1.2", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/culori": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", - "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/cz-conventional-changelog": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", - "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@commitlint/load": ">6.1.1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/cz-conventional-changelog/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cz-conventional-changelog/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/daisyui": { - "version": "4.12.24", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.24.tgz", - "integrity": "sha512-JYg9fhQHOfXyLadrBrEqCDM6D5dWCSSiM6eTNCRrBRzx/VlOCrLS8eDfIw9RVvs64v2mJdLooKXY8EwQzoszAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-selector-tokenizer": "^0.8", - "culori": "^3", - "picocolors": "^1", - "postcss-js": "^4" - }, - "engines": { - "node": ">=16.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/daisyui" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/date-fns-tz": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz", - "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", - "license": "MIT", - "peerDependencies": { - "date-fns": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/dnd-core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", - "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", - "license": "MIT", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, - "node_modules/dnd-core/node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/dnd-multi-backend": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/dnd-multi-backend/-/dnd-multi-backend-9.0.0.tgz", - "integrity": "sha512-BCUFes4x0LA2bZyEZFHeQzZ1CBZo6PB40zMOG/gNgICxjAZfN2jHgISowqkR1isdx/msUNzscxEb17SP7yc4KQ==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/LouisBrunner" - }, - "peerDependencies": { - "dnd-core": "^16.0.1" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.155", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", - "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz", - "integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.14.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.30.0", - "@eslint/plugin-kit": "^0.3.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz", - "integrity": "sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true, - "license": "MIT" - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-node-modules": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", - "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "findup-sync": "^4.0.0", - "merge": "^2.1.1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatbuffers": { - "version": "25.2.10", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.2.10.tgz", - "integrity": "sha512-7JlN9ZvLDG1McO3kbX0k4v+SUAg48L1rIwEvN6ZQl/eCtgJz9UylTMzE9wrmYrcorgxm3CX/3T/w5VAub99UUw==", - "peer": true - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/focus-lock": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.6.tgz", - "integrity": "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/focus-lock/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/focus-outline-manager": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/focus-outline-manager/-/focus-outline-manager-1.0.2.tgz", - "integrity": "sha512-bHWEmjLsTjGP9gVs7P3Hyl+oY5NlMW8aTSPdTJ+X2GKt6glDctt9fUCLbRV+d/l8NDC40+FxMjp9WlTQXaQALw==", - "license": "BSD-3-Clause" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT", - "optional": true - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT", - "optional": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - "peer": true - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "license": "MIT", - "dependencies": { - "void-elements": "3.1.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/i18next": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.3.0.tgz", - "integrity": "sha512-ZSQIiNGfqSG6yoLHaCvrkPp16UejHI8PCDxFYaNG/1qxtmqNmqEg4JlWKlxkrUmrin2sEjsy+Mjy1TRozBhOgw==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.27.6" - }, - "peerDependencies": { - "typescript": "^5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/i18next-browser-languagedetector": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", - "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/i18next-http-backend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz", - "integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==", - "license": "MIT", - "dependencies": { - "cross-fetch": "4.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb-keyval": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", - "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", - "license": "Apache-2.0" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "license": "MIT", - "optional": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/iota-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", - "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==" - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-port-reachable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", - "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/konva": { - "version": "9.3.20", - "resolved": "https://registry.npmjs.org/konva/-/konva-9.3.20.tgz", - "integrity": "sha512-7XPD/YtgfzC8b1c7z0hhY5TF1IO/pBYNa29zMTA2PeBaqI0n5YplUeo4JRuRcljeAF8lWtW65jePZZF7064c8w==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "license": "MIT", - "peer": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/lint-staged": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.2.tgz", - "integrity": "sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0", - "debug": "^4.4.1", - "lilconfig": "^3.1.3", - "listr2": "^8.3.3", - "micromatch": "^4.0.8", - "nano-spawn": "^1.0.2", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.8.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "peer": true - }, - "node_modules/longest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", - "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lower-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-cancellable-promise": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", - "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" - } - }, - "node_modules/make-event-props": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", - "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/merge": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", - "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge-refs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", - "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT", - "optional": true - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nano-spawn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz", - "integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT", - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ndarray": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", - "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", - "dependencies": { - "iota-array": "^1.0.0", - "is-buffer": "^1.0.2" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/no-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/node-abi": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", - "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT", - "optional": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.21.0-dev.20250206-d981b153d3", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0-dev.20250206-d981b153d3.tgz", - "integrity": "sha512-TwaE51xV9q2y8pM61q73rbywJnusw9ivTEHAJ39GVWNZqxCoDBpe/tQkh/w9S+o/g+zS7YeeL0I/2mEWd+dgyA==", - "peer": true - }, - "node_modules/onnxruntime-web": { - "version": "1.21.0-dev.20250206-d981b153d3", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.21.0-dev.20250206-d981b153d3.tgz", - "integrity": "sha512-esDVQdRic6J44VBMFLumYvcGfioMh80ceLmzF1yheJyuLKq/Th8VT2aj42XWQst+2bcWnAhw4IKmRQaqzU8ugg==", - "peer": true, - "dependencies": { - "flatbuffers": "^25.1.24", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.21.0-dev.20250206-d981b153d3", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parchment": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", - "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", - "license": "BSD-3-Clause" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/parse/-/parse-6.1.1.tgz", - "integrity": "sha512-zf70XcHKesDcqpO2RVKyIc1l7pngxBsYQVl0Yl/A38pftOSP8BQeampqqLEqMknzUetNZy8B+wrR3k5uTQDXOw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "7.27.0", - "idb-keyval": "6.2.1", - "react-native-crypto-js": "1.0.0", - "uuid": "10.0.0", - "ws": "8.18.1", - "xmlhttprequest": "1.8.0" - }, - "engines": { - "node": "18 || 19 || 20 || 22" - }, - "optionalDependencies": { - "crypto-js": "4.2.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path2d": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.2.tgz", - "integrity": "sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdfjs-dist": { - "version": "4.8.69", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz", - "integrity": "sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "canvas": "^3.0.0-rc2", - "path2d": "^0.2.1" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkijs": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.2.5.tgz", - "integrity": "sha512-WX0la7n7CbnguuaIQoT4Fc0IJckPDOUldzOwlZ0nwpOcySS+Six/tXBdc0RX17J5o1To0SAr3xDJjDLsOfDFQA==", - "license": "BSD-3-Clause", - "dependencies": { - "@noble/hashes": "^1.4.0", - "asn1js": "^3.0.5", - "bytestreamjs": "^2.0.0", - "pvtsutils": "^1.3.2", - "pvutils": "^1.1.3", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/pkijs/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "peer": true - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/pretty-quick": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-4.2.2.tgz", - "integrity": "sha512-uAh96tBW1SsD34VhhDmWuEmqbpfYc/B3j++5MC/6b3Cb8Ow7NJsvKFhg0eoGu2xXX+o9RkahkTK6sUdd8E7g5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.7", - "ignore": "^7.0.5", - "mri": "^1.2.0", - "picocolors": "^1.1.1", - "picomatch": "^4.0.2", - "tinyexec": "^0.3.2", - "tslib": "^2.8.1" - }, - "bin": { - "pretty-quick": "lib/cli.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://opencollective.com/pretty-quick" - }, - "peerDependencies": { - "prettier": "^3.0.0" - } - }, - "node_modules/pretty-quick/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/pretty-quick/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pretty-quick/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/print-js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz", - "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==", - "license": "MIT" - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "license": "MIT", - "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" - } - }, - "node_modules/prop-types-extra/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvtsutils/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quill": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz", - "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==", - "license": "BSD-3-Clause", - "dependencies": { - "eventemitter3": "^5.0.1", - "lodash-es": "^4.17.21", - "parchment": "^3.0.0", - "quill-delta": "^5.1.0" - }, - "engines": { - "npm": ">=8.2.3" - } - }, - "node_modules/quill-delta": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", - "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", - "license": "MIT", - "dependencies": { - "fast-diff": "^1.3.0", - "lodash.clonedeep": "^4.5.0", - "lodash.isequal": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/quill-html-edit-button": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quill-html-edit-button/-/quill-html-edit-button-3.0.0.tgz", - "integrity": "sha512-ZUV3rYjEvXz+v/7f8N0Mkp2+0D8VGDj6yCYPfagSLmyshczeMawS7vZJzaJ18dJp35IfjiPnzqyVk3KCI8qN1w==", - "license": "MIT", - "peerDependencies": { - "quill": "^2.x" - } - }, - "node_modules/radix-ui": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.2.tgz", - "integrity": "sha512-fT/3YFPJzf2WUpqDoQi005GS8EpCi+53VhcLaHUj5fwkPYiZAjk1mSxFvbMA8Uq71L03n+WysuYC+mlKkXxt/Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-accessible-icon": "1.1.7", - "@radix-ui/react-accordion": "1.2.11", - "@radix-ui/react-alert-dialog": "1.1.14", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-aspect-ratio": "1.1.7", - "@radix-ui/react-avatar": "1.1.10", - "@radix-ui/react-checkbox": "1.3.2", - "@radix-ui/react-collapsible": "1.1.11", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-context-menu": "2.2.15", - "@radix-ui/react-dialog": "1.1.14", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-dropdown-menu": "2.1.15", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-form": "0.1.7", - "@radix-ui/react-hover-card": "1.1.14", - "@radix-ui/react-label": "2.1.7", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-menubar": "1.1.15", - "@radix-ui/react-navigation-menu": "1.2.13", - "@radix-ui/react-one-time-password-field": "0.1.7", - "@radix-ui/react-password-toggle-field": "0.1.2", - "@radix-ui/react-popover": "1.1.14", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-progress": "1.1.7", - "@radix-ui/react-radio-group": "1.3.7", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-scroll-area": "1.2.9", - "@radix-ui/react-select": "2.2.5", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-slider": "1.3.5", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-switch": "1.2.5", - "@radix-ui/react-tabs": "1.1.12", - "@radix-ui/react-toast": "1.2.14", - "@radix-ui/react-toggle": "1.1.9", - "@radix-ui/react-toggle-group": "1.1.10", - "@radix-ui/react-toolbar": "1.1.10", - "@radix-ui/react-tooltip": "1.2.7", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-escape-keydown": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-accessible-icon": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", - "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-accordion": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz", - "integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collapsible": "1.1.11", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.14.tgz", - "integrity": "sha512-IOZfZ3nPvN6lXpJTBCunFQPRSvK8MDgSc1FB85xnIpUKOw9en0dJj8JmCAxV7BiZdtYlUpmrQjoTFkVYtdoWzQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.14", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", - "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-avatar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", - "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-checkbox": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.2.tgz", - "integrity": "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-collapsible": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz", - "integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-context-menu": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.15.tgz", - "integrity": "sha512-UsQUMjcYTsBjTSXw0P3GO0werEQvUY2plgRQuKoCTtkNr45q1DiL51j4m7gxhABzZ0BadoXNsIbg7F3KwiUBbw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", - "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz", - "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-form": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.7.tgz", - "integrity": "sha512-IXLKFnaYvFg/KkeV5QfOX7tRnwHXp127koOFUjLWMTrRv5Rny3DQcAtIFFeA/Cli4HHM8DuJCXAUsgnFVJndlw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-label": "2.1.7", - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-hover-card": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.14.tgz", - "integrity": "sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz", - "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-menubar": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.15.tgz", - "integrity": "sha512-Z71C7LGD+YDYo3TV81paUs8f3Zbmkvg6VLRQpKYfzioOE6n7fOhA3ApK/V/2Odolxjoc4ENk8AYCjohCNayd5A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.13.tgz", - "integrity": "sha512-WG8wWfDiJlSF5hELjwfjSGOXcBR/ZMhBFCGYe8vERpC39CQYZeq1PQ2kaYHdye3V95d06H89KGMsVCIE4LWo3g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-one-time-password-field": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.7.tgz", - "integrity": "sha512-w1vm7AGI8tNXVovOK7TYQHrAGpRF7qQL+ENpT1a743De5Zmay2RbWGKAiYDKIyIuqptns+znCKwNztE2xl1n0Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-password-toggle-field": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.2.tgz", - "integrity": "sha512-F90uYnlBsLPU1UbSLciLsWQmk8+hdWa6SFw4GXaIdNWxFxI5ITKVdAG64f+Twaa9ic6xE7pqxPyUmodrGjT4pQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-popover": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", - "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-progress": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", - "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-radio-group": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.7.tgz", - "integrity": "sha512-9w5XhD0KPOrm92OTTE0SysH3sYzHsSTHNvZgUBo/VZ80VdYyB5RneDbc0dKpURS24IxkoFRu/hI0i4XyfFwY6g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", - "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.9.tgz", - "integrity": "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-select": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz", - "integrity": "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-slider": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.5.tgz", - "integrity": "sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-switch": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.5.tgz", - "integrity": "sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-tabs": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz", - "integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-toast": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.14.tgz", - "integrity": "sha512-nAP5FBxBJGQ/YfUB+r+O6USFVkWq3gAInkxyEnmvEV5jtSbfDhfa4hwX8CraCnbjMLsE7XSf/K75l9xXY7joWg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-toggle": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz", - "integrity": "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.10.tgz", - "integrity": "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-toggle": "1.1.9", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-toolbar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.10.tgz", - "integrity": "sha512-jiwQsduEL++M4YBIurjSa+voD86OIytCod0/dbIxFZDLD8NfO1//keXYMfsW8BPcfqwoNjt+y06XcJqAb4KR7A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-toggle-group": "1.1.10" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-tooltip": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", - "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/re-resizable": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", - "integrity": "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-bootstrap": { - "version": "2.10.10", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.10.tgz", - "integrity": "sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.7", - "@restart/hooks": "^0.4.9", - "@restart/ui": "^1.9.4", - "@types/prop-types": "^15.7.12", - "@types/react-transition-group": "^4.4.6", - "classnames": "^2.3.2", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.8.1", - "prop-types-extra": "^1.1.0", - "react-transition-group": "^4.4.5", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "@types/react": ">=16.14.8", - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-clientside-effect": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.8.tgz", - "integrity": "sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/react-confetti": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.4.0.tgz", - "integrity": "sha512-5MdGUcqxrTU26I2EU7ltkWPwxvucQTuqMm8dUz72z2YMqTD6s9vMcDUysk7n9jnC+lXuCPeJJ7Knf98VEYE9Rg==", - "license": "MIT", - "dependencies": { - "tween-functions": "^1.2.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-datepicker": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-8.4.0.tgz", - "integrity": "sha512-6nPDnj8vektWCIOy9ArS3avus9Ndsyz5XgFCJ7nBxXASSpBdSL6lG9jzNNmViPOAOPh6T5oJyGaXuMirBLECag==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.27.3", - "clsx": "^2.1.1", - "date-fns": "^4.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/react-dnd": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", - "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", - "license": "MIT", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "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 - } - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", - "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", - "license": "MIT", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, - "node_modules/react-dnd-multi-backend": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/react-dnd-multi-backend/-/react-dnd-multi-backend-9.0.0.tgz", - "integrity": "sha512-LAKDdyj4oMvVA/k2RiJ8KLIPO9sBiYIjIYtoFCuAgml9qQwIq+oTav2IXGfG4DrP49fBnVO7jjf5ofJMNOlWTA==", - "license": "MIT", - "dependencies": { - "dnd-multi-backend": "^9.0.0", - "react-dnd-preview": "^9.0.0" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/LouisBrunner" - }, - "peerDependencies": { - "dnd-core": "^16.0.1", - "react": "^16.14.0 || ^17.0.2 || ^18.0.0 || ^19.0.0", - "react-dnd": "^16.0.1", - "react-dom": "^16.14.0 || ^17.0.2 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-dnd-preview": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/react-dnd-preview/-/react-dnd-preview-9.0.0.tgz", - "integrity": "sha512-WZTbrrNDlCGYJGrITHN/obI2kpdaKV3AY6Il2LLZcA9ApzG5bbDXBlWSFwuw8eTCMjmCXs5Wcv+p2QCMxX1Afw==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/LouisBrunner" - }, - "peerDependencies": { - "react": "^16.14.0 || ^17.0.2 || ^18.0.0 || ^19.0.0", - "react-dnd": "^16.0.1" - } - }, - "node_modules/react-dnd-touch-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-touch-backend/-/react-dnd-touch-backend-16.0.1.tgz", - "integrity": "sha512-NonoCABzzjyWGZuDxSG77dbgMZ2Wad7eQiCd/ECtsR2/NBLTjGksPUx9UPezZ1nQ/L7iD130Tz3RUshL/ClKLA==", - "license": "MIT", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "dnd-core": "^16.0.1" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-draggable": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", - "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", - "license": "MIT", - "dependencies": { - "clsx": "^1.1.1", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": ">= 16.3.0", - "react-dom": ">= 16.3.0" - } - }, - "node_modules/react-draggable/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, - "node_modules/react-focus-lock": { - "version": "2.13.6", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.13.6.tgz", - "integrity": "sha512-ehylFFWyYtBKXjAO9+3v8d0i+cnc1trGS0vlTGhzFW1vbFXVUTmR8s2tt/ZQG8x5hElg6rhENlLG1H3EZK0Llg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.0.0", - "focus-lock": "^1.3.6", - "prop-types": "^15.6.2", - "react-clientside-effect": "^1.2.7", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-gtm-module": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/react-gtm-module/-/react-gtm-module-2.0.11.tgz", - "integrity": "sha512-8gyj4TTxeP7eEyc2QKawEuQoAZdjKvMY4pgWfycGmqGByhs17fR+zEBs0JUDq4US/l+vbTl+6zvUIx27iDo/Vw==", - "license": "MIT" - }, - "node_modules/react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/react-i18next": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.3.tgz", - "integrity": "sha512-ypYmOKOnjqPEJZO4m1BI0kS8kWqkBNsKYyhVUfij0gvjy9xJNoG/VcGkxq5dRlVwzmrmY1BQMAmpbbUBLwC4Kw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.27.6", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 23.2.3", - "react": ">= 16.8.0", - "typescript": "^5" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT", - "peer": true - }, - "node_modules/react-konva": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/react-konva/-/react-konva-18.2.10.tgz", - "integrity": "sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.2", - "its-fine": "^1.1.1", - "react-reconciler": "~0.29.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "konva": "^8.0.1 || ^7.2.5 || ^9.0.0", - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "license": "MIT" - }, - "node_modules/react-native-crypto-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz", - "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==", - "license": "MIT" - }, - "node_modules/react-pdf": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-9.2.1.tgz", - "integrity": "sha512-AJt0lAIkItWEZRA5d/mO+Om4nPCuTiQ0saA+qItO967DTjmGjnhmF+Bi2tL286mOTfBlF5CyLzJ35KTMaDoH+A==", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "dequal": "^2.0.3", - "make-cancellable-promise": "^1.3.1", - "make-event-props": "^1.6.0", - "merge-refs": "^1.3.0", - "pdfjs-dist": "4.8.69", - "tiny-invariant": "^1.0.0", - "warning": "^4.0.0" - }, - "funding": { - "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-quill-new": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/react-quill-new/-/react-quill-new-3.4.6.tgz", - "integrity": "sha512-S2kEAwoKRo+xUIAEpb94fwiPe2QU3FmwIfQ+7Lkchf+izPa2nRu1mr4i4QxyVYg8TjHDryDUiOEYZuFEV45QFA==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21", - "quill": "~2.0.2" - }, - "peerDependencies": { - "quill-delta": "^5.1.0", - "react": "^16 || ^17 || ^18 || ^19", - "react-dom": "^16 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-reconciler": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", - "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-redux": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.0.tgz", - "integrity": "sha512-sGsQtcjMqdQyijAHytfGEELB8FufGbfXIsvUTe+NLx1GDRJCXtCFLBLUI1eyZCKXXvbEU2C6gai0PZKoIE9Vbg==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/react-remove-scroll/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/react-rnd": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.5.2.tgz", - "integrity": "sha512-0Tm4x7k7pfHf2snewJA8x7Nwgt3LV+58MVEWOVsFjk51eYruFEa6Wy7BNdxt4/lH0wIRsu7Gm3KjSXY2w7YaNw==", - "license": "MIT", - "dependencies": { - "re-resizable": "6.11.2", - "react-draggable": "4.4.6", - "tslib": "2.6.2" - }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - } - }, - "node_modules/react-rnd/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" - }, - "node_modules/react-router": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz", - "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-scrollbars-custom": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/react-scrollbars-custom/-/react-scrollbars-custom-4.1.1.tgz", - "integrity": "sha512-FOI1EMrdN5qziwvFAuH4saOo0+ggxeTuKLPpy6nezNdLUnDW1vCHGq0VSSfTSRstDgfXgwff5TMP9NeJ8NiFOQ==", - "license": "MIT", - "dependencies": { - "cnbuilder": "^3.1.0", - "react-draggable": "^4.4.5", - "zoom-level": "^2.5.0" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/xobotyi" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/react-select": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.1.tgz", - "integrity": "sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-side-effect": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", - "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-signature-canvas": { - "version": "1.1.0-alpha.2", - "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.1.0-alpha.2.tgz", - "integrity": "sha512-tKUNk3Gmh04Ug4K8p5g8Is08BFUKvbXxi0PyetQ/f8OgCBzcx4vqNf9+OArY/TdNdfHtswXQNRwZD6tyELjkjQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.17.9", - "@types/signature_pad": "^2.3.0", - "signature_pad": "^2.3.2", - "trim-canvas": "^0.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/agilgur5" - }, - "peerDependencies": { - "@types/prop-types": "^15.7.3", - "@types/react": "0.14 - 19", - "prop-types": "^15.5.8", - "react": "0.14 - 19", - "react-dom": "0.14 - 19" - }, - "peerDependenciesMeta": { - "@types/prop-types": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/react-timezone-select": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/react-timezone-select/-/react-timezone-select-3.2.8.tgz", - "integrity": "sha512-efEIVmYAHtm+oS+YlE/9DbieMka1Lop0v1LsW1TdLq0yCBnnAzROKDUY09CICY8TCijZlo0fk+wHZZkV5NpVNw==", - "license": "MIT", - "dependencies": { - "spacetime": "^7.6.0", - "timezone-soft": "^1.5.2" - }, - "peerDependencies": { - "react": "^16 || ^17.0.1 || ^18 || ^19.0.0-0", - "react-dom": "^16 || ^17.0.1 || ^18 || ^19.0.0-0", - "react-select": "^5.8.0" - } - }, - "node_modules/react-tooltip": { - "version": "5.29.1", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.29.1.tgz", - "integrity": "sha512-rmJmEb/p99xWhwmVT7F7riLG08wwKykjHiMGbDPloNJk3tdI73oHsVOwzZ4SRjqMdd5/xwb/4nmz0RcoMfY7Bw==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.6.1", - "classnames": "^2.3.0" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/reactour": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/reactour/-/reactour-1.19.4.tgz", - "integrity": "sha512-cMIaUQazGkdXt03m7AXAYXrCdyQl+uvH4nQBGP/oEjIaeSTZqj92C3W3y6doPakIIu21WeoGh1b0hBRKOxIViA==", - "license": "MIT", - "dependencies": { - "@rooks/use-mutation-observer": "4.11.2", - "classnames": "2.3.1", - "focus-outline-manager": "^1.0.2", - "lodash.debounce": "4.0.8", - "prop-types": "15.7.2", - "react-focus-lock": "^2.12.1", - "scroll-smooth": "1.1.1", - "scrollparent": "2.0.1" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0-0 || ^18.0.0-0", - "react-dom": "^16.3.0 || ^17.0.0-0 || ^18.0.0-0", - "react-is": "^16.8 || ^17.0.0-0 || ^18.0.0-0", - "styled-components": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/reactour/node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", - "license": "MIT" - }, - "node_modules/reactour/node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "node_modules/reactour/node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" - }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", - "license": "MIT", - "peerDependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, - "node_modules/regex-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", - "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "license": "MIT", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", - "license": "MIT", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", - "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.0", - "@rollup/rollup-android-arm64": "4.41.0", - "@rollup/rollup-darwin-arm64": "4.41.0", - "@rollup/rollup-darwin-x64": "4.41.0", - "@rollup/rollup-freebsd-arm64": "4.41.0", - "@rollup/rollup-freebsd-x64": "4.41.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", - "@rollup/rollup-linux-arm-musleabihf": "4.41.0", - "@rollup/rollup-linux-arm64-gnu": "4.41.0", - "@rollup/rollup-linux-arm64-musl": "4.41.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-musl": "4.41.0", - "@rollup/rollup-linux-s390x-gnu": "4.41.0", - "@rollup/rollup-linux-x64-gnu": "4.41.0", - "@rollup/rollup-linux-x64-musl": "4.41.0", - "@rollup/rollup-win32-arm64-msvc": "4.41.0", - "@rollup/rollup-win32-ia32-msvc": "4.41.0", - "@rollup/rollup-win32-x64-msvc": "4.41.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" - } - }, - "node_modules/rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rollup-plugin-inject": "^3.0.0" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/scroll-smooth": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/scroll-smooth/-/scroll-smooth-1.1.1.tgz", - "integrity": "sha512-i9e/hJf0ODPEsy+AubE0zES6xdOuIvtebe5MvdSI1lB4t91k+O+8kV15CYfPN0yPH4j4hZUoKM3rVaPVcmiOoQ==", - "license": "MIT" - }, - "node_modules/scrollparent": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.0.1.tgz", - "integrity": "sha512-HSdN78VMvFCSGCkh0oYX/tY4R3P1DW61f8+TeZZ4j2VLgfwvw0bpRSOv4PCVKisktIwbzHCfZsx+rLbbDBqIBA==", - "license": "ISC" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz", - "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==", - "license": "MIT", - "dependencies": { - "@zeit/schemas": "2.36.0", - "ajv": "8.12.0", - "arg": "5.0.2", - "boxen": "7.0.0", - "chalk": "5.0.1", - "chalk-template": "0.4.0", - "clipboardy": "3.0.0", - "compression": "1.7.4", - "is-port-reachable": "4.0.0", - "serve-handler": "6.1.6", - "update-check": "1.5.4" - }, - "bin": { - "serve": "build/main.js" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/serve/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/signature_pad": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-2.3.2.tgz", - "integrity": "sha512-peYXLxOsIY6MES2TrRLDiNg2T++8gGbpP2yaC+6Ohtxr+a2dzoaqWosWDY9sWqTAAk6E/TyQO+LJw9zQwyu5kA==", - "license": "MIT" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/snake-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true, - "license": "MIT" - }, - "node_modules/spacetime": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/spacetime/-/spacetime-7.10.0.tgz", - "integrity": "sha512-tanJSLq0/+Qvq1bmK0Nh2Ppk0lFOkGwpes29/64E6hyK4kn5d6LPt65Eidm2Xaf3gLvmG8KaXh8LmeymPlw0Aw==", - "license": "Apache-2.0" - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/styled-components": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", - "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-components/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "license": "MIT" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/synckit": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", - "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.4" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "license": "MIT", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/terser": { - "version": "5.39.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.2.tgz", - "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/timezone-soft": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/timezone-soft/-/timezone-soft-1.5.2.tgz", - "integrity": "sha512-BUr+CfBfeWXJwFAuEzPO9uF+v6sy3pL5SKLkDg4vdEhsyXgbBnpFoBCW8oEKSNTqNq9YHbVOjNb31xE7WyGmrA==", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/trim-canvas": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/trim-canvas/-/trim-canvas-0.1.2.tgz", - "integrity": "sha512-nd4Ga3iLFV94mdhW9JFMLpQbHUyCQuhFOD71PEAt1NjtMD5wbZctzhX8c3agHNybMR5zXD1XTGoIEWk995E6pQ==", - "license": "Apache-2.0" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsconfck": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", - "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tween-functions": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", - "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", - "license": "BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-check": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", - "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", - "license": "MIT", - "dependencies": { - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-callback-ref/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", - "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-svgr": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", - "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.3", - "@svgr/core": "^8.1.0", - "@svgr/plugin-jsx": "^8.1.0" - }, - "peerDependencies": { - "vite": ">=2.6.0" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", - "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-vitals": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.0.3.tgz", - "integrity": "sha512-4KmOFYxj7qT6RAdCH0SWwq8eKeXNhAFXR4PmgF6nrWFmrJ41n7lq3UCA6UK0GebQ4uu+XP8e8zGjaDO3wZlqTg==", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xlsx": { - "version": "0.20.3", - "resolved": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", - "integrity": "sha512-oLDq3jw7AcLqKWH2AhCpVTZl8mf6X2YReP+Neh0SJUzV/BdZYjth94tG5toiMB1PPrYtxOCfaoUCkvtuH+3AJA==", - "license": "Apache-2.0", - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.28", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.28.tgz", - "integrity": "sha512-/nt/67WYKnr5by3YS7LroZJbtcCBurDKKPBPWWzaxvVCGuG/NOsiKkrjoOhI8mJ+SQUXEbUzeB3S+6XDUEEj7Q==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zoom-level": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/zoom-level/-/zoom-level-2.5.0.tgz", - "integrity": "sha512-7UlRWU4Q3uCMCeDVMOm7eBrIu145OqsIJ3p6zq58l8UsSYwKWxc6zEapC5YA9tIeh0oheb4cT9Kk2Wq353loFg==", - "license": "MIT", - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/xobotyi" - } - } - } -} diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index a9a8943b12..f9e3cb0486 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -1,18 +1,18 @@ { "name": "open_sign", - "version": "2.21.1", + "version": "2.26.0", "private": true, "dependencies": { - "@formkit/auto-animate": "^0.8.2", - "@imgly/background-removal": "^1.6.0", - "@lottiefiles/dotlottie-react": "^0.14.2", + "@formkit/auto-animate": "^0.8.4", + "@imgly/background-removal": "^1.7.0", + "@lottiefiles/dotlottie-react": "^0.15.2", "@pdf-lib/fontkit": "^1.1.1", "@radix-ui/themes": "^3.2.1", "@reduxjs/toolkit": "^2.8.2", - "axios": "^1.10.0", + "axios": "^1.11.0", "date-fns-tz": "^3.2.0", "file-saver": "^2.0.5", - "i18next": "^25.3.0", + "i18next": "^25.4.0", "i18next-browser-languagedetector": "^8.2.0", "i18next-http-backend": "^3.0.2", "jszip": "^3.10.1", @@ -24,11 +24,11 @@ "print-js": "^1.6.0", "prismjs": "^1.30.0", "quill-html-edit-button": "^3.0.0", - "radix-ui": "^1.4.2", + "radix-ui": "^1.4.3", "react": "^18.3.1", "react-bootstrap": "^2.10.10", "react-confetti": "^6.4.0", - "react-datepicker": "^8.4.0", + "react-datepicker": "^8.7.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dnd-multi-backend": "^9.0.0", @@ -36,15 +36,15 @@ "react-dom": "^18.3.1", "react-gtm-module": "^2.0.11", "react-helmet": "^6.1.0", - "react-i18next": "^15.5.3", - "react-konva": "^18.2.10", + "react-i18next": "^15.7.3", + "react-konva": "^18.2.12", "react-pdf": "^9.2.1", - "react-quill-new": "^3.4.6", + "react-quill-new": "^3.6.0", "react-redux": "^9.2.0", "react-rnd": "^10.5.2", - "react-router": "^7.6.3", + "react-router": "^7.8.2", "react-scrollbars-custom": "^4.1.1", - "react-select": "^5.10.1", + "react-select": "^5.10.2", "react-signature-canvas": "^1.1.0-alpha.2", "react-timezone-select": "^3.2.8", "react-tooltip": "^5.29.1", @@ -53,7 +53,7 @@ "regex-parser": "^2.3.1", "serve": "^14.2.4", "styled-components": "^5.3.11", - "web-vitals": "^5.0.3", + "web-vitals": "^5.1.0", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" }, "scripts": { @@ -94,36 +94,34 @@ } }, "devDependencies": { - "@babel/core": "^7.27.7", - "@babel/preset-env": "^7.27.2", + "@babel/core": "^7.28.3", + "@babel/preset-env": "^7.28.3", "@babel/preset-react": "^7.27.1", - "@babel/runtime-corejs2": "^7.27.6", - "@testing-library/jest-dom": "^6.6.3", + "@babel/runtime-corejs2": "^7.28.3", + "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/react": "^18.3.23", - "@vitejs/plugin-react": "^4.6.0", - "@vitejs/plugin-react-swc": "^3.10.2", + "@types/react": "^19.1.12", + "@vitejs/plugin-react": "^4.7.0", "@vitest/ui": "^3.2.4", "autoprefixer": "^10.4.21", "babel-loader": "^10.0.0", "commitizen": "^4.3.1", - "concurrently": "^9.2.0", + "concurrently": "^9.2.1", "css-loader": "^7.1.2", "daisyui": "^4.12.24", - "dotenv": "^16.6.1", - "eslint": "^9.30.0", - "eslint-plugin-prettier": "^5.5.1", + "eslint": "^9.34.0", + "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", "jsdom": "^26.1.0", - "lint-staged": "^16.1.2", + "lint-staged": "^16.1.6", "postcss": "^8.5.6", "prettier": "^3.6.2", "pretty-quick": "^4.2.2", "rollup-plugin-node-polyfills": "^0.2.1", "tailwindcss": "^3.4.17", - "vite": "^6.3.5", - "vite-plugin-svgr": "^4.3.0", + "vite": "^7.1.4", + "vite-plugin-svgr": "^4.5.0", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.2.4" }, diff --git a/apps/OpenSign/public/favicon.ico b/apps/OpenSign/public/favicon.ico deleted file mode 100644 index d8a847fdc528f4dcbd3ed46bf0d185eb727044e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 zcmeHNp-#j=5FG*rcL*G!irgtqp+Tca2pV~Ygp)V~0>ckL0-Epvi1VlLB)CIB5a1ys z%f1{nrQ2@1-P>;ZCYdyy?(EFIzMXEj6Geb(6B(_DY>P;e%+LF4A~)JL9R6M3 z6q&Az^mQBUqCMtzeaMy3KvWy_baz8tog7#x+GcZxudSf1Pyfm7<-c*jmP%Rtu3vY> zFU8q(EW_92m)i6EUHO~k>P(__M=R=+NftF8#%V`AkKsPtUyRk`!(F3_ zK5fU2*i8%iWPH0h&_?_}-(IZwh_+dAz5n!gn?J;l__@?y@+T~RLf7AHJ+FH1%Acz7 zvh5k)p1+~jpSE?1?d;Z*#L0}4Xy?PnW&(T7QV=gjUv2K1FMnvh@}DL;jFI{?`ATUz}f@ zU-8bb*w@dozrUE?JDRfluFp;7Y3hgh7e8N2xHV-b{&C|U`~G?C-!F>RM!d#ve&hf- P&~*;z--9Sbpf&=(R^vxR diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index cd410074fe..5ee66a3c52 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -1,4 +1,4 @@ -{ +{ "header-news": "Neue Funktion: Benutzer des Teams-Plans können jetzt ihre eigenen AWS S3-Buckets für die Dateispeicherung integrieren", "header-news-btn": "Jetzt einrichten", "sandbox-news": "Dies ist eine Sandbox-Umgebung. Bitte nicht für produktive Zwecke verwenden.", @@ -189,7 +189,18 @@ "Logs": "Protokolle", "Expiry-date": "Ablaufdatum", "Company": "Unternehmen", - "JobTitle": "Berufsbezeichnung" + "JobTitle": "Berufsbezeichnung", + "Time to complete (Days)": "Zeit zur Fertigstellung (Tage)", + "Auto reminder": "Automatische Erinnerung", + "Remind once in every (Days)": "Erinnere einmal alle (Tage)", + "Enable OTP verification": "OTP-Verifizierung aktivieren", + "Enable Tour": "Tour aktivieren", + "Notify on signatures": "Bei Signaturen benachrichtigen", + "Allow modifications": "Änderungen zulassen", + "Redirect url": "Weiterleitungs-URL", + "Created Date": "Erstellungsdatum", + "Updated Date": "Aktualisierungsdatum", + "Expiry Date": "Ablaufdatum" }, "report-help": { "Draft Documents": "Dies sind Dokumente, die Sie begonnen, aber noch nicht zum Versenden fertiggestellt haben.", @@ -287,7 +298,7 @@ "deactivate": "deaktivieren", "this-user": "diesen Benutzer", "delete-user": "Benutzer löschen", - "delete": "löschen", + "delete": "Löschen", "add-user": "Benutzer hinzufügen", "password-generateed": "Das Passwort wird nur einmal generiert; stellen Sie sicher, dass Sie es kopieren.", "Team status": "Teamstatus", @@ -412,7 +423,7 @@ "upload": "Hochladen", "initial-teb": "Initialen", "signature-tab": "Unterschrift", - "initial-alert": "Meine Initiale nicht gefunden", + "initial-alert": "Meine Initiale wurde nicht gefunden", "copy-title": "Widget kopieren zu", "contact-delete-alert": "Sind Sie sicher, dass Sie diesen Kontakt löschen möchten?", "reset-password-alert-1": "Ein Link zum Zurücksetzen des Passworts wurde an Ihre E-Mail-Adresse gesendet.", @@ -477,7 +488,7 @@ "add-recipients": "Empfänger hinzufügen", "loading-mssg": "Das könnte etwas Zeit in Anspruch nehmen", "send-mail": "E-Mail senden", - "signature-field-widget": "Für jeden Benutzer muss mindestens ein Signaturfeld hinzugefügt werden. Sie haben keine Signaturfelder für {{signersName}} hinzugefügt", + "signature-field-widget": "Jeder Benutzer muss mindestens ein Signatur-Widget haben. Sie haben kein Signatur-Widget für {{signersName}} hinzugefügt.", "placeholder-alert-1": "Bitte stellen Sie sicher, dass für alle Empfänger mindestens ein Signatur-Widget hinzugefügt wurde.", "placeholder-alert-2": "Bitte bestätigen Sie, dass Sie das Textfeld ausgefüllt haben.", "placeholder-alert-3": "Sind Sie sicher, dass Sie dieses Dokument zur Unterzeichnung senden möchten?", @@ -612,7 +623,8 @@ "tour-mssg": { "home-layout-1": "Sie haben sich erfolgreich angemeldet! Werfen wir einen Blick darauf.", "home-layout-2": "Um Dokumente zum Selbstunterzeichnen hochzuladen oder um Unterschriften anderer anzufordern, wählen Sie einfach die entsprechenden Schaltflächen.", - "home-layout-3": "Sie sind bereit, {{appName}} zu verwenden! Wenn Sie Unterstützung benötigen, kontaktieren Sie uns gerne.", + "home-layout-3": "Sie sind bereit, {{appName}} zu verwenden!", + "home-layout-4": "Markiere uns auf", "generate-token": "Jetzt upgraden, um ein Produktions-API-Token zu generieren.", "opensign-drive-1": "Klicken Sie auf die Breadcrumb-Links, um einfach durch die Ordnerhierarchie zu navigieren und die Dokumente in jedem Ordner anzuzeigen.", "opensign-drive-2": "Klicken Sie auf die Schaltfläche Hinzufügen, um einen neuen Ordner oder ein neues Dokument zu erstellen.", @@ -622,28 +634,26 @@ "opensign-drive-6": "Klicken Sie mit der rechten Maustaste auf ein Dokument, um Optionen wie Herunterladen, Umbenennen, Verschieben und Löschen anzuzeigen. Klicken Sie auf das Dokument, um es zu öffnen.", "opensign-drive-7": "Klicken Sie mit der rechten Maustaste auf einen Ordner, um Optionen anzuzeigen. Wählen Sie Umbenennen, um den Namen des Ordners zu ändern, oder klicken Sie auf den Ordner, um seinen Inhalt anzuzeigen.", "pdf-request-file-1": "Liste der Unterzeichner, die das Dokument noch unterschreiben müssen.", - "pdf-request-file-2": "Klicken Sie auf die Platzhalter im Dokument, um zu unterschreiben. Sie sehen dann Optionen, Ihre Unterschrift zu zeichnen, einzugeben oder ein Bild hochzuladen.", - "pdf-request-file-3": "Klicken Sie auf die Schaltflächen Ablehnen oder Fertig stellen, um durch Ihr Dokument zu navigieren. Verwenden Sie das Auslassungsmenü für weitere Optionen, einschließlich der Schaltfläche Herunterladen.", + "pdf-request-file-2": "Klicken Sie auf eines der Felder im Dokument, um zu beginnen. Danach können Sie die erforderlichen Informationen eingeben.", + "pdf-request-file-3": "Sobald Sie alle erforderlichen Felder ausgefüllt haben, klicken Sie auf „Fertigstellen“. Danach können Sie das unterschriebene Dokument herunterladen. Je nach den Einstellungen des Absenders erhalten Sie möglicherweise eine Kopie des abgeschlossenen Dokuments zusammen mit dem Abschlusszertifikat, sobald alle Empfänger unterschrieben haben.", "pdf-request-file-4": "Liste der Unterzeichner, die das Dokument bereits unterzeichnet haben.", "pdf-request-file-5": "Sie können auf Automatisch alles unterschreiben klicken, um automatisch an allen für Sie vorgesehenen Stellen zu unterschreiben. Überprüfen Sie das Dokument gründlich, bevor Sie diese Schaltfläche verwenden.", "pdf-request-file-6": "Bitte füllen Sie die Felder auf Seite {{pagenumbers}} aus, die alle zur einfachen Identifizierung in der gleichen Farbe hervorgehoben sind.", - "placeholder-sign-1": "Wählen Sie einen Empfänger aus dieser Liste aus, um einen Platzhalter hinzuzufügen, an dem er unterschreiben soll. Der Platzhalter wird in der gleichen Farbe wie der Empfängername angezeigt, sobald Sie ihn im Dokument ablegen.", + "placeholder-sign-1": "Wählen Sie einen Empfänger aus dieser Liste, um ein Widget hinzuzufügen. Das Widget wird in derselben Farbe wie der Empfängername angezeigt, sobald Sie es auf das Dokument ziehen.", "placeholder-sign-2": "Das Klicken auf die Schaltfläche 'Empfänger hinzufügen' ermöglicht es Ihnen, weitere Unterzeichner hinzuzufügen.", "placeholder-sign-3": "Klicken Sie auf diese Schaltfläche, um weitere Empfänger/Unterzeichner zum Dokument hinzuzufügen.", - "placeholder-sign-4": "Ziehen Sie ein Feld in das Dokument oder klicken Sie darauf, um es hinzuzufügen.", - "placeholder-sign-5": "Der PDF-Inhaltsbereich zeigt bereits die vorhandenen Platzhalter der Vorlage an. Diese Platzhalter entsprechen der Farbe des Empfängernamens, um sie leicht erkennbar zu machen.", + "placeholder-sign-4": "Ziehen oder klicken Sie auf ein Widget, um es dem Dokument hinzuzufügen.", + "placeholder-sign-5": "Der PDF-Inhaltsbereich zeigt bereits die vorhandenen Widgets der Vorlage an. Diese Widgets entsprechen der Farbe des Empfängernamens, um sie leicht erkennbar zu machen.", "placeholder-sign-6": "Mit einem Klick auf 'Weiter' wird das Dokument gespeichert. Im nächsten Schritt können Sie die E-Mails, die an die Empfänger versendet werden sollen, anpassen oder die Signaturlinks kopieren und diese selbst mit den Empfängern teilen.", - "report-1":"Klicken Sie auf die Schaltfläche „Hinzufügen“, um eine neue Vorlage zu erstellen. Vorlagen sind wiederverwendbare Dokumente, mit denen schnell neue Dokumente mit derselben Struktur und unterschiedlichen Unterzeichnern erstellt werden können. Eine HR-Vorlage für die Einarbeitung könnte beispielsweise vordefinierte Rollen wie „Personalleiter“ und „Neuer Mitarbeiter“ enthalten. Bei jeder Verwendung der Vorlage können Sie die Rolle „Neuer Mitarbeiter“ verschiedenen neuen Mitarbeitern zuweisen, während die Rolle „Personalleiter“ unverändert bleibt. So wird ein nahtloser Einarbeitungsprozess für jeden neuen Mitarbeiter ermöglicht.", + "report-1": "Klicken Sie auf die Schaltfläche „Hinzufügen“, um eine neue Vorlage zu erstellen. Vorlagen sind wiederverwendbare Dokumente, mit denen schnell neue Dokumente mit derselben Struktur und unterschiedlichen Unterzeichnern erstellt werden können. Eine HR-Vorlage für die Einarbeitung könnte beispielsweise vordefinierte Rollen wie „Personalleiter“ und „Neuer Mitarbeiter“ enthalten. Bei jeder Verwendung der Vorlage können Sie die Rolle „Neuer Mitarbeiter“ verschiedenen neuen Mitarbeitern zuweisen, während die Rolle „Personalleiter“ unverändert bleibt. So wird ein nahtloser Einarbeitungsprozess für jeden neuen Mitarbeiter ermöglicht.", "redirect": "Klicken Sie auf die Schaltfläche 'Verwenden', um ein neues Dokument aus einer bestehenden Vorlage zu erstellen.", - "bulksend": "Um schnell mehrere Dokumente mithilfe einer vorhandenen Vorlage zu versenden, indem Sie einfach die E-Mail-Adressen der Empfänger erstellen, klicken Sie auf die Schaltfläche ‚Massenversand‘", - "option": "Dieses Menü zeigt weitere Optionen wie Bearbeiten und Löschen. Verwenden Sie die Schaltfläche 'Bearbeiten', um Unterzeichnerrollen hinzuzufügen, Felder zu ändern und Ihre Vorlage zu aktualisieren. Änderungen gelten für alle zukünftigen Dokumente, die aus dieser Vorlage erstellt werden, wirken sich jedoch nicht auf vorhandene Dokumente aus. Verwenden Sie die Schaltfläche 'Löschen', um die Vorlage zu entfernen.", - "signyour-self-1": "Wählen und ziehen Sie Ihre bevorzugten Widgets auf das PDF, um Ihr Dokument vor dem Unterzeichnen anzupassen. Wählen Sie die perfekten Stellen für jede Anpassung aus, um das Dokument an Ihre Bedürfnisse anzupassen.", + "bulksend": "Um schnell mehrere Dokumente mit einer vorhandenen Vorlage zu versenden, geben Sie einfach die E-Mail-Adressen der Empfänger ein und klicken Sie auf die Schaltfläche 'Massenversand'. Sie können bis zu 50 Empfänger erreichen.", + "option": "Dieses Menü zeigt weitere Optionen wie Bearbeiten, Löschen, Umbenennen, Duplizieren, Teilen usw. <1>Klicken Sie hier, um mehr über alle verfügbaren Optionen zu erfahren. <3>Hinweis: Änderungen an einer vorhandenen Vorlage gelten für alle zukünftigen Dokumente, die aus dieser Vorlage erstellt werden, betreffen jedoch nicht bereits versandte Dokumente.", + "signyour-self-1": "Wählen oder ziehen Sie Ihre bevorzugten Widgets auf das PDF, um Ihr Dokument vor der Unterzeichnung anzupassen. Platzieren Sie die Widgets an den perfekten Stellen, um das Dokument an Ihre Bedürfnisse anzupassen.", "signyour-self-2": "Ziehen Sie ein Widget irgendwo in diesen Bereich. Sie können es später in der Größe ändern und verschieben.", "template-placeholder-1": "Das Klicken auf die Schaltfläche 'Rolle hinzufügen' ermöglicht es Ihnen, verschiedene Unterzeichnerrollen hinzuzufügen. Sie können Benutzern diese Rollen in den folgenden Schritten zuweisen.", - "template-placeholder-2": "Sobald Rollen hinzugefügt wurden, wählen Sie eine Rolle aus der Liste aus, um einen Platzhalter hinzuzufügen, an dem der Unterzeichner unterschreiben soll. Der Platzhalter wird in der gleichen Farbe wie der Rollenname angezeigt, sobald Sie ihn im Dokument ablegen.", - "template-placeholder-3": "Ziehen Sie ein Feld in das Dokument oder klicken Sie darauf, um es hinzuzufügen.", - "template-placeholder-4": "Ziehen Sie den Platzhalter für eine Rolle an eine beliebige Stelle im Dokument. Denken Sie daran, dass er in der gleichen Farbe wie der Name des Empfängers angezeigt wird, um die Zuordnung zu erleichtern.", - "template-placeholder-5": "Das Klicken auf 'Weiter' speichert die aktuelle Vorlage. Nach dem Speichern werden Sie gefragt, ob Sie ein neues Dokument aus dieser Vorlage erstellen möchten.", + "template-placeholder-2": "Nachdem Sie Rollen hinzugefügt haben, wählen Sie eine aus der Liste, um ein Widget für diesen Empfänger zu platzieren. Sie können entweder auf das Widget klicken oder es auf das Dokument ziehen. Sobald es platziert ist, wird das Widget in derselben Farbe wie die ausgewählte Rolle angezeigt.", + "template-placeholder-3": "Das Klicken auf 'Weiter' speichert die aktuelle Vorlage. Nach dem Speichern werden Sie gefragt, ob Sie ein neues Dokument aus dieser Vorlage erstellen möchten.", "webhook-1": "Jetzt upgraden, um einen Webhook einzurichten", "Need your Signature": "Das Klicken auf diese Karte führt Sie zu einer Liste der Dokumente, die auf Ihre Überprüfung warten.", "Out for signatures": "Das Klicken auf diese Karte führt Sie zu einer Liste der Dokumente, die auf eine Signatur warten.", @@ -1044,7 +1054,7 @@ "not-calculated": "Nicht berechnet", "not-found-in-signature": "Nicht in Signatur gefunden", "readonly-error": "Das schreibgeschützte {{widgetName}}-Widget muss einen Standardwert haben oder kann optional gemacht werden.", - "choose-one":"Wählen Sie eine aus", + "choose-one": "Wählen Sie eine aus", "search-templates": "Vorlagen durchsuchen…", "search-documents": "Dokumente suchen…", "search-contacts": "Kontakte durchsuchen…", @@ -1131,6 +1141,7 @@ "show-more": "Mehr anzeigen", "browse-or-drag-to-replace-existing-file": "Durchsuchen oder per Drag & Drop eine neue Datei ziehen, um die vorhandene zu ersetzen", "optional-details": "Optionale Angaben", + "hide-optional-details": "optionale Angaben ausblenden", "mail-adapter-subscription-alert": "Bitte upgraden Sie auf den Professional- oder Team-Plan, um den Mail-Adapter einzurichten.", "connect-to-mail": "Mit Gmail verbinden", "custom-smtp": "Benutzerdefiniertes SMTP", @@ -1141,5 +1152,63 @@ "username": "Benutzername", "use-default-mail-adapter": "Möchten Sie wirklich die Standard-Mailserver von {{appName}} verwenden, um Ihre Signaturanfragen zu versenden? Wir empfehlen, Ihre eigenen Gmail- oder SMTP-Server zu verwenden, um die Zustellbarkeit zu verbessern.", "verification-code-sent-registered-email": "Ein Bestätigungscode wurde an Ihre registrierte E-Mail-Adresse <1>{{useremail}} gesendet. Bitte geben Sie den Code unten ein, um Ihre Einstellungen zu bestätigen.", - "smpt-credentials": "SMTP-Zugangsdaten" + "smpt-credentials": "SMTP-Zugangsdaten", + "delete-account": "Konto löschen", + "delete-account-que": "Sind Sie sicher, dass Sie Ihr Konto löschen möchten?", + "delete-account-que-user": "Sie sind dabei, diesen Benutzer und alle zugehörigen Daten dauerhaft zu löschen. Diese Aktion kann nicht rückgängig gemacht werden.", + "user-deleted-successfully": "Benutzer und alle zugehörigen Daten wurden erfolgreich gelöscht.", + "account-deletion-request-sent-via-mail": "Wir haben Ihnen einen Bestätigungslink per E-Mail gesendet. Genehmigen Sie die Anfrage, um die Löschung Ihres Kontos abzuschließen.", + "type-exact-email-delete": "Geben Sie die genaue E-Mail ein, um das Löschen zu aktivieren", + "email-does-not-match": "E-Mail stimmt nicht überein.", + "please-type-to-confirm": "Bitte geben Sie <1>{{userEmail}} ein, um zu bestätigen:", + "email-settings": "E-Mail-Einstellungen", + "email-settings-help": "Um eine bessere Zustellbarkeit Ihrer Signaturanfrage-E-Mails im Posteingang zu gewährleisten, können Sie Ihren eigenen E-Mail-Anbieter verbinden. Wählen Sie eine der folgenden Optionen:", + "connect-to-gmail": "Mit Gmail verbinden: ", + "connect-to-gmail-help": "Verwenden Sie Ihr Gmail-Konto, um Signaturanfrage-E-Mails direkt aus Ihrem eigenen Posteingang zu senden. Dies verbessert die Zustellraten und Zuverlässigkeit.", + "connect-to-smtp": "Benutzerdefiniertes SMTP: ", + "connect-to-smtp-help": "Verwenden Sie Ihren eigenen SMTP-Server, um E-Mails über Ihre Domain zu versenden. Diese Option gibt Ihnen die volle Kontrolle über Ihre E-Mail-Infrastruktur und verbessert die Zustellbarkeit sowie die Markenkonsistenz.", + "connect-to-default": "Wenn Sie möchten, können Sie auch die Standard-Mailserver von {{appName}} verwenden, wir empfehlen jedoch für optimale Ergebnisse die Nutzung Ihrer eigenen.", + "email-settings-redirect-message": "Diese Einstellung wurde von der Konsole zu den Haupteinstellungen → Präferenzen verschoben. Diese Seite wird in zukünftigen Versionen entfernt.", + "go-to-preferences-menu": "Zum Menü 'Einstellungen' gehen", + "document-download-filename-format": "Dateiname-Format für Dokument-Download", + "preview": "Vorschau: ", + "download-filename-format-help": "Wählen Sie, wie heruntergeladene PDFs benannt werden. Ihre Auswahl wird in Ihrem Profil gespeichert und in der gesamten App verwendet.", + "delete-action-prohibited": "Diese Aktion ist nicht erlaubt. Bitte wenden Sie sich an Ihren Administrator, um die Löschung des Kontos zu beantragen.", + "not-verified": "Nicht verifiziert", + "verified": "Verifiziert", + "expires": "Läuft ab", + "fix-resend-error": "Sie können dieses Dokument nicht korrigieren und erneut senden, da es vorab ausgefüllte Widgets enthält.", + "duplicate-template-error": "Sie können diese Vorlage nicht duplizieren, da sie vorab ausgefüllte Widgets enthält.", + "save-as-template-error": "Dieses Dokument kann nicht als Vorlage gespeichert werden, da es vorab ausgefüllte Widgets enthält.", + "redirecting-you-in": "Sie werden in {{redirectTimeLeft}} Sek. weitergeleitet...", + "pdf-tools-tour": "Klicken Sie auf diese Schaltflächen, um Seiten hinzuzufügen, zu löschen, neu anzuordnen, zu drehen und zu zoomen.", + "widgets": "Widgets", + "prefill-tour": "Verwenden Sie diese Option, um Informationen im Voraus einzugeben, bevor Sie das Dokument an Empfänger senden.", + "empty-prefill-error": "Die folgenden Pflichtfelder dürfen nicht leer bleiben:", + "please-fill-out": "Bitte füllen Sie diese aus, um fortzufahren.", + "custom-signing-certificate": "Benutzerdefiniertes Signaturzertifikat", + "signing-certificate-help": "Sie können Ihr eigenes Dokumentensignaturzertifikat hochladen, das zum Signieren aller Ihrer Dokumente sowie Abschlusszertifikate verwendet wird. Die Zertifikatsdatei sollte ein P12-Zertifikat im PFX-Format sein.", + "certificate-file-p12-in-PFX-format": "Zertifikatsdatei (p12-Zertifikat im PFX-Format)", + "password-of-pfx-file": "Passwort der PFX-Datei eingeben", + "update": "Aktualisieren", + "use-default-certificate": "Standardzertifikat von {{appName}} verwenden", + "upgrade-to-team-plan": "Auf Team-Plan upgraden", + "setup-file-storage": "Dateispeicher einrichten", + "save-and-activate": "Speichern & aktivieren", + "logging-out-to-apply-settings": "Sie werden abgemeldet, um neue Einstellungen anzuwenden", + "reconnect-to-default": "Erneut mit {{appName}} verbinden", + "active-file-adapter": "Aktiver Dateiadapter", + "file-adapter-unique-name": "Eindeutiger Name des Dateiadapters", + "unique-name-for-file-adapter": "Eindeutigen Namen für Dateiadapter eingeben", + "storage-provider": "Speicheranbieter", + "enter-bucket-name": "Bucket-Namen eingeben", + "enter-space-name": "Space-Namen eingeben", + "enter-region-of-bucket": "Region des Buckets eingeben", + "enter-region-of-space": "Region des Spaces eingeben", + "enter-access-key": "Access Key eingeben", + "enter-secret-access-key": "Secret Access Key eingeben", + "otp-email": "Wir haben einen Bestätigungscode gesendet", + "save-as-temp-warn": "Hinweis: Dieses Dokument enthält vorausgefüllte Widgets, die automatisch entfernt werden, da sie bereits im Basisdokument integriert sind.", + "edit-document": "Dokument bearbeiten", + "otp-email": "Wir haben einen Bestätigungscode gesendet" } diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index cd2c981c22..7c8795bab1 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -189,7 +189,18 @@ "Logs": "Logs", "Expiry-date": "Expiry date", "Company": "Company", - "JobTitle": "Job title" + "JobTitle": "Job title", + "Time to complete (Days)": "Time to complete (Days)", + "Auto reminder": "Auto reminder", + "Remind once in every (Days)": "Remind once in every (Days)", + "Enable OTP verification": "Enable OTP verification", + "Enable Tour": "Enable Tour", + "Notify on signatures": "Notify on signatures", + "Allow modifications": "Allow modifications", + "Redirect url": "Redirect url", + "Created Date": "Created Date", + "Updated Date": "Updated Date", + "Expiry Date": "Expiry Date" }, "report-help": { "Draft Documents": "These are documents you have started but have not finalized for sending.", @@ -287,7 +298,7 @@ "deactivate": "deactivate", "this-user": " this user", "delete-user": "Delete user", - "delete": "delete", + "delete": "Delete", "add-user": "Add user", "password-generateed": "Password will only be generated once; make sure to copy it.", "Team status": "Team status", @@ -478,7 +489,7 @@ "add-recipients": "Add recipients", "loading-mssg": "This might take some time", "send-mail": "Send Mail", - "signature-field-widget": "A minimum of one signature field must be added for each user. You have not added signature fields for {{signersName}}", + "signature-field-widget": "Each user must have at least one signature widget. You have not added a signature widget for {{signersName}}", "placeholder-alert-1": "Please ensure there's at least one signature widget added for all recipients.", "placeholder-alert-2": "Please confirm that you have filled the text field.", "placeholder-alert-3": " Are you sure you want to send out this document for signatures?", @@ -613,7 +624,8 @@ "tour-mssg": { "home-layout-1": "You have logged in successfully! Let's take a look.", "home-layout-2": "To upload documents for self-signing or to request others' signatures, simply select the respective buttons.", - "home-layout-3": "You are ready to start using {{appName}}! If you need support feel free to contact us.", + "home-layout-3": "You are ready to start using {{appName}}!", + "home-layout-4": "Star us on", "generate-token": "Upgrade now to generate production API token.", "opensign-drive-1": "Click on the breadcrumb links to easily navigate through the folder hierarchy and view the documents within each folder.", "opensign-drive-2": "Click the add button to create a new folder or document.", @@ -622,35 +634,33 @@ "opensign-drive-5": "The document list is displayed according to the selected sorting option. Icons next to each document indicate its current status.", "opensign-drive-6": "Right-click on a document to see options such as Download, Rename, Move, and Delete. Click on the document to open it.", "opensign-drive-7": "Right-click on any folder to see options. Choose 'Rename' to change the folder's name or click on the folder to navigate through its contents.", - "pdf-request-file-1": "List of signers who still need to sign the document .", - "pdf-request-file-2": "Click any of the placeholders appearing on the document to sign. You will then see options to draw your signature, type it, or upload an image .", - "pdf-request-file-3": "Click Decline, or Finish buttons to navigate your document. Use the ellipsis menu for additional options, including the Download button .", + "pdf-request-file-1": "List of signers who still need to sign the document.", + "pdf-request-file-2": "Click any of the fields appearing on the document to begin. You will then be able to fill in the required information.", + "pdf-request-file-3": "Once you've filled in all the required fields, click “Finish.” You'll then be able to download the signed document. Depending on the sender's settings, you may receive a copy of the completed document along with the completion certificate once all recipients have finished signing.", "pdf-request-file-4": "List of signers who have already signed the document .", "pdf-request-file-5": "You can click 'Auto Sign All' to automatically sign at all the locations meant to be signed by you. Make sure that you review the document properly before you click this button .", "pdf-request-file-6": "Please complete the fields on page number {{pagenumbers}}, all highlighted in the same color for easy identification.", - "placeholder-sign-1": "Select a recipient from this list to add a place-holder where he is supposed to sign.The placeholder will appear in the same colour as the recipient name once you drop it on the document.", + "placeholder-sign-1": "Select a recipient from this list to add a widgets. The widget will appear in the same colour as the recipient name once you drop it on the document.", "placeholder-sign-2": "Clicking 'Add recipients' button will allow you to add more signers.", "placeholder-sign-3": "Click this button to add more recipients/signers to the document.", - "placeholder-sign-4": "Drag or click on a field to add it to the document.", - "placeholder-sign-5": "The PDF content area already displays the template's existing placeholders. For your convenience, these placeholders will match the color of the recipient's name, making them easily identifiable.", + "placeholder-sign-4": "Drag or click a widget to add it to the document.", + "placeholder-sign-5": "The PDF content area already displays the template's existing Widgets. For your convenience, these widgets will match the color of the recipient's name, making them easily identifiable.", "placeholder-sign-6": "Clicking 'Next' will save the document. In the next step you can customize the emails to be sent out to the recipients or copy the signing links and share those with the recipients yourself.", "report-1": "Click the 'Add' button to create a new template. Templates are reusable documents designed to quickly generate new documents with the same structure and varying signers. For example, an HR template for onboarding could have predefined roles like 'HR Manager' and 'New Employee'. Each time you use the template, you can assign the 'New Employee' role to different incoming staff members, while the 'HR Manager' role remains constant, facilitating a seamless onboarding process for each recruit. ", "redirect": "Click the 'Use' button to create a new document from an existing template.", - "bulksend": "To quickly send multiple documents using an existing template by just creating the recipient email addresses, click the 'Bulk Send' button.", - "option": "This menu reveals more options such as Edit & Delete. Use the 'Edit' button to add signer roles, modify fields, and update your template. Changes will apply to all future documents created from this template but won't affect existing documents.Use the Delete button you can delete template. ", - "signyour-self-1": "Select and drag your preferred widgets onto the PDF to customize your document before signing. Choose the perfect spots for each modification to tailor the document to your needs.", + "bulksend": "To quickly send multiple documents using an existing template by just entering the recipient email addresses, click the 'Bulk Send' button. You can send to up to 50 recipients.", + "option": "This menu reveals more options such as Edit, Delete, Rename, Duplicate, Share, etc. <1>Click here to read more about all available options. <3>Note: Changes to an existing template will apply to all future documents created from that template but won't affect documents that are already sent out.", + "signyour-self-1": "Select or drag your preferred widgets onto the PDF to customize your document before signing. Choose the perfect spots for each widget to tailor the document to your needs.", "signyour-self-2": "Drag and drop anywhere in this area. You can resize and move it later.", "template-placeholder-1": "Clicking 'Add role' button will allow you to add various signer roles. You can attach users to each role in subsequent steps.", - "template-placeholder-2": "Once roles are added, select a role from list to add a place-holder where he is supposed to sign. The placeholder will appear in the same colour as the role name once you drop it on the document.", - "template-placeholder-3": "Drag or click on a field to add it to the document.", - "template-placeholder-4": "Drag the placeholder for a role anywhere on the document.Remember, it will appear in the same colour as the name of the recipient for easy reference.", - "template-placeholder-5": "Clicking 'Next' will store the current template. After saving, you'll be prompted to create a new document from this template if you wish.", + "template-placeholder-2": "After adding roles, choose one from the list to place a widget for that recipient. You can either click the widget or drag it onto the document. Once placed, the widget will display in the same color as the selected role.", + "template-placeholder-3": "Clicking 'Next' will store the current template. After saving, you'll be prompted to create a new document from this template if you wish.", "webhook-1": "Upgrade now to set webhook", "Need your Signature": "Clicking on this card will take you to the list of documents awaiting your review.", "Out for signatures": "Clicking on this card will take you to a list of documents awaiting signature.", "Recent signature requests": "This is a list of documents that are waiting for your signature.", "Recently sent for signatures": "This is a list of documents you've sent to other parties for signature.", - "Drafts": "This are documents you have started but have not finalized for sending.", + "Drafts": "These are documents you have started but have not finalized for sending.", "public-template": "This video demonstrates how to set up your personalized public profile, such as 'https://opensign.me/your-username'. You'll also learn how to customize your tagline and make your templates available for public signing.", "allowModify-widgets": "You can drag and drop any of these fields onto the document, in addition to the fields already designated for you by the document creator." }, @@ -741,7 +751,7 @@ "public-tour-message": "The template needs to be public before you can generate a shareable link.", "add-user-template": "You need to add a role before you can add fields for it.", "pdf-uncompatible": "This pdf is not compatible, please contact {{appName}}", - "text-field-tour": "'Prefill' fields must be filled in advance before the document is sent. If you need the signers to provide input, use signers fields instead.", + "text-field-tour": "'Prefill' fields must be filled in advance before the document is sent. If you need the signers to provide input, use signers fields instead.", "attach-signer-tour": "You need to attach a Signer to every role. You can do that by clicking this icon. Once you select a Signer it will be attached to all the fields associated with that role which appear in the same colour.", "allowed-signature-types": "Allowed signature types", "at-least-one-signature-type": "At least one signature type should be enabled.", @@ -989,20 +999,20 @@ "verify-identity": "Verify identity", "passkey-verification-failed": "Passkey verification failed. Please try again or use OTP.", "security-auth-help": { - "p1":"Manage your account's security settings to keep your data safe. OpenSign supports advanced authentication methods to enhance account protection.", - "2fa-auth-help":" Add an extra layer of security by enabling 2FA. This requires you to enter a verification code from an authenticator app after your password.", - "passkey-auth-help":"Use passkeys for passwordless sign-in with biometric or device-based verification, providing both strong security and convenience." + "p1": "Manage your account's security settings to keep your data safe. OpenSign supports advanced authentication methods to enhance account protection.", + "2fa-auth-help": " Add an extra layer of security by enabling 2FA. This requires you to enter a verification code from an authenticator app after your password.", + "passkey-auth-help": "Use passkeys for passwordless sign-in with biometric or device-based verification, providing both strong security and convenience." }, "signer-already-present": "Signer already present", "kiosk-sign": "Kiosk Sign", "dont-have-access-to-template": "The template has been deleted or you don't have access. Please contact the sender.", "kiosk-info": "Kiosk Mode lets you collect in-person signatures quickly and efficiently. Ideal for trade shows, events, or walk-in scenarios where all signers are physically present. ", "learn-more": "Learn more", - "finish-mssg":" Are you sure you want to finish the document ?", - "review":"Review", - "next-field":"Next Field", - "required-mssg":"{{leftRequiredWidget}} of {{totalWidget}} fields left", - "verify-document": "Verify document", + "finish-mssg": " Are you sure you want to finish the document ?", + "review": "Review", + "next-field": "Next Field", + "required-mssg": "{{leftRequiredWidget}} of {{totalWidget}} fields left", + "verify-document": "Verify document", "verify-document-signature": "Verify Document Signature", "select-pdf-document": "Select PDF Document", "selected-file": "Selected file", @@ -1045,23 +1055,23 @@ "not-calculated": "Not calculated", "not-found-in-signature": "Not found in signature", "readonly-error": "Read-only {{widgetName}} widget must have a default value or you can make it optional.", - "choose-one":"Choose One", + "choose-one": "Choose One", "search-templates": "Search templates…", "search-documents": "Search documents…", "search-contacts": "Search contacts…", - "add-role-alert":"Please add at least one role", - "edit-draft":"Edit draft", + "add-role-alert": "Please add at least one role", + "edit-draft": "Edit draft", "invalid-email-found": "Invalid email found: {{email}}", "duplicate-email-found": "Duplicate email found: {{email}}", "vertical": "Vertical", "horizontal": "Horizontal", "billing": "Billing", "console": "Console", - "prefill-widget":"Prefill Widgets", + "prefill-widget": "Prefill Widgets", "action-prohibited": "This action isn't allowed for your email domain. Please contact your administrator for assistance.", "must-have-at-least-one-vacant-role": "You must have at least one role unassigned before setting a template to 'public'.", "remove-duplicate": "Please remove duplicate option", - "prefill-bulk-error":"Bulk send is not allowed when prefill widgets are added. Please remove the prefill widgets to proceed.", + "prefill-bulk-error": "Bulk send is not allowed when prefill widgets are added. Please remove the prefill widgets to proceed.", "session-expired-title": "Session Expired", "access-denied": "Access denied", "upgrade": "Upgrade", @@ -1085,9 +1095,9 @@ "app-name": "App Name", "provide-domain-name": "provide your domain name", "provide-app-name": "provide your app name", - "logo":"Logo", + "logo": "Logo", "upload-app-logo": "upload your app logo", - "prefill-unfilled-widget" :"The following required field(s) cannot be left empty: {{emptyWidget}} Please fill them out to proceed.", + "prefill-unfilled-widget": "The following required field(s) cannot be left empty: {{emptyWidget}} Please fill them out to proceed.", "Dashboard": "Dashboard", "Analytics": "Analytics", "Templates": "Templates", @@ -1096,7 +1106,7 @@ "Completed": "Completed", "Drafts": "Drafts", "Declined": "Declined", - "Expired": "Expired", + "Expired": "Expired", "Contactbook": "Contactbook", "My Signature": "My signature", "API Token": "API token", @@ -1132,15 +1142,74 @@ "show-more": "Show More", "browse-or-drag-to-replace-existing-file": "Browse or drag & drop a new file to replace the existing one", "optional-details": "Optional details", + "hide-optional-details": "Hide optional details", "mail-adapter-subscription-alert": "Please upgrade to Professional or Team plan to setup custom SMTP.", "connect-to-mail": "Connect to Gmail", "custom-smtp": "Custom SMTP", "default-smtp": "{{appName}} default SMTP", - "host":"Host", - "port":"Port", + "host": "Host", + "port": "Port", "sender-email": "Sender Email", "username": "Username", "use-default-mail-adapter": "Are you sure you want to use {{appName}}'s default mail servers to send your signature request emails? We recommend using your own Gmail or SMTP servers for improved inbox deliverability.", "verification-code-sent-registered-email": "A verification code has been sent to your registered email <1>{{useremail}} confirm your settings. Please enter the code below.", - "smpt-credentials": "SMTP Credentials" -} \ No newline at end of file + "smpt-credentials": "SMTP Credentials", + "delete-account": "Delete account", + "delete-account-que": "Are you sure you want to delete your account?", + "delete-account-que-user": "You are about to permanently delete this user and all associated data. This action cannot be undone.", + "user-deleted-successfully": "User and all associated data deleted successfully.", + "account-deletion-request-sent-via-mail": "We've emailed you a confirmation link. Approve the request to complete your account deletion.", + "type-exact-email-delete": "Type the exact email to enable delete", + "email-does-not-match": "Email does not match.", + "please-type-to-confirm": "Please type <1>{{userEmail}} to confirm:", + "email-settings": "Email settings", + "email-settings-help": " To ensure better inbox deliverability for your signature request emails, you can connect your own email provider. Choose one of the following options:", + "connect-to-gmail": "Connect to Gmail: ", + "connect-to-gmail-help": "Use your Gmail account to send signature request emails directly from your own inbox, improving delivery rates and reliability.", + "connect-to-smtp": "Custom SMTP: ", + "connect-to-smtp-help": "Use your custom SMTP server for sending emails through your domain. This option gives you full control over your email infrastructure, enhancing deliverability and brand consistency.", + "connect-to-default": "If you prefer, you can also Use {{appName}} default mail servers, though we recommend using your own for optimal results.", + "email-settings-redirect-message": "This setting has been moved from the console to Main Menu Settings → Preferences. This page will be removed in upcoming versions.", + "go-to-preferences-menu": "Go to Preferences menu", + "document-download-filename-format": "Document download filename format", + "preview": "Preview: ", + "download-filename-format-help": "Choose how downloaded PDFs are named. Your selection is saved to your profile and used across the app.", + "delete-action-prohibited": "This action is not permitted. Kindly contact your administrator to request account deletion.", + "not-verified": "Not verified", + "verified": "Verified", + "expires": "Expires", + "fix-resend-error": "You can't fix and resend this document because it contains prefill widgets.", + "duplicate-template-error": "You can't duplicate this template because it contains prefill widgets.", + "save-as-template-error": "This document cannot be saved as a template because it contains prefill widgets.", + "redirecting-you-in": "Redirecting you in {{redirectTimeLeft}} sec...", + "pdf-tools-tour": "Click these buttons to add, delete, rearrange, rotate and zoom pages.", + "widgets": "Widgets", + "prefill-tour": "Use this option to enter information in advance before sending the document to recipients.", + "empty-prefill-error": "The following required field(s) cannot be left empty:", + "please-fill-out": "Please fill them out to proceed.", + "custom-signing-certificate": "Custom signing certificate", + "signing-certificate-help": "You can upload your own document signing certificate which will be used to sign all your documents as well as completion certificates. The certificate file should be a P12 certificate in PFX format.", + "certificate-file-p12-in-PFX-format": "Certificate file (p12 certificate in PFX format)", + "password-of-pfx-file": "Enter password of pfx file", + "update": "Update", + "use-default-certificate": "Use default {{appName}} certificate", + "upgrade-to-team-plan": "Upgrade to Team Plan", + "setup-file-storage": "Setup file storage", + "save-and-activate": "Save & activate", + "logging-out-to-apply-settings": "You are being logged out to apply new settings", + "reconnect-to-default": "Reconnect to {{appName}}", + "active-file-adapter": "Active File Adapter", + "file-adapter-unique-name": "File Adapter unique name", + "unique-name-for-file-adapter": "Enter unique name for file adapter", + "storage-provider": "Storage Provider", + "enter-bucket-name": "Enter bucket name", + "enter-space-name": "Enter space name", + "enter-region-of-bucket": "Enter region of bucket", + "enter-region-of-space": "Enter region of space", + "enter-access-key": "Enter access key", + "enter-secret-access-key": "Enter secret access key", + "otp-email":"We’ve sent a verification code to", + "save-as-temp-warn":"Note: This document includes prefilled widgets, which will be automatically removed as they are already incorporated into the base document.", + "edit-document": "Edit document", + "otp-email":"We've sent a verification code to" +} diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index 34f0072535..89c0e21127 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -189,7 +189,18 @@ "Logs": "Registros", "Expiry-date": "Date d'expiration", "Company": "Compañía", - "JobTitle": "Título del puesto" + "JobTitle": "Título del puesto", + "Time to complete (Days)": "Tiempo para completar (días)", + "Auto reminder": "Recordatorio automático", + "Remind once in every (Days)": "Recordar una vez cada (días)", + "Enable OTP verification": "Habilitar verificación OTP", + "Enable Tour": "Habilitar recorrido", + "Notify on signatures": "Notificar en las firmas", + "Allow modifications": "Permitir modificaciones", + "Redirect url": "URL de redirección", + "Created Date": "Fecha de creación", + "Updated Date": "Fecha de actualización", + "Expiry Date": "Fecha de vencimiento" }, "report-help": { "Draft Documents": "Estos son documentos que has iniciado pero no has finalizado para su envío.", @@ -249,7 +260,6 @@ "submit": "Enviar", "reset": "Volver a empezar", "my-signature": "Mi firma", - "initial-alert": "Mi inicial no encontrada", "signature": "Firma", "upload-image": " Subir imagen", "clear": "Limpiar", @@ -288,7 +298,7 @@ "deactivate": "desactivar", "this-user": " este usuario", "delete-user": "Eliminar usuario", - "delete": "eliminar", + "delete": "Eliminar", "add-user": "Agregar usuario", "password-generateed": "La contraseña solo será generada una vez; asegúrate de copiarla.", "Team status": "Estado del equipo", @@ -413,7 +423,7 @@ "upload": "Subir", "initial-teb": "Iniciales", "signature-tab": "Firma", - "your-signature": "Tu firma", + "initial-alert": "Mi inicial no encontrada", "copy-title": "Copiar widget a", "contact-delete-alert": "¿En definitiva quieres eliminar este contacto?", "reset-password-alert-1": "El enlace para restablecer la contraseña ha sido enviado a tu correo electrónico", @@ -479,6 +489,7 @@ "add-recipients": "Agregar destinatarios", "loading-mssg": "Esto podría llevar algún tiempo", "send-mail": "Enviar correo", + "signature-field-widget": "Cada usuario debe tener al menos un widget de firma. No ha añadido un widget de firma para {{signersName}}.", "placeholder-alert-1": "Por favor, asegúrate de que hay al menos un widget de firma para cada destinatario.", "placeholder-alert-2": "Por favor, confirma que hayas rellenado el campo de texto.", "placeholder-alert-3": " ¿En definitiva quieres enviar este documento para ser firmado?", @@ -613,7 +624,8 @@ "tour-mssg": { "home-layout-1": "¡Has iniciado sesión exitosamente! Echemos un vistazo.", "home-layout-2": "Para subir documentos para firmar tú mismo o para solicitar la firma de otros, simplemente selecciona los botones correspondientes.", - "home-layout-3": "¡Ya puedes empezar a utilizar {{appName}}! Si necesitas soporte siéntete libre de contactarnos.", + "home-layout-3": "¡Ya puedes empezar a utilizar {{appName}}!", + "home-layout-4": "Danos una estrella en", "generate-token": "Mejora ahora para generar un token API de producción.", "opensign-drive-1": "Haz clic en los enlaces para navegar fácilmente por la estructura jerárquica de carpetas y ver los documentos de cada carpeta.", "opensign-drive-2": "Haz clic en el botón «Agregar» para crear una nueva carpeta o documento.", @@ -623,34 +635,32 @@ "opensign-drive-6": "Haz clic con el botón derecho en un documento para ver opciones como «Descargar», «Renombrar», «Mover» y «Eliminar». Haz clic en el documento para abrirlo.", "opensign-drive-7": "Haz clic con el botón derecho en cualquier carpeta para ver las opciones. Elige «Renombrar» para cambiar el nombre de la carpeta o haz clic en ella para navegar por su contenido.", "pdf-request-file-1": "Lista de firmantes que todavía tienen que firmar este documento.", - "pdf-request-file-2": "Haz clic en cualquiera de los marcadores de posición que aparecen en el documento para firmar. A continuación, verás opciones para dibujar tu firma, escribirla o subir una imagen .", - "pdf-request-file-3": "Haga clic en los botones Rechazar o Finalizar para navegar por el documento. Utilice el menú de puntos suspensivos para ver opciones adicionales, incluido el botón Descargar.", + "pdf-request-file-2": "Haga clic en cualquiera de los campos que aparecen en el documento para comenzar. Luego podrá completar la información requerida.", + "pdf-request-file-3": "Una vez que haya completado todos los campos obligatorios, haga clic en 'Finalizar'. Luego podrá descargar el documento firmado. Según la configuración del remitente, es posible que reciba una copia del documento completado junto con el certificado de finalización una vez que todos los destinatarios hayan firmado.", "pdf-request-file-4": "Lista de firmantes que ya han firmado el documento.", "pdf-request-file-5": "Puedes hacer clic en «Firmar todo automáticamente» para firmar de manera automática en todos los lugares que deban ser firmados por ti. Asegúrate de revisar correctamente el documento antes de hacer clic en ese botón.", "pdf-request-file-6": "Por favor, complete los campos en la página {{pagenumbers}}, todos resaltados con el mismo color para facilitar la identificación.", - "placeholder-sign-1": "Selecciona un destinatario de esta lista para agregar un marcador de posición dónde este destinatario tendrá que firmar. El marcador de posición aparecerá con el mismo color que el nombre del destinatario una vez lo sueltes en el documento.", + "placeholder-sign-1": "Seleccione un destinatario de esta lista para añadir un widget. El widget aparecerá con el mismo color que el nombre del destinatario una vez que lo coloque en el documento.", "placeholder-sign-2": "Hacer clic en el botón «Agregar destinatarios» te permitirá añadir más firmantes.", "placeholder-sign-3": "Haz clic en este botón para agregar más destinatarios/firmantes al documento.", - "placeholder-sign-4": "Arrastra o haz clic en un capo para agregarlo al documento.", - "placeholder-sign-5": "El área de contenido del PDF ya muestra los marcadores de posición existentes en la plantilla. Para tu comodidad, estos marcadores de posición coincidirán con el color del nombre del destinatario, haciéndolos fácilmente identificables.", + "placeholder-sign-4": "Arrastre o haga clic en un widget para añadirlo al documento.", + "placeholder-sign-5": "El área de contenido del PDF ya muestra los widgets existentes de la plantilla. Para su comodidad, estos widgets coincidirán con el color del nombre del destinatario, lo que los hace fácilmente identificables.", "placeholder-sign-6": "Al hacer clic en 'Siguiente' se guardará el documento. En el siguiente paso, puede personalizar los correos electrónicos que se enviarán a los destinatarios o copiar los enlaces de firma y compartirlos usted mismo con los destinatarios.", "report-1": "Haz clic en el botón «Agregar» para crear una nueva plantilla. Las plantillas son documentos reusables diseñados para generar rápidamente nuevos documentos con la misma estructura pero diferentes firmantes. Por ejemplo, una plantilla de RR.HH. para el proceso de incorporación podría tener roles predefinidos como «Director de RR.HH.» y «Nuevo empleado». Cada vez que utilices la plantilla, puedes asignar el rol de «Nuevo empleado» a los distintos miembros del personal que se incorporen, mientras que el rol de « Director de RR.HH.» permanece constante, lo que facilita un proceso de incorporación fluido para cada persona contratada.", "redirect": "Haz clic en el botón «Usar» para crear un nuevo documento desde una plantilla existente.", - "bulksend": "Para enviar rápidamente múltiples documentos utilizando una plantilla existente creando simplemente las direcciones de correo electrónico de los destinatarios, haz clic en el botón 'Envío Masivo'.", - "option": "Este menú revela más opciones como «Editar» y «Eliminar». Usa el botón «Editar» para agregar roles, modificar campos y actualizar tu plantilla. Los cambios aplicarán para todos los documentos futuros que sean creados usando esta plantilla pero no afectarán a los documentos ya existentes. Con el botón «Eliminar» puedes eliminar la plantilla.", - "signyour-self-1": "Para personalizar el documento antes de que sea firmado, selecciona y arrastra al documento los widgets que prefieras. Escoge el espacio perfecto para cada modificación para adaptar el documento a tus necesidades.", + "bulksend": "Para enviar rápidamente varios documentos utilizando una plantilla existente, simplemente introduzca las direcciones de correo electrónico de los destinatarios y haga clic en el botón 'Envío masivo'. Puede enviar hasta 50 destinatarios.", + "option": "Este menú muestra más opciones como Editar, Eliminar, Renombrar, Duplicar, Compartir, etc. <1>Haga clic aquí para leer más sobre todas las opciones disponibles. <3>Nota: Los cambios en una plantilla existente se aplicarán a todos los futuros documentos creados a partir de esa plantilla, pero no afectarán a los documentos que ya se hayan enviado.", + "signyour-self-1": "Seleccione o arrastre sus widgets preferidos al PDF para personalizar su documento antes de firmar. Elija los lugares perfectos para cada widget y adapte el documento a sus necesidades.", "signyour-self-2": "Arrastra y suelta en cualquier lugar de esta área. Después podrás cambiar el tamaño y moverlo.", "template-placeholder-1": "Hacer clic en el botón «Agregar rol» te permitirá agregar varios roles de firmantes. Puedes asociar usuarios a cada rol en los siguientes pasos.", - "template-placeholder-2": "Una vez que los roles hayan sido agregados, selecciona un rol de la lista para agregar un marcador de posición donde éste tendrá que firmar. El marcador de posición aparecerá con el mismo color que el nombre del rol una vez lo sueltes en el documento.", - "template-placeholder-3": "Arrastra o haz clic en un capo para agregarlo al documento.", - "template-placeholder-4": "Arrastra el marcador de posición para un rol a cualquier lugar del documento. Recuerda, aparecerá con el mismo color que el nombre del rol para poder referenciarlo fácilmente.", - "template-placeholder-5": "Hacer clic en «Siguiente» guardará la plantilla actual. Luego de guardar, se te consultará si deseas crear un nuevo documento usando esta plantilla.", + "template-placeholder-2": "Después de añadir roles, elija uno de la lista para colocar un widget para ese destinatario. Puede hacer clic en el widget o arrastrarlo al documento. Una vez colocado, el widget se mostrará en el mismo color que el rol seleccionado.", + "template-placeholder-3": "Hacer clic en «Siguiente» guardará la plantilla actual. Luego de guardar, se te consultará si deseas crear un nuevo documento usando esta plantilla.", "webhook-1": "Mejora ahora para configurar un webhook", "Need your Signature": "Hacer clic en esta tarjeta te llevará a la lista de documentos que esperan por tu revisión.", "Out for signatures": "Hacer clic en esta tarjeta te llevará a la lista de documentos que esperan tu firma.", "Recent signature requests": "Esta es una lista de documentos que esperan por tu firma.", "Recently sent for signatures": "Esta es una lista de documentos que has enviado a otras partes para que sea firmado.", - "Drafts": "Estos son documentos que has empezado pero que todavía no finalizas para su envío.", + "Drafts": "Estos son documentos que ha comenzado pero que aún no ha finalizado para enviar.", "public-template": "Este video muestra cómo puedes configurar tu perfil público personalizado, como «https://opensign.me/tu-nombre-de-usuario». También aprenderás cómo personalizar tu eslogan y cómo hacer tus plantillas disponibles para su firmado público.", "allowModify-widgets": "Puede arrastrar y soltar cualquiera de estos campos en el documento, además de los campos ya designados para usted por el creador del documento" }, @@ -1045,7 +1055,7 @@ "not-calculated": "No calculado", "not-found-in-signature": "No encontrado en la firma", "readonly-error": "El widget de solo lectura {{widgetName}} debe tener un valor predeterminado o puede hacerlo opcional.", - "choose-one":"Elige uno", + "choose-one": "Elige uno", "search-templates": "Buscar plantillas…", "search-documents": "Buscar documentos…", "search-contacts": "Buscar contactos…", @@ -1053,7 +1063,7 @@ "duplicate-email-found": "Correo electrónico duplicado encontrado: {{email}}", "vertical": "Vertical", "add-role-alert": "Por favor, agregue al menos un rol", - "edit-draft": "Editar borrador", + "edit-draft": "Editar borrador", "horizontal": "Horizontal", "billing": "Facturación", "console": "Consola", @@ -1132,6 +1142,7 @@ "show-more": "Mostrar más", "browse-or-drag-to-replace-existing-file": "Busque o arrastre y suelte un nuevo archivo para reemplazar el existente", "optional-details": "Detalles opcionales", + "hide-optional-details": "ocultar detalles opcionales", "mail-adapter-subscription-alert": "Bitte upgraden Sie auf den Professional- oder Team-Plan, um ein benutzerdefiniertes SMTP einzurichten.", "connect-to-mail": "Conectar con Gmail", "custom-smtp": "SMTP personalizado", @@ -1142,5 +1153,63 @@ "username": "Nombre de usuario", "use-default-mail-adapter": "¿Está seguro de que desea usar los servidores de correo predeterminados de {{appName}} para enviar solicitudes de firma? Recomendamos usar su propio servidor de Gmail o SMTP para una mejor entregabilidad.", "verification-code-sent-registered-email": "Se ha enviado un código de verificación a su correo registrado <1>{{useremail}}. Ingrese el código a continuación para confirmar su configuración.", - "smpt-credentials": "Credenciales SMTP" + "smpt-credentials": "Credenciales SMTP", + "delete-account": "Eliminar cuenta", + "delete-account-que": "¿Está seguro de que desea eliminar su cuenta?", + "delete-account-que-user": "Está a punto de eliminar permanentemente este usuario y todos los datos asociados. Esta acción no se puede deshacer.", + "user-deleted-successfully": "Usuario y todos los datos asociados eliminados correctamente.", + "account-deletion-request-sent-via-mail": "Le hemos enviado por correo electrónico un enlace de confirmación. Apruebe la solicitud para completar la eliminación de su cuenta.", + "type-exact-email-delete": "Escriba el correo electrónico exacto para habilitar la eliminación", + "email-does-not-match": "El correo electrónico no coincide.", + "please-type-to-confirm": "Por favor, escriba <1>{{userEmail}} para confirmar:", + "email-settings": "Configuración de correo electrónico", + "email-settings-help": "Para garantizar una mejor entregabilidad en la bandeja de entrada de sus correos electrónicos de solicitud de firma, puede conectar su propio proveedor de correo electrónico. Elija una de las siguientes opciones:", + "connect-to-gmail": "Conectar con Gmail: ", + "connect-to-gmail-help": "Utilice su cuenta de Gmail para enviar correos electrónicos de solicitud de firma directamente desde su propia bandeja de entrada, mejorando la tasa de entrega y la fiabilidad.", + "connect-to-smtp": "SMTP personalizado: ", + "connect-to-smtp-help": "Utilice su propio servidor SMTP para enviar correos electrónicos a través de su dominio. Esta opción le brinda control total sobre su infraestructura de correo electrónico, mejorando la entregabilidad y la coherencia de la marca.", + "connect-to-default": "Si lo prefiere, también puede usar los servidores de correo predeterminados de {{appName}}, aunque recomendamos usar los suyos para obtener mejores resultados.", + "email-settings-redirect-message": "Esta configuración se ha movido de la consola a Configuración del menú principal → Preferencias. Esta página se eliminará en próximas versiones.", + "go-to-preferences-menu": "Ir al menú de preferencias", + "document-download-filename-format": "Formato de nombre de archivo para la descarga del documento", + "preview": "Vista previa: ", + "download-filename-format-help": "Elija cómo se nombran los archivos PDF descargados. Su selección se guarda en su perfil y se usa en toda la aplicación.", + "delete-action-prohibited": "Esta acción no está permitida. Por favor, póngase en contacto con su administrador para solicitar la eliminación de la cuenta.", + "not-verified": "No verificado", + "verified": "Verificado", + "expires": "Expira", + "fix-resend-error": "No puede corregir y reenviar este documento porque contiene widgets predefinidos.", + "duplicate-template-error": "No puede duplicar esta plantilla porque contiene widgets predefinidos.", + "save-as-template-error": "Este documento no se puede guardar como plantilla porque contiene widgets predefinidos.", + "redirecting-you-in": "Redirigiéndolo en {{redirectTimeLeft}} seg...", + "pdf-tools-tour": "Haga clic en estos botones para agregar, eliminar, reorganizar, rotar y acercar/alejar páginas.", + "widgets": "Widgets", + "prefill-tour": "Use esta opción para ingresar información por adelantado antes de enviar el documento a los destinatarios.", + "empty-prefill-error": "Los siguientes campos obligatorios no pueden quedar vacíos:", + "please-fill-out": "Por favor, complételos para continuar.", + "custom-signing-certificate": "Certificado de firma personalizado", + "signing-certificate-help": "Puede cargar su propio certificado de firma de documentos, que se utilizará para firmar todos sus documentos así como los certificados de finalización. El archivo del certificado debe ser un certificado P12 en formato PFX.", + "certificate-file-p12-in-PFX-format": "Archivo de certificado (certificado p12 en formato PFX)", + "password-of-pfx-file": "Ingrese la contraseña del archivo pfx", + "update": "Actualizar", + "use-default-certificate": "Usar el certificado predeterminado de {{appName}}", + "upgrade-to-team-plan": "Actualizar al plan de equipo", + "setup-file-storage": "Configurar almacenamiento de archivos", + "save-and-activate": "Guardar y activar", + "logging-out-to-apply-settings": "Se está cerrando la sesión para aplicar la nueva configuración", + "reconnect-to-default": "Volver a conectar con {{appName}}", + "active-file-adapter": "Adaptador de archivos activo", + "file-adapter-unique-name": "Nombre único del adaptador de archivos", + "unique-name-for-file-adapter": "Ingrese un nombre único para el adaptador de archivos", + "storage-provider": "Proveedor de almacenamiento", + "enter-bucket-name": "Ingrese el nombre del bucket", + "enter-space-name": "Ingrese el nombre del espacio", + "enter-region-of-bucket": "Ingrese la región del bucket", + "enter-region-of-space": "Ingrese la región del espacio", + "enter-access-key": "Ingrese la clave de acceso", + "enter-secret-access-key": "Ingrese la clave secreta de acceso", + "otp-email": "Hemos enviado un código de verificación", + "save-as-temp-warn": "Nota: Este documento incluye widgets prellenados, que se eliminarán automáticamente ya que ya están incorporados en el documento base.", + "edit-document": "Editar documento", + "otp-email": "Hemos enviado un código de verificación" } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index d6b3688fff..3e9ffc9090 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -26,7 +26,7 @@ "Name": "Nom et Prénom", "Date": "Date" }, - "folder": "Dossier", + "folder": "Dossier", "pdf": "Pdf", "context-menu": { "Download": "Télécharger", @@ -45,7 +45,6 @@ "upgrade-now": "Mettre à jour maintenant", "contact-now": "Contacter maintenant", "upgrade-to": "Mettre à niveau vers", - "pro": "PRO", "plan": "Offre", "connect": "Connecter", "connect-to-g-drive": "Se connecter à Google Drive", @@ -56,6 +55,7 @@ "subscribe-card-plan": "Débloquez des fonctionnalités premium à partir de seulement {{premiumPrice}}/mois. Bénéficiez de performances améliorées et de seulement {{addonPrice}} par crédit supplémentaire après vos crédits premium inclus.", "user-name-limit-char": "Pour avoir un nom d'utilisateur de moins de 8 caractères s'il vous plaît s'abonner", "tour-content": "Ne plus afficher", + "pro": "PRO", "team": "Équipe", "docs": "Documents", "session-expired": "Votre session a expiré.", @@ -163,10 +163,22 @@ "Logs": "Journaux", "Expiry-date": "Fecha de caducidad", "Company": "Organisation", - "JobTitle": "Votre Fonction" + "JobTitle": "Votre Fonction", + "Time to complete (Days)": "Temps pour terminer (jours)", + "Auto reminder": "Rappel automatique", + "Remind once in every (Days)": "Rappeler une fois tous les (jours)", + "Enable OTP verification": "Activer la vérification OTP", + "Enable Tour": "Activer la visite", + "Notify on signatures": "Notifier lors des signatures", + "Allow modifications": "Autoriser les modifications", + "Redirect url": "URL de redirection", + "Created Date": "Date de création", + "Updated Date": "Date de mise à jour", + "Expiry Date": "Date d'expiration" }, "btnLabel": { "sign": "Signer", + "Sign": "SIGNER", "Resend": "Relancer", "Rename": "Renommer", "Revoke": "Révoquer", @@ -248,7 +260,6 @@ "submit": "Soumettre", "reset": "Réinitialiser", "my-signature": "Ma signature", - "initial-alert": "Mon initiale introuvable", "signature": "Signature", "upload-image": "Télécharger une image", "clear": "Vider", @@ -287,7 +298,7 @@ "deactivate": "désactiver", "this-user": "cet utilisateur ", "delete-user": "Supprimer l'utilisateur", - "delete": "supprimer", + "delete": "Supprimer", "add-user": "Ajouter un utilisateur", "password-generateed": "Le mot de passe ne sera généré qu'une seule fois ; assurez-vous de le copier.", "Team status": "Statut de l'équipe", @@ -412,7 +423,7 @@ "upload": "Télécharger", "initial-teb": "Initiales", "signature-tab": "Signature", - "your-signature": "Votre signature", + "initial-alert": "Mon initiale est introuvable", "copy-title": "Copier le widget vers", "contact-delete-alert": "Êtes-vous sûr de vouloir supprimer ce contact ?", "reset-password": "Le lien de réinitialisation du mot de passe a été envoyé à votre identifiant de messagerie", @@ -477,7 +488,7 @@ "add-recipients": "Ajouter des destinataires", "loading-mssg": "Cela pourrait prendre du temps", "send-mail": "Envoyer un mail", - "signature-field-widget": "Au moins un champ de signature doit être ajouté pour chaque utilisateur. Vous n'avez pas ajouté de champs de signature pour {{signersName}}", + "signature-field-widget": "Chaque utilisateur doit avoir au moins un widget de signature. Vous n’avez pas ajouté de widget de signature pour {{signersName}}.", "placeholder-alert-1": "Veuillez vous assurer qu'au moins un widget de signature est ajouté pour tous les destinataires.", "placeholder-alert-2": "Veuillez confirmer que vous avez rempli le champ de texte.", "placeholder-alert-3": "Etes-vous sûr de vouloir envoyer ce document pour signature ? ", @@ -612,7 +623,8 @@ "tour-mssg": { "home-layout-1": "Vous vous êtes connecté avec succès ! Jetons un coup d'oeil.", "home-layout-2": "Pour télécharger des documents à auto-signature ou pour demander la signature d'autres personnes, sélectionnez simplement les boutons correspondants.", - "home-layout-3": "Vous êtes prêt à commencer à utiliser {{appName}} ! Si vous avez besoin d'aide, n'hésitez pas à nous contacter.", + "home-layout-3": "Vous êtes prêt à commencer à utiliser {{appName}} !", + "home-layout-4": "Ajoutez-nous une étoile sur", "generate-token": "Effectuez la mise à niveau maintenant pour générer un jeton API de production.", "opensign-drive-1": "Cliquez sur les liens du fil d'Ariane pour naviguer facilement dans la hiérarchie des dossiers et afficher les documents dans chaque dossier.", "opensign-drive-2": "Cliquez sur le bouton Ajouter pour créer un nouveau dossier ou document.", @@ -622,34 +634,32 @@ "opensign-drive-6": "Faites un clic droit sur un document pour voir les options telles que Télécharger, Renommer, Déplacer et Supprimer. Cliquez sur le document pour l'ouvrir.", "opensign-drive-7": "Faites un clic droit sur n'importe quel dossier pour voir les options. Choisissez 'Renommer' pour changer le nom du dossier ou cliquez sur le dossier pour naviguer dans son contenu.", "pdf-request-file-1": "Liste des signataires qui doivent encore signer le document.", - "pdf-request-file-2": "Cliquez sur l'un des espaces réservés apparaissant sur le document pour signer. Vous verrez alors des options pour dessiner votre signature, la saisir ou télécharger une image.", - "pdf-request-file-3": "Cliquez sur les boutons Refuser ou Terminer pour parcourir votre document. Utilisez le menu à points de suspension pour des options supplémentaires, notamment le bouton Télécharger.", + "pdf-request-file-2": "Cliquez sur l'un des champs figurant dans le document pour commencer. Vous pourrez ensuite remplir les informations requises.", + "pdf-request-file-3": "Une fois que vous avez rempli tous les champs obligatoires, cliquez sur « Terminer ». Vous pourrez ensuite télécharger le document signé. Selon les paramètres de l'expéditeur, vous pourriez recevoir une copie du document complété avec le certificat de finalisation une fois que tous les destinataires auront signé.", "pdf-request-file-4": "Liste des signataires ayant déjà signé le document.", "pdf-request-file-5": "Vous pouvez cliquer sur 'Signer automatiquement tout' pour signer automatiquement à tous les emplacements que vous êtes censé signer. Assurez-vous de lire correctement le document avant de cliquer sur ce bouton.", "pdf-request-file-6": "Veuillez remplir les champs à la page {{pagenumbers}}, tous mis en évidence avec la même couleur pour une identification facile.", - "placeholder-sign-1": "Sélectionnez un destinataire dans cette liste pour ajouter un espace réservé à l'endroit où il est censé signer. L'espace réservé apparaîtra de la même couleur que le nom du destinataire une fois que vous le déposerez sur le document.", + "placeholder-sign-1": "Sélectionnez un destinataire dans cette liste pour ajouter un widget. Le widget apparaîtra dans la même couleur que le nom du destinataire une fois déposé sur le document.", "placeholder-sign-2": "Cliquer sur le bouton 'Ajouter des destinataires' vous permettra d'ajouter plus de signataires.", "placeholder-sign-3": "Cliquez sur ce bouton pour ajouter plus de destinataires/signataires au document", - "placeholder-sign-4": "Faites glisser ou cliquez sur un champ pour l'ajouter au document.", - "placeholder-sign-5": "La zone de contenu PDF affiche déjà les espaces réservés existants du modèle. Pour votre commodité, ces espaces réservés correspondront à la couleur du nom du destinataire, ce qui les rendra facilement identifiables.", + "placeholder-sign-4": "Faites glisser ou cliquez sur un widget pour l'ajouter au document.", + "placeholder-sign-5": "La zone de contenu du PDF affiche déjà les widgets existants du modèle. Pour plus de commodité, ces widgets correspondront à la couleur du nom du destinataire, ce qui les rend facilement identifiables.", "placeholder-sign-6": "En cliquant sur 'Suivant', le document sera enregistré. À l'étape suivante, vous pouvez personnaliser les e-mails à envoyer aux destinataires ou copier les liens de signature et les partager vous-même avec les destinataires.", "report-1": "Cliquez sur le bouton 'Ajouter' pour créer un nouveau modèle. Les modèles sont des documents réutilisables conçus pour générer rapidement de nouveaux documents avec la même structure et différents signataires. Par exemple, un modèle RH pour l'intégration peut avoir des rôles prédéfinis tels que 'Responsable RH' et ' Nouvel employé'. Chaque fois que vous utilisez le modèle, vous pouvez attribuer le rôle 'Nouvel employé' à différents membres du personnel entrants, tandis que le rôle 'Responsable RH' reste constant, facilitant ainsi un processus d'intégration fluide pour chaque recrue", "redirect": "Cliquez sur le bouton 'Utiliser' pour créer un nouveau document à partir d'un modèle existant.", - "bulksend": "Pour envoyer rapidement plusieurs documents en utilisant un modèle existant en créant simplement les adresses e-mail des destinataires, cliquez sur le bouton 'Envoi en masse'.", - "option": "Ce menu révèle plus d'options telles que Modifier et Supprimer. Utilisez le bouton « Modifier » pour ajouter des rôles de signataire, modifier les champs et mettre à jour votre modèle. Les modifications s'appliqueront à tous les futurs documents créés à partir de ce modèle mais n'affecteront pas les documents existants. Utilisez le bouton Supprimer, vous pouvez supprimer le modèle ", - "signyour-self-1": "Sélectionnez et faites glisser vos widgets préférés sur le PDF pour personnaliser votre document avant de le signer. Choisissez les endroits parfaits pour chaque modification afin d'adapter le document à vos besoins.", + "bulksend": "Pour envoyer rapidement plusieurs documents en utilisant un modèle existant, saisissez simplement les adresses e-mail des destinataires et cliquez sur le bouton 'Envoi groupé'. Vous pouvez envoyer jusqu'à 50 destinataires.", + "option": "Ce menu affiche plus d'options comme Modifier, Supprimer, Renommer, Dupliquer, Partager, etc. <1>Cliquez ici pour en savoir plus sur toutes les options disponibles. <3>Remarque : Les modifications apportées à un modèle existant s'appliqueront à tous les futurs documents créés à partir de ce modèle, mais n'affecteront pas les documents déjà envoyés.", + "signyour-self-1": "Sélectionnez ou faites glisser vos widgets préférés sur le PDF pour personnaliser votre document avant de le signer. Choisissez les emplacements parfaits pour chaque widget afin d'adapter le document à vos besoins.", "signyour-self-2": "Faites glisser et déposer n'importe où dans cette zone. Vous pourrez la redimensionner et la déplacer plus tard.", "template-placeholder-1": "Cliquer sur le bouton 'Ajouter un rôle' vous permettra d'ajouter différents rôles de signataire. Vous pourrez attacher des utilisateurs à chaque rôle dans les étapes suivantes.", - "template-placeholder-2": "Une fois les rôles ajoutés, sélectionnez un rôle dans la liste pour ajouter un espace réservé à l'endroit où il est censé signer. L'espace réservé apparaîtra dans la même couleur que le nom du rôle une fois que vous l'aurez déposé sur le document.", - "template-placeholder-3": "Faites glisser ou cliquez sur un champ pour l'ajouter au document.", - "template-placeholder-4": "Faites glisser l'espace réservé pour un rôle n'importe où sur le document. N'oubliez pas qu'il apparaîtra dans la même couleur que le nom du destinataire pour une référence facile.", - "template-placeholder-5": "Cliquer sur 'Suivant' stockera le modèle actuel. Après l'enregistrement, vous serez invité à créer un nouveau document à partir de ce modèle si vous le souhaitez.", + "template-placeholder-2": "Après avoir ajouté des rôles, choisissez-en un dans la liste pour placer un widget pour ce destinataire. Vous pouvez cliquer sur le widget ou le faire glisser sur le document. Une fois placé, le widget s'affichera dans la même couleur que le rôle sélectionné.", + "template-placeholder-3": "Cliquer sur 'Suivant' stockera le modèle actuel. Après l'enregistrement, vous serez invité à créer un nouveau document à partir de ce modèle si vous le souhaitez.", "webhook-1": "Mettez à niveau maintenant pour définir le webhook", "Need your Signature": "En cliquant sur cette carte, vous accéderez à la liste des documents en attente de révision.", "Out for signatures": "En cliquant sur cette carte, vous accéderez à une liste de documents en attente de signature.", "Recent signature requests": "Voici une liste de documents qui attendent votre signature.", "Recently sent for signatures": "Il s'agit d'une liste de documents que vous avez envoyés à d'autres parties pour signature.", - "Drafts": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.", + "Drafts": "Ce sont des documents que vous avez commencés mais que vous n'avez pas finalisés pour l'envoi.", "public-template": "Cette vidéo montre comment configurer votre profil public personnalisé, tel que 'https://opensign.me/your-username'. Vous apprendrez également comment personnaliser votre slogan et rendre vos modèles disponibles pour la signature publique.", "allowModify-widgets": "Vous pouvez faire glisser et déposer n'importe lequel de ces champs sur le document, en plus des champs déjà désignés pour vous par le créateur du document." }, @@ -1000,7 +1010,7 @@ "finish-mssg": "Êtes-vous sûr de vouloir terminer le document ?", "review": "Revoir", "next-field": "Champ suivant", - "required-mssg":"{{leftRequiredWidget}} champs sur {{totalWidget}} restants", + "required-mssg": "{{leftRequiredWidget}} champs sur {{totalWidget}} restants", "verify-document": "Vérifier le document", "verify-document-signature": "Vérifier la signature du document", "select-pdf-document": "Sélectionner le document PDF", @@ -1044,7 +1054,7 @@ "not-calculated": "Non calculé", "not-found-in-signature": "Introuvable dans la signature", "readonly-error": "Le widget en lecture seule {{widgetName}} doit avoir une valeur par défaut ou vous pouvez le rendre facultatif.", - "choose-one":"Choisissez-en un", + "choose-one": "Choisissez-en un", "search-templates": "Rechercher des modèles…", "search-documents": "Rechercher des documents…", "search-contacts": "Rechercher des contacts…", @@ -1131,6 +1141,7 @@ "show-more": "Afficher plus", "browse-or-drag-to-replace-existing-file": "Parcourez ou faites glisser un nouveau fichier pour remplacer l'existant", "optional-details": "Détails facultatifs", + "hide-optional-details": "masquer les détails facultatifs", "mail-adapter-subscription-alert": "Veuillez passer au plan Professionnel ou Équipe pour configurer un SMTP personnalisé.", "connect-to-mail": "Se connecter à Gmail", "custom-smtp": "SMTP personnalisé", @@ -1141,5 +1152,63 @@ "username": "Nom d'utilisateur", "use-default-mail-adapter": "Voulez-vous vraiment utiliser les serveurs de messagerie par défaut de {{appName}} pour envoyer vos demandes de signature ? Nous vous recommandons d'utiliser votre propre serveur Gmail ou SMTP pour une meilleure délivrabilité.", "verification-code-sent-registered-email": "Un code de vérification a été envoyé à votre email enregistré <1>{{useremail}}. Veuillez entrer le code ci-dessous pour confirmer vos paramètres.", - "smpt-credentials": "Identifiants SMTP" + "smpt-credentials": "Identifiants SMTP", + "delete-account": "Supprimer le compte", + "delete-account-que": "Êtes-vous sûr de vouloir supprimer votre compte ?", + "delete-account-que-user": "Vous êtes sur le point de supprimer définitivement cet utilisateur et toutes les données associées. Cette action est irréversible.", + "user-deleted-successfully": "L'utilisateur et toutes les données associées ont été supprimés avec succès.", + "account-deletion-request-sent-via-mail": "Nous vous avons envoyé par e-mail un lien de confirmation. Approuvez la demande pour finaliser la suppression de votre compte.", + "type-exact-email-delete": "Saisissez l'adresse e-mail exacte pour activer la suppression", + "email-does-not-match": "L'adresse e-mail ne correspond pas.", + "please-type-to-confirm": "Veuillez saisir <1>{{userEmail}} pour confirmer:", + "email-settings": "Paramètres de messagerie", + "email-settings-help": "Pour assurer une meilleure délivrabilité dans la boîte de réception de vos e-mails de demande de signature, vous pouvez connecter votre propre fournisseur de messagerie. Choisissez l’une des options suivantes :", + "connect-to-gmail": "Se connecter à Gmail: ", + "connect-to-gmail-help": "Utilisez votre compte Gmail pour envoyer des e-mails de demande de signature directement depuis votre propre boîte de réception, améliorant ainsi les taux de délivrabilité et la fiabilité.", + "connect-to-smtp": "SMTP personnalisé: ", + "connect-to-smtp-help": "Utilisez votre propre serveur SMTP pour envoyer des e-mails via votre domaine. Cette option vous donne un contrôle total sur votre infrastructure de messagerie, améliorant la délivrabilité et la cohérence de la marque.", + "connect-to-default": "Si vous le souhaitez, vous pouvez également utiliser les serveurs de messagerie par défaut de {{appName}}, bien que nous recommandions d’utiliser les vôtres pour des résultats optimaux.", + "email-settings-redirect-message": "Ce paramètre a été déplacé de la console vers Paramètres du menu principal → Préférences. Cette page sera supprimée dans les prochaines versions.", + "go-to-preferences-menu": "Aller au menu Préférences", + "document-download-filename-format": "Format du nom de fichier pour le téléchargement du document", + "preview": "Aperçu : ", + "download-filename-format-help": "Choisissez comment les fichiers PDF téléchargés sont nommés. Votre sélection est enregistrée dans votre profil et utilisée dans toute l'application.", + "delete-action-prohibited": "Cette action n'est pas autorisée. Veuillez contacter votre administrateur pour demander la suppression du compte.", + "not-verified": "Non vérifié", + "verified": "Vérifié", + "expires": "Expire", + "fix-resend-error": "Vous ne pouvez pas corriger et renvoyer ce document car il contient des widgets préremplis.", + "duplicate-template-error": "Vous ne pouvez pas dupliquer ce modèle car il contient des widgets préremplis.", + "save-as-template-error": "Ce document ne peut pas être enregistré comme modèle car il contient des widgets préremplis.", + "redirecting-you-in": "Redirection dans {{redirectTimeLeft}} s...", + "pdf-tools-tour": "Cliquez sur ces boutons pour ajouter, supprimer, réorganiser, faire pivoter et zoomer les pages.", + "widgets": "Widgets", + "prefill-tour": "Utilisez cette option pour saisir des informations à l'avance avant d'envoyer le document aux destinataires.", + "empty-prefill-error": "Les champs obligatoires suivants ne peuvent pas être laissés vides :", + "please-fill-out": "Veuillez les remplir pour continuer.", + "custom-signing-certificate": "Certificat de signature personnalisé", + "signing-certificate-help": "Vous pouvez télécharger votre propre certificat de signature de documents, qui sera utilisé pour signer tous vos documents ainsi que les certificats d’achèvement. Le fichier du certificat doit être un certificat P12 au format PFX.", + "certificate-file-p12-in-PFX-format": "Fichier de certificat (certificat p12 au format PFX)", + "password-of-pfx-file": "Entrez le mot de passe du fichier pfx", + "update": "Mettre à jour", + "use-default-certificate": "Utiliser le certificat par défaut de {{appName}}", + "upgrade-to-team-plan": "Passer au plan Équipe", + "setup-file-storage": "Configurer le stockage de fichiers", + "save-and-activate": "Enregistrer et activer", + "logging-out-to-apply-settings": "Vous êtes déconnecté pour appliquer les nouveaux paramètres", + "reconnect-to-default": "Se reconnecter à {{appName}}", + "active-file-adapter": "Adaptateur de fichiers actif", + "file-adapter-unique-name": "Nom unique de l'adaptateur de fichiers", + "unique-name-for-file-adapter": "Entrez un nom unique pour l'adaptateur de fichiers", + "storage-provider": "Fournisseur de stockage", + "enter-bucket-name": "Entrez le nom du bucket", + "enter-space-name": "Entrez le nom de l'espace", + "enter-region-of-bucket": "Entrez la région du bucket", + "enter-region-of-space": "Entrez la région de l'espace", + "enter-access-key": "Entrez la clé d'accès", + "enter-secret-access-key": "Entrez la clé d'accès secrète", + "otp-email": "Nous avons envoyé un code de vérification", + "save-as-temp-warn": "Remarque : Ce document contient des widgets préremplis, qui seront automatiquement supprimés car ils sont déjà intégrés dans le document de base.", + "edit-document": "Modifier le document", + "otp-email": "Nous avons envoyé un code de vérification" } diff --git a/apps/OpenSign/public/locales/hi/translation.json b/apps/OpenSign/public/locales/hi/translation.json index e4930eaa6d..2094966ad5 100644 --- a/apps/OpenSign/public/locales/hi/translation.json +++ b/apps/OpenSign/public/locales/hi/translation.json @@ -189,7 +189,18 @@ "Logs": "लॉग", "Expiry-date": "समाप्ति तिथि", "Company": "कंपनी", - "JobTitle": "पद" + "JobTitle": "पद", + "Time to complete (Days)": "पूरा करने का समय (दिन)", + "Auto reminder": "स्वचालित अनुस्मारक", + "Remind once in every (Days)": "हर (दिन) में एक बार याद दिलाएं", + "Enable OTP verification": "OTP सत्यापन सक्षम करें", + "Enable Tour": "टूर सक्षम करें", + "Notify on signatures": "हस्ताक्षर पर सूचित करें", + "Allow modifications": "संशोधन की अनुमति दें", + "Redirect url": "रीडायरेक्ट URL", + "Created Date": "निर्माण तिथि", + "Updated Date": "अद्यतन तिथि", + "Expiry Date": "समाप्ति तिथि" }, "report-help": { "Draft Documents": "ये वे दस्तावेज़ हैं जिन्हें आपने शुरू तो किया है लेकिन भेजने के लिए अंतिम रूप नहीं दिया है।", @@ -477,7 +488,7 @@ "add-recipients": "प्राप्तकर्ता जोड़ें", "loading-mssg": "इसमें कुछ समय लग सकता है", "send-mail": "मेल भेजें", - "signature-field-widget": "प्रत्येक उपयोगकर्ता के लिए कम से कम एक हस्ताक्षर फ़ील्ड जोड़ा जाना चाहिए। आपने {{signersName}} के लिए हस्ताक्षर फ़ील्ड नहीं जोड़े हैं", + "signature-field-widget": "प्रत्येक उपयोगकर्ता के पास कम से कम एक हस्ताक्षर विजेट होना चाहिए। आपने {{signersName}} के लिए हस्ताक्षर विजेट नहीं जोड़ा है।", "placeholder-alert-1": "कृपया सुनिश्चित करें कि सभी प्राप्तकर्ताओं के लिए कम से कम एक हस्ताक्षर विजेट जोड़ा गया है।", "placeholder-alert-2": "कृपया पुष्टि करें कि आपने टेक्स्ट फ़ील्ड भर दिया है।", "placeholder-alert-3": " क्या आप वाकई इस दस्तावेज़ को हस्ताक्षर के लिए भेजना चाहते हैं?", @@ -612,7 +623,8 @@ "tour-mssg": { "home-layout-1": "आप सफलतापूर्वक लॉग इन हो गए हैं! आइए एक नज़र डालते हैं।", "home-layout-2": "स्व-हस्ताक्षर के लिए दस्तावेज़ अपलोड करने या दूसरों के हस्ताक्षर का अनुरोध करने के लिए, बस संबंधित बटन चुनें।", - "home-layout-3": "आप {{appName}} का उपयोग शुरू करने के लिए तैयार हैं! यदि आपको सहायता की आवश्यकता है तो हमसे संपर्क करने में संकोच न करें।", + "home-layout-3": "आप {{appName}} का उपयोग शुरू करने के लिए तैयार हैं!", + "home-layout-4": "हमें स्टार दें", "generate-token": "उत्पादन एपीआई टोकन उत्पन्न करने के लिए अभी अपग्रेड करें।", "opensign-drive-1": "फ़ोल्डर पदानुक्रम के माध्यम से आसानी से नेविगेट करने और प्रत्येक फ़ोल्डर के भीतर दस्तावेज़ देखने के लिए ब्रेडक्रंब लिंक पर क्लिक करें।", "opensign-drive-2": "नया फ़ोल्डर या दस्तावेज़ बनाने के लिए जोड़ें बटन पर क्लिक करें।", @@ -622,34 +634,32 @@ "opensign-drive-6": "डाउनलोड, नाम बदलें, स्थानांतरित करें और हटाएं जैसे विकल्प देखने के लिए किसी दस्तावेज़ पर राइट-क्लिक करें। इसे खोलने के लिए दस्तावेज़ पर क्लिक करें।", "opensign-drive-7": "विकल्प देखने के लिए किसी भी फ़ोल्डर पर राइट-क्लिक करें। फ़ोल्डर का नाम बदलने के लिए 'नाम बदलें' चुनें या इसकी सामग्री के माध्यम से नेविगेट करने के लिए फ़ोल्डर पर क्लिक करें।", "pdf-request-file-1": "उन हस्ताक्षरकर्ताओं की सूची जिन्हें अभी भी दस्तावेज़ पर हस्ताक्षर करने की आवश्यकता है।", - "pdf-request-file-2": "हस्ताक्षर करने के लिए दस्तावेज़ पर दिखाई देने वाले किसी भी प्लेसहोल्डर पर क्लिक करें। फिर आपको अपना हस्ताक्षर खींचने, टाइप करने या एक छवि अपलोड करने के विकल्प दिखाई देंगे।", - "pdf-request-file-3": "अपने दस्तावेज़ को नेविगेट करने के लिए अस्वीकार करें, या समाप्त करें बटन पर क्लिक करें। डाउनलोड बटन सहित अतिरिक्त विकल्पों के लिए दीर्घवृत्त मेनू का उपयोग करें।", + "pdf-request-file-2": "शुरू करने के लिए दस्तावेज़ में दिखाई देने वाले किसी भी फ़ील्ड पर क्लिक करें। उसके बाद आप आवश्यक जानकारी भर सकेंगे।", + "pdf-request-file-3": "एक बार जब आप सभी आवश्यक फ़ील्ड भर लें, तो 'समाप्त करें' पर क्लिक करें। उसके बाद आप हस्ताक्षरित दस्तावेज़ डाउनलोड कर सकेंगे। प्रेषक की सेटिंग्स के आधार पर, जब सभी प्राप्तकर्ता हस्ताक्षर कर लेंगे, तो आपको पूर्ण दस्तावेज़ की एक प्रति और पूर्णता प्रमाणपत्र प्राप्त हो सकता है।", "pdf-request-file-4": "उन हस्ताक्षरकर्ताओं की सूची जिन्होंने पहले ही दस्तावेज़ पर हस्ताक्षर कर दिए हैं।", "pdf-request-file-5": "आप उन सभी स्थानों पर स्वचालित रूप से हस्ताक्षर करने के लिए 'सभी पर स्वतः हस्ताक्षर करें' पर क्लिक कर सकते हैं, जिन पर आपके द्वारा हस्ताक्षर किए जाने हैं। सुनिश्चित करें कि आप इस बटन पर क्लिक करने से पहले दस्तावेज़ की ठीक से समीक्षा कर लें।", "pdf-request-file-6": "कृपया पृष्ठ संख्या {{pagenumbers}} पर फ़ील्ड पूरी करें, सभी आसान पहचान के लिए एक ही रंग में हाइलाइट किए गए हैं।", - "placeholder-sign-1": "एक प्लेस-होल्डर जोड़ने के लिए इस सूची से एक प्राप्तकर्ता का चयन करें जहां उसे हस्ताक्षर करना है। प्लेसहोल्डर दस्तावेज़ पर छोड़ने के बाद प्राप्तकर्ता के नाम के समान रंग में दिखाई देगा।", + "placeholder-sign-1": "इस सूची से एक प्राप्तकर्ता चुनें ताकि विजेट जोड़ सकें। दस्तावेज़ पर रखने के बाद विजेट उसी रंग में दिखाई देगा जो प्राप्तकर्ता के नाम का है।", "placeholder-sign-2": "'प्राप्तकर्ता जोड़ें' बटन पर क्लिक करने से आप अधिक हस्ताक्षरकर्ताओं को जोड़ सकेंगे।", "placeholder-sign-3": "दस्तावेज़ में अधिक प्राप्तकर्ताओं/हस्ताक्षरकर्ताओं को जोड़ने के लिए इस बटन पर क्लिक करें।", - "placeholder-sign-4": "इसे दस्तावेज़ में जोड़ने के लिए किसी फ़ील्ड पर खींचें या क्लिक करें।", - "placeholder-sign-5": "पीडीएफ सामग्री क्षेत्र पहले से ही टेम्पलेट के मौजूदा प्लेसहोल्डर प्रदर्शित करता है। आपकी सुविधा के लिए, ये प्लेसहोल्डर प्राप्तकर्ता के नाम के रंग से मेल खाएंगे, जिससे उन्हें आसानी से पहचाना जा सकेगा।", + "placeholder-sign-4": "दस्तावेज़ में जोड़ने के लिए विजेट को खींचें या उस पर क्लिक करें।", + "placeholder-sign-5": "PDF सामग्री क्षेत्र पहले से ही टेम्पलेट के मौजूदा विजेट दिखाता है। आपकी सुविधा के लिए, ये विजेट प्राप्तकर्ता के नाम के रंग से मेल खाएँगे ताकि वे आसानी से पहचाने जा सकें।", "placeholder-sign-6": "'अगला' पर क्लिक करने से दस्तावेज़ सहेजा जाएगा। अगले चरण में आप प्राप्तकर्ताओं को भेजे जाने वाले ईमेल को अनुकूलित कर सकते हैं या हस्ताक्षर लिंक कॉपी कर सकते हैं और उन्हें स्वयं प्राप्तकर्ताओं के साथ साझा कर सकते हैं।", "report-1": "नया टेम्पलेट बनाने के लिए 'जोड़ें' बटन पर क्लिक करें। टेम्पलेट पुन: प्रयोज्य दस्तावेज़ हैं जिन्हें समान संरचना और अलग-अलग हस्ताक्षरकर्ताओं के साथ नए दस्तावेज़ों को शीघ्रता से उत्पन्न करने के लिए डिज़ाइन किया गया है। उदाहरण के लिए, ऑनबोर्डिंग के लिए एक मानव संसाधन टेम्पलेट में 'मानव संसाधन प्रबंधक' और 'नया कर्मचारी' जैसी पूर्वनिर्धारित भूमिकाएँ हो सकती हैं। हर बार जब आप टेम्पलेट का उपयोग करते हैं, तो आप विभिन्न आने वाले कर्मचारियों को 'नया कर्मचारी' भूमिका सौंप सकते हैं, जबकि 'मानव संसाधन प्रबंधक' भूमिका स्थिर रहती है, जिससे प्रत्येक भर्ती के लिए एक सहज ऑनबोर्डिंग प्रक्रिया सुविधाजनक होती है। ", "redirect": "किसी मौजूदा टेम्पलेट से नया दस्तावेज़ बनाने के लिए 'उपयोग करें' बटन पर क्लिक करें।", - "bulksend": "केवल प्राप्तकर्ता ईमेल पते बनाकर किसी मौजूदा टेम्पलेट का उपयोग करके कई दस्तावेज़ों को शीघ्रता से भेजने के लिए, 'थोक भेजें' बटन पर क्लिक करें।", - "option": "यह मेनू संपादन और हटाएं जैसे अधिक विकल्प प्रकट करता है। हस्ताक्षरकर्ता भूमिकाएं जोड़ने, फ़ील्ड संशोधित करने और अपने टेम्पलेट को अपडेट करने के लिए 'संपादित करें' बटन का उपयोग करें। परिवर्तन इस टेम्पलेट से बनाए गए सभी भविष्य के दस्तावेज़ों पर लागू होंगे लेकिन मौजूदा दस्तावेज़ों को प्रभावित नहीं करेंगे। हटाएं बटन का उपयोग करके आप टेम्पलेट हटा सकते हैं। ", - "signyour-self-1": "हस्ताक्षर करने से पहले अपने दस्तावेज़ को अनुकूलित करने के लिए अपने पसंदीदा विजेट चुनें और उन्हें पीडीएफ पर खींचें। अपनी आवश्यकताओं के अनुसार दस्तावेज़ को अनुकूलित करने के लिए प्रत्येक संशोधन के लिए सही स्थान चुनें।", + "bulksend": "किसी मौजूदा टेम्पलेट का उपयोग करके कई दस्तावेज़ जल्दी भेजने के लिए, केवल प्राप्तकर्ताओं के ईमेल पते दर्ज करें और 'बल्क सेंड' बटन पर क्लिक करें। आप अधिकतम 50 प्राप्तकर्ताओं को भेज सकते हैं।", + "option": "इस मेनू में और विकल्प दिखाई देंगे जैसे संपादित करें, हटाएं, नाम बदलें, डुप्लिकेट करें, साझा करें आदि। <1>यहां क्लिक करें सभी उपलब्ध विकल्पों के बारे में और पढ़ने के लिए। <3>नोट: किसी मौजूदा टेम्पलेट में किए गए बदलाव उस टेम्पलेट से बनाए गए सभी भविष्य के दस्तावेज़ों पर लागू होंगे, लेकिन पहले से भेजे गए दस्तावेज़ों पर प्रभाव नहीं डालेंगे।", + "signyour-self-1": "हस्ताक्षर करने से पहले अपने दस्तावेज़ को अनुकूलित करने के लिए अपनी पसंद के विजेट चुनें या उन्हें PDF पर खींचें। अपनी आवश्यकता के अनुसार प्रत्येक विजेट को सही स्थान पर रखें।", "signyour-self-2": "इस क्षेत्र में कहीं भी खींचें और छोड़ें। आप इसे बाद में आकार बदल सकते हैं और स्थानांतरित कर सकते हैं।", "template-placeholder-1": "'भूमिका जोड़ें' बटन पर क्लिक करने से आप विभिन्न हस्ताक्षरकर्ता भूमिकाएँ जोड़ सकेंगे। आप बाद के चरणों में प्रत्येक भूमिका में उपयोगकर्ताओं को संलग्न कर सकते हैं।", - "template-placeholder-2": "भूमिकाएँ जोड़ने के बाद, सूची से एक भूमिका चुनें ताकि एक प्लेस-होल्डर जोड़ा जा सके जहाँ उसे हस्ताक्षर करना है। प्लेसहोल्डर दस्तावेज़ पर छोड़ने के बाद भूमिका के नाम के समान रंग में दिखाई देगा।", - "template-placeholder-3": "इसे दस्तावेज़ में जोड़ने के लिए किसी फ़ील्ड पर खींचें या क्लिक करें।", - "template-placeholder-4": "किसी भूमिका के लिए प्लेसहोल्डर को दस्तावेज़ पर कहीं भी खींचें। याद रखें, यह आसान संदर्भ के लिए प्राप्तकर्ता के नाम के समान रंग में दिखाई देगा।", - "template-placeholder-5": "'अगला' पर क्लिक करने से वर्तमान टेम्पलेट संग्रहीत हो जाएगा। सहेजने के बाद, यदि आप चाहें तो इस टेम्पलेट से एक नया दस्तावेज़ बनाने के लिए आपको संकेत दिया जाएगा।", + "template-placeholder-2": "भूमिकाएँ जोड़ने के बाद, सूची में से एक चुनें ताकि उस प्राप्तकर्ता के लिए विजेट रखा जा सके। आप विजेट पर क्लिक कर सकते हैं या उसे दस्तावेज़ पर खींच सकते हैं। एक बार रखे जाने के बाद, विजेट चयनित भूमिका के समान रंग में दिखाई देगा।", + "template-placeholder-3": "'अगला' पर क्लिक करने से वर्तमान टेम्पलेट संग्रहीत हो जाएगा। सहेजने के बाद, यदि आप चाहें तो इस टेम्पलेट से एक नया दस्तावेज़ बनाने के लिए आपको संकेत दिया जाएगा।", "webhook-1": "वेबहूक सेट करने के लिए अभी अपग्रेड करें", "Need your Signature": "इस कार्ड पर क्लिक करने से आप अपनी समीक्षा की प्रतीक्षा कर रहे दस्तावेज़ों की सूची पर पहुंच जाएंगे।", "Out for signatures": "इस कार्ड पर क्लिक करने से आप हस्ताक्षर की प्रतीक्षा कर रहे दस्तावेज़ों की सूची पर पहुंच जाएंगे।", "Recent signature requests": "यह उन दस्तावेज़ों की सूची है जो आपके हस्ताक्षर की प्रतीक्षा कर रहे हैं।", "Recently sent for signatures": "यह उन दस्तावेज़ों की सूची है जिन्हें आपने हस्ताक्षर के लिए अन्य पक्षों को भेजा है।", - "Drafts": "ये वे दस्तावेज़ हैं जिन्हें आपने शुरू तो किया है लेकिन भेजने के लिए अंतिम रूप नहीं दिया है।", + "Drafts": "ये वे दस्तावेज़ हैं जिन्हें आपने शुरू किया है लेकिन भेजने के लिए अंतिम रूप नहीं दिया है।", "public-template": "यह वीडियो दर्शाता है कि आप अपना व्यक्तिगत सार्वजनिक प्रोफ़ाइल कैसे सेट अप कर सकते हैं, जैसे 'https://opensign.me/your-username'। आप यह भी सीखेंगे कि अपनी टैगलाइन को कैसे अनुकूलित करें और अपने टेम्पलेट्स को सार्वजनिक हस्ताक्षर के लिए उपलब्ध कराएं।", "allowModify-widgets": "आप इन फ़ील्ड में से किसी को भी दस्तावेज़ पर खींच और छोड़ सकते हैं, इसके अतिरिक्त दस्तावेज़ निर्माता द्वारा आपके लिए पहले से निर्दिष्ट फ़ील्ड के। " }, @@ -1044,12 +1054,12 @@ "not-calculated": "गणना नहीं की गई", "not-found-in-signature": "हस्ताक्षर में नहीं मिला", "readonly-error": "रीड-ओनली {{widgetName}} विजेट में एक डिफ़ॉल्ट मान होना चाहिए या आप इसे वैकल्पिक बना सकते हैं।", - "choose-one":"एक का चयन", + "choose-one": "एक का चयन", "search-templates": "टेम्पलेट खोजें…", "search-documents": "दस्तावेज़ खोजें…", "search-contacts": "संपर्क खोजें…", "add-role-alert": "कृपया कम से कम एक भूमिका जोड़ें", - "edit-draft": "ड्राफ्ट संपादित करें", + "edit-draft": "ड्राफ्ट संपादित करें", "invalid-email-found": "अमान्य ईमेल पाया गया: {{email}}", "duplicate-email-found": "डुप्लिकेट ईमेल पाया गया: {{email}}", "vertical": "वर्टिकल", @@ -1131,6 +1141,7 @@ "show-more": "और दिखाएं", "browse-or-drag-to-replace-existing-file": "नई फ़ाइल ब्राउज़ करें या खींचकर छोड़ें ताकि मौजूदा फ़ाइल को बदला जा सके", "optional-details": "वैकल्पिक विवरण", + "hide-optional-details": "वैकल्पिक विवरण छिपाएं", "mail-adapter-subscription-alert": "कस्टम SMTP सेटअप करने के लिए कृपया प्रोफेशनल या टीम प्लान में अपग्रेड करें।", "connect-to-mail": "Gmail से कनेक्ट करें", "custom-smtp": "कस्टम SMTP", @@ -1141,5 +1152,63 @@ "username": "यूज़रनेम", "use-default-mail-adapter": "क्या आप वाकई {{appName}} के डिफ़ॉल्ट मेल सर्वर का उपयोग करके सिग्नेचर अनुरोध भेजना चाहते हैं? बेहतर इनबॉक्स डिलीवरी के लिए हम अपने Gmail या SMTP सर्वर का उपयोग करने की सिफारिश करते हैं।", "verification-code-sent-registered-email": "आपके पंजीकृत ईमेल <1>{{useremail}} पर एक सत्यापन कोड भेजा गया है। कृपया अपनी सेटिंग की पुष्टि के लिए नीचे कोड दर्ज करें।", - "smpt-credentials": "SMTP क्रेडेंशियल्स" + "smpt-credentials": "SMTP क्रेडेंशियल्स", + "delete-account": "खाता हटाएं", + "delete-account-que": "क्या आप वाकई अपना खाता हटाना चाहते हैं?", + "delete-account-que-user": "आप इस उपयोगकर्ता और सभी संबंधित डेटा को स्थायी रूप से हटाने वाले हैं। इस क्रिया को पूर्ववत नहीं किया जा सकता।", + "user-deleted-successfully": "उपयोगकर्ता और सभी संबंधित डेटा सफलतापूर्वक हटाए गए।", + "account-deletion-request-sent-via-mail": "हमने आपको एक पुष्टि लिंक ईमेल किया है। अपने खाते को हटाने की प्रक्रिया पूरी करने के लिए अनुरोध को स्वीकृत करें।", + "type-exact-email-delete": "हटाने को सक्षम करने के लिए सटीक ईमेल टाइप करें", + "email-does-not-match": "ईमेल मेल नहीं खाता।", + "please-type-to-confirm": "कृपया पुष्टि करने के लिए <1>{{userEmail}} टाइप करें:", + "email-settings": "ईमेल सेटिंग्स", + "email-settings-help": "अपने हस्ताक्षर अनुरोध ईमेल की बेहतर इनबॉक्स डिलीवरी सुनिश्चित करने के लिए, आप अपने स्वयं के ईमेल प्रदाता को कनेक्ट कर सकते हैं। निम्न विकल्पों में से एक चुनें:", + "connect-to-gmail": "Gmail से कनेक्ट करें: ", + "connect-to-gmail-help": "अपने Gmail खाते का उपयोग करके हस्ताक्षर अनुरोध ईमेल सीधे अपने इनबॉक्स से भेजें, जिससे डिलीवरी दर और विश्वसनीयता में सुधार होगा।", + "connect-to-smtp": "कस्टम SMTP: ", + "connect-to-smtp-help": "अपने डोमेन के माध्यम से ईमेल भेजने के लिए अपने कस्टम SMTP सर्वर का उपयोग करें। यह विकल्प आपको अपने ईमेल इंफ्रास्ट्रक्चर पर पूरा नियंत्रण देता है, जिससे डिलीवरी और ब्रांड की निरंतरता में सुधार होता है।", + "connect-to-default": "यदि आप चाहें, तो आप {{appName}} के डिफ़ॉल्ट मेल सर्वर का भी उपयोग कर सकते हैं, हालांकि सर्वोत्तम परिणामों के लिए हम अपने सर्वर का उपयोग करने की सलाह देते हैं।", + "email-settings-redirect-message": "यह सेटिंग कंसोल से मुख्य मेनू सेटिंग्स → प्रेफ़रेंस में स्थानांतरित कर दी गई है। यह पेज आने वाले संस्करणों में हटा दिया जाएगा।", + "go-to-preferences-menu": "प्रेफ़रेंस मेनू पर जाएं", + "document-download-filename-format": "दस्तावेज़ डाउनलोड फ़ाइलनाम प्रारूप", + "preview": "पूर्वावलोकन: ", + "download-filename-format-help": "डाउनलोड की गई PDF फ़ाइलों का नाम कैसे रखा जाए, चुनें। आपका चयन आपके प्रोफ़ाइल में सहेजा जाएगा और पूरे ऐप में उपयोग किया जाएगा।", + "delete-action-prohibited": "यह कार्रवाई अनुमत नहीं है। कृपया अपना खाता हटाने के लिए अपने व्यवस्थापक से संपर्क करें।", + "not-verified": "सत्यापित नहीं", + "verified": "सत्यापित", + "expires": "समाप्ति", + "fix-resend-error": "आप इस दस्तावेज़ को ठीक करके पुनः नहीं भेज सकते क्योंकि इसमें प्रीफ़िल विजेट्स हैं।", + "duplicate-template-error": "आप इस टेम्पलेट को डुप्लिकेट नहीं कर सकते क्योंकि इसमें प्रीफ़िल विजेट्स हैं।", + "save-as-template-error": "इस दस्तावेज़ को टेम्पलेट के रूप में सहेजा नहीं जा सकता क्योंकि इसमें प्रीफ़िल विजेट्स हैं।", + "redirecting-you-in": "{{redirectTimeLeft}} सेकंड में आपको रीडायरेक्ट किया जा रहा है...", + "pdf-tools-tour": "पृष्ठ जोड़ने, हटाने, पुनः व्यवस्थित करने, घुमाने और ज़ूम करने के लिए इन बटनों पर क्लिक करें।", + "widgets": "विजेट्स", + "prefill-tour": "दस्तावेज़ को प्राप्तकर्ताओं को भेजने से पहले अग्रिम रूप से जानकारी दर्ज करने के लिए इस विकल्प का उपयोग करें।", + "empty-prefill-error": "निम्न आवश्यक फ़ील्ड खाली नहीं छोड़े जा सकते:", + "please-fill-out": "कृपया आगे बढ़ने के लिए इन्हें भरें।", + "custom-signing-certificate": "कस्टम साइनिंग प्रमाणपत्र", + "signing-certificate-help": "आप अपना स्वयं का दस्तावेज़ हस्ताक्षर प्रमाणपत्र अपलोड कर सकते हैं, जिसका उपयोग आपके सभी दस्तावेज़ों और पूर्णता प्रमाणपत्रों पर हस्ताक्षर करने के लिए किया जाएगा। प्रमाणपत्र फ़ाइल PFX फॉर्मेट में P12 प्रमाणपत्र होनी चाहिए।", + "certificate-file-p12-in-PFX-format": "प्रमाणपत्र फ़ाइल (PFX फॉर्मेट में p12 प्रमाणपत्र)", + "password-of-pfx-file": "pfx फ़ाइल का पासवर्ड दर्ज करें", + "update": "अपडेट करें", + "use-default-certificate": "डिफ़ॉल्ट {{appName}} प्रमाणपत्र का उपयोग करें", + "upgrade-to-team-plan": "टीम प्लान में अपग्रेड करें", + "setup-file-storage": "फ़ाइल स्टोरेज सेटअप करें", + "save-and-activate": "सहेजें और सक्रिय करें", + "logging-out-to-apply-settings": "नई सेटिंग लागू करने के लिए आपको लॉग आउट किया जा रहा है", + "reconnect-to-default": "{{appName}} से फिर से कनेक्ट करें", + "active-file-adapter": "सक्रिय फ़ाइल एडेप्टर", + "file-adapter-unique-name": "फ़ाइल एडेप्टर का यूनिक नाम", + "unique-name-for-file-adapter": "फ़ाइल एडेप्टर के लिए यूनिक नाम दर्ज करें", + "storage-provider": "स्टोरेज प्रदाता", + "enter-bucket-name": "बकेट का नाम दर्ज करें", + "enter-space-name": "स्पेस का नाम दर्ज करें", + "enter-region-of-bucket": "बकेट का क्षेत्र दर्ज करें", + "enter-region-of-space": "स्पेस का क्षेत्र दर्ज करें", + "enter-access-key": "एक्सेस की दर्ज करें", + "enter-secret-access-key": "सीक्रेट एक्सेस की दर्ज करें", + "otp-email": "हमने एक सत्यापन कोड भेजा है", + "save-as-temp-warn": "नोट: इस दस्तावेज़ में पहले से भरे हुए विजेट शामिल हैं, जिन्हें स्वचालित रूप से हटा दिया जाएगा क्योंकि वे पहले से ही मूल दस्तावेज़ में सम्मिलित हैं।", + "edit-document": "दस्तावेज़ संपादित करें", + "otp-email": "हमने एक सत्यापन कोड भेजा है" } diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index 5f24e52ae4..5b96a88522 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -1,7 +1,7 @@ { "header-news": "Nuova funzionalità: Gli utenti del piano Teams possono ora integrare i propri bucket AWS S3 per l'archiviazione dei file", "header-news-btn": "Configura Ora", - "sandbox-news": "Questo è un ambiente sandbox. Si prega di non utilizzarlo per scopi di produzione.", + "sandbox-news": "Questo è un ambiente sandbox. Si prega di non utilizzarlo per scopi di produzione.", "create-account": "Crea Account", "login": "Accedi", "language": "Lingua", @@ -189,7 +189,18 @@ "Logs": "Log", "Expiry-date": "Data di scadenza", "Company": "Azienda", - "JobTitle": "Titolo professionale" + "JobTitle": "Titolo professionale", + "Time to complete (Days)": "Tempo per completare (giorni)", + "Auto reminder": "Promemoria automatico", + "Remind once in every (Days)": "Ricorda una volta ogni (giorni)", + "Enable OTP verification": "Abilita verifica OTP", + "Enable Tour": "Abilita tour", + "Notify on signatures": "Notifica sulle firme", + "Allow modifications": "Consenti modifiche", + "Redirect url": "URL di reindirizzamento", + "Created Date": "Data di creazione", + "Updated Date": "Data di aggiornamento", + "Expiry Date": "Data di scadenza" }, "report-help": { "Draft Documents": "Questi sono documenti che hai iniziato ma non hai ancora finalizzato per l'invio.", @@ -287,7 +298,7 @@ "deactivate": "disattiva", "this-user": "questo utente", "delete-user": "Elimina utente", - "delete": "elimina", + "delete": "Elimina", "add-user": "Aggiungi utente", "password-generateed": "La password verrà generata solo una volta; assicurati di copiarla.", "Team status": "Stato del Team", @@ -412,7 +423,7 @@ "upload": "Caricamento", "initial-teb": "Iniziali", "signature-tab": "Firma", - "your-signature": "La tua firma", + "initial-alert": "La mia iniziale non trovata", "copy-title": "Copia widget in", "contact-delete-alert": "Sei sicuro di voler eliminare questo contatto?", "reset-password-alert-1": "Il link per reimpostare la password è stato inviato al tuo indirizzo email", @@ -477,7 +488,7 @@ "add-recipients": "Aggiungi destinatari", "loading-mssg": "Questo potrebbe richiedere del tempo", "send-mail": "Invia Mail", - "signature-field-widget":"È necessario aggiungere almeno un campo firma per ogni utente. Non hai aggiunto campi firma per {{signersName}}", + "signature-field-widget": "Ogni utente deve avere almeno un widget di firma. Non hai aggiunto un widget di firma per {{signersName}}.", "placeholder-alert-1": "Assicurati che sia stato aggiunto almeno un widget per la firma per tutti i destinatari.", "placeholder-alert-2": "Conferma di aver compilato il campo di testo.", "placeholder-alert-3": "Sei sicuro di voler inviare questo documento per le firme?", @@ -612,7 +623,8 @@ "tour-mssg": { "home-layout-1": "Accesso effettuato con successo! Diamo un'occhiata.", "home-layout-2": "Per caricare documenti da firmare personalmente o richiedere le firme di altri, seleziona semplicemente i pulsanti corrispondenti.", - "home-layout-3": "Sei pronto per iniziare a usare {{appName}}! Se hai bisogno di supporto, contattaci pure.", + "home-layout-3": "Sei pronto per iniziare a usare {{appName}}!", + "home-layout-4": "Dacci una stella su", "generate-token": "Esegui l'upgrade ora per generare un token API di produzione.", "opensign-drive-1": "Fai clic sui collegamenti breadcrumb per navigare facilmente attraverso la gerarchia delle cartelle e visualizzare i documenti in ciascuna cartella.", "opensign-drive-2": "Fai clic sul pulsante aggiungi per creare una nuova cartella o documento.", @@ -622,34 +634,32 @@ "opensign-drive-6": "Fai clic con il tasto destro su un documento per vedere opzioni come Scarica, Rinomina, Sposta e Elimina. Fai clic sul documento per aprirlo.", "opensign-drive-7": "Fai clic con il tasto destro su qualsiasi cartella per vedere le opzioni. Scegli 'Rinomina' per cambiare il nome della cartella o fai clic sulla cartella per navigare nei suoi contenuti.", "pdf-request-file-1": "Elenco dei firmatari che devono ancora firmare il documento.", - "pdf-request-file-2": "Fai clic su uno dei segnaposto che appaiono sul documento per firmare. Vedrai poi le opzioni per disegnare la tua firma, digitarla o caricare un'immagine.", - "pdf-request-file-3": "Clicca sui pulsanti Rifiuta o Fine per navigare nel tuo documento. Usa il menu con i puntini di sospensione per opzioni aggiuntive, incluso il pulsante Scarica.", + "pdf-request-file-2": "Fai clic su uno qualsiasi dei campi presenti nel documento per iniziare. Potrai quindi compilare le informazioni richieste.", + "pdf-request-file-3": "Dopo aver compilato tutti i campi richiesti, fai clic su 'Fine'. Potrai quindi scaricare il documento firmato. A seconda delle impostazioni del mittente, potresti ricevere una copia del documento completato insieme al certificato di completamento una volta che tutti i destinatari avranno firmato.", "pdf-request-file-4": "Elenco dei firmatari che hanno già firmato il documento.", "pdf-request-file-5": "Puoi fare clic su 'Firma Tutto Automaticamente' per firmare automaticamente in tutte le posizioni previste per te. Assicurati di esaminare attentamente il documento prima di fare clic su questo pulsante.", "pdf-request-file-6": "Si prega di completare i campi alla pagina {{pagenumbers}}, tutti evidenziati con lo stesso colore per una facile identificazione.", - "placeholder-sign-1": "Seleziona un destinatario da questo elenco per aggiungere un segnaposto dove deve firmare. Il segnaposto apparirà dello stesso colore del nome del destinatario una volta posizionato sul documento.", + "placeholder-sign-1": "Seleziona un destinatario da questo elenco per aggiungere un widget. Il widget apparirà con lo stesso colore del nome del destinatario una volta posizionato sul documento.", "placeholder-sign-2": "Facendo clic sul pulsante 'Aggiungi destinatari' potrai aggiungere più firmatari.", "placeholder-sign-3": "Fai clic su questo pulsante per aggiungere altri destinatari/firmatari al documento.", - "placeholder-sign-4": "Trascina o fai clic su un campo per aggiungerlo al documento.", - "placeholder-sign-5": "L'area del contenuto PDF visualizza già i segnaposti esistenti del modello. Per tua comodità, questi segnaposti corrisponderanno al colore del nome del destinatario, rendendoli facilmente identificabili.", + "placeholder-sign-4": "Trascina o fai clic su un widget per aggiungerlo al documento.", + "placeholder-sign-5": "L'area di contenuto PDF mostra già i widget esistenti del modello. Per comodità, questi widget corrisponderanno al colore del nome del destinatario, rendendoli facilmente identificabili.", "placeholder-sign-6": "Facendo clic su 'Invia' il documento verrà salvato. Nel passaggio successivo potrai personalizzare le email da inviare ai destinatari o copiare i link di firma e condividerli direttamente con i destinatari.", "report-1": "Fai clic sul pulsante 'Aggiungi' per creare un nuovo modello. I modelli sono documenti riutilizzabili progettati per generare rapidamente nuovi documenti con la stessa struttura e firmatari diversi. Ad esempio, un modello HR per l'onboarding potrebbe avere ruoli predefinita come 'Responsabile HR' e 'Nuovo Dipendente'. Ogni volta che usi il modello, puoi assegnare il ruolo 'Nuovo Dipendente' a membri dello staff in arrivo, mentre il ruolo 'Responsabile HR' rimane costante, facilitando un processo di onboarding fluido per ogni nuovo assunto.", "redirect": "Fai clic sul pulsante 'Usa' per creare un nuovo documento da un modello esistente.", - "bulksend": "Per inviare rapidamente più documenti utilizzando un modello esistente creando semplicemente gli indirizzi e-mail dei destinatari, fai clic sul pulsante 'Invio Multiplo'.", - "option": "Questo menu rivela altre opzioni come Modifica ed Elimina. Usa il pulsante 'Modifica' per aggiungere ruoli di firmatari, modificare i campi e aggiornare il modello. Le modifiche si applicheranno a tutti i futuri documenti creati da questo modello ma non influiranno sui documenti esistenti. Usa il pulsante Elimina per eliminare il modello.", - "signyour-self-1": "Seleziona e trascina i widget preferiti sul PDF per personalizzare il documento prima di firmarlo. Scegli i punti perfetti per ogni modifica per adattare il documento alle tue esigenze.", + "bulksend": "Per inviare rapidamente più documenti utilizzando un modello esistente, basta inserire gli indirizzi e-mail dei destinatari e fare clic sul pulsante 'Invio massivo'. Puoi inviare fino a 50 destinatari.", + "option": "Questo menu mostra ulteriori opzioni come Modifica, Elimina, Rinomina, Duplica, Condividi, ecc. <1>Fai clic qui per saperne di più su tutte le opzioni disponibili. <3>Nota: Le modifiche a un modello esistente si applicheranno a tutti i futuri documenti creati da quel modello, ma non influenzeranno i documenti già inviati.", + "signyour-self-1": "Seleziona o trascina i widget preferiti sul PDF per personalizzare il tuo documento prima della firma. Scegli i punti perfetti per ciascun widget per adattare il documento alle tue esigenze.", "signyour-self-2": "Trascina e rilascia ovunque in quest'area. Puoi ridimensionarlo e spostarlo in seguito.", "template-placeholder-1": "Facendo clic sul pulsante 'Aggiungi ruolo' potrai aggiungere vari ruoli di firmatari. Puoi assegnare utenti a ciascun ruolo nei passaggi successivi.", - "template-placeholder-2": "Una volta aggiunti i ruoli, seleziona un ruolo dall'elenco per aggiungere un segnaposto dove deve firmare. Il segnaposto apparirà dello stesso colore del nome del ruolo una volta posizionato sul documento.", - "template-placeholder-3": "Trascina o fai clic su un campo per aggiungerlo al documento.", - "template-placeholder-4": "Trascina il segnaposto per un ruolo ovunque sul documento. Ricorda, apparirà dello stesso colore del nome del destinatario per un facile riferimento.", - "template-placeholder-5": "Facendo clic su 'Avanti' il modello corrente verrà memorizzato. Dopo averlo salvato, ti verrà chiesto di creare un nuovo documento da questo modello, se lo desideri.", + "template-placeholder-2": "Dopo aver aggiunto i ruoli, scegli uno dall'elenco per posizionare un widget per quel destinatario. Puoi fare clic sul widget o trascinarlo nel documento. Una volta posizionato, il widget verrà visualizzato nello stesso colore del ruolo selezionato.", + "template-placeholder-3": "Facendo clic su 'Avanti' il modello corrente verrà memorizzato. Dopo averlo salvato, ti verrà chiesto di creare un nuovo documento da questo modello, se lo desideri.", "webhook-1": "Esegui l'upgrade ora per configurare il webhook.", "Need your Signature": "Facendo clic su questa scheda, accederai all'elenco dei documenti in attesa della tua revisione.", "Out for signatures": "Facendo clic su questa scheda, accederai all'elenco dei documenti in attesa di firma.", "Recent signature requests": "Questo è un elenco di documenti che aspettano la tua firma.", "Recently sent for signatures": "Questo è un elenco di documenti che hai inviato ad altre parti per la firma.", - "Drafts": "Questi sono documenti che hai iniziato ma non hai finalizzato per l'invio.", + "Drafts": "Questi sono documenti che hai iniziato ma non hai ancora finalizzato per l'invio.", "public-template": "Questo video dimostra come configurare il tuo profilo pubblico personalizzato, come 'https://opensign.me/tuo-username'. Imparerai anche come personalizzare il tuo slogan e rendere i tuoi modelli disponibili per la firma pubblica.", "allowModify-widgets": "È possibile trascinare e rilasciare uno qualsiasi di questi campi nel documento, oltre ai campi già designati dal creatore del documento." }, @@ -744,7 +754,7 @@ "attach-signer-tour": "Devi allegare un firmatario a ogni ruolo. Puoi farlo cliccando su questa icona. Una volta selezionato un firmatario, sarà associato a tutti i campi associati a quel ruolo che appariranno dello stesso colore.", "allowed-signature-types": "Tipi di firma consentiti", "at-least-one-signature-type": "Almeno un tipo di firma deve essere abilitato.", - "expect-default-one-more-signature-type": "Abilita un tipo di firma aggiuntivo oltre al tipo predefinita.", + "expect-default-one-signature-type": "Abilita un tipo di firma aggiuntivo oltre al tipo predefinita.", "add-signer-note": "Nota - Questo contatto verrà aggiunto alla tua lista di contatti", "allowed-signature-types-help": { "p1": "Questa preferenza di firma controlla le opzioni di firma disponibili per i tuoi firmatari. Solo i tipi di firma che selezioni appariranno nel widget di firma quando un documento viene firmato. Ad esempio, se scegli solo l'opzione 'Disegna' nelle preferenze, il tuo firmatario vedrà solo l'opzione 'Disegna' nel widget di firma, mentre gli altri tre tipi non saranno disponibili.", @@ -910,7 +920,7 @@ "note-length-alert": "La nota può contenere al massimo 200 caratteri.", "description-length-alert": " La descrizione può contenere al massimo 500 caratteri.", "fix-&-resend-document": "Correggi e reinvia il documento", - "do-you-want-recreate-document?": "Questo creerà una bozza da questo documento con tutti i campi intatti. Sei sicuro di voler ricreare questo documento?", + "do-you-want-recreate-document?": "Questo creerà una bozza da questo documento con tutti i campi intatti. Sei sicuro di voler ricreare questo documento?", "start-editing": "Inizia a modificare", "unsaved-changes-discard-them?": "Hai modifiche non salvate. Vuoi scartarle?", "yes-discard": "Sì, scarta", @@ -1000,7 +1010,7 @@ "finish-mssg": "Sei sicuro di voler completare il documento?", "review": "Rivedere", "next-field": "Campo successivo", - "required-mssg":"{{leftRequiredWidget}} di {{totalWidget}} campi rimanenti", + "required-mssg": "{{leftRequiredWidget}} di {{totalWidget}} campi rimanenti", "verify-document": "Verifica documento", "verify-document-signature": "Verifica firma documento", "select-pdf-document": "Seleziona documento PDF", @@ -1044,7 +1054,7 @@ "not-calculated": "Non calcolato", "not-found-in-signature": "Non trovato nella firma", "readonly-error": "Il widget {{widgetName}} di sola lettura deve avere un valore predefinito oppure può essere reso facoltativo.", - "choose-one":"Scegline uno", + "choose-one": "Scegline uno", "search-templates": "Cerca modelli…", "search-documents": "Cerca documenti…", "search-contacts": "Cerca contatti…", @@ -1131,7 +1141,9 @@ "show-more": "Mostra di più", "browse-or-drag-to-replace-existing-file": "Sfoglia o trascina un nuovo file per sostituire quello esistente", "optional-details": "Dettagli facoltativi", - "mail-adapter-subscription-alert": "Esegui l'upgrade al piano Professional o Team per configurare un SMTP personalizzato.", "connect-to-mail": "Connetti a Gmail", + "hide-optional-details": "nascondi dettagli facoltativi", + "mail-adapter-subscription-alert": "Esegui l'upgrade al piano Professional o Team per configurare un SMTP personalizzato.", + "connect-to-mail": "Connetti a Gmail", "custom-smtp": "SMTP personalizzato", "default-smtp": "SMTP predefinito di {{appName}}", "host": "Host", @@ -1140,5 +1152,63 @@ "username": "Nome utente", "use-default-mail-adapter": "Sei sicuro di voler usare i server di posta predefiniti di {{appName}} per inviare le richieste di firma? Ti consigliamo di usare i tuoi server Gmail o SMTP per una migliore consegna in posta in arrivo.", "verification-code-sent-registered-email": "Un codice di verifica è stato inviato alla tua email registrata <1>{{useremail}}. Inserisci il codice qui sotto per confermare le impostazioni.", - "smpt-credentials": "Credenziali SMTP" + "smpt-credentials": "Credenziali SMTP", + "delete-account": "Elimina account", + "delete-account-que": "Sei sicuro di voler eliminare il tuo account?", + "delete-account-que-user": "Stai per eliminare in modo permanente questo utente e tutti i dati associati. Questa azione non può essere annullata.", + "user-deleted-successfully": "Utente e tutti i dati associati eliminati con successo.", + "account-deletion-request-sent-via-mail": "Le abbiamo inviato via e-mail un link di conferma. Approvi la richiesta per completare l'eliminazione del suo account.", + "type-exact-email-delete": "Digita l'e-mail esatta per abilitare l'eliminazione", + "email-does-not-match": "L'e-mail non corrisponde.", + "please-type-to-confirm": "Per favore, digita <1>{{userEmail}} per confermare:", + "email-settings": "Impostazioni e-mail", + "email-settings-help": "Per garantire una migliore consegna nella casella di posta in arrivo delle e-mail di richiesta firma, puoi collegare il tuo provider di posta elettronica. Scegli una delle seguenti opzioni:", + "connect-to-gmail": "Connetti a Gmail", + "connect-to-gmail-help": "Usa il tuo account Gmail per inviare e-mail di richiesta firma direttamente dalla tua casella di posta, migliorando il tasso di consegna e l'affidabilità.", + "connect-to-smtp": "SMTP personalizzato", + "connect-to-smtp-help": "Usa il tuo server SMTP personalizzato per inviare e-mail tramite il tuo dominio. Questa opzione ti offre il pieno controllo sulla tua infrastruttura e-mail, migliorando la consegna e la coerenza del marchio.", + "connect-to-default": "Se preferisci, puoi anche utilizzare i server di posta predefiniti di {{appName}}, anche se consigliamo di usare i tuoi per ottenere risultati ottimali.", + "email-settings-redirect-message": "Questa impostazione è stata spostata dalla console a Impostazioni del menu principale → Preferenze. Questa pagina verrà rimossa nelle prossime versioni.", + "go-to-preferences-menu": "Vai al menu Preferenze", + "document-download-filename-format": "Formato del nome file per il download del documento", + "preview": "Anteprima: ", + "download-filename-format-help": "Scegli come vengono nominati i PDF scaricati. La tua selezione viene salvata nel tuo profilo e utilizzata in tutta l'app.", + "delete-action-prohibited": "Questa azione non è consentita. Si prega di contattare l'amministratore per richiedere l'eliminazione dell'account.", + "not-verified": "Non verificato", + "verified": "Verificato", + "expires": "Scade", + "fix-resend-error": "Non è possibile correggere e reinviare questo documento perché contiene widget precompilati.", + "duplicate-template-error": "Non è possibile duplicare questo modello perché contiene widget precompilati.", + "save-as-template-error": "Questo documento non può essere salvato come modello perché contiene widget precompilati.", + "redirecting-you-in": "Reindirizzamento tra {{redirectTimeLeft}} sec...", + "pdf-tools-tour": "Fare clic su questi pulsanti per aggiungere, eliminare, riorganizzare, ruotare e ingrandire/ridurre le pagine.", + "widgets": "Widget", + "prefill-tour": "Usa questa opzione per inserire le informazioni in anticipo prima di inviare il documento ai destinatari.", + "empty-prefill-error": "I seguenti campi obbligatori non possono essere lasciati vuoti:", + "please-fill-out": "Si prega di compilarli per continuare.", + "custom-signing-certificate": "Certificato di firma personalizzato", + "signing-certificate-help": "Puoi caricare il tuo certificato di firma dei documenti, che verrà utilizzato per firmare tutti i tuoi documenti e i certificati di completamento. Il file del certificato deve essere un certificato P12 in formato PFX.", + "certificate-file-p12-in-PFX-format": "File di certificato (certificato p12 in formato PFX)", + "password-of-pfx-file": "Inserisci la password del file pfx", + "update": "Aggiorna", + "use-default-certificate": "Usa il certificato predefinito di {{appName}}", + "upgrade-to-team-plan": "Aggiorna al piano Team", + "setup-file-storage": "Configura archiviazione file", + "save-and-activate": "Salva e attiva", + "logging-out-to-apply-settings": "Stai effettuando il logout per applicare le nuove impostazioni", + "reconnect-to-default": "Riconnetti a {{appName}}", + "active-file-adapter": "File Adapter attivo", + "file-adapter-unique-name": "Nome univoco del File Adapter", + "unique-name-for-file-adapter": "Inserisci un nome univoco per il File Adapter", + "storage-provider": "Provider di archiviazione", + "enter-bucket-name": "Inserisci il nome del bucket", + "enter-space-name": "Inserisci il nome dello space", + "enter-region-of-bucket": "Inserisci la regione del bucket", + "enter-region-of-space": "Inserisci la regione dello space", + "enter-access-key": "Inserisci l'access key", + "enter-secret-access-key": "Inserisci la secret access key", + "otp-email": "Abbiamo inviato un codice di verifica", + "save-as-temp-warn": "Nota: Questo documento include widget precompilati, che verranno automaticamente rimossi poiché sono già incorporati nel documento di base.", + "edit-document": "Modifica documento", + "otp-email": "Abbiamo inviato un codice di verifica" } diff --git a/apps/OpenSign/public/logo192.png b/apps/OpenSign/public/logo192.png deleted file mode 100644 index ed55ce328aa7b39f60ab843e8725f2568f408e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2181 zcmc&!iC0r+7Qc_Mmyo!i1`#965L*-*F)WhsSgfEPKtx7m3=Far#6STB0uqFw${8iJ z3R4i-sv#{9F(_6HM1eLSl~fQk5Cdi37a>^Id9*X_nf?LJ`JMOu-u>Ra@4MfuUo5-qpp~6Jzn(qp6Oqo?T}(FhZg{4?05mbAw?3O?y{o2d`M>c;0FEV?M+* zo@eS76B;UWK61*qXtM-=>B7zYsEY%`c?n%)E6Vq@bze?+;P~~IH?r@Y@9!nDTH?*V z3O2*P{;ROPd2#Hdup`L3fw@Ab?zSVg;q*XLKkm-ycmSef2m#Qcsl9Q4;tJ^ig>@}` z2;ftd0I9n6Uuu9QQHBGe?a~oLkfQI^IS{V_S55zam=jFaXSHp${rvR9=0VRVJ_;ckRtQ{vo-5=x{E# z_$LWt-YuM68|K5_)+w8m9i23p-*bpfg`AARvr*xVw2u7F0omR##x1K^i=WW*#l@K? z=MO7n)!WNN%THw0pSLg1>|3;+g~!Z$wM_e}A3F|bamY9qORhYm30$Yf^PCog2c3S| z3_z|X9#==ir3pXt%k zV-0E>9sxjk42>*|4I~~`s{e;zu@>wk{w+&nydA8e+dnq0HGgGLnpXGB!`$oJ4Yb7C z_(VosK#Wo65`yZW+UUr^{Dl|U^pT91IR* zFMP27o!9l{;SBd0ekG-%+JkM)$nW`7o|RkM5-e%EwG|8?!t3TWc5CgZtW$Jtn_kY! z?E1Of*Z!g)mbcG?>Cl8v>ip@7Uv!`wz+(Kn<3P#XfCDIrP72=)-tAq2{FUs4wO^WJYH5CBvTM2z;vA2y>jqF}K4$IM$gHinvKse6y$|_~%Jino zRp?{2FDgGFs|i&@Ck=8I5a)GAFqFn_%0xCYd73q&F;pONbP9gkFvE^&Zf>oje5ex( z6$CK@7GVrm;#-%AyvvqI4{TXGNRv{a{s+2!$Tey*o60tGs}~LHFPjn%le19sr2Kq)UR_TZGKYfu-A5xaA(SXAN&dEgx=0DX_w)ufWG98NB;ya`#_VvWz`RS zWTh|ik)u@4Xm<6?S{fW9l2Fw%HtzwY@<8FPLwv*#9mC!IZ_dBJ^zCjukuspPUc1PW z5=0I=FA4nowsR6eiEM2Amnrw@=6EBRXbu}<0OtM=-0k$m*k(a54xS6#+-w}&Z%?gwraa zl+MTaiF%W7FS>Lzr|b+fZ$5SAT>HpdY&H$+<{d>2!3#@^v}|SXlK;}8O=Zs%wRddp z&NnZ$a%+6=5Az#mtWM@hXcYJD#%WzzHR;jXs@Z|;8HKVsyF*%tpiBA$E>gdGy-aJr zcOz6;7L+60;^(+EF}fw{nqxY)<`$mQ#0qXZXLDBvpc_qlv;#AT+6Ki`tPMEQNE&7q z9LvW&!&o<Z%;aHxB%tnc07Zo_@Gp zKeFPe@am07*23J4JM>TcM%@JwmNb?fmnt57!w;Xl@I$cW*oE;Do=v`kIyOptl{^+U z<^z-Bz1Ba)@l7M+7*4#qDQ<$L+zGvG9Zp*YW9~NVYem;Xd%7ycgnZZL-i%$^%-OV+ z0y~~V3?oH{Gg2=aeKX6qPkc0(-kaRhFUWmMdTwDZ|7bS}(i{CZ5W42DGG37y0!P{t zJOdncM>c@t=lP8|(AOMCKy%y0zYrjVT&V%%=yzY)K|%8ScTP@1_{F=5wtVMC#<~rz M2i%;?9sMr-8`Xk>+yDRo diff --git a/apps/OpenSign/public/logo512.png b/apps/OpenSign/public/logo512.png deleted file mode 100644 index bdfc6932514f36661b9d5a74dccac2587aafe89d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10982 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 diff --git a/apps/OpenSign/public/sample_contacts.csv b/apps/OpenSign/public/sample_contacts.csv index a4ffda392f..e22fc6c504 100644 --- a/apps/OpenSign/public/sample_contacts.csv +++ b/apps/OpenSign/public/sample_contacts.csv @@ -1,4 +1,4 @@ -Name,Email,Phone -John Doe,john@example.com,1234567890 -Jane Smith,jane@example.com,9876543210 -Foo Bar,foo@example.com,5555555555 +Name,Email,Phone,Company,JobTitle +John Doe,john@example.com,1234567890,abc firm,dev +Jane Smith,jane@example.com,9876543210,xyz firm,manager +Foo Bar,foo@example.com,5555555555,xyz firm,director diff --git a/apps/OpenSign/public/static/js/assets/images/logo-dark.png b/apps/OpenSign/public/static/js/assets/images/logo-dark.png index 33a512e4c207e0b51235c3139f19d44c1ef78291..7f64bc8aac782d087518aa1ae8062e88e54ff301 100644 GIT binary patch literal 20522 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 GvHt;H*ybz% literal 97499 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 diff --git a/apps/OpenSign/public/static/js/assets/images/logo.2a7bff0c1189183fafe71d7d5b94e0cd.png b/apps/OpenSign/public/static/js/assets/images/logo.2a7bff0c1189183fafe71d7d5b94e0cd.png deleted file mode 100644 index 8db5381242d1dafd321f1e8137d246b0b9d72cd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88554 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 literal 20 YcmezWuZ+QnK@W%xfutb=F9R0?06XdftpET3 diff --git a/apps/OpenSign/src/App.jsx b/apps/OpenSign/src/App.jsx index 342964fde2..435fc2a323 100644 --- a/apps/OpenSign/src/App.jsx +++ b/apps/OpenSign/src/App.jsx @@ -1,4 +1,5 @@ -import { useState, useEffect, lazy } from "react"; +import { useState, useEffect } from "react"; +import { lazyWithRetry, hideUpgradeProgress } from "./utils"; import { Routes, Route, BrowserRouter } from "react-router"; import { pdfjs } from "react-pdf"; import Form from "./pages/Form"; @@ -13,24 +14,28 @@ import SignYourSelf from "./pages/SignyourselfPdf"; import DraftDocument from "./components/pdf/DraftDocument"; import PlaceHolderSign from "./pages/PlaceHolderSign"; import PdfRequestFiles from "./pages/PdfRequestFiles"; -import LazyPage from "./primitives/LazyPage"; +import Lazy from "./primitives/LazyPage"; import Loader from "./primitives/Loader"; import UserList from "./pages/UserList"; import { serverUrl_fn } from "./constant/appinfo"; import DocSuccessPage from "./pages/DocSuccessPage"; import ValidateSession from "./primitives/ValidateSession"; -const DebugPdf = lazy(() => import("./pages/DebugPdf")); -const ForgetPassword = lazy(() => import("./pages/ForgetPassword")); -const GuestLogin = lazy(() => import("./pages/GuestLogin")); -const ChangePassword = lazy(() => import("./pages/ChangePassword")); -const UserProfile = lazy(() => import("./pages/UserProfile")); -const Opensigndrive = lazy(() => import("./pages/Opensigndrive")); -const ManageSign = lazy(() => import("./pages/Managesign")); -const AddAdmin = lazy(() => import("./pages/AddAdmin")); -const UpdateExistUserAdmin = lazy(() => import("./pages/UpdateExistUserAdmin")); -const Preferences = lazy(() => import("./pages/Preferences")); -const Login = lazy(() => import("./pages/Login")); -const VerifyDocument = lazy(() => import("./pages/VerifyDocument")); +import DragProvider from "./components/DragProivder"; +import Title from "./components/Title"; +const DebugPdf = lazyWithRetry(() => import("./pages/DebugPdf")); +const ForgetPassword = lazyWithRetry(() => import("./pages/ForgetPassword")); +const GuestLogin = lazyWithRetry(() => import("./pages/GuestLogin")); +const ChangePassword = lazyWithRetry(() => import("./pages/ChangePassword")); +const UserProfile = lazyWithRetry(() => import("./pages/UserProfile")); +const Opensigndrive = lazyWithRetry(() => import("./pages/Opensigndrive")); +const ManageSign = lazyWithRetry(() => import("./pages/Managesign")); +const AddAdmin = lazyWithRetry(() => import("./pages/AddAdmin")); +const UpdateExistUserAdmin = lazyWithRetry( + () => import("./pages/UpdateExistUserAdmin") +); +const Preferences = lazyWithRetry(() => import("./pages/Preferences")); +const Login = lazyWithRetry(() => import("./pages/Login")); +const VerifyDocument = lazyWithRetry(() => import("./pages/VerifyDocument")); pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.mjs`; const AppLoader = () => { return ( @@ -42,73 +47,46 @@ const AppLoader = () => { function App() { const [isloading, setIsLoading] = useState(true); useEffect(() => { - handleCredentials(); + // initialize creds + const id = process.env.REACT_APP_APPID ?? "opensign"; + localStorage.setItem("parseAppId", id); + localStorage.setItem("baseUrl", `${serverUrl_fn()}/`); + hideUpgradeProgress(); + localStorage.removeItem("showUpgradeProgress"); + setIsLoading(false); }, []); - const handleCredentials = () => { - const appId = process.env.REACT_APP_APPID - ? process.env.REACT_APP_APPID - : "opensign"; - const baseurl = serverUrl_fn(); - try { - localStorage.setItem("baseUrl", `${baseurl}/`); - localStorage.setItem("parseAppId", appId); - setIsLoading(false); - } catch (error) { - console.log("err ", error); - } - }; - return (
{isloading ? ( ) : ( + <Routes> <Route element={<ValidateRoute />}> - <Route exact path="/" element={<LazyPage Page={Login} />} /> - <Route - path="/addadmin" - element={<LazyPage Page={AddAdmin} />} - /> + <Route exact path="/" element={<Lazy Page={Login} />} /> + <Route path="/addadmin" element={<Lazy Page={AddAdmin} />} /> <Route path="/upgrade-2.1" - element={<LazyPage Page={UpdateExistUserAdmin} />} + element={<Lazy Page={UpdateExistUserAdmin} />} /> </Route> <Route element={<Validate />}> - <Route - path="/load/template/:templateId" - element={<TemplatePlaceholder />} - /> - <Route - exact - path="/load/placeholdersign/:docId" - element={<PlaceHolderSign />} - /> <Route exact path="/load/recipientSignPdf/:docId/:contactBookId" - element={<PdfRequestFiles />} + element={<DragProvider Page={PdfRequestFiles} />} /> </Route> - <Route - path="/loadmf/signmicroapp/login/:id/:userMail/:contactBookId/:serverUrl" - element={<LazyPage Page={GuestLogin} />} - /> - <Route - path="/login/:id/:userMail/:contactBookId/:serverUrl" - element={<LazyPage Page={GuestLogin} />} - /> <Route path="/login/:base64url" - element={<LazyPage Page={GuestLogin} />} + element={<Lazy Page={GuestLogin} />} /> - <Route path="/debugpdf" element={<LazyPage Page={DebugPdf} />} /> + <Route path="/debugpdf" element={<Lazy Page={DebugPdf} />} /> <Route path="/forgetpassword" - element={<LazyPage Page={ForgetPassword} />} + element={<Lazy Page={ForgetPassword} />} /> <Route element={ @@ -117,62 +95,52 @@ function App() { </ValidateSession> } > - <Route - path="/changepassword" - element={<LazyPage Page={ChangePassword} />} - /> + <Route path="/users" element={<UserList />} /> + <Route + path="/changepassword" + element={<Lazy Page={ChangePassword} />} + /> <Route path="/form/:id" element={<Form />} /> <Route path="/report/:id" element={<Report />} /> <Route path="/dashboard/:id" element={<Dashboard />} /> + <Route path="/profile" element={<Lazy Page={UserProfile} />} /> + <Route path="/drive" element={<Lazy Page={Opensigndrive} />} /> + <Route path="/managesign" element={<Lazy Page={ManageSign} />} /> <Route - path="/profile" - element={<LazyPage Page={UserProfile} />} - /> - <Route - path="/drive" - element={<LazyPage Page={Opensigndrive} />} + path="/template/:templateId" + element={<DragProvider Page={TemplatePlaceholder} />} /> + {/* signyouself route with no rowlevel data using docId from url */} <Route - path="/managesign" - element={<LazyPage Page={ManageSign} />} + path="/signaturePdf/:docId" + element={<DragProvider Page={SignYourSelf} />} /> + {/* draft document route to handle and navigate route page according to document status */} <Route - path="/template/:templateId" - element={<TemplatePlaceholder />} + path="/draftDocument" + element={<DragProvider Page={DraftDocument} />} /> - {/* signyouself route with no rowlevel data using docId from url */} - <Route path="/signaturePdf/:docId" element={<SignYourSelf />} /> - {/* draft document route to handle and navigate route page according to document status */} - <Route path="/draftDocument" element={<DraftDocument />} /> {/* recipient placeholder set route with no rowlevel data using docId from url*/} <Route path="/placeHolderSign/:docId" - element={<PlaceHolderSign />} - /> - {/* for user signature (need your sign route) with row level data */} - <Route path="/pdfRequestFiles" element={<PdfRequestFiles />} /> - {/* for user signature (need your sign route) with no row level data */} - <Route - path="/pdfRequestFiles/:docId" - element={<PdfRequestFiles />} + element={<DragProvider Page={PlaceHolderSign} />} /> {/* recipient signature route with no rowlevel data using docId from url */} <Route path="/recipientSignPdf/:docId/:contactBookId" - element={<PdfRequestFiles />} + element={<DragProvider Page={PdfRequestFiles} />} /> <Route path="/recipientSignPdf/:docId" - element={<PdfRequestFiles />} + element={<DragProvider Page={PdfRequestFiles} />} /> - <Route path="/users" element={<UserList />} /> <Route path="/verify-document" - element={<LazyPage Page={VerifyDocument} />} + element={<Lazy Page={VerifyDocument} />} /> <Route path="/preferences" - element={<LazyPage Page={Preferences} />} + element={<Lazy Page={Preferences} />} /> </Route> <Route path="/success" element={<DocSuccessPage />} /> diff --git a/apps/OpenSign/src/assets/images/dp.png b/apps/OpenSign/src/assets/images/dp.png index 203691f94150957d39844d678c46ce870a05dc58..b8c788a26eb12edeb8e6a4c3b99c9487f7ec9409 100644 GIT binary patch literal 4350 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 Y&i8)@A|47R{{sL}h^9)F(wmU~0d@U6!vFvP literal 13142 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 Mr6^e{Zs`C20Npv$K>z>% diff --git a/apps/OpenSign/src/assets/images/folder.png b/apps/OpenSign/src/assets/images/folder.png index 1520d8092f4cb8a54f2f2a3e54ddf2b8df01e2da..29865a258f7de5c1c9785cfaedda164871352f68 100644 GIT binary patch delta 179 zcmbQByn}y&3NK5#qpu?a!^VE@KZ&f9CvxctFt8<gySp&_2f+n<mrtIkD9*{Y%hSa% zq~g}w%_q1vv6ai)aasOVWh>QTU|>)!ag8WRNi0dVN-jzTQVd20My9$3=DJ2EAqEy! tM&?$grrHJuRt5&&eW&T8Xvob^$xN%nt)WdoZ!%B=gQu&X%Q~loCIIgoH1hxe delta 2719 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 Z-vB-eIsNAO)?)ww002ovPDHLkV1nBUD5C%X diff --git a/apps/OpenSign/src/assets/images/login_img.svg b/apps/OpenSign/src/assets/images/login_img.svg index a5b486ed90..4061942564 100644 --- a/apps/OpenSign/src/assets/images/login_img.svg +++ b/apps/OpenSign/src/assets/images/login_img.svg @@ -1,184 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="691.365" height="586.346" viewBox="0 0 691.365 586.346"> - <defs> - <linearGradient id="linear-gradient" x1="0.5" y1="1" x2="0.5" y2="-0.001" gradientUnits="objectBoundingBox"> - <stop offset="0" stop-color="gray" stop-opacity="0.251"/> - <stop offset="0.54" stop-color="gray" stop-opacity="0.122"/> - <stop offset="1" stop-color="gray" stop-opacity="0.102"/> - </linearGradient> - </defs> - <g id="Group_644" data-name="Group 644" transform="translate(-588.635 -80)"> - <g id="Group_642" data-name="Group 642" transform="translate(22538.635 6999)"> - <path id="Path_472" data-name="Path 472" d="M482.764,637.675c51.612-29.22,67.336-29.693,124.954-17.169,81.646,17.758,88.43-49.93,108.306-186.933,33.946-233.98-108.306-295.737-108.306-295.737s-94.6-8.1-150.536-38.963C377.726,55.027,286.9,49.443,207.046,86.542c-51.069,23.7-93.125,56.714-100.31,102.034-20.09,126.746,12.9,196.58-48.819,237.954S48.944,581.5,96.263,577.564c34.968-2.906,80.842,52.415,130.687,60.111,17.382,2.684,88.7-13.043,99.578,0C341.327,655.4,464.763,647.87,482.764,637.675Z" transform="translate(-21979.895 -6980.982)" fill="#00ddf1" opacity="0.1"/> - <g id="Group_641" data-name="Group 641" transform="translate(-21545.08 -6816.88)"> - <rect id="Rectangle_263" data-name="Rectangle 263" width="217.867" height="15.073" transform="translate(0 39.052)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_264" data-name="Rectangle 264" width="217.867" height="15.073" transform="translate(0 104.137)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_265" data-name="Rectangle 265" width="217.867" height="15.073" transform="translate(0 171.964)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_266" data-name="Rectangle 266" width="13.702" height="39.052" transform="translate(19.183)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_267" data-name="Rectangle 267" width="13.702" height="2.74" transform="translate(19.183 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_268" data-name="Rectangle 268" width="13.702" height="2.74" transform="translate(19.183 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_269" data-name="Rectangle 269" width="13.702" height="39.052" transform="translate(39.737)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_270" data-name="Rectangle 270" width="13.702" height="2.74" transform="translate(39.737 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_271" data-name="Rectangle 271" width="13.702" height="2.74" transform="translate(39.737 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_272" data-name="Rectangle 272" width="13.702" height="39.052" transform="translate(60.29)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_273" data-name="Rectangle 273" width="13.702" height="2.74" transform="translate(60.29 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_274" data-name="Rectangle 274" width="13.702" height="2.74" transform="translate(60.29 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_275" data-name="Rectangle 275" width="13.702" height="39.052" transform="translate(80.844)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_276" data-name="Rectangle 276" width="13.702" height="2.74" transform="translate(80.844 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_277" data-name="Rectangle 277" width="13.702" height="2.74" transform="translate(80.844 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_278" data-name="Rectangle 278" width="13.702" height="39.052" transform="translate(101.397)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_279" data-name="Rectangle 279" width="13.702" height="2.74" transform="translate(101.397 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_280" data-name="Rectangle 280" width="13.702" height="2.74" transform="translate(101.397 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_281" data-name="Rectangle 281" width="13.702" height="39.052" transform="translate(121.95)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_282" data-name="Rectangle 282" width="13.702" height="2.74" transform="translate(121.95 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_283" data-name="Rectangle 283" width="13.702" height="2.74" transform="translate(121.95 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_284" data-name="Rectangle 284" width="13.702" height="39.052" transform="translate(142.504)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_285" data-name="Rectangle 285" width="13.702" height="2.74" transform="translate(142.504 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_286" data-name="Rectangle 286" width="13.702" height="2.74" transform="translate(142.504 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_287" data-name="Rectangle 287" width="13.702" height="39.052" transform="matrix(0.894, -0.448, 0.448, 0.894, 135.847, 138.025)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_288" data-name="Rectangle 288" width="13.702" height="2.74" transform="matrix(0.894, -0.448, 0.448, 0.894, 138.614, 143.541)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_289" data-name="Rectangle 289" width="13.702" height="2.74" transform="matrix(0.894, -0.448, 0.448, 0.894, 148.128, 162.529)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_290" data-name="Rectangle 290" width="13.702" height="39.052" transform="translate(19.183 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_291" data-name="Rectangle 291" width="13.702" height="2.74" transform="translate(19.183 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_292" data-name="Rectangle 292" width="13.702" height="2.74" transform="translate(19.183 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_293" data-name="Rectangle 293" width="13.702" height="39.052" transform="translate(39.737 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_294" data-name="Rectangle 294" width="13.702" height="2.74" transform="translate(39.737 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_295" data-name="Rectangle 295" width="13.702" height="2.74" transform="translate(39.737 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_296" data-name="Rectangle 296" width="13.702" height="39.052" transform="translate(60.29 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_297" data-name="Rectangle 297" width="13.702" height="2.74" transform="translate(60.29 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_298" data-name="Rectangle 298" width="13.702" height="2.74" transform="translate(60.29 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_299" data-name="Rectangle 299" width="13.702" height="39.052" transform="translate(145.93 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_300" data-name="Rectangle 300" width="13.702" height="2.74" transform="translate(145.93 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_301" data-name="Rectangle 301" width="13.702" height="2.74" transform="translate(145.93 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_302" data-name="Rectangle 302" width="13.702" height="39.052" transform="translate(166.483 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_303" data-name="Rectangle 303" width="13.702" height="2.74" transform="translate(166.483 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_304" data-name="Rectangle 304" width="13.702" height="2.74" transform="translate(166.483 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_305" data-name="Rectangle 305" width="13.702" height="39.052" transform="translate(187.036 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_306" data-name="Rectangle 306" width="13.702" height="2.74" transform="translate(187.036 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_307" data-name="Rectangle 307" width="13.702" height="2.74" transform="translate(187.036 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_308" data-name="Rectangle 308" width="13.702" height="39.052" transform="translate(19.183 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_309" data-name="Rectangle 309" width="13.702" height="2.74" transform="translate(19.183 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_310" data-name="Rectangle 310" width="13.702" height="2.74" transform="translate(19.183 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_311" data-name="Rectangle 311" width="13.702" height="39.052" transform="translate(39.737 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_312" data-name="Rectangle 312" width="13.702" height="2.74" transform="translate(39.737 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_313" data-name="Rectangle 313" width="13.702" height="2.74" transform="translate(39.737 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_314" data-name="Rectangle 314" width="13.702" height="39.052" transform="translate(60.29 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_315" data-name="Rectangle 315" width="13.702" height="2.74" transform="translate(60.29 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_316" data-name="Rectangle 316" width="13.702" height="2.74" transform="translate(60.29 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_317" data-name="Rectangle 317" width="13.702" height="39.052" transform="translate(80.844 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_318" data-name="Rectangle 318" width="13.702" height="2.74" transform="translate(80.844 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_319" data-name="Rectangle 319" width="13.702" height="2.74" transform="translate(80.844 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_320" data-name="Rectangle 320" width="13.702" height="39.052" transform="translate(101.397 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_321" data-name="Rectangle 321" width="13.702" height="2.74" transform="translate(101.397 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_322" data-name="Rectangle 322" width="13.702" height="2.74" transform="translate(101.397 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_323" data-name="Rectangle 323" width="13.702" height="39.052" transform="translate(121.95 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_324" data-name="Rectangle 324" width="13.702" height="2.74" transform="translate(121.95 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_325" data-name="Rectangle 325" width="13.702" height="2.74" transform="translate(121.95 160.317)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_473" data-name="Path 473" d="M797.862,159.09v35.571h-13.7V156.48Q791.039,157.693,797.862,159.09Z" transform="translate(-621.103 -155.61)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_326" data-name="Rectangle 326" width="13.702" height="2.74" transform="translate(163.057 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_327" data-name="Rectangle 327" width="13.702" height="2.74" transform="translate(163.057 27.405)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_474" data-name="Path 474" d="M827.862,165.719v30.83h-13.7V162.43c1.781.391,3.556.8,5.33,1.22Q823.7,164.636,827.862,165.719Z" transform="translate(-630.549 -157.483)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_475" data-name="Path 475" d="M827.862,166.285v.685h-13.7v-2.74h5.33Q823.7,165.2,827.862,166.285Z" transform="translate(-630.549 -158.05)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_328" data-name="Rectangle 328" width="13.702" height="2.74" transform="translate(183.611 27.405)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_476" data-name="Path 476" d="M691.358,287.276s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.4,9.4,0,0,0,9.146,5.179c4.35-.233,5.8-3.549,6.166-6.639a6.851,6.851,0,0,0-9.057-7.3Z" transform="translate(-589.693 -196.649)" fill="#00ddf1"/> - <path id="Path_477" data-name="Path 477" d="M686.2,296.239a6.68,6.68,0,0,1-.089-6.426c2-3.659,6.166-2.254,6.166-2.254l.212-.075a6.762,6.762,0,0,1,4.885.11,6.762,6.762,0,0,0-5.762-.548l-.212.075s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.982,9.982,0,0,0,4.7,4.446A10.277,10.277,0,0,1,686.2,296.239Z" transform="translate(-589.706 -196.595)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_478" data-name="Path 478" d="M691.42,290.06s1.542,1.213,5.282,0" transform="translate(-591.9 -197.672)" fill="#00ddf1" opacity="0.2"/> - <path id="Path_479" data-name="Path 479" d="M690.93,277.21s2.638,7.153,2.418,9.023l2.09-.219s-3.521-6.269-2.638-8.8Z" transform="translate(-591.746 -193.626)" fill="#00ddf1"/> - <path id="Path_480" data-name="Path 480" d="M690.93,277.21s2.638,7.153,2.418,9.023l2.09-.219s-3.521-6.269-2.638-8.8Z" transform="translate(-591.746 -193.626)" fill="#00ddf1" opacity="0.2"/> - <path id="Path_481" data-name="Path 481" d="M702.92,277.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S701.536,284.391,702.92,277.6Z" transform="translate(-592.952 -193.414)" fill="#00ddf1"/> - <path id="Path_482" data-name="Path 482" d="M702.92,277.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S701.536,284.391,702.92,277.6Z" transform="translate(-592.952 -193.414)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_483" data-name="Path 483" d="M694.75,283.958s1.089-5.207,8.16-5.878" transform="translate(-592.949 -193.9)" fill="#00ddf1"/> - <path id="Path_484" data-name="Path 484" d="M819.358,386.276s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.4,9.4,0,0,0,9.146,5.18c4.35-.233,5.8-3.549,6.166-6.639a6.851,6.851,0,0,0-9.057-7.3Z" transform="translate(-629.999 -227.823)" fill="#00ddf1"/> - <path id="Path_485" data-name="Path 485" d="M814.2,395.239a6.68,6.68,0,0,1-.089-6.426c2-3.659,6.166-2.254,6.166-2.254l.212-.075a6.762,6.762,0,0,1,4.885.11,6.762,6.762,0,0,0-5.762-.548l-.212.075s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.982,9.982,0,0,0,4.7,4.446A10.276,10.276,0,0,1,814.2,395.239Z" transform="translate(-630.011 -227.769)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_486" data-name="Path 486" d="M819.42,389.06s1.542,1.213,5.282,0" transform="translate(-632.206 -228.846)" fill="#00ddf1" opacity="0.2"/> - <path id="Path_487" data-name="Path 487" d="M818.93,376.21s2.638,7.153,2.419,9.023l2.09-.219s-3.522-6.269-2.638-8.8Z" transform="translate(-632.051 -224.799)" fill="#00ddf1"/> - <path id="Path_488" data-name="Path 488" d="M818.93,376.21s2.638,7.153,2.419,9.023l2.09-.219s-3.522-6.269-2.638-8.8Z" transform="translate(-632.051 -224.799)" fill="#00ddf1" opacity="0.2"/> - <path id="Path_489" data-name="Path 489" d="M830.92,376.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S829.536,383.391,830.92,376.6Z" transform="translate(-633.257 -224.588)" fill="#00ddf1"/> - <path id="Path_490" data-name="Path 490" d="M830.92,376.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S829.536,383.391,830.92,376.6Z" transform="translate(-633.257 -224.588)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_491" data-name="Path 491" d="M822.75,382.958s1.089-5.207,8.16-5.878" transform="translate(-633.254 -225.073)" fill="#00ddf1"/> - </g> - </g> - <g id="Group_643" data-name="Group 643" transform="translate(7 -63)"> - <g id="Group_639" data-name="Group 639" transform="translate(21233 8372)"> - <ellipse id="Ellipse_73" data-name="Ellipse 73" cx="49.851" cy="8.007" rx="49.851" ry="8.007" transform="translate(-20118.443 -7772.555)" fill="#00abf6" opacity="0.1"/> - <rect id="Rectangle_182" data-name="Rectangle 182" width="3.208" height="72.224" transform="translate(-20070.199 -7917.934)" fill="#535461"/> - <path id="Path_268" data-name="Path 268" d="M1025.906,587.251l-.2,3.254-.287,4.6-.118,1.913-.281,4.6-.123,1.913-.286,4.6-3.233,52.22a8.851,8.851,0,0,1-8.83,8.268H995.731a8.841,8.841,0,0,1-8.82-8.3l-3.244-52.225-.281-4.6-.117-1.913-.292-4.6-.117-1.913-.281-4.6-.2-3.254a4.6,4.6,0,0,1,4.574-4.865h34.391a4.6,4.6,0,0,1,4.569,4.9Z" transform="translate(-21072.734 -8433.181)" fill="#565661"/> - <path id="Path_269" data-name="Path 269" d="M990.949,517.36l-.287,4.589H948.106l-.286-4.589Z" transform="translate(-21037.977 -8360.036)" fill="#9d9cb5"/> - <path id="Path_270" data-name="Path 270" d="M990.93,530.08l-.281,4.594H948.9l-.286-4.594Z" transform="translate(-21038.363 -8366.248)" fill="#9d9cb5"/> - <path id="Path_271" data-name="Path 271" d="M990.912,542.8l-.287,4.589H949.686L949.4,542.8Z" transform="translate(-21038.748 -8372.46)" fill="#9d9cb5"/> - <path id="Path_272" data-name="Path 272" d="M933.875,490.464c18.684,13.517,26.466,34.656,26.466,34.656s-22.511-.773-41.2-14.289-26.46-34.651-26.46-34.651S915.2,476.953,933.875,490.464Z" transform="translate(-21028.934 -8381.328)" fill="#00abf6"/> - <path id="Path_273" data-name="Path 273" d="M892.68,476.18s23.365,12.969,30.865,23.708,36.8,25.233,36.8,25.233" transform="translate(-21028.934 -8381.328)" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2"/> - <path id="Path_274" data-name="Path 274" d="M975.393,443.457c10.171,7.352,14.407,18.863,14.407,18.863s-12.279-.425-22.424-7.776S953,435.68,953,435.68,965.227,436.1,975.393,443.457Z" transform="translate(-21058.393 -8361.549)" fill="#00abf6"/> - <path id="Path_275" data-name="Path 275" d="M953,435.68s12.719,7.06,16.8,12.9,20.03,13.737,20.03,13.737" transform="translate(-21058.393 -8361.549)" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2"/> - <path id="Path_276" data-name="Path 276" d="M1040.3,470.483c-11.68,12.836-14.151,29.612-14.151,29.612s16.469-4.042,28.139-16.883,14.151-29.612,14.151-29.612S1051.981,457.647,1040.3,470.483Z" transform="translate(-21094.119 -8370.301)" fill="#00abf6"/> - <path id="Path_277" data-name="Path 277" d="M1068.45,453.61s-15.215,13.159-19.083,22.224S1026.15,500.1,1026.15,500.1" transform="translate(-21094.119 -8370.306)" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2"/> - </g> - <g id="Group_638" data-name="Group 638" transform="translate(-40 36)"> - <rect id="Rectangle_254" data-name="Rectangle 254" width="12.343" height="37.459" transform="translate(741.459 392.675)" fill="#3f3d56"/> - <rect id="Rectangle_255" data-name="Rectangle 255" width="12.343" height="39.629" transform="translate(1073.647 390.726)" fill="#3f3d56"/> - <path id="Path_418" data-name="Path 418" d="M597.889,523.665v8.446l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643L264.408,535.2h-.1l-29.007.273-.312.007L106.1,536.658v-9.745l30.306-18.19,60.808-.507,1.3-.007.429-.007,1.3-.019,29.2-.24,1.306-.007.416-.007,1.3-.006,9.362-.078.247-.006,23.1-.195h.188l180.214-1.52,4.411-.032h.442l3.365-.033,24.459-.2,1.3-.02,1.2-.013h.624l7.607-.058,1.507-.02,2.02-.013,6.334-.058,10.05-.084,1.3-.013,2.261-.013h.422l48.536-.416Z" transform="translate(566.82 43)" fill="#65617d"/> - <path id="Path_419" data-name="Path 419" d="M597.889,523.665v8.446l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643L264.408,535.2h-.1l-29.007.273-.312.007L106.1,536.658v-9.745l30.306-18.19,60.808-.507,1.3-.007.429-.007,1.3-.019,29.2-.24,1.306-.007.416-.007,1.3-.006,9.362-.078.247-.006,23.1-.195h.188l180.214-1.52,4.411-.032h.442l3.365-.033,24.459-.2,1.3-.02,1.2-.013h.624l7.607-.058,1.507-.02,2.02-.013,6.334-.058,10.05-.084,1.3-.013,2.261-.013h.422l48.536-.416Z" transform="translate(566.82 43)" opacity="0.2"/> - <path id="Path_420" data-name="Path 420" d="M358.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" transform="translate(437.441 -122.381)" fill="#3f3d56"/> - <path id="Path_421" data-name="Path 421" d="M358.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" transform="translate(437.441 -122.381)" opacity="0.1"/> - <path id="Path_422" data-name="Path 422" d="M360.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" transform="translate(436.74 -122.381)" fill="#3f3d56"/> - <rect id="Rectangle_256" data-name="Rectangle 256" width="30.644" height="20.464" transform="translate(1046.362 534.189)" fill="#3f3d56"/> - <rect id="Rectangle_257" data-name="Rectangle 257" width="30.644" height="20.464" transform="translate(1046.362 534.189)" opacity="0.1"/> - <rect id="Rectangle_258" data-name="Rectangle 258" width="30.644" height="20.464" transform="translate(1045.062 534.189)" fill="#3f3d56"/> - <path id="Path_423" data-name="Path 423" d="M223.943,265.82v3.723l-12.343-.318v-3.4Z" transform="translate(529.859 126.848)" opacity="0.1"/> - <path id="Path_424" data-name="Path 424" d="M358.741,271.246,343.909,377.789a2.794,2.794,0,0,1-2.839,2.41L222.314,377.12l-2.254-.058a2.794,2.794,0,0,1-2.7-3.164l16.651-111.533a2.794,2.794,0,0,1,2.949-2.358l119.186,8.069a2.787,2.787,0,0,1,2.6,3.17Z" transform="translate(476.307 16.556)" fill="#65617d"/> - <path id="Path_425" data-name="Path 425" d="M169.158,99.16,156.6,197.472l109.142,3.463,13.422-94.85Z" transform="translate(549.128 185.237)" fill="#00ddf1"/> - <rect id="Rectangle_259" data-name="Rectangle 259" width="132.965" height="112.605" rx="5.33" transform="translate(853.849 282.877)" fill="#65617d"/> - <rect id="Rectangle_260" data-name="Rectangle 260" width="120.836" height="93.765" transform="translate(860.125 290.458)" fill="#00ddf1"/> - <path id="Path_426" data-name="Path 426" d="M735.273,262.82v2.462l-12.343.253V262.82Z" transform="translate(350.717 127.899)" opacity="0.1"/> - <path id="Path_427" data-name="Path 427" d="M833.626,371a2,2,0,0,1-1.949,2.131l-121.615,2.514a2,2,0,0,1-2.033-1.813L697.575,265.156a2,2,0,0,1,1.9-2.189l120.693-6,1.3-.065a1.994,1.994,0,0,1,2.092,1.819Z" transform="translate(308.06 17.643)" fill="#65617d"/> - <path id="Path_428" data-name="Path 428" d="M628.93,100.238,739.157,94.82l9.31,98.748-109.356,2.6Z" transform="translate(383.65 186.757)" fill="#00ddf1"/> - <path id="Path_429" data-name="Path 429" d="M899.741,371a2,2,0,0,1-1.949,2.131L886.28,256.963l1.3-.065a2,2,0,0,1,2.092,1.819Z" transform="translate(241.945 17.643)" opacity="0.1"/> - <rect id="Rectangle_261" data-name="Rectangle 261" width="12.343" height="11.096" transform="translate(741.459 419.038)" opacity="0.1"/> - <path id="Path_431" data-name="Path 431" d="M281.574,483.65v3.229l-30.644.819V483.65Z" transform="translate(516.08 50.533)" opacity="0.1"/> - <path id="Path_432" data-name="Path 432" d="M390.8,483.886V593.158a2.6,2.6,0,0,1-2.5,2.566l-124.506,3.313h-.033a2.6,2.6,0,0,1-2.566-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H388.23A2.6,2.6,0,0,1,390.8,483.886Z" transform="translate(460.942 -60.983)" fill="#65617d"/> - <path id="Path_434" data-name="Path 434" d="M194.6,319.15H309.914v96.311L194.6,418.06Z" transform="translate(535.815 108.164)" fill="#d4dfec"/> - <rect id="Rectangle_262" data-name="Rectangle 262" width="12.343" height="11.317" transform="translate(1073.647 419.038)" opacity="0.1"/> - <path id="Path_435" data-name="Path 435" d="M709.574,483.65v4.164L678.93,487V483.65Z" transform="translate(366.132 50.533)" opacity="0.1"/> - <path id="Path_436" data-name="Path 436" d="M797.782,483.886V596.471a2.6,2.6,0,0,1-2.6,2.566h0l-124.532-3.313a2.6,2.6,0,0,1-2.5-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H795.19a2.6,2.6,0,0,1,2.592,2.566Z" transform="translate(318.365 -60.983)" fill="#65617d"/> - <path id="Path_437" data-name="Path 437" d="M866.289,483.886V596.471a2.6,2.6,0,0,1-2.6,2.566h0V481.32h0a2.6,2.6,0,0,1,2.6,2.566Z" transform="translate(249.859 -60.983)" opacity="0.1"/> - <path id="Path_438" data-name="Path 438" d="M713.414,319.15H598.1v96.311l115.314,2.6Z" transform="translate(394.451 108.164)" fill="#d4dfec"/> - <path id="Path_439" data-name="Path 439" d="M593.3,483.886V593.158a2.6,2.6,0,0,1-2.5,2.566l-124.506,3.313h0a2.6,2.6,0,0,1-2.6-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H590.73A2.6,2.6,0,0,1,593.3,483.886Z" transform="translate(389.997 -60.983)" fill="#65617d"/> - <path id="Path_440" data-name="Path 440" d="M397.1,319.15H512.414v96.311L397.1,418.06Z" transform="translate(464.87 108.164)" fill="#d4dfec"/> - <path id="Path_441" data-name="Path 441" d="M597.889,533.65V542.1l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643-114.086,1.059h-.1l-29.007.273-.312.007L106.1,546.643V536.9l131.562-.864h.312l26.629-.182h.123l183.9-1.215h.188l.11-.006h.305l3.112-.019h.948l48.393-.325,2.858-.013.637-.007Z" transform="translate(566.82 33.015)" opacity="0.1"/> - <circle id="Ellipse_99" data-name="Ellipse 99" cx="33.347" cy="33.347" r="33.347" transform="translate(887.196 363.44)" fill="#fbbebe"/> - <path id="Path_442" data-name="Path 442" d="M383.74,592.973a.806.806,0,0,1,.065-.227c.65-2.332,1.806-6.276,2.67-9.427.11-.39.214-.773.312-1.137.955-3.554,2.813-11.876,3.846-17.066.364-1.826.65-3.248.708-3.963.13-1.1,2.085-5.795,4.3-11.194,1.553-3.794,3.248-7.939,4.489-11.434a39.876,39.876,0,0,0,1.9-6.4,3.313,3.313,0,0,0,0-1.384,9.543,9.543,0,0,1-.312-2.274h0c-.149-4.028,1.052-10.394,2.91-13.065,2.274-3.248,3.9-15.371,3.9-15.371s3.365.487,3.9-2.293a4,4,0,0,0,.065-.91,4.815,4.815,0,0,0-.058-.721c-.578-4.054,9.563-8.368,15.267-9.3a12.769,12.769,0,0,1,1.949-.182,17.694,17.694,0,0,0,4.06-.935q.909-.279,1.949-.65c2.391-.806,5.249-1.871,8.283-3.04,11.408-4.424,25.22-10.394,25.22-10.394.1-.461.208-.9.331-1.338a18,18,0,0,1,10.622-12.3h0v-1.3c0-2.241-.1-4.548-.195-6.847,0-.448-.039-.9-.065-1.345v-.734c0-.455-.046-.91-.071-1.358l-.117-.091a10.66,10.66,0,0,1-2.534-2.729,9.916,9.916,0,0,1-.923-1.949c-.812-2.2-1-4.658-1.546-6.984l-.117-.481a54.579,54.579,0,0,0-2.6-6.873c-1.436-3.521-2.54-7.146-3.638-10.817q-1-3.333-2.02-6.678l-1.026-3.4c-.195-.65-.39-1.3-.539-1.949h0a8.627,8.627,0,0,1-.169-.91h0a6.5,6.5,0,0,1,.156-2.995,20.854,20.854,0,0,1,.858-1.949,5.113,5.113,0,0,0,.325-.9h0a1.947,1.947,0,0,0,.052-.208,3.667,3.667,0,0,0,.071-.7,11.993,11.993,0,0,0-.338-2.527.045.045,0,0,1,0-.032,1.661,1.661,0,0,0-.032-.175,16.564,16.564,0,0,1-.234-1.949,18.483,18.483,0,0,1,2.254-10.115l.123-.234a16.383,16.383,0,0,1,1.2-1.806h0a9.122,9.122,0,0,1,.65-.793,2.594,2.594,0,0,1-3.606-.936,2.475,2.475,0,0,1-.149-.292c-.033-.078-.059-.162-.085-.247-.455-1.592.338-3.287,1.377-4.58a12.012,12.012,0,0,1,3.729-3.053h0a2.51,2.51,0,0,1,.26-.136,11.125,11.125,0,0,1,1.715-.689h0a9.781,9.781,0,0,1,1.059-.286l-2.41-.221-.974-.091A9.414,9.414,0,0,1,479,361.527h.7a7.625,7.625,0,0,1,1.02.084A2.885,2.885,0,0,1,479,358.8a9.362,9.362,0,0,0,5.97,1.988h.247a19.494,19.494,0,0,1-.221-2.124h0a21.545,21.545,0,0,1,0-2.9,5.483,5.483,0,0,0,4.4,1.468l-1.351-1.884a6.165,6.165,0,0,0,4.262,1.332l.312-.033a4.547,4.547,0,0,0,.773-.149h.058c-.123-.156-.234-.318-.344-.487l-.039-.078a6.282,6.282,0,0,1-.65-1.358,4.284,4.284,0,0,1-.156-.565h0a5.684,5.684,0,0,1,.292-3.541c2.1,1.754,4.4,4.151,7.146,2.339s2.839-5.139,7.146-4.8a6.626,6.626,0,0,1,5.464,3.976,4.385,4.385,0,0,1,4.983-1.137,4.45,4.45,0,0,1,2.521,4.476c1.786-.448,3.71-.89,5.425-.214s2.82,2.865,1.845,4.327a.931.931,0,0,1-.091.13c-.8,1.033-2.566,1.6-2.378,2.9l.273.195.845.611q4.97,3.586,9.68,7.536c1.611,1.351,3.326,2.975,3.437,5.087a5.617,5.617,0,0,1-.156,1.54h0c-.1.507-.247,1.013-.357,1.52a12.676,12.676,0,0,0-.221,3.93h0c.045.383.1.76.175,1.143.994,5.022,5.009,9.167,5.405,14.292v.364a11.546,11.546,0,0,1-.045,1.644c-.3,3.118-1.741,6.113-2.91,9.1-.072.182-.143.364-.208.546a90.5,90.5,0,0,0-4.548,18.294,65.14,65.14,0,0,1-1.3,6.555,17.365,17.365,0,0,1-3.307,6.776,10.536,10.536,0,0,1-2.183,1.949,12.132,12.132,0,0,1-1.722.916v.039c.071.4.13.793.2,1.189.039.208.071.416.11.65h0a.089.089,0,0,0,0,.039c.546,3.073,1.169,6.081,1.826,8.939l.331,1.423c8.186,2.956,9.154,9.011,9.212,11.33a6.259,6.259,0,0,1,0,.929s12.343.325,17.216,3.9a13.21,13.21,0,0,0,2.93,1.494,53.917,53.917,0,0,0,6.009,1.877c1.046.273,2.137.539,3.248.8,1.949.448,4.015.884,6.009,1.3,5.321,1.072,10.33,1.949,12.87,2.6,6.061,1.533,19.925,14.825,19.925,14.825s1.624,13.409,3.248,15.364,4.548,8.829,4.548,8.829l10.745,19.106,4.548,8.036h2.923a4.97,4.97,0,0,1,2.085,1.364c.773.689,1.631,1.546,2.384,2.326l1.247,1.332.78.864s4.723.117,6,3.852c3.846-.11,8.569.143,11.876,1.624a9.187,9.187,0,0,1,1.3.7,5.639,5.639,0,0,1,2.683,3.677,5.422,5.422,0,0,1,.117.935c0,.37,0,.741,0,1.1-.234,4.918-3.437,9.011-6.38,11.765l.208.37s-.1.234-.286.65c-.052.123-.117.26-.188.416h0c-.383.819-.994,2.046-1.793,3.482a41.136,41.136,0,0,1-6.217,8.556l-.188.195-37.511.344-.11-.13-7.276-8.679-3.619-4.314-.11-.136-.1,1.033-.351,3.443-.845,8.322-.045.416v.11l-.1.961.071-.961h-.188l-69.513.65-114.092,1.26v.546h-.091v-.546l-29.072.312Z" transform="translate(418.007 -14.269)" fill="url(#linear-gradient)"/> - <path id="Path_443" data-name="Path 443" d="M586.185,511.522s-64.641,7.8-58.469,0c2.235-2.82,2.852-11.174,2.729-20.691-.039-2.891-.143-5.886-.292-8.868-.715-14.292-2.436-28.26-2.436-28.26s56.52-26.636,50.023-5.522c-2.6,8.53-1.748,20.51.227,31.755.578,3.281,1.247,6.5,1.949,9.55a223.892,223.892,0,0,0,6.269,22.036Z" transform="translate(367.711 -46.521)" fill="#fbbebe"/> - <path id="Path_444" data-name="Path 444" d="M586.185,537.354s-64.641,7.8-58.469,0c2.235-2.82,2.852-11.174,2.729-20.692,9.855-4.21,22.394-1.072,22.394-1.072,13.2-2.631,21.666-2.118,27.078-.273A223.888,223.888,0,0,0,586.185,537.354Z" transform="translate(367.711 -72.353)" opacity="0.1"/> - <path id="Path_445" data-name="Path 445" d="M413.346,651.973v-.546l114.092-1.241,69.513-.65h.195l-.071.961.1-.961h.123v-.11l.89-8.738.338-3.307.1-1.033.091-.864,4.015-13.389,4.015-13.37,3.378-11.258,5.158-17.2s-2.923-6.821-4.548-8.77-3.248-15.267-3.248-15.267-13.864-13.208-19.925-14.728c-2.54-.65-7.555-1.514-12.883-2.6-1.994-.4-4.041-.832-6.009-1.3-1.111-.253-2.2-.52-3.248-.786a57.086,57.086,0,0,1-6.009-1.858,13.448,13.448,0,0,1-2.924-1.488c-4.775-3.5-16.742-3.9-17.2-3.9h0a.269.269,0,0,1,0-.045v-.058a6.66,6.66,0,0,0,0-.819,5.208,5.208,0,0,0-.059-.91.82.82,0,0,0-.045-.325c-.032-.234-.071-.481-.13-.741a3.226,3.226,0,0,0-.078-.344,11.181,11.181,0,0,0-.812-2.267c-.045-.1-.1-.214-.156-.318a11.861,11.861,0,0,0-1.1-1.709c-.084-.11-.175-.227-.273-.338a12.721,12.721,0,0,0-1.767-1.715c-.175-.136-.357-.279-.546-.409a3.026,3.026,0,0,0-.331-.234l-.578-.377-.539-.312c-.474-.26-.974-.513-1.52-.754-.169-.078-.351-.149-.533-.221s-.468-.182-.708-.273h-.039l-.487-.195c-.37-.123-.747-.234-1.143-.344l-.6-.156-.65-.149-.65-.136c-.65-.13-1.345-.247-2.072-.338l-.741-.091-.76-.078-.786-.065-1.117-.065-1.3-.045a81.017,81.017,0,0,0-17.054,1.814,46.946,46.946,0,0,0-11.855-1.093h-.565l-.65.039h-.416l-.838.078a6.224,6.224,0,0,0-.845.1c-.279.039-.572.071-.851.117l-.429.071c-.422.071-.851.149-1.3.24q-.214.039-.429.1c-.565.123-1.13.273-1.689.442-.279.078-.559.169-.838.266-.143.039-.279.091-.416.143l-.416.149-.409.162-.487.195c-.247.1-.487.214-.728.331-.136.058-.273.123-.4.195s-.266.13-.39.2a18.03,18.03,0,0,0-4.034,2.846l-.331.318-.325.331c-.11.11-.214.227-.318.344a15.473,15.473,0,0,0-1.182,1.462c-.1.136-.2.273-.3.416a17.335,17.335,0,0,0-1.117,1.9c-.084.156-.162.318-.24.474a21.243,21.243,0,0,0-1.3,3.411q-.182.65-.331,1.3s-13.753,6.068-25.161,10.46c-3.034,1.169-5.892,2.228-8.283,3.027-.7.234-1.345.448-1.949.65a17.347,17.347,0,0,1-4.06.935,12.778,12.778,0,0,0-1.949.182c-5.243.851-14.227,4.548-15.208,8.257a2.4,2.4,0,0,0-.065.91v.071c.65,4.548-3.9,3.9-3.9,3.9s-1.624,12.019-3.9,15.267c-1.644,2.339-2.768,7.555-2.91,11.492h0a12.741,12.741,0,0,0,.286,3.658v.091c.26.871-.364,3.248-1.423,6.3-1.15,3.346-2.826,7.5-4.437,11.427-2.43,5.925-4.716,11.3-4.859,12.486-.058.526-.227,1.468-.461,2.683-.948,4.95-3.053,14.377-4.093,18.19-.773,2.845-1.9,6.743-2.67,9.42a.91.91,0,0,1-.065.227l29.124-.286v.546h.091Z" transform="translate(417.856 -73.042)" fill="#00ddf1"/> - <path id="Path_446" data-name="Path 446" d="M445.44,607.57s37.03,19.165,50.348,16.891Z" transform="translate(396.391 -105.214)" opacity="0.1"/> - <path id="Path_447" data-name="Path 447" d="M561.44,595.57s36.056,11.694,48.074,13.318S561.44,595.57,561.44,595.57Z" transform="translate(355.751 -101.01)" opacity="0.1"/> - <path id="Path_448" data-name="Path 448" d="M585.443,530.686c-18.84,3.469-54.311,2.722-69.643,2.2,5.62-20.139,33.022-13.292,33.022-13.292C582.74,512.821,585.339,526.866,585.443,530.686Z" transform="translate(371.74 -73.754)" opacity="0.1"/> - <path id="Path_449" data-name="Path 449" d="M585.443,528.686c-18.84,3.469-54.311,2.722-69.643,2.2,5.62-20.139,33.022-13.292,33.022-13.292C582.74,510.821,585.339,524.866,585.443,528.686Z" transform="translate(371.74 -73.053)" fill="#00ddf1"/> - <path id="Path_450" data-name="Path 450" d="M776.94,672.008s22.192-3.411,22.628,6.334S788.25,694.9,788.25,694.9Z" transform="translate(280.251 -127.587)" fill="#fbbebe"/> - <path id="Path_451" data-name="Path 451" d="M578.17,479.936a30.558,30.558,0,0,1-2.923,1.13c-7,2.417-14.065,4.853-21.439,5.736s-15.111.1-21.543-3.573a18.685,18.685,0,0,1-1.949-1.267c-.715-14.292-2.436-28.26-2.436-28.26s56.52-26.636,50.023-5.522C575.318,456.711,576.195,468.69,578.17,479.936Z" transform="translate(367.508 -46.521)" opacity="0.1"/> - <path id="Path_452" data-name="Path 452" d="M536.9,360.29a6.153,6.153,0,0,1-5.405-1.137l1.351,1.878a5.5,5.5,0,0,1-4.4-1.462,22.146,22.146,0,0,0,.208,5.035,9.433,9.433,0,0,1-6.211-1.949,2.872,2.872,0,0,0,1.715,2.8,9.316,9.316,0,0,0-10.135,6.958l3.391.312a12,12,0,0,0-6.782,4.138c-1.039,1.3-1.832,2.962-1.377,4.548s2.651,2.6,3.846,1.468a18.151,18.151,0,0,0-3.963,14.806,9.4,9.4,0,0,1,.3,3.417,28.993,28.993,0,0,1-1.228,3.047c-.65,1.9-.032,3.956.546,5.847l3.047,10.018c1.1,3.619,2.2,7.244,3.645,10.745a53.328,53.328,0,0,1,2.6,6.828c.819,3.144.851,6.588,2.6,9.336a12.948,12.948,0,0,0,4.665,4.112c6.425,3.677,14.188,4.457,21.542,3.573s14.409-3.32,21.406-5.736a20.141,20.141,0,0,0,4.444-1.949c4.84-3.17,5.918-9.654,6.821-15.364a87.242,87.242,0,0,1,4.736-18.71c1.416-3.567,3.248-7.185,2.936-11.005-.4-5.074-4.411-9.186-5.405-14.175a12.344,12.344,0,0,1,.045-5.048,11.473,11.473,0,0,0,.513-3.053c-.11-2.092-1.826-3.7-3.437-5.048q-5.243-4.379-10.823-8.277c-.188-1.3,1.579-1.858,2.378-2.884,1.13-1.449-.039-3.748-1.754-4.424s-3.638-.234-5.425.214a4.281,4.281,0,0,0-7.5-3.32,6.627,6.627,0,0,0-5.47-3.95c-4.307-.338-4.392,2.956-7.146,4.768s-5.028-.578-7.146-2.319A6.029,6.029,0,0,0,536.9,360.29Z" transform="translate(374.5 -15.625)" fill="#3f3d56"/> - <path id="Path_453" data-name="Path 453" d="M768.171,669.128s-.578,1.377-1.644,3.372a44.83,44.83,0,0,1-5.847,8.556l-.175.188h-1.052l-37.511.344h-.9l-.11-.13-7.276-8.634-2.741-3.255-.11-.136-.234-.273-.13-.156-.169-.2-5.334-6.328,1.949-8.121,3.32-13.682.084-.331.65-2.6.461-1.949,1.546-6.354,5.3-21.861,9.42,4.872,9.933,17.541,5.334,9.42h2.923c.552,0,1.819,1.065,3.092,2.293.455.435.91.9,1.3,1.3,1.156,1.2,2.072,2.222,2.072,2.222s4.736.1,6.009,3.833a4.537,4.537,0,0,1,.162.552,26.191,26.191,0,0,0,1.644,4.262c.838,1.826,1.891,3.9,2.956,5.97,1.981,3.8,4,7.419,4.736,8.731l.091.162Z" transform="translate(305.476 -105.217)" fill="#00ddf1"/> - <path id="Path_454" data-name="Path 454" d="M615.681,653.093l-.065.929v.065l-.11,1.494-.864,12.025L613.6,682.093l-.3,4.08-.65,8.731v.11l-69.513.65L429.061,696.9v.546h-.091v-.728l.292-9.329.559-18.229L430.3,653.7l.045-1.54a6.841,6.841,0,0,1,7.419-6.607c3.066.26,7.049.578,11.811.916l1.949.143c27.5,1.91,78.322,4.379,129.606,1.3,1.078-.059,2.163-.123,3.248-.2,7.952-.5,15.9-1.143,23.764-1.949a6.841,6.841,0,0,1,7.536,7.3Z" transform="translate(402.161 -118.514)" opacity="0.1"/> - <path id="Path_455" data-name="Path 455" d="M429.08,698.857v-.546l114.092-1.241,69.513-.65h.195v-.11l.65-8.731.279-3.9,1.065-14.689.838-11.629v-.286a6.893,6.893,0,0,0-.071-1.6.2.2,0,0,0,0-.065,6.751,6.751,0,0,0-1.3-3.014,6.847,6.847,0,0,0-6.12-2.6c-7.867.806-15.813,1.449-23.764,1.949-1.085.078-2.17.143-3.248.2-51.284,3.047-102.106.578-129.606-1.3l-1.949-.143c-4.762-.338-8.744-.65-11.811-.916a6.847,6.847,0,0,0-7.3,5.542,7.146,7.146,0,0,0-.117,1.065l-.442,14.4-.6,18.236-.286,9.329v.728Z" transform="translate(402.122 -119.926)" fill="#3f3d56"/> - <path id="Path_456" data-name="Path 456" d="M615.925,661.692l-.8,9.959L613.937,686.5l-.3,3.716-.65,8.322-.039.416v.11h0l-.1.961.071-.961h-.188l-69.513.65L429.11,700.944v-.182l.318-9.329.65-18.229.416-12.116a4.132,4.132,0,0,1,1.988-3.411,4.061,4.061,0,0,1,2.456-.585c1.364.11,3.04.24,5,.383,3.177.234,7.094.507,11.655.793,8.445.533,19.041,1.1,31.183,1.572,33.782,1.3,79.388,1.735,122.707-2.059,1.949-.169,3.963-.357,5.931-.546a4.066,4.066,0,0,1,2.261.429,3.346,3.346,0,0,1,.559.351,3.989,3.989,0,0,1,1.3,1.6,2.315,2.315,0,0,1,.162.4A4.08,4.08,0,0,1,615.925,661.692Z" transform="translate(402.112 -122.559)" opacity="0.1"/> - <path id="Path_457" data-name="Path 457" d="M360.914,677.87v2.072a3.982,3.982,0,0,1-2.274,3.6l-26.051.5a3.976,3.976,0,0,1-2.319-3.619v-1.949Z" transform="translate(436.74 -129.843)" opacity="0.1"/> - <path id="Path_458" data-name="Path 458" d="M280.294,512.532l-33.944.65V507.55l33.944-.65Z" transform="translate(517.685 42.387)" fill="#3f3d56"/> - <path id="Path_459" data-name="Path 459" d="M280.294,512.532l-33.944.65V507.55l33.944-.65Z" transform="translate(517.685 42.387)" opacity="0.1"/> - <path id="Path_460" data-name="Path 460" d="M282.294,512.532l-33.944.65V507.55l33.944-.65Z" transform="translate(516.984 42.387)" fill="#3f3d56"/> - <path id="Path_461" data-name="Path 461" d="M552.228,360.039A6.334,6.334,0,0,1,551,357.22a6.165,6.165,0,0,0,.273,2.988A5.847,5.847,0,0,0,552.228,360.039Z" transform="translate(359.434 -17.505)"/> - <path id="Path_462" data-name="Path 462" d="M540.1,366.9a22.83,22.83,0,0,1-.24-2.4c0,.8,0,1.6,0,2.41Z" transform="translate(363.311 -20.056)"/> - <path id="Path_463" data-name="Path 463" d="M621.706,398.627a11.912,11.912,0,0,1,.234-1.722,11.7,11.7,0,0,0,.52-3.047,4.008,4.008,0,0,0-.1-.689c-.11.6-.286,1.2-.416,1.787a12.433,12.433,0,0,0-.234,3.671Z" transform="translate(334.652 -30.1)"/> - <path id="Path_464" data-name="Path 464" d="M600.922,368.894l.708.513a12.8,12.8,0,0,0,1.67-1.442,2.384,2.384,0,0,0,.247-2.365,1.95,1.95,0,0,1-.247.416C602.5,367.042,600.734,367.607,600.922,368.894Z" transform="translate(341.923 -20.441)"/> - <path id="Path_465" data-name="Path 465" d="M518.455,380.29a8,8,0,0,0-.565,1.481,11.8,11.8,0,0,1,3.248-1.228Z" transform="translate(371.008 -25.587)"/> - <path id="Path_466" data-name="Path 466" d="M531.888,368.979a9.637,9.637,0,0,1-1.221-.8,2.758,2.758,0,0,0,.058.767,7.7,7.7,0,0,1,1.163.033Z" transform="translate(366.534 -21.345)"/> - <path id="Path_467" data-name="Path 467" d="M587.579,428.33c-.266,3.151-1.735,6.185-2.923,9.173a87.2,87.2,0,0,0-4.736,18.717c-.9,5.71-1.949,12.194-6.821,15.358a19.488,19.488,0,0,1-4.437,1.949c-7,2.423-14.065,4.853-21.439,5.736s-15.111.11-21.543-3.567a12.993,12.993,0,0,1-4.664-4.112c-1.735-2.748-1.767-6.191-2.6-9.336a53.424,53.424,0,0,0-2.6-6.834c-1.436-3.5-2.54-7.146-3.638-10.739q-1.527-5.009-3.047-10.024a18.716,18.716,0,0,1-.741-3.086,11.644,11.644,0,0,0,.741,5.035q1.52,5.022,3.047,10.024c1.1,3.619,2.2,7.244,3.638,10.739a53.417,53.417,0,0,1,2.6,6.834c.819,3.144.851,6.587,2.6,9.336a12.993,12.993,0,0,0,4.664,4.112c6.432,3.677,14.188,4.45,21.543,3.567s14.409-3.313,21.439-5.736a19.487,19.487,0,0,0,4.437-1.949c4.84-3.164,5.918-9.647,6.821-15.358a87.2,87.2,0,0,1,4.736-18.717c1.416-3.56,3.248-7.179,2.936-11.005C587.592,428.408,587.579,428.369,587.579,428.33Z" transform="translate(374.359 -42.418)"/> - <path id="Path_468" data-name="Path 468" d="M510.318,421.419v-.071a9.1,9.1,0,0,0-.3-3.411,17.272,17.272,0,0,1-.253-2.157,17.769,17.769,0,0,0,.253,4.106C510.123,420.393,510.24,420.906,510.318,421.419Z" transform="translate(373.864 -38.021)"/> - <path id="Path_469" data-name="Path 469" d="M512.452,397.929a18.02,18.02,0,0,1,1.7-2.384c-1.189,1.137-3.385.123-3.846-1.455a3.788,3.788,0,0,0,0,1.949,2.852,2.852,0,0,0,2.15,1.89Z" transform="translate(373.712 -30.422)"/> - <path id="Path_470" data-name="Path 470" d="M762.946,656.57s2.059,7.471,0,13.968S762.946,656.57,762.946,656.57Z" transform="translate(285.475 -122.381)" opacity="0.1"/> - <path id="Path_471" data-name="Path 471" d="M776,668.3s.864,9.485-1.085,11.168S776,668.3,776,668.3Z" transform="translate(281.189 -126.49)" opacity="0.1"/> - <line id="Line_88" data-name="Line 88" y1="0.65" x2="66.011" transform="translate(733.267 442.068)" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2"/> - <line id="Line_89" data-name="Line 89" y1="0.643" x2="66.011" transform="translate(733.267 450.176)" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2"/> - <line id="Line_90" data-name="Line 90" y1="0.65" x2="66.011" transform="translate(733.267 458.277)" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2"/> - </g> - </g> - </g> -</svg> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="691.365" height="586.346" viewBox="0 0 691.365 586.346"><defs><linearGradient id="linear-gradient" x1=".5" x2=".5" y1="1" y2="-.001" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="gray" stop-opacity=".251"/><stop offset=".54" stop-color="gray" stop-opacity=".122"/><stop offset="1" stop-color="gray" stop-opacity=".102"/></linearGradient></defs><g id="Group_644" data-name="Group 644" transform="translate(-588.635 -80)"><g id="Group_642" data-name="Group 642" transform="translate(22538.635 6999)"><path id="Path_472" fill="#00ddf1" d="M482.764,637.675c51.612-29.22,67.336-29.693,124.954-17.169,81.646,17.758,88.43-49.93,108.306-186.933,33.946-233.98-108.306-295.737-108.306-295.737s-94.6-8.1-150.536-38.963C377.726,55.027,286.9,49.443,207.046,86.542c-51.069,23.7-93.125,56.714-100.31,102.034-20.09,126.746,12.9,196.58-48.819,237.954S48.944,581.5,96.263,577.564c34.968-2.906,80.842,52.415,130.687,60.111,17.382,2.684,88.7-13.043,99.578,0C341.327,655.4,464.763,647.87,482.764,637.675Z" data-name="Path 472" opacity=".1" transform="translate(-21979.895 -6980.982)"/><g id="Group_641" data-name="Group 641" transform="translate(-21545.08 -6816.88)"><rect id="Rectangle_263" width="217.867" height="15.073" fill="#00ddf1" data-name="Rectangle 263" opacity=".1" transform="translate(0 39.052)"/><rect id="Rectangle_264" width="217.867" height="15.073" fill="#00ddf1" data-name="Rectangle 264" opacity=".1" transform="translate(0 104.137)"/><rect id="Rectangle_265" width="217.867" height="15.073" fill="#00ddf1" data-name="Rectangle 265" opacity=".1" transform="translate(0 171.964)"/><rect id="Rectangle_266" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 266" opacity=".1" transform="translate(19.183)"/><rect id="Rectangle_267" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 267" opacity=".1" transform="translate(19.183 6.166)"/><rect id="Rectangle_268" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 268" opacity=".1" transform="translate(19.183 27.405)"/><rect id="Rectangle_269" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 269" opacity=".1" transform="translate(39.737)"/><rect id="Rectangle_270" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 270" opacity=".1" transform="translate(39.737 6.166)"/><rect id="Rectangle_271" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 271" opacity=".1" transform="translate(39.737 27.405)"/><rect id="Rectangle_272" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 272" opacity=".1" transform="translate(60.29)"/><rect id="Rectangle_273" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 273" opacity=".1" transform="translate(60.29 6.166)"/><rect id="Rectangle_274" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 274" opacity=".1" transform="translate(60.29 27.405)"/><rect id="Rectangle_275" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 275" opacity=".1" transform="translate(80.844)"/><rect id="Rectangle_276" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 276" opacity=".1" transform="translate(80.844 6.166)"/><rect id="Rectangle_277" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 277" opacity=".1" transform="translate(80.844 27.405)"/><rect id="Rectangle_278" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 278" opacity=".1" transform="translate(101.397)"/><rect id="Rectangle_279" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 279" opacity=".1" transform="translate(101.397 6.166)"/><rect id="Rectangle_280" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 280" opacity=".1" transform="translate(101.397 27.405)"/><rect id="Rectangle_281" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 281" opacity=".1" transform="translate(121.95)"/><rect id="Rectangle_282" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 282" opacity=".1" transform="translate(121.95 6.166)"/><rect id="Rectangle_283" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 283" opacity=".1" transform="translate(121.95 27.405)"/><rect id="Rectangle_284" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 284" opacity=".1" transform="translate(142.504)"/><rect id="Rectangle_285" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 285" opacity=".1" transform="translate(142.504 6.166)"/><rect id="Rectangle_286" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 286" opacity=".1" transform="translate(142.504 27.405)"/><rect id="Rectangle_287" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 287" opacity=".1" transform="matrix(0.894, -0.448, 0.448, 0.894, 135.847, 138.025)"/><rect id="Rectangle_288" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 288" opacity=".1" transform="matrix(0.894, -0.448, 0.448, 0.894, 138.614, 143.541)"/><rect id="Rectangle_289" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 289" opacity=".1" transform="matrix(0.894, -0.448, 0.448, 0.894, 148.128, 162.529)"/><rect id="Rectangle_290" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 290" opacity=".1" transform="translate(19.183 65.771)"/><rect id="Rectangle_291" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 291" opacity=".1" transform="translate(19.183 71.937)"/><rect id="Rectangle_292" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 292" opacity=".1" transform="translate(19.183 93.176)"/><rect id="Rectangle_293" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 293" opacity=".1" transform="translate(39.737 65.771)"/><rect id="Rectangle_294" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 294" opacity=".1" transform="translate(39.737 71.937)"/><rect id="Rectangle_295" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 295" opacity=".1" transform="translate(39.737 93.176)"/><rect id="Rectangle_296" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 296" opacity=".1" transform="translate(60.29 65.771)"/><rect id="Rectangle_297" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 297" opacity=".1" transform="translate(60.29 71.937)"/><rect id="Rectangle_298" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 298" opacity=".1" transform="translate(60.29 93.176)"/><rect id="Rectangle_299" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 299" opacity=".1" transform="translate(145.93 65.771)"/><rect id="Rectangle_300" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 300" opacity=".1" transform="translate(145.93 71.937)"/><rect id="Rectangle_301" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 301" opacity=".1" transform="translate(145.93 93.176)"/><rect id="Rectangle_302" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 302" opacity=".1" transform="translate(166.483 65.771)"/><rect id="Rectangle_303" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 303" opacity=".1" transform="translate(166.483 71.937)"/><rect id="Rectangle_304" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 304" opacity=".1" transform="translate(166.483 93.176)"/><rect id="Rectangle_305" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 305" opacity=".1" transform="translate(187.036 65.771)"/><rect id="Rectangle_306" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 306" opacity=".1" transform="translate(187.036 71.937)"/><rect id="Rectangle_307" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 307" opacity=".1" transform="translate(187.036 93.176)"/><rect id="Rectangle_308" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 308" opacity=".1" transform="translate(19.183 132.912)"/><rect id="Rectangle_309" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 309" opacity=".1" transform="translate(19.183 139.078)"/><rect id="Rectangle_310" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 310" opacity=".1" transform="translate(19.183 160.317)"/><rect id="Rectangle_311" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 311" opacity=".1" transform="translate(39.737 132.912)"/><rect id="Rectangle_312" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 312" opacity=".1" transform="translate(39.737 139.078)"/><rect id="Rectangle_313" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 313" opacity=".1" transform="translate(39.737 160.317)"/><rect id="Rectangle_314" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 314" opacity=".1" transform="translate(60.29 132.912)"/><rect id="Rectangle_315" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 315" opacity=".1" transform="translate(60.29 139.078)"/><rect id="Rectangle_316" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 316" opacity=".1" transform="translate(60.29 160.317)"/><rect id="Rectangle_317" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 317" opacity=".1" transform="translate(80.844 132.912)"/><rect id="Rectangle_318" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 318" opacity=".1" transform="translate(80.844 139.078)"/><rect id="Rectangle_319" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 319" opacity=".1" transform="translate(80.844 160.317)"/><rect id="Rectangle_320" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 320" opacity=".1" transform="translate(101.397 132.912)"/><rect id="Rectangle_321" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 321" opacity=".1" transform="translate(101.397 139.078)"/><rect id="Rectangle_322" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 322" opacity=".1" transform="translate(101.397 160.317)"/><rect id="Rectangle_323" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 323" opacity=".1" transform="translate(121.95 132.912)"/><rect id="Rectangle_324" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 324" opacity=".1" transform="translate(121.95 139.078)"/><rect id="Rectangle_325" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 325" opacity=".1" transform="translate(121.95 160.317)"/><path id="Path_473" fill="#00ddf1" d="M797.862,159.09v35.571h-13.7V156.48Q791.039,157.693,797.862,159.09Z" data-name="Path 473" opacity=".1" transform="translate(-621.103 -155.61)"/><rect id="Rectangle_326" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 326" opacity=".1" transform="translate(163.057 6.166)"/><rect id="Rectangle_327" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 327" opacity=".1" transform="translate(163.057 27.405)"/><path id="Path_474" fill="#00ddf1" d="M827.862,165.719v30.83h-13.7V162.43c1.781.391,3.556.8,5.33,1.22Q823.7,164.636,827.862,165.719Z" data-name="Path 474" opacity=".1" transform="translate(-630.549 -157.483)"/><path id="Path_475" fill="#00ddf1" d="M827.862,166.285v.685h-13.7v-2.74h5.33Q823.7,165.2,827.862,166.285Z" data-name="Path 475" opacity=".1" transform="translate(-630.549 -158.05)"/><rect id="Rectangle_328" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 328" opacity=".1" transform="translate(183.611 27.405)"/><path id="Path_476" fill="#00ddf1" d="M691.358,287.276s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.4,9.4,0,0,0,9.146,5.179c4.35-.233,5.8-3.549,6.166-6.639a6.851,6.851,0,0,0-9.057-7.3Z" data-name="Path 476" transform="translate(-589.693 -196.649)"/><path id="Path_477" fill="#00ddf1" d="M686.2,296.239a6.68,6.68,0,0,1-.089-6.426c2-3.659,6.166-2.254,6.166-2.254l.212-.075a6.762,6.762,0,0,1,4.885.11,6.762,6.762,0,0,0-5.762-.548l-.212.075s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.982,9.982,0,0,0,4.7,4.446A10.277,10.277,0,0,1,686.2,296.239Z" data-name="Path 477" opacity=".1" transform="translate(-589.706 -196.595)"/><path id="Path_478" fill="#00ddf1" d="M691.42,290.06s1.542,1.213,5.282,0" data-name="Path 478" opacity=".2" transform="translate(-591.9 -197.672)"/><path id="Path_479" fill="#00ddf1" d="M690.93,277.21s2.638,7.153,2.418,9.023l2.09-.219s-3.521-6.269-2.638-8.8Z" data-name="Path 479" transform="translate(-591.746 -193.626)"/><path id="Path_480" fill="#00ddf1" d="M690.93,277.21s2.638,7.153,2.418,9.023l2.09-.219s-3.521-6.269-2.638-8.8Z" data-name="Path 480" opacity=".2" transform="translate(-591.746 -193.626)"/><path id="Path_481" fill="#00ddf1" d="M702.92,277.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S701.536,284.391,702.92,277.6Z" data-name="Path 481" transform="translate(-592.952 -193.414)"/><path id="Path_482" fill="#00ddf1" d="M702.92,277.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S701.536,284.391,702.92,277.6Z" data-name="Path 482" opacity=".1" transform="translate(-592.952 -193.414)"/><path id="Path_483" fill="#00ddf1" d="M694.75,283.958s1.089-5.207,8.16-5.878" data-name="Path 483" transform="translate(-592.949 -193.9)"/><path id="Path_484" fill="#00ddf1" d="M819.358,386.276s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.4,9.4,0,0,0,9.146,5.18c4.35-.233,5.8-3.549,6.166-6.639a6.851,6.851,0,0,0-9.057-7.3Z" data-name="Path 484" transform="translate(-629.999 -227.823)"/><path id="Path_485" fill="#00ddf1" d="M814.2,395.239a6.68,6.68,0,0,1-.089-6.426c2-3.659,6.166-2.254,6.166-2.254l.212-.075a6.762,6.762,0,0,1,4.885.11,6.762,6.762,0,0,0-5.762-.548l-.212.075s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.982,9.982,0,0,0,4.7,4.446A10.276,10.276,0,0,1,814.2,395.239Z" data-name="Path 485" opacity=".1" transform="translate(-630.011 -227.769)"/><path id="Path_486" fill="#00ddf1" d="M819.42,389.06s1.542,1.213,5.282,0" data-name="Path 486" opacity=".2" transform="translate(-632.206 -228.846)"/><path id="Path_487" fill="#00ddf1" d="M818.93,376.21s2.638,7.153,2.419,9.023l2.09-.219s-3.522-6.269-2.638-8.8Z" data-name="Path 487" transform="translate(-632.051 -224.799)"/><path id="Path_488" fill="#00ddf1" d="M818.93,376.21s2.638,7.153,2.419,9.023l2.09-.219s-3.522-6.269-2.638-8.8Z" data-name="Path 488" opacity=".2" transform="translate(-632.051 -224.799)"/><path id="Path_489" fill="#00ddf1" d="M830.92,376.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S829.536,383.391,830.92,376.6Z" data-name="Path 489" transform="translate(-633.257 -224.588)"/><path id="Path_490" fill="#00ddf1" d="M830.92,376.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S829.536,383.391,830.92,376.6Z" data-name="Path 490" opacity=".1" transform="translate(-633.257 -224.588)"/><path id="Path_491" fill="#00ddf1" d="M822.75,382.958s1.089-5.207,8.16-5.878" data-name="Path 491" transform="translate(-633.254 -225.073)"/></g></g><g id="Group_643" data-name="Group 643" transform="translate(7 -63)"><g id="Group_639" data-name="Group 639" transform="translate(21233 8372)"><ellipse id="Ellipse_73" cx="49.851" cy="8.007" fill="#00abf6" data-name="Ellipse 73" opacity=".1" rx="49.851" ry="8.007" transform="translate(-20118.443 -7772.555)"/><rect id="Rectangle_182" width="3.208" height="72.224" fill="#535461" data-name="Rectangle 182" transform="translate(-20070.199 -7917.934)"/><path id="Path_268" fill="#565661" d="M1025.906,587.251l-.2,3.254-.287,4.6-.118,1.913-.281,4.6-.123,1.913-.286,4.6-3.233,52.22a8.851,8.851,0,0,1-8.83,8.268H995.731a8.841,8.841,0,0,1-8.82-8.3l-3.244-52.225-.281-4.6-.117-1.913-.292-4.6-.117-1.913-.281-4.6-.2-3.254a4.6,4.6,0,0,1,4.574-4.865h34.391a4.6,4.6,0,0,1,4.569,4.9Z" data-name="Path 268" transform="translate(-21072.734 -8433.181)"/><path id="Path_269" fill="#9d9cb5" d="M990.949,517.36l-.287,4.589H948.106l-.286-4.589Z" data-name="Path 269" transform="translate(-21037.977 -8360.036)"/><path id="Path_270" fill="#9d9cb5" d="M990.93,530.08l-.281,4.594H948.9l-.286-4.594Z" data-name="Path 270" transform="translate(-21038.363 -8366.248)"/><path id="Path_271" fill="#9d9cb5" d="M990.912,542.8l-.287,4.589H949.686L949.4,542.8Z" data-name="Path 271" transform="translate(-21038.748 -8372.46)"/><path id="Path_272" fill="#00abf6" d="M933.875,490.464c18.684,13.517,26.466,34.656,26.466,34.656s-22.511-.773-41.2-14.289-26.46-34.651-26.46-34.651S915.2,476.953,933.875,490.464Z" data-name="Path 272" transform="translate(-21028.934 -8381.328)"/><path id="Path_273" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2" d="M892.68,476.18s23.365,12.969,30.865,23.708,36.8,25.233,36.8,25.233" data-name="Path 273" transform="translate(-21028.934 -8381.328)"/><path id="Path_274" fill="#00abf6" d="M975.393,443.457c10.171,7.352,14.407,18.863,14.407,18.863s-12.279-.425-22.424-7.776S953,435.68,953,435.68,965.227,436.1,975.393,443.457Z" data-name="Path 274" transform="translate(-21058.393 -8361.549)"/><path id="Path_275" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2" d="M953,435.68s12.719,7.06,16.8,12.9,20.03,13.737,20.03,13.737" data-name="Path 275" transform="translate(-21058.393 -8361.549)"/><path id="Path_276" fill="#00abf6" d="M1040.3,470.483c-11.68,12.836-14.151,29.612-14.151,29.612s16.469-4.042,28.139-16.883,14.151-29.612,14.151-29.612S1051.981,457.647,1040.3,470.483Z" data-name="Path 276" transform="translate(-21094.119 -8370.301)"/><path id="Path_277" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2" d="M1068.45,453.61s-15.215,13.159-19.083,22.224S1026.15,500.1,1026.15,500.1" data-name="Path 277" transform="translate(-21094.119 -8370.306)"/></g><g id="Group_638" data-name="Group 638" transform="translate(-40 36)"><rect id="Rectangle_254" width="12.343" height="37.459" fill="#3f3d56" data-name="Rectangle 254" transform="translate(741.459 392.675)"/><rect id="Rectangle_255" width="12.343" height="39.629" fill="#3f3d56" data-name="Rectangle 255" transform="translate(1073.647 390.726)"/><path id="Path_418" fill="#65617d" d="M597.889,523.665v8.446l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643L264.408,535.2h-.1l-29.007.273-.312.007L106.1,536.658v-9.745l30.306-18.19,60.808-.507,1.3-.007.429-.007,1.3-.019,29.2-.24,1.306-.007.416-.007,1.3-.006,9.362-.078.247-.006,23.1-.195h.188l180.214-1.52,4.411-.032h.442l3.365-.033,24.459-.2,1.3-.02,1.2-.013h.624l7.607-.058,1.507-.02,2.02-.013,6.334-.058,10.05-.084,1.3-.013,2.261-.013h.422l48.536-.416Z" data-name="Path 418" transform="translate(566.82 43)"/><path id="Path_419" d="M597.889,523.665v8.446l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643L264.408,535.2h-.1l-29.007.273-.312.007L106.1,536.658v-9.745l30.306-18.19,60.808-.507,1.3-.007.429-.007,1.3-.019,29.2-.24,1.306-.007.416-.007,1.3-.006,9.362-.078.247-.006,23.1-.195h.188l180.214-1.52,4.411-.032h.442l3.365-.033,24.459-.2,1.3-.02,1.2-.013h.624l7.607-.058,1.507-.02,2.02-.013,6.334-.058,10.05-.084,1.3-.013,2.261-.013h.422l48.536-.416Z" data-name="Path 419" opacity=".2" transform="translate(566.82 43)"/><path id="Path_420" fill="#3f3d56" d="M358.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" data-name="Path 420" transform="translate(437.441 -122.381)"/><path id="Path_421" d="M358.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" data-name="Path 421" opacity=".1" transform="translate(437.441 -122.381)"/><path id="Path_422" fill="#3f3d56" d="M360.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" data-name="Path 422" transform="translate(436.74 -122.381)"/><rect id="Rectangle_256" width="30.644" height="20.464" fill="#3f3d56" data-name="Rectangle 256" transform="translate(1046.362 534.189)"/><rect id="Rectangle_257" width="30.644" height="20.464" data-name="Rectangle 257" opacity=".1" transform="translate(1046.362 534.189)"/><rect id="Rectangle_258" width="30.644" height="20.464" fill="#3f3d56" data-name="Rectangle 258" transform="translate(1045.062 534.189)"/><path id="Path_423" d="M223.943,265.82v3.723l-12.343-.318v-3.4Z" data-name="Path 423" opacity=".1" transform="translate(529.859 126.848)"/><path id="Path_424" fill="#65617d" d="M358.741,271.246,343.909,377.789a2.794,2.794,0,0,1-2.839,2.41L222.314,377.12l-2.254-.058a2.794,2.794,0,0,1-2.7-3.164l16.651-111.533a2.794,2.794,0,0,1,2.949-2.358l119.186,8.069a2.787,2.787,0,0,1,2.6,3.17Z" data-name="Path 424" transform="translate(476.307 16.556)"/><path id="Path_425" fill="#00ddf1" d="M169.158,99.16,156.6,197.472l109.142,3.463,13.422-94.85Z" data-name="Path 425" transform="translate(549.128 185.237)"/><rect id="Rectangle_259" width="132.965" height="112.605" fill="#65617d" data-name="Rectangle 259" rx="5.33" transform="translate(853.849 282.877)"/><rect id="Rectangle_260" width="120.836" height="93.765" fill="#00ddf1" data-name="Rectangle 260" transform="translate(860.125 290.458)"/><path id="Path_426" d="M735.273,262.82v2.462l-12.343.253V262.82Z" data-name="Path 426" opacity=".1" transform="translate(350.717 127.899)"/><path id="Path_427" fill="#65617d" d="M833.626,371a2,2,0,0,1-1.949,2.131l-121.615,2.514a2,2,0,0,1-2.033-1.813L697.575,265.156a2,2,0,0,1,1.9-2.189l120.693-6,1.3-.065a1.994,1.994,0,0,1,2.092,1.819Z" data-name="Path 427" transform="translate(308.06 17.643)"/><path id="Path_428" fill="#00ddf1" d="M628.93,100.238,739.157,94.82l9.31,98.748-109.356,2.6Z" data-name="Path 428" transform="translate(383.65 186.757)"/><path id="Path_429" d="M899.741,371a2,2,0,0,1-1.949,2.131L886.28,256.963l1.3-.065a2,2,0,0,1,2.092,1.819Z" data-name="Path 429" opacity=".1" transform="translate(241.945 17.643)"/><rect id="Rectangle_261" width="12.343" height="11.096" data-name="Rectangle 261" opacity=".1" transform="translate(741.459 419.038)"/><path id="Path_431" d="M281.574,483.65v3.229l-30.644.819V483.65Z" data-name="Path 431" opacity=".1" transform="translate(516.08 50.533)"/><path id="Path_432" fill="#65617d" d="M390.8,483.886V593.158a2.6,2.6,0,0,1-2.5,2.566l-124.506,3.313h-.033a2.6,2.6,0,0,1-2.566-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H388.23A2.6,2.6,0,0,1,390.8,483.886Z" data-name="Path 432" transform="translate(460.942 -60.983)"/><path id="Path_434" fill="#d4dfec" d="M194.6,319.15H309.914v96.311L194.6,418.06Z" data-name="Path 434" transform="translate(535.815 108.164)"/><rect id="Rectangle_262" width="12.343" height="11.317" data-name="Rectangle 262" opacity=".1" transform="translate(1073.647 419.038)"/><path id="Path_435" d="M709.574,483.65v4.164L678.93,487V483.65Z" data-name="Path 435" opacity=".1" transform="translate(366.132 50.533)"/><path id="Path_436" fill="#65617d" d="M797.782,483.886V596.471a2.6,2.6,0,0,1-2.6,2.566h0l-124.532-3.313a2.6,2.6,0,0,1-2.5-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H795.19a2.6,2.6,0,0,1,2.592,2.566Z" data-name="Path 436" transform="translate(318.365 -60.983)"/><path id="Path_437" d="M866.289,483.886V596.471a2.6,2.6,0,0,1-2.6,2.566h0V481.32h0a2.6,2.6,0,0,1,2.6,2.566Z" data-name="Path 437" opacity=".1" transform="translate(249.859 -60.983)"/><path id="Path_438" fill="#d4dfec" d="M713.414,319.15H598.1v96.311l115.314,2.6Z" data-name="Path 438" transform="translate(394.451 108.164)"/><path id="Path_439" fill="#65617d" d="M593.3,483.886V593.158a2.6,2.6,0,0,1-2.5,2.566l-124.506,3.313h0a2.6,2.6,0,0,1-2.6-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H590.73A2.6,2.6,0,0,1,593.3,483.886Z" data-name="Path 439" transform="translate(389.997 -60.983)"/><path id="Path_440" fill="#d4dfec" d="M397.1,319.15H512.414v96.311L397.1,418.06Z" data-name="Path 440" transform="translate(464.87 108.164)"/><path id="Path_441" d="M597.889,533.65V542.1l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643-114.086,1.059h-.1l-29.007.273-.312.007L106.1,546.643V536.9l131.562-.864h.312l26.629-.182h.123l183.9-1.215h.188l.11-.006h.305l3.112-.019h.948l48.393-.325,2.858-.013.637-.007Z" data-name="Path 441" opacity=".1" transform="translate(566.82 33.015)"/><circle id="Ellipse_99" cx="33.347" cy="33.347" r="33.347" fill="#fbbebe" data-name="Ellipse 99" transform="translate(887.196 363.44)"/><path id="Path_442" fill="url(#linear-gradient)" d="M383.74,592.973a.806.806,0,0,1,.065-.227c.65-2.332,1.806-6.276,2.67-9.427.11-.39.214-.773.312-1.137.955-3.554,2.813-11.876,3.846-17.066.364-1.826.65-3.248.708-3.963.13-1.1,2.085-5.795,4.3-11.194,1.553-3.794,3.248-7.939,4.489-11.434a39.876,39.876,0,0,0,1.9-6.4,3.313,3.313,0,0,0,0-1.384,9.543,9.543,0,0,1-.312-2.274h0c-.149-4.028,1.052-10.394,2.91-13.065,2.274-3.248,3.9-15.371,3.9-15.371s3.365.487,3.9-2.293a4,4,0,0,0,.065-.91,4.815,4.815,0,0,0-.058-.721c-.578-4.054,9.563-8.368,15.267-9.3a12.769,12.769,0,0,1,1.949-.182,17.694,17.694,0,0,0,4.06-.935q.909-.279,1.949-.65c2.391-.806,5.249-1.871,8.283-3.04,11.408-4.424,25.22-10.394,25.22-10.394.1-.461.208-.9.331-1.338a18,18,0,0,1,10.622-12.3h0v-1.3c0-2.241-.1-4.548-.195-6.847,0-.448-.039-.9-.065-1.345v-.734c0-.455-.046-.91-.071-1.358l-.117-.091a10.66,10.66,0,0,1-2.534-2.729,9.916,9.916,0,0,1-.923-1.949c-.812-2.2-1-4.658-1.546-6.984l-.117-.481a54.579,54.579,0,0,0-2.6-6.873c-1.436-3.521-2.54-7.146-3.638-10.817q-1-3.333-2.02-6.678l-1.026-3.4c-.195-.65-.39-1.3-.539-1.949h0a8.627,8.627,0,0,1-.169-.91h0a6.5,6.5,0,0,1,.156-2.995,20.854,20.854,0,0,1,.858-1.949,5.113,5.113,0,0,0,.325-.9h0a1.947,1.947,0,0,0,.052-.208,3.667,3.667,0,0,0,.071-.7,11.993,11.993,0,0,0-.338-2.527.045.045,0,0,1,0-.032,1.661,1.661,0,0,0-.032-.175,16.564,16.564,0,0,1-.234-1.949,18.483,18.483,0,0,1,2.254-10.115l.123-.234a16.383,16.383,0,0,1,1.2-1.806h0a9.122,9.122,0,0,1,.65-.793,2.594,2.594,0,0,1-3.606-.936,2.475,2.475,0,0,1-.149-.292c-.033-.078-.059-.162-.085-.247-.455-1.592.338-3.287,1.377-4.58a12.012,12.012,0,0,1,3.729-3.053h0a2.51,2.51,0,0,1,.26-.136,11.125,11.125,0,0,1,1.715-.689h0a9.781,9.781,0,0,1,1.059-.286l-2.41-.221-.974-.091A9.414,9.414,0,0,1,479,361.527h.7a7.625,7.625,0,0,1,1.02.084A2.885,2.885,0,0,1,479,358.8a9.362,9.362,0,0,0,5.97,1.988h.247a19.494,19.494,0,0,1-.221-2.124h0a21.545,21.545,0,0,1,0-2.9,5.483,5.483,0,0,0,4.4,1.468l-1.351-1.884a6.165,6.165,0,0,0,4.262,1.332l.312-.033a4.547,4.547,0,0,0,.773-.149h.058c-.123-.156-.234-.318-.344-.487l-.039-.078a6.282,6.282,0,0,1-.65-1.358,4.284,4.284,0,0,1-.156-.565h0a5.684,5.684,0,0,1,.292-3.541c2.1,1.754,4.4,4.151,7.146,2.339s2.839-5.139,7.146-4.8a6.626,6.626,0,0,1,5.464,3.976,4.385,4.385,0,0,1,4.983-1.137,4.45,4.45,0,0,1,2.521,4.476c1.786-.448,3.71-.89,5.425-.214s2.82,2.865,1.845,4.327a.931.931,0,0,1-.091.13c-.8,1.033-2.566,1.6-2.378,2.9l.273.195.845.611q4.97,3.586,9.68,7.536c1.611,1.351,3.326,2.975,3.437,5.087a5.617,5.617,0,0,1-.156,1.54h0c-.1.507-.247,1.013-.357,1.52a12.676,12.676,0,0,0-.221,3.93h0c.045.383.1.76.175,1.143.994,5.022,5.009,9.167,5.405,14.292v.364a11.546,11.546,0,0,1-.045,1.644c-.3,3.118-1.741,6.113-2.91,9.1-.072.182-.143.364-.208.546a90.5,90.5,0,0,0-4.548,18.294,65.14,65.14,0,0,1-1.3,6.555,17.365,17.365,0,0,1-3.307,6.776,10.536,10.536,0,0,1-2.183,1.949,12.132,12.132,0,0,1-1.722.916v.039c.071.4.13.793.2,1.189.039.208.071.416.11.65h0a.089.089,0,0,0,0,.039c.546,3.073,1.169,6.081,1.826,8.939l.331,1.423c8.186,2.956,9.154,9.011,9.212,11.33a6.259,6.259,0,0,1,0,.929s12.343.325,17.216,3.9a13.21,13.21,0,0,0,2.93,1.494,53.917,53.917,0,0,0,6.009,1.877c1.046.273,2.137.539,3.248.8,1.949.448,4.015.884,6.009,1.3,5.321,1.072,10.33,1.949,12.87,2.6,6.061,1.533,19.925,14.825,19.925,14.825s1.624,13.409,3.248,15.364,4.548,8.829,4.548,8.829l10.745,19.106,4.548,8.036h2.923a4.97,4.97,0,0,1,2.085,1.364c.773.689,1.631,1.546,2.384,2.326l1.247,1.332.78.864s4.723.117,6,3.852c3.846-.11,8.569.143,11.876,1.624a9.187,9.187,0,0,1,1.3.7,5.639,5.639,0,0,1,2.683,3.677,5.422,5.422,0,0,1,.117.935c0,.37,0,.741,0,1.1-.234,4.918-3.437,9.011-6.38,11.765l.208.37s-.1.234-.286.65c-.052.123-.117.26-.188.416h0c-.383.819-.994,2.046-1.793,3.482a41.136,41.136,0,0,1-6.217,8.556l-.188.195-37.511.344-.11-.13-7.276-8.679-3.619-4.314-.11-.136-.1,1.033-.351,3.443-.845,8.322-.045.416v.11l-.1.961.071-.961h-.188l-69.513.65-114.092,1.26v.546h-.091v-.546l-29.072.312Z" data-name="Path 442" transform="translate(418.007 -14.269)"/><path id="Path_443" fill="#fbbebe" d="M586.185,511.522s-64.641,7.8-58.469,0c2.235-2.82,2.852-11.174,2.729-20.691-.039-2.891-.143-5.886-.292-8.868-.715-14.292-2.436-28.26-2.436-28.26s56.52-26.636,50.023-5.522c-2.6,8.53-1.748,20.51.227,31.755.578,3.281,1.247,6.5,1.949,9.55a223.892,223.892,0,0,0,6.269,22.036Z" data-name="Path 443" transform="translate(367.711 -46.521)"/><path id="Path_444" d="M586.185,537.354s-64.641,7.8-58.469,0c2.235-2.82,2.852-11.174,2.729-20.692,9.855-4.21,22.394-1.072,22.394-1.072,13.2-2.631,21.666-2.118,27.078-.273A223.888,223.888,0,0,0,586.185,537.354Z" data-name="Path 444" opacity=".1" transform="translate(367.711 -72.353)"/><path id="Path_445" fill="#00ddf1" d="M413.346,651.973v-.546l114.092-1.241,69.513-.65h.195l-.071.961.1-.961h.123v-.11l.89-8.738.338-3.307.1-1.033.091-.864,4.015-13.389,4.015-13.37,3.378-11.258,5.158-17.2s-2.923-6.821-4.548-8.77-3.248-15.267-3.248-15.267-13.864-13.208-19.925-14.728c-2.54-.65-7.555-1.514-12.883-2.6-1.994-.4-4.041-.832-6.009-1.3-1.111-.253-2.2-.52-3.248-.786a57.086,57.086,0,0,1-6.009-1.858,13.448,13.448,0,0,1-2.924-1.488c-4.775-3.5-16.742-3.9-17.2-3.9h0a.269.269,0,0,1,0-.045v-.058a6.66,6.66,0,0,0,0-.819,5.208,5.208,0,0,0-.059-.91.82.82,0,0,0-.045-.325c-.032-.234-.071-.481-.13-.741a3.226,3.226,0,0,0-.078-.344,11.181,11.181,0,0,0-.812-2.267c-.045-.1-.1-.214-.156-.318a11.861,11.861,0,0,0-1.1-1.709c-.084-.11-.175-.227-.273-.338a12.721,12.721,0,0,0-1.767-1.715c-.175-.136-.357-.279-.546-.409a3.026,3.026,0,0,0-.331-.234l-.578-.377-.539-.312c-.474-.26-.974-.513-1.52-.754-.169-.078-.351-.149-.533-.221s-.468-.182-.708-.273h-.039l-.487-.195c-.37-.123-.747-.234-1.143-.344l-.6-.156-.65-.149-.65-.136c-.65-.13-1.345-.247-2.072-.338l-.741-.091-.76-.078-.786-.065-1.117-.065-1.3-.045a81.017,81.017,0,0,0-17.054,1.814,46.946,46.946,0,0,0-11.855-1.093h-.565l-.65.039h-.416l-.838.078a6.224,6.224,0,0,0-.845.1c-.279.039-.572.071-.851.117l-.429.071c-.422.071-.851.149-1.3.24q-.214.039-.429.1c-.565.123-1.13.273-1.689.442-.279.078-.559.169-.838.266-.143.039-.279.091-.416.143l-.416.149-.409.162-.487.195c-.247.1-.487.214-.728.331-.136.058-.273.123-.4.195s-.266.13-.39.2a18.03,18.03,0,0,0-4.034,2.846l-.331.318-.325.331c-.11.11-.214.227-.318.344a15.473,15.473,0,0,0-1.182,1.462c-.1.136-.2.273-.3.416a17.335,17.335,0,0,0-1.117,1.9c-.084.156-.162.318-.24.474a21.243,21.243,0,0,0-1.3,3.411q-.182.65-.331,1.3s-13.753,6.068-25.161,10.46c-3.034,1.169-5.892,2.228-8.283,3.027-.7.234-1.345.448-1.949.65a17.347,17.347,0,0,1-4.06.935,12.778,12.778,0,0,0-1.949.182c-5.243.851-14.227,4.548-15.208,8.257a2.4,2.4,0,0,0-.065.91v.071c.65,4.548-3.9,3.9-3.9,3.9s-1.624,12.019-3.9,15.267c-1.644,2.339-2.768,7.555-2.91,11.492h0a12.741,12.741,0,0,0,.286,3.658v.091c.26.871-.364,3.248-1.423,6.3-1.15,3.346-2.826,7.5-4.437,11.427-2.43,5.925-4.716,11.3-4.859,12.486-.058.526-.227,1.468-.461,2.683-.948,4.95-3.053,14.377-4.093,18.19-.773,2.845-1.9,6.743-2.67,9.42a.91.91,0,0,1-.065.227l29.124-.286v.546h.091Z" data-name="Path 445" transform="translate(417.856 -73.042)"/><path id="Path_446" d="M445.44,607.57s37.03,19.165,50.348,16.891Z" data-name="Path 446" opacity=".1" transform="translate(396.391 -105.214)"/><path id="Path_447" d="M561.44,595.57s36.056,11.694,48.074,13.318S561.44,595.57,561.44,595.57Z" data-name="Path 447" opacity=".1" transform="translate(355.751 -101.01)"/><path id="Path_448" d="M585.443,530.686c-18.84,3.469-54.311,2.722-69.643,2.2,5.62-20.139,33.022-13.292,33.022-13.292C582.74,512.821,585.339,526.866,585.443,530.686Z" data-name="Path 448" opacity=".1" transform="translate(371.74 -73.754)"/><path id="Path_449" fill="#00ddf1" d="M585.443,528.686c-18.84,3.469-54.311,2.722-69.643,2.2,5.62-20.139,33.022-13.292,33.022-13.292C582.74,510.821,585.339,524.866,585.443,528.686Z" data-name="Path 449" transform="translate(371.74 -73.053)"/><path id="Path_450" fill="#fbbebe" d="M776.94,672.008s22.192-3.411,22.628,6.334S788.25,694.9,788.25,694.9Z" data-name="Path 450" transform="translate(280.251 -127.587)"/><path id="Path_451" d="M578.17,479.936a30.558,30.558,0,0,1-2.923,1.13c-7,2.417-14.065,4.853-21.439,5.736s-15.111.1-21.543-3.573a18.685,18.685,0,0,1-1.949-1.267c-.715-14.292-2.436-28.26-2.436-28.26s56.52-26.636,50.023-5.522C575.318,456.711,576.195,468.69,578.17,479.936Z" data-name="Path 451" opacity=".1" transform="translate(367.508 -46.521)"/><path id="Path_452" fill="#3f3d56" d="M536.9,360.29a6.153,6.153,0,0,1-5.405-1.137l1.351,1.878a5.5,5.5,0,0,1-4.4-1.462,22.146,22.146,0,0,0,.208,5.035,9.433,9.433,0,0,1-6.211-1.949,2.872,2.872,0,0,0,1.715,2.8,9.316,9.316,0,0,0-10.135,6.958l3.391.312a12,12,0,0,0-6.782,4.138c-1.039,1.3-1.832,2.962-1.377,4.548s2.651,2.6,3.846,1.468a18.151,18.151,0,0,0-3.963,14.806,9.4,9.4,0,0,1,.3,3.417,28.993,28.993,0,0,1-1.228,3.047c-.65,1.9-.032,3.956.546,5.847l3.047,10.018c1.1,3.619,2.2,7.244,3.645,10.745a53.328,53.328,0,0,1,2.6,6.828c.819,3.144.851,6.588,2.6,9.336a12.948,12.948,0,0,0,4.665,4.112c6.425,3.677,14.188,4.457,21.542,3.573s14.409-3.32,21.406-5.736a20.141,20.141,0,0,0,4.444-1.949c4.84-3.17,5.918-9.654,6.821-15.364a87.242,87.242,0,0,1,4.736-18.71c1.416-3.567,3.248-7.185,2.936-11.005-.4-5.074-4.411-9.186-5.405-14.175a12.344,12.344,0,0,1,.045-5.048,11.473,11.473,0,0,0,.513-3.053c-.11-2.092-1.826-3.7-3.437-5.048q-5.243-4.379-10.823-8.277c-.188-1.3,1.579-1.858,2.378-2.884,1.13-1.449-.039-3.748-1.754-4.424s-3.638-.234-5.425.214a4.281,4.281,0,0,0-7.5-3.32,6.627,6.627,0,0,0-5.47-3.95c-4.307-.338-4.392,2.956-7.146,4.768s-5.028-.578-7.146-2.319A6.029,6.029,0,0,0,536.9,360.29Z" data-name="Path 452" transform="translate(374.5 -15.625)"/><path id="Path_453" fill="#00ddf1" d="M768.171,669.128s-.578,1.377-1.644,3.372a44.83,44.83,0,0,1-5.847,8.556l-.175.188h-1.052l-37.511.344h-.9l-.11-.13-7.276-8.634-2.741-3.255-.11-.136-.234-.273-.13-.156-.169-.2-5.334-6.328,1.949-8.121,3.32-13.682.084-.331.65-2.6.461-1.949,1.546-6.354,5.3-21.861,9.42,4.872,9.933,17.541,5.334,9.42h2.923c.552,0,1.819,1.065,3.092,2.293.455.435.91.9,1.3,1.3,1.156,1.2,2.072,2.222,2.072,2.222s4.736.1,6.009,3.833a4.537,4.537,0,0,1,.162.552,26.191,26.191,0,0,0,1.644,4.262c.838,1.826,1.891,3.9,2.956,5.97,1.981,3.8,4,7.419,4.736,8.731l.091.162Z" data-name="Path 453" transform="translate(305.476 -105.217)"/><path id="Path_454" d="M615.681,653.093l-.065.929v.065l-.11,1.494-.864,12.025L613.6,682.093l-.3,4.08-.65,8.731v.11l-69.513.65L429.061,696.9v.546h-.091v-.728l.292-9.329.559-18.229L430.3,653.7l.045-1.54a6.841,6.841,0,0,1,7.419-6.607c3.066.26,7.049.578,11.811.916l1.949.143c27.5,1.91,78.322,4.379,129.606,1.3,1.078-.059,2.163-.123,3.248-.2,7.952-.5,15.9-1.143,23.764-1.949a6.841,6.841,0,0,1,7.536,7.3Z" data-name="Path 454" opacity=".1" transform="translate(402.161 -118.514)"/><path id="Path_455" fill="#3f3d56" d="M429.08,698.857v-.546l114.092-1.241,69.513-.65h.195v-.11l.65-8.731.279-3.9,1.065-14.689.838-11.629v-.286a6.893,6.893,0,0,0-.071-1.6.2.2,0,0,0,0-.065,6.751,6.751,0,0,0-1.3-3.014,6.847,6.847,0,0,0-6.12-2.6c-7.867.806-15.813,1.449-23.764,1.949-1.085.078-2.17.143-3.248.2-51.284,3.047-102.106.578-129.606-1.3l-1.949-.143c-4.762-.338-8.744-.65-11.811-.916a6.847,6.847,0,0,0-7.3,5.542,7.146,7.146,0,0,0-.117,1.065l-.442,14.4-.6,18.236-.286,9.329v.728Z" data-name="Path 455" transform="translate(402.122 -119.926)"/><path id="Path_456" d="M615.925,661.692l-.8,9.959L613.937,686.5l-.3,3.716-.65,8.322-.039.416v.11h0l-.1.961.071-.961h-.188l-69.513.65L429.11,700.944v-.182l.318-9.329.65-18.229.416-12.116a4.132,4.132,0,0,1,1.988-3.411,4.061,4.061,0,0,1,2.456-.585c1.364.11,3.04.24,5,.383,3.177.234,7.094.507,11.655.793,8.445.533,19.041,1.1,31.183,1.572,33.782,1.3,79.388,1.735,122.707-2.059,1.949-.169,3.963-.357,5.931-.546a4.066,4.066,0,0,1,2.261.429,3.346,3.346,0,0,1,.559.351,3.989,3.989,0,0,1,1.3,1.6,2.315,2.315,0,0,1,.162.4A4.08,4.08,0,0,1,615.925,661.692Z" data-name="Path 456" opacity=".1" transform="translate(402.112 -122.559)"/><path id="Path_457" d="M360.914,677.87v2.072a3.982,3.982,0,0,1-2.274,3.6l-26.051.5a3.976,3.976,0,0,1-2.319-3.619v-1.949Z" data-name="Path 457" opacity=".1" transform="translate(436.74 -129.843)"/><path id="Path_458" fill="#3f3d56" d="M280.294,512.532l-33.944.65V507.55l33.944-.65Z" data-name="Path 458" transform="translate(517.685 42.387)"/><path id="Path_459" d="M280.294,512.532l-33.944.65V507.55l33.944-.65Z" data-name="Path 459" opacity=".1" transform="translate(517.685 42.387)"/><path id="Path_460" fill="#3f3d56" d="M282.294,512.532l-33.944.65V507.55l33.944-.65Z" data-name="Path 460" transform="translate(516.984 42.387)"/><path id="Path_461" d="M552.228,360.039A6.334,6.334,0,0,1,551,357.22a6.165,6.165,0,0,0,.273,2.988A5.847,5.847,0,0,0,552.228,360.039Z" data-name="Path 461" transform="translate(359.434 -17.505)"/><path id="Path_462" d="M540.1,366.9a22.83,22.83,0,0,1-.24-2.4c0,.8,0,1.6,0,2.41Z" data-name="Path 462" transform="translate(363.311 -20.056)"/><path id="Path_463" d="M621.706,398.627a11.912,11.912,0,0,1,.234-1.722,11.7,11.7,0,0,0,.52-3.047,4.008,4.008,0,0,0-.1-.689c-.11.6-.286,1.2-.416,1.787a12.433,12.433,0,0,0-.234,3.671Z" data-name="Path 463" transform="translate(334.652 -30.1)"/><path id="Path_464" d="M600.922,368.894l.708.513a12.8,12.8,0,0,0,1.67-1.442,2.384,2.384,0,0,0,.247-2.365,1.95,1.95,0,0,1-.247.416C602.5,367.042,600.734,367.607,600.922,368.894Z" data-name="Path 464" transform="translate(341.923 -20.441)"/><path id="Path_465" d="M518.455,380.29a8,8,0,0,0-.565,1.481,11.8,11.8,0,0,1,3.248-1.228Z" data-name="Path 465" transform="translate(371.008 -25.587)"/><path id="Path_466" d="M531.888,368.979a9.637,9.637,0,0,1-1.221-.8,2.758,2.758,0,0,0,.058.767,7.7,7.7,0,0,1,1.163.033Z" data-name="Path 466" transform="translate(366.534 -21.345)"/><path id="Path_467" d="M587.579,428.33c-.266,3.151-1.735,6.185-2.923,9.173a87.2,87.2,0,0,0-4.736,18.717c-.9,5.71-1.949,12.194-6.821,15.358a19.488,19.488,0,0,1-4.437,1.949c-7,2.423-14.065,4.853-21.439,5.736s-15.111.11-21.543-3.567a12.993,12.993,0,0,1-4.664-4.112c-1.735-2.748-1.767-6.191-2.6-9.336a53.424,53.424,0,0,0-2.6-6.834c-1.436-3.5-2.54-7.146-3.638-10.739q-1.527-5.009-3.047-10.024a18.716,18.716,0,0,1-.741-3.086,11.644,11.644,0,0,0,.741,5.035q1.52,5.022,3.047,10.024c1.1,3.619,2.2,7.244,3.638,10.739a53.417,53.417,0,0,1,2.6,6.834c.819,3.144.851,6.587,2.6,9.336a12.993,12.993,0,0,0,4.664,4.112c6.432,3.677,14.188,4.45,21.543,3.567s14.409-3.313,21.439-5.736a19.487,19.487,0,0,0,4.437-1.949c4.84-3.164,5.918-9.647,6.821-15.358a87.2,87.2,0,0,1,4.736-18.717c1.416-3.56,3.248-7.179,2.936-11.005C587.592,428.408,587.579,428.369,587.579,428.33Z" data-name="Path 467" transform="translate(374.359 -42.418)"/><path id="Path_468" d="M510.318,421.419v-.071a9.1,9.1,0,0,0-.3-3.411,17.272,17.272,0,0,1-.253-2.157,17.769,17.769,0,0,0,.253,4.106C510.123,420.393,510.24,420.906,510.318,421.419Z" data-name="Path 468" transform="translate(373.864 -38.021)"/><path id="Path_469" d="M512.452,397.929a18.02,18.02,0,0,1,1.7-2.384c-1.189,1.137-3.385.123-3.846-1.455a3.788,3.788,0,0,0,0,1.949,2.852,2.852,0,0,0,2.15,1.89Z" data-name="Path 469" transform="translate(373.712 -30.422)"/><path id="Path_470" d="M762.946,656.57s2.059,7.471,0,13.968S762.946,656.57,762.946,656.57Z" data-name="Path 470" opacity=".1" transform="translate(285.475 -122.381)"/><path id="Path_471" d="M776,668.3s.864,9.485-1.085,11.168S776,668.3,776,668.3Z" data-name="Path 471" opacity=".1" transform="translate(281.189 -126.49)"/><line id="Line_88" x2="66.011" y1=".65" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2" data-name="Line 88" transform="translate(733.267 442.068)"/><line id="Line_89" x2="66.011" y1=".643" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2" data-name="Line 89" transform="translate(733.267 450.176)"/><line id="Line_90" x2="66.011" y1=".65" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2" data-name="Line 90" transform="translate(733.267 458.277)"/></g></g></g></svg> \ No newline at end of file diff --git a/apps/OpenSign/src/assets/images/logo.png b/apps/OpenSign/src/assets/images/logo.png index 8db5381242d1dafd321f1e8137d246b0b9d72cd7..a8bdc1405d9172c20977a9db77c2985625709f2d 100644 GIT binary patch literal 16183 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 UUsqx;75t~CWqi3z<7U|Z0##vmUH||9 literal 88554 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 HgJ0r*^(4=5 diff --git a/apps/OpenSign/src/assets/images/pad.svg b/apps/OpenSign/src/assets/images/pad.svg index 2db7e9fe22..5248025546 100644 --- a/apps/OpenSign/src/assets/images/pad.svg +++ b/apps/OpenSign/src/assets/images/pad.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="103.06" height="98.114" viewBox="0 0 103.06 98.114"><defs><style>.a{fill:#e0e0e0;}.b,.k{opacity:0.5;}.c{fill:url(#a);}.d{fill:#fafafa;}.e{fill:url(#b);}.f{fill:url(#c);}.g,.k{fill:#c2c2c2;}.h{fill:url(#d);}.i{fill:#fff;}.j{fill:url(#f);}</style><linearGradient id="a" x1="0.509" y1="0.997" x2="0.509" y2="-0.003" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="gray" stop-opacity="0.251"/><stop offset="0.54" stop-color="gray" stop-opacity="0.122"/><stop offset="1" stop-color="gray" stop-opacity="0.102"/></linearGradient><linearGradient id="b" x1="0.813" y1="0.841" x2="0.813" y2="-0.159" xlink:href="#a"/><linearGradient id="c" x1="1.78" y1="0.849" x2="1.78" y2="-0.151" xlink:href="#a"/><linearGradient id="d" x1="0.5" y1="1" x2="0.5" y2="0" xlink:href="#a"/><linearGradient id="f" x1="0.5" y1="0.999" x2="0.5" y2="-0.001" xlink:href="#a"/></defs><rect class="a" width="54.914" height="75.874" transform="matrix(0.978, -0.21, 0.21, 0.978, 8.686, 17.025)"/><g class="b" transform="translate(9.863 6.954)"><rect class="c" width="53.059" height="73.309" transform="matrix(0.978, -0.21, 0.21, 0.978, 0, 11.131)"/></g><rect class="d" width="51.708" height="71.69" transform="matrix(0.978, -0.21, 0.21, 0.978, 10.636, 18.471)"/><rect class="e" width="25.652" height="6.214" transform="matrix(0.978, -0.21, 0.21, 0.978, 22.788, 12.685)"/><path class="f" d="M441.307,91.352a3.672,3.672,0,1,0,4.272,2.837A3.629,3.629,0,0,0,441.307,91.352Zm1.215,5.667a2.119,2.119,0,1,1,1.578-2.513,2.093,2.093,0,0,1-1.578,2.513Z" transform="translate(-407.253 -87.292)"/><rect class="g" width="25.111" height="5.94" transform="matrix(0.978, -0.21, 0.21, 0.978, 22.996, 12.367)"/><path class="g" d="M441.629,91.351a3.51,3.51,0,1,0,4.168,2.7A3.51,3.51,0,0,0,441.629,91.351Zm1.161,5.416a2.026,2.026,0,1,1,1.556-2.405A2.026,2.026,0,0,1,442.79,96.767Z" transform="translate(-407.575 -87.291)"/><rect class="a" width="54.914" height="75.874" transform="translate(32.406 14.691)"/><g class="b" transform="translate(33.334 15.973)"><rect class="h" width="53.059" height="73.309"/></g><rect class="i" width="51.708" height="71.69" transform="translate(34.009 16.514)"/><rect class="h" width="25.652" height="6.214" transform="translate(47.105 13.405)"/><path class="j" d="M641.906,118a3.673,3.673,0,1,0,3.586,3.672A3.63,3.63,0,0,0,641.906,118Zm0,5.79a2.119,2.119,0,1,1,2.068-2.119,2.093,2.093,0,0,1-2.068,2.109Z" transform="translate(-581.976 -110.66)"/><rect class="g" width="25.111" height="5.94" transform="translate(47.375 13.139)"/><path class="g" d="M642.44,118a3.51,3.51,0,1,0,3.51,3.51A3.51,3.51,0,0,0,642.44,118Zm0,5.535a2.027,2.027,0,1,0,0-.006Z" transform="translate(-582.509 -110.66)"/><g class="b" transform="translate(0.816 92.615)"><rect class="g" width="0.472" height="2.68" transform="translate(1.103)"/><rect class="g" width="0.472" height="2.68" transform="translate(2.68 1.105) rotate(90)"/></g><g class="b" transform="translate(55.629)"><rect class="g" width="0.472" height="2.68" transform="translate(1.103)"/><rect class="g" width="0.472" height="2.68" transform="translate(2.68 1.103) rotate(90)"/></g><path class="k" d="M947.527,824.693a.579.579,0,0,1-.323-.7.278.278,0,0,0,.013-.064h0a.29.29,0,0,0-.522-.192h0a.293.293,0,0,0-.033.057.579.579,0,0,1-.7.323.278.278,0,0,0-.064-.013h0a.29.29,0,0,0-.192.521h0a.281.281,0,0,0,.057.033.579.579,0,0,1,.323.7.271.271,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.274.274,0,0,0,.033-.057.579.579,0,0,1,.7-.323.278.278,0,0,0,.064.013h0a.29.29,0,0,0,.192-.522h0A.274.274,0,0,0,947.527,824.693Z" transform="translate(-850.636 -727.615)"/><path class="k" d="M313.117,619.633a.579.579,0,0,1-.323-.7.277.277,0,0,0,.013-.064h0a.29.29,0,0,0-.521-.192h0a.277.277,0,0,0-.033.056.579.579,0,0,1-.7.323.287.287,0,0,0-.064-.013h0a.29.29,0,0,0-.192.522h0a.285.285,0,0,0,.057.033.579.579,0,0,1,.323.7.282.282,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.278.278,0,0,0,.033-.057.579.579,0,0,1,.7-.323.279.279,0,0,0,.064.012h0a.29.29,0,0,0,.192-.521h0A.276.276,0,0,0,313.117,619.633Z" transform="translate(-295.944 -548.323)"/><path class="k" d="M841.527,120.313a.579.579,0,0,1-.323-.7.279.279,0,0,0,.012-.064h0a.29.29,0,0,0-.521-.192h0a.274.274,0,0,0-.033.057.579.579,0,0,1-.7.323.282.282,0,0,0-.064-.013h0a.29.29,0,0,0-.192.521h0a.279.279,0,0,0,.057.033.579.579,0,0,1,.323.7.28.28,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.281.281,0,0,0,.033-.057.579.579,0,0,1,.7-.323.279.279,0,0,0,.064.013h0a.29.29,0,0,0,.192-.521h0A.279.279,0,0,0,841.527,120.313Z" transform="translate(-757.955 -111.745)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(101.167 38.569)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(28.047 92.875)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(91.45 59.021)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(10.004 11.161)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(0 36.972)"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="103.06" height="98.114" viewBox="0 0 103.06 98.114"><defs><style>.a{fill:#e0e0e0}.b,.k{opacity:.5}.c{fill:url(#a)}.d{fill:#fafafa}.e{fill:url(#b)}.f{fill:url(#c)}.g,.k{fill:#c2c2c2}.h{fill:url(#d)}.i{fill:#fff}.j{fill:url(#f)}</style><linearGradient id="a" x1=".509" x2=".509" y1=".997" y2="-.003" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="gray" stop-opacity=".251"/><stop offset=".54" stop-color="gray" stop-opacity=".122"/><stop offset="1" stop-color="gray" stop-opacity=".102"/></linearGradient><linearGradient id="b" x1=".813" x2=".813" y1=".841" y2="-.159" xlink:href="#a"/><linearGradient id="c" x1="1.78" x2="1.78" y1=".849" y2="-.151" xlink:href="#a"/><linearGradient id="d" x1=".5" x2=".5" y1="1" y2="0" xlink:href="#a"/><linearGradient id="f" x1=".5" x2=".5" y1=".999" y2="-.001" xlink:href="#a"/></defs><rect width="54.914" height="75.874" class="a" transform="matrix(0.978, -0.21, 0.21, 0.978, 8.686, 17.025)"/><g class="b" transform="translate(9.863 6.954)"><rect width="53.059" height="73.309" class="c" transform="matrix(0.978, -0.21, 0.21, 0.978, 0, 11.131)"/></g><rect width="51.708" height="71.69" class="d" transform="matrix(0.978, -0.21, 0.21, 0.978, 10.636, 18.471)"/><rect width="25.652" height="6.214" class="e" transform="matrix(0.978, -0.21, 0.21, 0.978, 22.788, 12.685)"/><path d="M441.307,91.352a3.672,3.672,0,1,0,4.272,2.837A3.629,3.629,0,0,0,441.307,91.352Zm1.215,5.667a2.119,2.119,0,1,1,1.578-2.513,2.093,2.093,0,0,1-1.578,2.513Z" class="f" transform="translate(-407.253 -87.292)"/><rect width="25.111" height="5.94" class="g" transform="matrix(0.978, -0.21, 0.21, 0.978, 22.996, 12.367)"/><path d="M441.629,91.351a3.51,3.51,0,1,0,4.168,2.7A3.51,3.51,0,0,0,441.629,91.351Zm1.161,5.416a2.026,2.026,0,1,1,1.556-2.405A2.026,2.026,0,0,1,442.79,96.767Z" class="g" transform="translate(-407.575 -87.291)"/><rect width="54.914" height="75.874" class="a" transform="translate(32.406 14.691)"/><g class="b" transform="translate(33.334 15.973)"><rect width="53.059" height="73.309" class="h"/></g><rect width="51.708" height="71.69" class="i" transform="translate(34.009 16.514)"/><rect width="25.652" height="6.214" class="h" transform="translate(47.105 13.405)"/><path d="M641.906,118a3.673,3.673,0,1,0,3.586,3.672A3.63,3.63,0,0,0,641.906,118Zm0,5.79a2.119,2.119,0,1,1,2.068-2.119,2.093,2.093,0,0,1-2.068,2.109Z" class="j" transform="translate(-581.976 -110.66)"/><rect width="25.111" height="5.94" class="g" transform="translate(47.375 13.139)"/><path d="M642.44,118a3.51,3.51,0,1,0,3.51,3.51A3.51,3.51,0,0,0,642.44,118Zm0,5.535a2.027,2.027,0,1,0,0-.006Z" class="g" transform="translate(-582.509 -110.66)"/><g class="b" transform="translate(0.816 92.615)"><rect width=".472" height="2.68" class="g" transform="translate(1.103)"/><rect width=".472" height="2.68" class="g" transform="translate(2.68 1.105) rotate(90)"/></g><g class="b" transform="translate(55.629)"><rect width=".472" height="2.68" class="g" transform="translate(1.103)"/><rect width=".472" height="2.68" class="g" transform="translate(2.68 1.103) rotate(90)"/></g><path d="M947.527,824.693a.579.579,0,0,1-.323-.7.278.278,0,0,0,.013-.064h0a.29.29,0,0,0-.522-.192h0a.293.293,0,0,0-.033.057.579.579,0,0,1-.7.323.278.278,0,0,0-.064-.013h0a.29.29,0,0,0-.192.521h0a.281.281,0,0,0,.057.033.579.579,0,0,1,.323.7.271.271,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.274.274,0,0,0,.033-.057.579.579,0,0,1,.7-.323.278.278,0,0,0,.064.013h0a.29.29,0,0,0,.192-.522h0A.274.274,0,0,0,947.527,824.693Z" class="k" transform="translate(-850.636 -727.615)"/><path d="M313.117,619.633a.579.579,0,0,1-.323-.7.277.277,0,0,0,.013-.064h0a.29.29,0,0,0-.521-.192h0a.277.277,0,0,0-.033.056.579.579,0,0,1-.7.323.287.287,0,0,0-.064-.013h0a.29.29,0,0,0-.192.522h0a.285.285,0,0,0,.057.033.579.579,0,0,1,.323.7.282.282,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.278.278,0,0,0,.033-.057.579.579,0,0,1,.7-.323.279.279,0,0,0,.064.012h0a.29.29,0,0,0,.192-.521h0A.276.276,0,0,0,313.117,619.633Z" class="k" transform="translate(-295.944 -548.323)"/><path d="M841.527,120.313a.579.579,0,0,1-.323-.7.279.279,0,0,0,.012-.064h0a.29.29,0,0,0-.521-.192h0a.274.274,0,0,0-.033.057.579.579,0,0,1-.7.323.282.282,0,0,0-.064-.013h0a.29.29,0,0,0-.192.521h0a.279.279,0,0,0,.057.033.579.579,0,0,1,.323.7.28.28,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.281.281,0,0,0,.033-.057.579.579,0,0,1,.7-.323.279.279,0,0,0,.064.013h0a.29.29,0,0,0,.192-.521h0A.279.279,0,0,0,841.527,120.313Z" class="k" transform="translate(-757.955 -111.745)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(101.167 38.569)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(28.047 92.875)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(91.45 59.021)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(10.004 11.161)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(0 36.972)"/></svg> \ No newline at end of file diff --git a/apps/OpenSign/src/assets/images/pdf3.png b/apps/OpenSign/src/assets/images/pdf3.png index 54868d5e811c8d2a433c24e831b8a00279dad644..f529b452c12067c0a5972191c5ec70bfd9ef04e2 100644 GIT binary patch literal 10008 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 literal 11944 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 diff --git a/apps/OpenSign/src/assets/images/recreatedoc.png b/apps/OpenSign/src/assets/images/recreatedoc.png index 3348345cc90eba29c68e212d998b3f18006d2a53..0dcd06762e40df87eaa411b03fd21871416989f3 100644 GIT binary patch literal 41045 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 F{{cqeKSlrm literal 41662 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 LMTtsrqk#Vb4@g3} diff --git a/apps/OpenSign/src/components/AddSigner.jsx b/apps/OpenSign/src/components/AddSigner.jsx index 4bf088502c..a1b7ed8000 100644 --- a/apps/OpenSign/src/components/AddSigner.jsx +++ b/apps/OpenSign/src/components/AddSigner.jsx @@ -49,7 +49,7 @@ const AddSigner = (props) => { e.preventDefault(); e.stopPropagation(); if (!emailRegex.test(email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { setIsLoader(true); if (localStorage.getItem("TenantId")) { diff --git a/apps/OpenSign/src/components/AddUser.jsx b/apps/OpenSign/src/components/AddUser.jsx index 27fc8b0934..d8da34dd09 100644 --- a/apps/OpenSign/src/components/AddUser.jsx +++ b/apps/OpenSign/src/components/AddUser.jsx @@ -1,6 +1,5 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Parse from "parse"; -import Title from "./Title"; import Loader from "../primitives/Loader"; import { copytoData, @@ -72,7 +71,7 @@ const AddUser = (props) => { e.preventDefault(); e.stopPropagation(); if (!emailRegex.test(formdata.email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { const localUser = JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; setIsFormLoader(true); @@ -100,7 +99,6 @@ const AddUser = (props) => { }; const res = await Parse.Cloud.run("adduser", params); const parseData = JSON.parse(JSON.stringify(res)); - console.log("parseData ", parseData); if (props.closePopup) { props.closePopup(); } @@ -155,7 +153,6 @@ const AddUser = (props) => { }; return ( <div className="shadow-md rounded-box my-[1px] p-3 bg-base-100 relative"> - <Title title={t("add-user")} /> {isFormLoader && ( <div className="absolute w-full h-full inset-0 flex justify-center items-center bg-base-content/30 z-50"> <Loader /> @@ -166,7 +163,7 @@ const AddUser = (props) => { <div className="mb-3"> <label htmlFor="name" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("name")} <span className="text-[red] text-[13px]"> *</span> @@ -187,7 +184,7 @@ const AddUser = (props) => { <div className="mb-3"> <label htmlFor="email" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("email")} <span className="text-[red] text-[13px]"> *</span> @@ -206,7 +203,7 @@ const AddUser = (props) => { /> </div> <div className="mb-3"> - <label className="block text-xs text-gray-700 font-semibold"> + <label className="block text-xs font-semibold"> {t("password")} </label> <div className="flex justify-between items-center op-input op-input-bordered op-input-sm text-base-content w-full h-full text-[13px]"> @@ -223,7 +220,7 @@ const AddUser = (props) => { <div className="mb-3"> <label htmlFor="phone" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("phone")} {/* <span className="text-[red] text-[13px]"> *</span> */} @@ -240,7 +237,7 @@ const AddUser = (props) => { <div className="mb-3"> <label htmlFor="phone" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("Role")} <span className="text-[red] text-[13px]"> *</span> diff --git a/apps/OpenSign/src/components/BulkSendUi.jsx b/apps/OpenSign/src/components/BulkSendUi.jsx index 439084825a..ea9b814180 100644 --- a/apps/OpenSign/src/components/BulkSendUi.jsx +++ b/apps/OpenSign/src/components/BulkSendUi.jsx @@ -17,6 +17,7 @@ const BulkSendUi = (props) => { const [isLoader, setIsLoader] = useState(false); const [signers, setSigners] = useState([]); const [emails, setEmails] = useState([]); + const [isPrefillExist, setIsPrefillExist] = useState(false); useEffect(() => { signatureExist(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -24,9 +25,14 @@ const BulkSendUi = (props) => { //function to check at least one signature field exist const signatureExist = async () => { + const isPrefill = props?.Placeholders.some((x) => x?.Role === "prefill"); + if (isPrefill) { + setIsPrefillExist(isPrefill); + } setIsDisableBulkSend(false); const getPlaceholder = props?.Placeholders; - const checkIsSignatureExistt = getPlaceholder?.every((placeholderObj) => + const removePrefill = getPlaceholder.filter((x) => x?.Role !== "prefill"); + const checkIsSignatureExistt = removePrefill?.every((placeholderObj) => placeholderObj?.placeHolder?.some((holder) => holder?.pos?.some((posItem) => posItem?.type === "signature") ) @@ -216,7 +222,11 @@ const BulkSendUi = (props) => { <Loader /> </div> )} - {!isDisableBulkSend ? ( + {isPrefillExist ? ( + <div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center"> + {t("prefill-bulk-error")} + </div> + ) : !isDisableBulkSend ? ( <> {props.Placeholders?.length > 0 ? ( isSignatureExist ? ( diff --git a/apps/OpenSign/src/components/ColumnSelector.jsx b/apps/OpenSign/src/components/ColumnSelector.jsx new file mode 100644 index 0000000000..879461db2f --- /dev/null +++ b/apps/OpenSign/src/components/ColumnSelector.jsx @@ -0,0 +1,63 @@ +import React, { useState, useEffect } from "react"; +import ModalUi from "../primitives/ModalUi"; +import { useTranslation } from "react-i18next"; + +const ColumnSelector = ({ + isOpen, + allColumns = [], + visibleColumns = [], + columnLabels = {}, + defaultColumns = [], + onApply, + onClose +}) => { + const { t } = useTranslation(); + const [selected, setSelected] = useState(visibleColumns); + const [names, setNames] = useState(columnLabels); + + useEffect(() => { + setSelected(visibleColumns); + setNames(columnLabels); + }, [visibleColumns, columnLabels]); + + const handleChange = (col) => { + setSelected((prev) => + prev.includes(col) ? prev.filter((c) => c !== col) : [...prev, col] + ); + }; + + const handleApply = () => { + onApply && onApply(selected, names); + onClose && onClose(); + }; + + return ( + <ModalUi isOpen={isOpen} title={t("select-columns")} handleClose={onClose}> + <div className="p-[20px] flex flex-col gap-2"> + {allColumns.map((col, i) => ( + <div key={col} className="flex justify-between items-center gap-2"> + <span className="flex justify-center items-center h-full"> + <input + id={col + "_" + i} + type="checkbox" + checked={selected.includes(col)} + onChange={() => handleChange(col)} + className="mb-0" + /> + <span className="whitespace-nowrap ml-1"> + {t(`report-heading.${col}`, { defaultValue: col })} + </span> + </span> + </div> + ))} + <div className="flex justify-start mt-2"> + <button onClick={handleApply} className="op-btn op-btn-primary"> + {t("apply")} + </button> + </div> + </div> + </ModalUi> + ); +}; + +export default ColumnSelector; diff --git a/apps/OpenSign/src/components/DragProivder.jsx b/apps/OpenSign/src/components/DragProivder.jsx new file mode 100644 index 0000000000..3cb17c40b8 --- /dev/null +++ b/apps/OpenSign/src/components/DragProivder.jsx @@ -0,0 +1,51 @@ +import { HTML5Backend } from "react-dnd-html5-backend"; +import { TouchBackend } from "react-dnd-touch-backend"; +import { + DndProvider, + TouchTransition, + MouseTransition, + Preview +} from "react-dnd-multi-backend"; +import DragElement from "./pdf/DragElement"; +import LazyPage from "../primitives/LazyPage"; +import { GuidelinesProvider } from "../context/GuidelinesContext"; + +const HTML5toTouch = { + backends: [ + { + id: "html5", + backend: HTML5Backend, + transition: MouseTransition + }, + { + id: "touch", + backend: TouchBackend, + options: { enableMouseEvents: true }, + preview: true, + transition: TouchTransition + } + ] +}; + +/* This handling in only for devices which support touch */ +const generatePreview = (props) => { + const { item, style } = props; + const newStyle = { ...style }; + + return ( + <div style={newStyle}> + <DragElement {...item} /> + </div> + ); +}; + +export default function DragProvider({ Page, lazy = false }) { + return ( + <DndProvider options={HTML5toTouch}> + <Preview>{generatePreview}</Preview> + <GuidelinesProvider> + {lazy ? <LazyPage Page={Page} /> : <Page />} + </GuidelinesProvider> + </DndProvider> + ); +} diff --git a/apps/OpenSign/src/components/Header.jsx b/apps/OpenSign/src/components/Header.jsx index d2b327ed57..fe732a68dc 100644 --- a/apps/OpenSign/src/components/Header.jsx +++ b/apps/OpenSign/src/components/Header.jsx @@ -12,32 +12,43 @@ import { } from "../constant/Utils"; import { useTranslation } from "react-i18next"; import { appInfo } from "../constant/appinfo"; +import { useDispatch } from "react-redux"; +import { toggleSidebar } from "../redux/reducers/sidebarReducer.js"; -const Header = ({ showSidebar, setIsMenu, isConsole }) => { +const Header = ({ isConsole, setIsLoggingOut }) => { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const { width } = useWindowSize(); + const dispatch = useDispatch(); const username = localStorage.getItem("username") || ""; const image = localStorage.getItem("profileImg") || dp; - const isAdmin = - localStorage.getItem("Extand_Class") && - JSON.parse(localStorage.getItem("Extand_Class"))?.[0]?.UserRole === - "contracts_Admin"; const [isOpen, setIsOpen] = useState(false); const [applogo, setAppLogo] = useState(""); const [isDarkTheme, setIsDarkTheme] = useState(); const toggleDropdown = () => { setIsOpen(!isOpen); - if (width <= 768) { - setIsMenu(false); + closeSidebar(); + }; + const closeSidebar = () => { + if (width && width <= 768) { + dispatch(toggleSidebar(false)); } }; + useEffect(() => { initializeHead(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + useEffect(() => { + closeSidebar(); + }, [width]); + + const showSidebar = () => { + dispatch(toggleSidebar()); + }; + async function initializeHead() { const applogo = await getAppLogo(); @@ -49,8 +60,9 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { } } - const closeDropdown = async () => { + const handleLogout = async () => { setIsOpen(false); + setIsLoggingOut(true); try { await Parse.User.logOut(); } catch (err) { @@ -62,6 +74,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { let PageLanding = localStorage.getItem("PageLanding"); let baseUrl = localStorage.getItem("baseUrl"); let appid = localStorage.getItem("parseAppId"); + let favicon = localStorage.getItem("favicon"); localStorage.clear(); saveLanguageInLocal(i18n); @@ -71,7 +84,8 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { localStorage.setItem("userSettings", appdata); localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); - + localStorage.setItem("favicon", favicon); + setIsLoggingOut(false); navigate("/"); }; @@ -113,7 +127,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { }, []); return ( - <div> + <> <div className="op-navbar bg-base-100 shadow touch-none"> <div className="flex-none"> <button @@ -237,7 +251,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { </li> </> )} - <li onClick={closeDropdown}> + <li onClick={handleLogout}> <span> <i className="fa-light fa-arrow-right-from-bracket"></i>{" "} {t("log-out")} @@ -247,7 +261,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { </div> </div> </div> - </div> + </> ); }; diff --git a/apps/OpenSign/src/components/RotateAlert.jsx b/apps/OpenSign/src/components/RotateAlert.jsx index b25c57805f..3e804ff8a8 100644 --- a/apps/OpenSign/src/components/RotateAlert.jsx +++ b/apps/OpenSign/src/components/RotateAlert.jsx @@ -26,7 +26,7 @@ function RotateAlert(props) { props.setShowRotateAlert({ status: false, degree: 0 }) } type="button" - className="op-btn op-btn-ghost shadow-md" + className="op-btn op-btn-ghost text-base-content shadow-md" > {t("no")} </button> diff --git a/apps/OpenSign/src/components/Title.jsx b/apps/OpenSign/src/components/Title.jsx index 5db98c7953..a3d6cd6047 100644 --- a/apps/OpenSign/src/components/Title.jsx +++ b/apps/OpenSign/src/components/Title.jsx @@ -1,20 +1,82 @@ import { Helmet } from "react-helmet"; +import { useLocation, matchPath } from "react-router"; +import { useTranslation } from "react-i18next"; +import { useMemo } from "react"; +import { useManifestUrl } from "../hook/useManifestUrl"; -function Title({ title, drive }) { +const TITLE_MAP = { + "/": "login", + // Homelayout + "/dashboard/35KBoSgoAK": "Dashboard", + "/form/sHAnZphf69": "Sign Yourself", + "/form/8mZzFxbG1z": "Request Signatures", + "/form/template": "New Template", + "/report/6TeaPr321t": "Templates", + "/report/4Hhwbp482K": "Need your sign", + "/report/1MwEuxLEkF": "In Progress", + "/report/kQUoW4hUXz": "Completed", + "/report/ByHuevtCFY": "Drafts", + "/report/UPr2Fm5WY3": "Declined", + "/report/zNqBHXHsYH": "Expired", + "/report/contacts": "Contactbook", + "/drive": "Drive", + "/managesign": "My Signature", + "/preferences": "Preferences", + "/users": "Users", + "/profile": "profile", + "/changepassword": "change-password", + "/verify-document": "verify-document", + + "/signaturePdf/:docId": "Sign Yourself", + "/placeHolderSign/:docId": "Request Signatures", + "/template/:templateId": "New Template", + "/recipientSignPdf/:docId": "Request Signatures", + "/recipientSignPdf/:docId/:contactBookId": "Request Signatures", + "/load/recipientSignPdf/:docId/:contactBookId": "Request Signatures", + + // alone + "/debugpdf": "Debug Pdf", + "/forgetpassword": "forgot-password", + "/success": "success", + "/addadmin": "add-admin", + "/upgrade-2.1": "add-admin", + "/draftDocument": "New Document", + "/login/:base64url": "Request Signatures", + +}; + +function resolveTitle(pathname, override) { + if (override) return override; + for (let [pattern, label] of Object.entries(TITLE_MAP)) { + if (matchPath({ path: pattern, end: true }, pathname)) { + return label; + } + } + return ""; +} + +export default function Title() { + const { pathname, state } = useLocation(); + const { t } = useTranslation(); const appName = "OpenSign™"; + const logo = useMemo(() => localStorage.getItem("favicon"), []); + const prefix = useMemo( + () => resolveTitle(pathname, state?.title), + [pathname, state?.title] + ); + const title = useMemo( + () => (prefix ? `${t(prefix)} - ${appName}` : appName), + [t, prefix, appName] + ); + const manifestUrl = useManifestUrl(appName, logo); + return ( <Helmet> - <title>{drive ? title : `${title} - ${appName}`} - - + {title} + + {logo && } + ); } - -export default Title; diff --git a/apps/OpenSign/src/components/dashboard/DashboardReport.jsx b/apps/OpenSign/src/components/dashboard/DashboardReport.jsx index 8cdc3d0565..9832578b7e 100644 --- a/apps/OpenSign/src/components/dashboard/DashboardReport.jsx +++ b/apps/OpenSign/src/components/dashboard/DashboardReport.jsx @@ -1,6 +1,6 @@ -import React, { useEffect, useState, useRef } from "react"; +import { useEffect, useState, useRef } from "react"; import Parse from "parse"; -import ReportTable from "../../primitives/GetReportDisplay"; +import DocumentsReport from "../../reports/document/DocumentsReport"; import reportJson from "../../json/ReportJson"; import axios from "axios"; import Loader from "../../primitives/Loader"; @@ -198,7 +198,7 @@ function DashboardReport(props) { ) : ( <> {reportName ? ( - ) : ( -
-
-

{t("report-not-found")}

+
+
+ {t("report-not-found")}
)} diff --git a/apps/OpenSign/src/components/dashboard/GetDashboard.jsx b/apps/OpenSign/src/components/dashboard/GetDashboard.jsx index 4173d3e2d7..8bd7250b94 100644 --- a/apps/OpenSign/src/components/dashboard/GetDashboard.jsx +++ b/apps/OpenSign/src/components/dashboard/GetDashboard.jsx @@ -1,8 +1,9 @@ -import React, { Suspense, lazy } from "react"; +import React, { Suspense } from "react"; +import { lazyWithRetry } from "../../utils"; import { useTranslation } from "react-i18next"; -const DashboardButton = lazy(() => import("./DashboardButton")); -const DashboardCard = lazy(() => import("./DashboardCard")); -const DashboardReport = lazy(() => import("./DashboardReport")); +const DashboardButton = lazyWithRetry(() => import("./DashboardButton")); +const DashboardCard = lazyWithRetry(() => import("./DashboardCard")); +const DashboardReport = lazyWithRetry(() => import("./DashboardReport")); const buttonList = [ { label: "Sign yourself", diff --git a/apps/OpenSign/src/components/opensigndrive/DriveBody.jsx b/apps/OpenSign/src/components/opensigndrive/DriveBody.jsx index e140a33656..7ea1c52241 100644 --- a/apps/OpenSign/src/components/opensigndrive/DriveBody.jsx +++ b/apps/OpenSign/src/components/opensigndrive/DriveBody.jsx @@ -366,14 +366,14 @@ function DriveBody(props) { {data.Name} _ - Folder + {t("folder")} _ _ @@ -390,7 +390,7 @@ function DriveBody(props) { {data.Name} {createddate} - Pdf + {t("pdf")} {t(`drive-document-status.${status}`)} @@ -458,14 +458,14 @@ function DriveBody(props) { className="ContextMenuItem" > - Rename + {t(`context-menu.Rename`)} handleMenuItemClick("Delete", data, data.Type)} className="ContextMenuItem" > - Delete + {t(`context-menu.Delete`)} @@ -550,7 +550,6 @@ function DriveBody(props) { ) )}
- )} - @@ -627,21 +625,21 @@ function DriveBody(props) { - {props?.pdfData?.map((data, ind) => { - return ( - - {handleFolderData(data, ind, "table")} - - ); - })} + {props?.pdfData?.map((data, ind) => ( + + {handleFolderData(data, ind, "table")} + + ))}
) : (
- {props.pdfData.map((data, ind) => { - return {handleFolderData(data, ind, "list")}; - })} + {props?.pdfData?.map((data, ind) => ( + + {handleFolderData(data, ind, "list")} + + ))}
)} diff --git a/apps/OpenSign/src/components/pdf/AddRoleModal.jsx b/apps/OpenSign/src/components/pdf/AddRoleModal.jsx index f052a74a39..652e89dbd0 100644 --- a/apps/OpenSign/src/components/pdf/AddRoleModal.jsx +++ b/apps/OpenSign/src/components/pdf/AddRoleModal.jsx @@ -33,7 +33,7 @@ const AddRoleModal = (props) => { diff --git a/apps/OpenSign/src/components/pdf/AgreementContent.jsx b/apps/OpenSign/src/components/pdf/AgreementContent.jsx index b45090893e..50bf880a76 100644 --- a/apps/OpenSign/src/components/pdf/AgreementContent.jsx +++ b/apps/OpenSign/src/components/pdf/AgreementContent.jsx @@ -118,7 +118,7 @@ function AgreementContent(props) { {t("agrre-button")} + {isCustomize && ( + + )} +
+ { + !isCustomize && ( + setIsCustomize(!isCustomize)} + > + {t("cutomize-email")} + + ) + } +
+ +
+ + {t("or")} + +
+
{props?.handleShareList()}
+

+
+ + )} + + ); +} + +export default CustomizeMail; diff --git a/apps/OpenSign/src/components/pdf/DragElement.jsx b/apps/OpenSign/src/components/pdf/DragElement.jsx index e8bcfed528..446a3cb73c 100644 --- a/apps/OpenSign/src/components/pdf/DragElement.jsx +++ b/apps/OpenSign/src/components/pdf/DragElement.jsx @@ -1,5 +1,5 @@ -import React from "react"; -import { getWidgetType, widgets } from "../../constant/Utils"; +import { widgets } from "../../constant/Utils"; +import getWidgetType from "./getWidgetType"; function DragElement(item) { const getWidgets = widgets; diff --git a/apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx b/apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx index 4f913b949a..d427354f7f 100644 --- a/apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx +++ b/apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx @@ -21,6 +21,7 @@ function DropdownWidgetOption(props) { const [layout, setLayout] = useState("vertical"); const statusArr = ["required", "optional"]; const layoutArr = ["vertical", "horizontal"]; + const isPrefillExist = props?.roleName === "prefill"; const resetState = () => { setDropdownOptionList(["Option-1", "Option-2"]); @@ -87,7 +88,7 @@ function DropdownWidgetOption(props) { const deleteOption = true; const addOption = false; const getUpdatedOptions = dropdownOptionList.filter( - (data, index) => index !== ind + (_, index) => index !== ind ); setDropdownOptionList(getUpdatedOptions); props.handleSaveWidgetsOptions( @@ -102,6 +103,14 @@ function DropdownWidgetOption(props) { }; const handleSaveOption = () => { + if (["checkbox", radioButtonWidget, "dropdown"].includes(props.type)) { + const allUnique = + new Set(dropdownOptionList).size === dropdownOptionList.length; + if (!allUnique) { + alert("Please remove duplicate option"); + return; + } + } const defaultData = defaultCheckbox && defaultCheckbox.length > 0 ? defaultCheckbox @@ -228,37 +237,40 @@ function DropdownWidgetOption(props) { >
))} - +
+ +
- {["dropdown", radioButtonWidget].includes(props.type) && ( - <> - - - - )} - {props.type !== "checkbox" && ( + {["dropdown", radioButtonWidget].includes(props.type) && + !isPrefillExist && ( + <> + + + + )} + {props.type !== "checkbox" && !isPrefillExist && (
{statusArr.map((data, ind) => (
- {props.isShowAdvanceFeature && ( + {props.isShowAdvanceFeature && !isPrefillExist && (
0 && (
- + e.target.setCustomValidity(t("input-required"))} onInput={(e) => e.target.setCustomValidity("")} value={props.requestSubject} - onChange={(e) => props.setRequestSubject(e.target.value)} + onChange={(e) => { + props?.setRequestSubject(e.target.value); + props?.setCustomizeMail((prev) => ({ + ...prev, + subject: e.target.value + })); + }} placeholder='${senderName} has requested you to sign "${documentName}"' className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" /> diff --git a/apps/OpenSign/src/components/pdf/Guidelines.jsx b/apps/OpenSign/src/components/pdf/Guidelines.jsx new file mode 100644 index 0000000000..96a42319d5 --- /dev/null +++ b/apps/OpenSign/src/components/pdf/Guidelines.jsx @@ -0,0 +1,30 @@ +const Guidelines = ({ x1, x2, y1, y2 }) => { + return ( + <> + {/* Horizontal guidelines */} + {/* top guide */}{" "} +
+ {/* bottom guide */} +
+ {/* Vertical guidelines */} + {/* left guide */} +
+ {/* right guide */} +
+ + ); +}; + +export default Guidelines; diff --git a/apps/OpenSign/src/components/pdf/PageReorderModal.jsx b/apps/OpenSign/src/components/pdf/PageReorderModal.jsx index 03c24077da..a152fb3c20 100644 --- a/apps/OpenSign/src/components/pdf/PageReorderModal.jsx +++ b/apps/OpenSign/src/components/pdf/PageReorderModal.jsx @@ -61,14 +61,14 @@ export default function PageReorderModal({
diff --git a/apps/OpenSign/src/components/pdf/PdfHeader.jsx b/apps/OpenSign/src/components/pdf/PdfHeader.jsx index fb40e789eb..04bf23fbea 100644 --- a/apps/OpenSign/src/components/pdf/PdfHeader.jsx +++ b/apps/OpenSign/src/components/pdf/PdfHeader.jsx @@ -23,9 +23,6 @@ import { maxFileSize } from "../../constant/const"; function Header(props) { const { t } = useTranslation(); - const filterPrefill = - props?.signerPos && - props?.signerPos?.filter((data) => data.Role !== "prefill"); const isMobile = window.innerWidth < 767; const [isDownloading, setIsDownloading] = useState(""); const [isDeletePage, setIsDeletePage] = useState(false); @@ -71,14 +68,13 @@ function Header(props) { const handleFileUpload = async (e) => { const file = e.target.files[0]; if (!file) { - alert("Please upload a valid PDF file."); + alert(t("please-select-pdf")); return; } if (!file.type.includes("pdf")) { - alert("Only PDF files are allowed."); + alert(t("only-pdf-allowed")); return; } - const mb = Math.round(file?.size / Math.pow(1024, 2)); if (mb > maxFileSize) { alert(`${t("file-alert-1")} ${maxFileSize} MB`); @@ -108,18 +104,18 @@ function Header(props) { // Upload the file to Parse Server } catch (err) { console.error("Incorrect password or decryption failed", err); - alert("Incorrect password or decryption failed."); + alert(t("incorrect-password-or-decryption-failed")); } } else { - alert("Please provided Password."); + alert(t("provide-password")); } } else { console.log("Err ", err); - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } } else { - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } const uploadedPdfDoc = await PDFDocument.load(uploadedPdfBytes, { @@ -162,6 +158,21 @@ function Header(props) { } setIsReorderModal(false); }; + + const handleDownloadDoc = async () => { + await handleDownloadPdf( + props?.pdfDetails, + setIsDownloading, + props.pdfBase64 + ); + }; + const handleDownloadBtn = async () => { + if (props?.isCompleted) { + props?.setIsDownloadModal(true); + } else { + await handleDownloadDoc(); + } + }; return (
{isMobile && props?.isShowHeader ? ( @@ -201,17 +212,7 @@ function Header(props) { > { - if (props?.isCompleted) { - props?.setIsDownloadModal(true); - } else { - handleDownloadPdf( - props?.pdfDetails, - setIsDownloading, - props.pdfBase64 - ); - } - }} + onClick={() => handleDownloadBtn()} >
{ if (!props?.isMailSend) { - props?.alertSendEmail(); + props?.handleSaveDoc(); } }} className={`${ @@ -348,13 +349,7 @@ function Header(props) { )} - handleDownloadPdf( - props?.pdfDetails, - setIsDownloading, - props.pdfBase64 - ) - } + onClick={() => handleDownloadDoc()} >
{props?.isPlaceholder ? ( <> -
- {!props?.isMailSend && - props?.signersdata.length > 0 && - props?.signersdata.length !== filterPrefill.length && ( -
- {filterPrefill.length === 0 ? ( - - {t("add")}{" "} - {props?.signersdata.length - filterPrefill.length}{" "} - {t("recipients")} {t("widgets-name.signature")} - - ) : ( - - {t("add")}{" "} - {props?.signersdata.length - filterPrefill.length}{" "} - {t("more")} - {t("recipients")} {t("widgets-name.signature")} - - )} -
- )} -
+
{props?.setIsEditTemplate && ( )} {enabledBackBtn && ( @@ -518,7 +492,7 @@ function Header(props) { disabled={props?.isMailSend && true} data-tut="headerArea" className="op-btn op-btn-primary op-btn-sm mr-[3px]" - onClick={() => props?.alertSendEmail()} + onClick={() => props?.handleSaveDoc()} > {props?.completeBtnTitle ? props?.completeBtnTitle @@ -565,17 +539,7 @@ function Header(props) { @@ -614,14 +572,8 @@ function Header(props) { {!props?.templateId && ( @@ -744,8 +696,8 @@ function Header(props) { handleClose={() => setIsDeletePage(false)} >
-

{t("delete-alert-2")}

-

{t("delete-note")}

+

{t("delete-alert-2")}

+

{t("delete-note")}

diff --git a/apps/OpenSign/src/components/pdf/PdfZoom.jsx b/apps/OpenSign/src/components/pdf/PdfTools.jsx similarity index 79% rename from apps/OpenSign/src/components/pdf/PdfZoom.jsx rename to apps/OpenSign/src/components/pdf/PdfTools.jsx index caff5f9e99..8a3e55ab1e 100644 --- a/apps/OpenSign/src/components/pdf/PdfZoom.jsx +++ b/apps/OpenSign/src/components/pdf/PdfTools.jsx @@ -14,7 +14,7 @@ import { PDFDocument } from "pdf-lib"; import { maxFileSize } from "../../constant/const"; import PageReorderModal from "./PageReorderModal"; -function PdfZoom(props) { +function PdfTools(props) { const { t } = useTranslation(); const mergePdfInputRef = useRef(null); const [isDeletePage, setIsDeletePage] = useState(false); @@ -57,13 +57,14 @@ function PdfZoom(props) { }; const handleFileUpload = async (e) => { + props.setIsTour && props.setIsTour(false); const file = e.target.files[0]; if (!file) { - alert("Please upload a valid PDF file."); + alert(t("please-select-pdf")); return; } if (!file.type.includes("pdf")) { - alert("Only PDF files are allowed."); + alert(t("only-pdf-allowed")); return; } const mb = Math.round(file?.size / Math.pow(1024, 2)); @@ -95,18 +96,18 @@ function PdfZoom(props) { // Upload the file to Parse Server } catch (err) { console.error("Incorrect password or decryption failed", err); - alert("Incorrect password or decryption failed."); + alert(t("incorrect-password-or-decryption-failed")); } } else { - alert("Please provided Password."); + alert(t("provide-password")); } } else { console.log("Err ", err); - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } } else { - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } const uploadedPdfDoc = await PDFDocument.load(uploadedPdfBytes, { @@ -150,13 +151,42 @@ function PdfZoom(props) { setIsReorderModal(false); }; + const handleDeletePage = () => { + setIsDeletePage(true); + props.setIsTour && props.setIsTour(false); + }; + + const handleReorderPages = () => { + setIsReorderModal(true); + props.setIsTour && props.setIsTour(false); + }; + + const handleZoomIn = () => { + props.clickOnZoomIn(); + props.setIsTour && props.setIsTour(false); + }; + const handleZoomOut = () => { + props.clickOnZoomOut(); + props.setIsTour && props.setIsTour(false); + }; + const handleRotate = () => { + props.handleRotationFun(90); + props.setIsTour && props.setIsTour(false); + }; + const handleAntiRotate = () => { + props.handleRotationFun(-90); + props.setIsTour && props.setIsTour(false); + }; return ( <> - + {!props.isDisableEditTools && ( <> mergePdfInputRef.current.click()} title={t("add-pages")} > @@ -170,15 +200,15 @@ function PdfZoom(props) { setIsDeletePage(true)} + className="bg-gray-50 px-[4px] 2xl:py-[10px] cursor-pointer" + onClick={handleDeletePage} title={t("delete-page")} > setIsReorderModal(true)} + className="bg-gray-50 px-[4px] 2xl:py-[10px] cursor-pointer" + onClick={handleReorderPages} title={t("reorder-pages")} > @@ -187,7 +217,7 @@ function PdfZoom(props) { )} props.clickOnZoomIn()} + onClick={handleZoomIn} title={t("zoom-in")} > @@ -197,7 +227,7 @@ function PdfZoom(props) { <> props.handleRotationFun(90)} + onClick={handleRotate} title={t("rotate-right")} > @@ -205,18 +235,15 @@ function PdfZoom(props) { props.handleRotationFun(-90)} + onClick={handleAntiRotate} > )} props.clickOnZoomOut()} - style={{ - cursor: props.zoomPercent > 0 ? "pointer" : "default" - }} + className="bg-gray-50 px-[4px] 2xl:py-[10px] cursor-pointer" + onClick={handleZoomOut} title={t("zoom-out")} > @@ -229,8 +256,8 @@ function PdfZoom(props) { handleClose={() => setIsDeletePage(false)} >
-

{t("delete-alert-2")}

-

{t("delete-note")}

+

{t("delete-alert-2")}

+

{t("delete-note")}

@@ -258,4 +285,4 @@ function PdfZoom(props) { ); } -export default PdfZoom; +export default PdfTools; diff --git a/apps/OpenSign/src/components/pdf/Placeholder.jsx b/apps/OpenSign/src/components/pdf/Placeholder.jsx index bf7b817427..00f5ed186a 100644 --- a/apps/OpenSign/src/components/pdf/Placeholder.jsx +++ b/apps/OpenSign/src/components/pdf/Placeholder.jsx @@ -8,23 +8,27 @@ import { fontsizeArr, getContainerScale, handleCopyNextToWidget, - handleCopySignUrl, handleHeighlightWidget, onChangeInput, radioButtonWidget, textInputWidget, cellsWidget, textWidget, - selectFormat + selectFormat, + randomId } from "../../constant/Utils"; import PlaceholderType from "./PlaceholderType"; import moment from "moment"; import "../../styles/opensigndrive.css"; import ModalUi from "../../primitives/ModalUi"; import { useTranslation } from "react-i18next"; -import { useDispatch } from "react-redux"; -import { setIsShowModal } from "../../redux/reducers/widgetSlice"; +import { useDispatch, useSelector } from "react-redux"; +import { + setIsShowModal, + setPrefillImg +} from "../../redux/reducers/widgetSlice"; import { themeColor } from "../../constant/const"; +import { useGuidelinesContext } from "../../context/GuidelinesContext"; //function to get default format const getDefaultFormat = (dateFormat) => dateFormat || "MM/dd/yyyy"; @@ -47,6 +51,8 @@ const getDefaultDate = (dateStr, format) => { function Placeholder(props) { const { t } = useTranslation(); const dispatch = useDispatch(); + const prefillImg = useSelector((state) => state.widget.prefillImg); + const { showGuidelines } = useGuidelinesContext(); const widgetData = props.pos?.options?.defaultValue || props.pos?.options?.response; const [isDateModal, setIsDateModal] = useState(false); @@ -128,15 +134,18 @@ function Placeholder(props) { // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectDate]); - //`handleWidgetIdandPopup` is used to set current widget id and open relative popup - const handleWidgetIdandPopup = async () => { + const handleOnClickPlaceholder = async () => { + props?.setIsReqSignTourDisabled && props?.setIsReqSignTourDisabled(true); //'props.isOpenSignPad' variable is used to check flow to open signature pad for finish document + //request sign, signyourself, selfsign,public-sign, kiosk mode if ( props.isOpenSignPad && !props.isDragging && !props.pos.options?.isReadOnly && - props.pos.type !== textWidget + props?.data?.Role !== "prefill" && + props.data?.Id === props.uniqueId ) { + props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); if (props?.ispublicTemplate) { props.handleUserDetails(); } else { @@ -157,113 +166,25 @@ function Placeholder(props) { } dispatch(setIsShowModal({ [props.pos.key]: true })); } - } else if ( - props.isPlaceholder && - !props.isDragging && - props.pos.type !== textWidget - ) { - if (props.pos.key === props?.currWidgetsDetails?.key) { + } + //placeholder, template flow + else if (props.isPlaceholder && !props.isDragging) { + props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); + if ( + props.pos.key === props?.currWidgetsDetails?.key && + props?.data?.Role !== "prefill" + ) { props.handleLinkUser(props.data.Id); props.setUniqueId(props.data.Id); const checkIndex = props.xyPosition.findIndex( (data) => data.Id === props.data.Id ); props.setIsSelectId(checkIndex || 0); + } else if (props?.data?.Role === "prefill") { + dispatch(setIsShowModal({ [props.pos.key]: true })); + props.setUniqueId(props?.data?.Id); + props?.setRoleName("prefill"); } - //handle prefill 'text widget' click then save previos in tem variable after save or close button again assign current selected userId - } else if (props.pos.type === textWidget) { - dispatch(setIsShowModal({ [props.pos.key]: true })); - props.setTempSignerId(props?.uniqueId); - props.setUniqueId(props?.data?.Id); - } - }; - - const widgetClickHandler = () => { - props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); - if (props?.data?.signerObjId === props?.signerObjId && !props.isDragging) { - handleWidgetIdandPopup(); - } //condition for open contact details popup when sign templet from public signing flow - else if (props?.uniqueId && props.data?.Id === props?.uniqueId) { - handleWidgetIdandPopup(); - } - }; - - const handleOnClickPlaceholder = () => { - //'props.isDragging' variable is used to checking if user take any widget and try to drag then in that case - //onclick event call. so to prevent onclick and do not open unecessary modal open. - //condition only for request signing flow and self signing flow then apply one click copy sign url of previous drawn signature - if (props.isApplyAll) { - props.setRequestSignTour && props.setRequestSignTour(true); - let isCopySignature = false; - let existSignPosition = ""; - //condition for 'signature','initials','stamp' widgets only - if (["signature", "initials", "stamp"].includes(props.pos.type)) { - const widgetKey = props.pos.key; - let exitLoop = false; - const placeholders = props.data.placeHolder; - //check onclick current widget signature/stamp/initials signature url exist or not - placeholders?.forEach((holder) => { - holder?.pos?.forEach((posItem) => { - if (posItem.SignUrl && posItem.type === props.pos.type) { - existSignPosition = posItem; - return; // Break out of the current iteration - } - }); - if (existSignPosition) { - return; - } - }); - //case:- - //1- Open signpad once when if there are no any signature url draw - //2- If multiple signature widgets are present, clicking on the next widget should copy the signature URL from the previously drawn signature - //3- If the user attempts to edit the signature, open the signature pad to allow drawing a new signature upon clicking. - for (const placeholderObj of props.data.placeHolder || []) { - for (const posItem of placeholderObj.pos || []) { - if (posItem.key === widgetKey) { - //This condition is used to open signature pad to draw signature in some case - //case-1 : The condition (!posItem.SignUrl && !existSignPosition) checks if the current widget being clicked does not have a drawn signature and no signature URL exists for any signature widget. - //case-2 : The condition posItem.SignUrl is used to verify if the current widget already has a drawn signature and if the user is attempting to edit it - if ((!posItem.SignUrl && !existSignPosition) || posItem.SignUrl) { - exitLoop = true; - } else { - //else condition is used to copy the signature URL from the previously drawn signature - exitLoop = true; - isCopySignature = true; - break; - } - } - } - if (exitLoop) { - break; // Stop iterating through placeholders if exitLoop true - } - } - //existSignPosition.type === props.pos.type ensures that the current widget's type matches the type of the widget associated with the existing signature URL during the click event - if ( - existSignPosition.type === props.pos.type && - existSignPosition && - isCopySignature - ) { - props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); - //function to copy the signature URL from the previously drawn signature when clicking on the next widget. - handleCopySignUrl( - props.pos, //currect widget position details - existSignPosition, //exist sign url widget's position details - props.setXyPosition, //used to update Placeholders details - props.xyPosition, //keep Placeholders details - props.pageNumber, //current page number - props.signerObjId //current signer's object id - ); - existSignPosition = ""; - } else { - widgetClickHandler(); - } - } else { - widgetClickHandler(); - } - } else { - //The else condition is used to handle the case when the user clicks on a widget and open signature pad to draw sign - props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); - handleWidgetIdandPopup(); } }; //`handleOnClickSettingIcon` is used set current widget details and open setting of it @@ -300,17 +221,17 @@ function Placeholder(props) { } //condition for only placeholder and template flow - if (props.data && props?.pos?.type !== textWidget) { + if (props.data && props?.data?.Role !== "prefill") { props.setUniqueId(props?.data?.Id); const checkIndex = props.xyPosition - .filter((data) => data.Role !== "prefill") + .filter((data) => data?.Role !== "prefill") .findIndex((data) => data.Id === props.data.Id); props.setIsSelectId && props.setIsSelectId(checkIndex || 0); - } - //condition to handle in placeholder and template flow for text widget signerId for text widgets i have to set uniqueId in tempSignerId because - //it does not have any signer user and any signerobjId - else if (props.data && props.pos.type === textWidget && !props.isSelfSign) { - props.setTempSignerId(props.uniqueId); + } else if ( + !props.isSelfSign && + props.data && + props.pos.type === "prefill" + ) { props.setUniqueId(props?.data?.Id); } props.setCurrWidgetsDetails(props.pos); @@ -320,21 +241,17 @@ function Placeholder(props) { e.stopPropagation(); //condition to handle text widget signer obj id and unique id //when user click on copy icon of text widget in that condition text widget does not have any signerObjId - //in that case i have to save in tempSignerId as a unique id of previous select signer's unique id - //and on save or cancel button of copy all page popup i have set this temp signer Id in unique id - - if (props.data && props?.pos?.type !== textWidget) { + if (props.data && props?.data?.Role !== "prefill") { props.setUniqueId(props?.data?.Id); const checkIndex = props.xyPosition - .filter((data) => data.Role !== "prefill") + .filter((data) => data?.Role !== "prefill") .findIndex((data) => data.Id === props.data.Id); props.setIsSelectId && props.setIsSelectId(checkIndex || 0); } else if ( + !props.isSelfSign && props.data && - props.pos.type === textWidget && - !props.isSelfSign + props.pos.type === "prefill" ) { - props.setTempSignerId(props.uniqueId); props.setUniqueId(props?.data?.Id); } @@ -347,15 +264,26 @@ function Placeholder(props) { props.setIsPageCopy(true); props.setCurrWidgetsDetails(props.pos); } else { + const newId = randomId(); //function to create new widget next to just widget handleCopyNextToWidget( + newId, props.pos, - props.pos.type, props.xyPosition, props.index, props.setXyPosition, props.data && props.data?.Id ); + //condiiton is used to store copied prefill image base64 url in redux for display image + if (props?.data?.Role === "prefill") { + const getPrefillImg = prefillImg?.find((x) => x.id === props.pos.key); + dispatch( + setPrefillImg({ + id: newId, + base64: getPrefillImg?.base64 + }) + ); + } } }; @@ -380,7 +308,7 @@ function Placeholder(props) { //`onChangeInput` is used to save data related to date in a placeholder field onChangeInput( date, - props.pos.key, + props.pos, props.xyPosition, props.index, props.setXyPosition, @@ -476,23 +404,14 @@ function Placeholder(props) { e.stopPropagation(); handleOnClickSettingIcon(); }} - className="fa-light fa-gear icon" - style={{ - color: "#188ae2", - right: "29px", - top: "-19px", - cursor: "pointer", - zIndex: 99, - pointerEvents: "auto" - }} + className="fa-light fa-gear icon text-[#188ae2] right-[29px] -top-[19px] z-[99] pointer-events-auto" >
) : ( /* condition to add setting icon for placeholder & template flow for all widgets except signature and date */ - ((!props?.pos?.type && props.pos.isStamp) || - (props?.pos?.type && - !["date"].includes(props.pos.type) && - !props.isSignYourself && - !props.isSelfSign)) && ( + !props.isSignYourself && + !props.isSelfSign && + props?.pos?.type && + !["date"].includes(props.pos.type) && ( { e.stopPropagation(); @@ -506,25 +425,20 @@ function Placeholder(props) { e.stopPropagation(); handleOnClickSettingIcon(); }} - className="fa-light fa-gear icon" + className="fa-light fa-gear icon text-[#188ae2] -top-[19px] z-[99] pointer-events-auto" style={{ - color: "#188ae2", - right: props?.pos?.type === textWidget ? "32px" : "51px", - top: "-19px", - cursor: "pointer", - zIndex: 99, - pointerEvents: "auto" + right: props?.data?.Role === "prefill" ? "32px" : "51px" }} > ) )} - {/* condition for usericon for all widgets except text widgets and signyour-self flow */} - {props.pos.type !== textWidget && - !props.isSignYourself && - !props.isSelfSign && ( + {/* condition for usericon to display for all widgets except prefill widgets, signyour-self and self-sign flow */} + {!props.isSignYourself && + !props.isSelfSign && + props?.data?.Role !== "prefill" && ( { e.stopPropagation(); props.handleLinkUser(props.data.Id); @@ -543,7 +457,6 @@ function Placeholder(props) { ); props.setIsSelectId(checkIndex || 0); }} - style={{ color: "#188ae2", right: "32px", top: "-18px" }} > )} @@ -580,36 +493,32 @@ function Placeholder(props) { } }} style={{ - zIndex: "99", - top: "-18px", - right: props.isPlaceholder ? "50px" : "30px", - color: "#188ae2", - fontSize: "14px", - cursor: "pointer", - pointerEvents: "auto" + right: + props.isPlaceholder && props?.data?.Role !== "prefill" + ? "50px" + : "30px" }} - className="fa-light fa-gear icon" + className="fa-light fa-gear icon text-[#188ae2] text-[14px] z-[99] -top-[18px] pointer-events-auto" >
)} {/* copy icon for all widgets */} handleCopyPlaceholder(e)} onTouchEnd={(e) => handleCopyPlaceholder(e)} - style={{ color: "#188ae2", right: "12px", top: "-18px" }} > {/* delete icon for all widgets */} { e.stopPropagation(); //condition for template and placeholder flow if (props.data) { - props.handleDeleteSign(props.pos.key, props.data.Id); + props.handleDeleteWidget(props.pos.key, props.data.Id); } //condition for signyour-self flow else { - props.handleDeleteSign(props.pos.key); + props.handleDeleteWidget(props.pos.key); } }} //for mobile and tablet touch event @@ -617,14 +526,13 @@ function Placeholder(props) { e.stopPropagation(); //condition for template and placeholder flow if (props.data) { - props.handleDeleteSign(props.pos.key, props.data?.Id); + props.handleDeleteWidget(props.pos.key, props.data?.Id); } //condition for signyour-self flow else { - props.handleDeleteSign(props.pos.key); + props.handleDeleteWidget(props.pos.key); } }} - style={{ color: "#188ae2", right: "-8px", top: "-18px" }} > ) @@ -648,11 +556,7 @@ function Placeholder(props) { return resizePos * pos.scale * containerScale; } } else { - // if (pos.scale === containerScale) { - // return resizePos * pos.scale * props.scale; - // } else { return resizePos * containerScale * props.scale; - // } } } }; @@ -674,15 +578,7 @@ function Placeholder(props) { } else { return resizePos * pos.scale * containerScale; } - } - // else if (pos.scale === containerScale) { - // if (props.scale > 1) { - // return resizePos * pos.scale * props.scale; - // } else { - // return resizePos * pos.scale; - // } - // } - else { + } else { return resizePos * containerScale * props.scale; } } @@ -733,7 +629,6 @@ function Placeholder(props) { return "rgba(203, 233, 237, 0.69)"; } }; - const fontSize = calculateFont(props.pos.options?.fontSize); const fontColor = props.pos.options?.fontColor || "black"; @@ -817,7 +712,7 @@ function Placeholder(props) { bounds="parent" className="signYourselfBlock" style={{ - border: "1px solid #007bff", + border: "1.5px solid #007bff", borderRadius: "2px", cursor: getCursor(), zIndex: @@ -830,18 +725,20 @@ function Placeholder(props) { : "5", opacity: props.isNeedSign && props.data?.Id !== props?.uniqueId && "0.4", - background: handleBackground() + background: + props?.data?.Role === "prefill" + ? "transparent" + : handleBackground() //handle block color of widget for }} onDrag={(_, d) => { - props.handleTabDrag && props.handleTabDrag(props.pos.key); - props.showGuidelines && - props.showGuidelines( - true, - d.x, - d.y, - d.node.offsetWidth, - d.node.offsetHeight - ); + props?.handleTabDrag?.(props.pos.key); + showGuidelines( + true, + d.x, + d.y, + d.node.offsetWidth, + d.node.offsetHeight + ); }} size={{ width: @@ -863,55 +760,49 @@ function Placeholder(props) { } maxHeight="auto" onResizeStart={(e, dir, ref) => { - props.setIsResize && props.setIsResize(true); - props.showGuidelines && - props.showGuidelines( - true, - xPos(props.pos, props.isSignYourself), - yPos(props.pos, props.isSignYourself), - ref.offsetWidth, - ref.offsetHeight - ); + props?.setIsResize?.(true); + showGuidelines( + true, + xPos(props.pos, props.isSignYourself), + yPos(props.pos, props.isSignYourself), + ref.offsetWidth, + ref.offsetHeight + ); }} onResize={(e, dir, ref, delta, position) => { - props.showGuidelines && - props.showGuidelines( - true, - position.x, - position.y, - ref.offsetWidth, - ref.offsetHeight - ); + showGuidelines( + true, + position.x, + position.y, + ref.offsetWidth, + ref.offsetHeight + ); }} onResizeStop={(e, direction, ref) => { - setTimeout(() => { - props.setIsResize && props.setIsResize(false); - }, 50); - props.handleSignYourselfImageResize && - props.handleSignYourselfImageResize( - ref, - props.pos.key, - props.xyPosition, - props.setXyPosition, - props.index, - containerScale, - props.scale, - props.data && props.data.Id, - props.isResize - ); - props.showGuidelines && props.showGuidelines(false); + setTimeout(() => props?.setIsResize?.(false), 50); + props?.handleSignYourselfImageResize?.( + ref, + props.pos.key, + props.xyPosition, + props.setXyPosition, + props.index, + containerScale, + props.scale, + props.data && props.data.Id, + props.isResize + ); + showGuidelines(false); }} onDragStop={(event, dragElement) => { - props.handleStop && - props.handleStop( - event, - dragElement, - props.data?.Id, - props.pos?.key - ); - props.isDragging && - props.showGuidelines && - props.showGuidelines(false); + if (props?.isDragging) { + showGuidelines(false); + } + props?.handleStop?.( + event, + dragElement, + props.data?.Id, + props.pos?.key + ); }} position={{ x: xPos(props.pos, props.isSignYourself), @@ -948,11 +839,12 @@ function Placeholder(props) { ![radioButtonWidget, "checkbox"].includes(props.pos.type) && props.pos.key === props?.currWidgetsDetails?.key && )} - {/* 1- Show a border if props.pos.key === props?.currWidgetsDetails?.key, indicating the current user's selected widget. - 2- If props.isShowBorder is true, display border for all widgets. - 3- Use the combination of props?.isAlllowModify and !props?.assignedWidgetId.includes(props.pos.key) to determine when to show border: - 3.1- When isAlllowModify is true, show border. - 3.2- Do not display border for widgets already assigned (props.assignedWidgetId.includes(props.pos.key) is true). + + {/* 1- Show a ouline if props.pos.key === props?.currWidgetsDetails?.key, indicating the current user's selected widget. + 2- If props.isShowBorder is true, display ouline for all widgets. + 3- Use the combination of props?.isAlllowModify and !props?.assignedWidgetId.includes(props.pos.key) to determine when to show ouline: + 3.1- When isAlllowModify is true, show ouline. + 3.2- Do not display ouline for widgets already assigned (props.assignedWidgetId.includes(props.pos.key) is true). */} {props.pos.key === props?.currWidgetsDetails?.key && (props.isShowBorder || @@ -992,6 +884,11 @@ function Placeholder(props) { calculateFontsize={props.calculateFontsize} pdfDetails={props?.pdfDetails && props?.pdfDetails[0]} isNeedSign={props.isNeedSign} + isAllowModify={ + props.isShowBorder || + (props?.isAlllowModify && + !props?.assignedWidgetId.includes(props.pos.key)) + } setSelectDate={setSelectDate} selectDate={selectDate} startDate={startDate} @@ -1003,7 +900,6 @@ function Placeholder(props) {
)} -
@@ -1073,7 +969,7 @@ function Placeholder(props) { >
- {props?.isPlaceholder && ( + {props?.isPlaceholder && props?.data?.Role !== "prefill" && (
data.pageNumber === newPageNumber @@ -213,6 +215,7 @@ function PlaceholderCopy(props) { //function for getting selected type placeholder copy const handleApplyCopy = () => { + const newId = randomId(); if (selectCopyType === 4) { const signerPosition = props.xyPosition; let currentXYposition; @@ -230,8 +233,8 @@ function PlaceholderCopy(props) { ); //function to create new widget next to just widget handleCopyNextToWidget( + newId, currentXYposition, - props.widgetType, props.xyPosition, props.pageNumber, props.setXyPosition, @@ -248,8 +251,8 @@ function PlaceholderCopy(props) { ); //function to create new widget next to just widget handleCopyNextToWidget( + newId, currentXYposition, - props.widgetType, props.xyPosition, getIndex, props.setXyPosition @@ -260,11 +263,6 @@ function PlaceholderCopy(props) { } }; const handleUniqueId = () => { - const signerId = props.signerObjId ? props.signerObjId : props.Id; - if (signerId && props.widgetType === textWidget && props.setTempSignerId) { - props.setUniqueId(props?.tempSignerId); - props.setTempSignerId(""); - } props.setIsPageCopy(false); setSelectCopyType(1); }; @@ -306,7 +304,7 @@ function PlaceholderCopy(props) {
); case "date": - return iswidgetEnable ? ( + return iswidgetEnable || props?.data?.Role === "prefill" ? ( (
@@ -397,11 +421,15 @@ function PlaceholderType(props) {
); case "image": - return props.pos.SignUrl ? ( + return prefillImgLoad[props.pos?.key] ? ( +
+ +
+ ) : imgUrl ? ( image ) : ( @@ -445,9 +473,9 @@ function PlaceholderType(props) { case radioButtonWidget: const radioLayout = props.pos.options?.layout || "vertical"; const isOnlyOneBtn = props.pos.options?.values?.length > 0 ? true : false; - const radioWrapperClass = `flex items-start ${ + const radioWrapperClass = `flex items-start whitespace-pre-wrap ${ radioLayout === "horizontal" - ? `flex-row flex-wrap ${isOnlyOneBtn ? "gap-x-[10px]" : ""}` + ? `flex-row flex-wrap lg:py-[1.6px] ${isOnlyOneBtn ? "gap-x-[10px]" : ""}` : `flex-col ${isOnlyOneBtn ? "gap-y-[5px]" : ""}` }`; // Using gap-y-1 for consistency, adjust if needed return ( diff --git a/apps/OpenSign/src/components/pdf/PrefillWidgetsModal.jsx b/apps/OpenSign/src/components/pdf/PrefillWidgetsModal.jsx new file mode 100644 index 0000000000..50710386cc --- /dev/null +++ b/apps/OpenSign/src/components/pdf/PrefillWidgetsModal.jsx @@ -0,0 +1,768 @@ +import { forwardRef, useEffect, useMemo, useRef, useState } from "react"; +import ModalUi from "../../primitives/ModalUi"; +import { + getMonth, + getYear, + radioButtonWidget, + compressedFileSize, + textWidget, + months, + changeDateToMomentFormat, + convertBase64ToFile, + generatePdfName, + isBase64 +} from "../../constant/Utils"; +import DatePicker from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import { range } from "pdf-lib"; +import { useTranslation } from "react-i18next"; +import moment from "moment"; +import AsyncSelect from "react-select/async"; +import axios from "axios"; +import AddContact from "../../primitives/AddContact"; +import Loader from "../../primitives/Loader"; +import { useDispatch, useSelector } from "react-redux"; +import { + resetWidgetState, + setPrefillImg +} from "../../redux/reducers/widgetSlice"; +import * as utils from "../../utils"; + +const ShowTextWidget = ({ position, handleWidgetDetails }) => { + const inputRef = useRef(null); + const [inputValue, setInputValue] = useState(position.options.response || ""); + + return ( + { + setInputValue(e.target.value); + handleWidgetDetails(position, e.target.value); + }} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + ); +}; + +function PrefillWidgetModal(props) { + const { t } = useTranslation(); + const dispatch = useDispatch(); + // Track already loaded image keys so they don't increment multiple times + const loadedSet = useRef(new Set()); + const initializedRef = useRef(false); // prevent rerun on state updates + const prefillImg = useSelector((state) => state.widget.prefillImg); + const [uniqueWidget, setUniqueWidget] = useState([]); + const [image, setImage] = useState(null); + const [imageLoaders, setImageLoaders] = useState({}); + const [currentWidget, setCurrentWidget] = useState(""); + const [userList, setUserList] = useState([]); + const [totalImages, setTotalImages] = useState(0); + const [loadedImages, setLoadedImages] = useState(0); + const [loading, setLoading] = useState(false); + const years = range(1950, getYear(new Date()) + 16, 1); + const widgetTitle = "font-medium"; + const isAnyLoaderActive = Object.values(imageLoaders).some( + (val) => val === true + ); + + // useMemo to memoize the calculation of unique widgets + const memoizedUniqueWidget = useMemo(() => { + //functions to used remove duplicate name values across all pages + if (!props.prefillData) return []; + //This will help us track which name values have already been encountered across all pages. + const uniqueNames = new Set(); + //Filter and flatten placeholder widgets while keeping unique names + const filteredArray = props.prefillData?.placeHolder?.map((item) => ({ + ...item, + pos: item.pos.filter((curr) => { + if (uniqueNames.has(curr?.options?.name)) return false; //Duplicate name found, remove it + uniqueNames.add(curr?.options?.name); //First time seen, add to set + return true; + }) + })); + //latten the filtered array and exclude read-only widgets + const flatArray = filteredArray?.flatMap((page) => + page.pos + .filter((widget) => !widget.options?.isReadOnly) + .map((widget) => ({ + widget, + pageNumber: page.pageNumber + })) + ); + + return flatArray || []; + }, [props.prefillData]); + useEffect(() => { + dispatch(resetWidgetState([])); + }, []); + // Reset loader state when modal closes + useEffect(() => { + if (!props?.isPrefillModal) { + initializedRef.current = false; + setTotalImages(0); + setLoadedImages(0); + setLoading(false); + } + }, [props?.isPrefillModal]); + + useEffect(() => { + //function is used to save all image base64 in redux state to display prefill images + const savePrefillImg = async () => { + const prefillImg = await utils?.savePrefillImg(props.xyPosition); + if (Array.isArray(prefillImg)) { + prefillImg.forEach((img) => dispatch(setPrefillImg(img))); + } + setImageLoaders({}); + }; + savePrefillImg(); + }, [props.xyPosition]); + + useEffect(() => { + setUniqueWidget(memoizedUniqueWidget); + }, [memoizedUniqueWidget]); + + useEffect(() => { + if (totalImages > 0 && loadedImages === totalImages) { + setLoading(false); + } + }, [loadedImages, totalImages]); + useEffect(() => { + if (image?.src) { + handleWidgetDetails(currentWidget); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [image]); + + // Run only once per modal open + useEffect(() => { + if (props?.isPrefillModal && !initializedRef.current) { + const getImgWidgets = uniqueWidget?.filter( + (w) => w.widget?.type === "image" && w.widget?.options?.response + ); + if (getImgWidgets?.length > 0) { + const imgCount = getImgWidgets.length; + setTotalImages(imgCount); + setLoadedImages(0); + setLoading(true); + initializedRef.current = true; // mark as initialized + } + } + }, [props?.isPrefillModal, uniqueWidget]); + + // The getDatePickerDate function retrieves the date in the correct format supported by the DatePicker. + const getDatePickerDate = (selectedDate, format = "dd-MM-yyyy") => { + let date; + if (format && format === "dd-MM-yyyy") { + const [day, month, year] = selectedDate?.split("-"); + date = new Date(`${year}-${month}-${day}`); + } else if (format && format === "dd.MM.yyyy") { + const [day, month, year] = selectedDate?.split("."); + date = new Date(`${year}.${month}.${day}`); + } else if (format && format === "dd/MM/yyyy") { + const [day, month, year] = selectedDate?.split("/"); + date = new Date(`${year}/${month}/${day}`); + } else { + date = new Date(selectedDate); + } + return date; + }; + const ImageComponent = (props) => { + const imageRefs = useRef([]); + let imgUrl = ""; + const isBase64Url = isBase64(props?.position?.SignUrl); + if (isBase64Url) { + imgUrl = props?.position?.SignUrl; + } else { + const getPrefillImg = prefillImg?.find( + (x) => x.id === props?.position?.key + ); + imgUrl = getPrefillImg?.base64; + } + + return ( + <> + {props?.position.options?.name} + {imgUrl ? ( + <> +
+ print img (imageRefs.current[props?.position.key] = el)} // Assign ref dynamicallys + src={imgUrl} + draggable="false" + className="object-contain h-full w-full aspect-[5/2]" + onLoad={() => handleImageLoaded?.(props?.position.key)} + onError={() => handleImageLoaded?.(props?.position.key)} + /> +
+ handleClearImage(props?.position)} + className="flex justify-start text-blue-500 underline cursor-pointer" + > + {t("clear")} + + + ) : ( +
imageRefs.current[props?.position.key]?.click()} + > + {imageLoaders[props?.position?.key] && ( +
+ +
+ )} + onImageChange(e, props?.position)} + className="filetype" + accept="image/png,image/jpeg" + ref={(el) => (imageRefs.current[props?.position.key] = el)} // Assign ref dynamically + hidden + /> + +
{t("upload")}
+
+ )} + + ); + }; + const ExampleCustomInput = forwardRef(({ value, onClick }, ref) => ( +
+ {value} + +
+ )); + ExampleCustomInput.displayName = "ExampleCustomInput"; + + const handleDate = (position) => { + // The getDatePickerDate function retrieves the date in the correct format supported by the DatePicker. + const getDate = getDatePickerDate( + position?.options.response || new Date(), + position?.options?.validation?.format + ); + return getDate; + }; + //function to set date with required date format onchange date + const handleOnDateChange = (date, position) => { + const format = position?.options?.validation?.format || "MM/dd/yyyy"; + let updateDate = date; + let newDate; + const isSpecialDateFormat = + format && ["dd-MM-yyyy", "dd.MM.yyyy", "dd/MM/yyyy"].includes(format); + if (isSpecialDateFormat) { + newDate = moment(updateDate).format(changeDateToMomentFormat(format)); + } else { + //using moment package is used to change date as per the format provided in selectDate obj e.g. - MM/dd/yyyy -> 03/12/2024 + newDate = new Date(updateDate); + newDate = moment(newDate.getTime()).format( + changeDateToMomentFormat(format) + ); + } + handleWidgetDetails(position, newDate); + }; + + const handleSavePrefillImg = async (widgetDetails) => { + setImageLoaders((prev) => ({ ...prev, [widgetDetails?.key]: true })); + try { + const imageName = generatePdfName(16); + const imageUrl = await convertBase64ToFile( + imageName, + image.src, + image.imgType + ); + setImageLoaders({}); + if (imageUrl) { + return imageUrl; + } + } catch (e) { + console.log("error in handleSavePrefillImg function ", e); + } + }; + //function is used to handle prefill widgets details and check if there are any duplicate widget name field exist then update all duplicate value + const handleWidgetDetails = async (widgetDetails, response) => { + const widgetName = widgetDetails?.options?.name; + const getPrefill = props.xyPosition.find((x) => x?.Role === "prefill"); + const getPlaceholder = getPrefill?.placeHolder; + let imgUrl; + if (widgetDetails?.type === "image") { + imgUrl = await handleSavePrefillImg(widgetDetails); + } + const updatedData = getPlaceholder.map((page) => ({ + ...page, + pos: page.pos.map((item) => { + if (item.options.name === widgetName) { + if (widgetDetails?.type === "image") { + return { + ...item, + SignUrl: imgUrl, + ImageType: image.imgType, + options: { ...item.options, response: imgUrl } + }; + } else { + return { + ...item, + options: { ...item.options, response: response } + }; + } + } else { + return item; + } + }) + })); + const newUpdateSigner = props.xyPosition.map((obj) => { + if (obj.Role === "prefill") { + return { ...obj, placeHolder: updatedData }; + } + return obj; + }); + props.setXyPosition(newUpdateSigner); + }; + + //function for set checked and unchecked value of checkbox + const handleCheckboxValue = (isChecked, ind, position) => { + let updateSelectedCheckbox = []; + updateSelectedCheckbox = + position.options?.defaultValue || position.options?.response || []; + if (isChecked) { + updateSelectedCheckbox.push(ind); + } else { + updateSelectedCheckbox = updateSelectedCheckbox.filter( + (data) => data !== ind + ); + } + handleWidgetDetails(position, updateSelectedCheckbox); + }; + + //function for image upload or update + const onImageChange = (event, position) => { + if (event.target.files && event.target.files[0]) { + const file = event.target.files[0]; + compressedFileSize(file, setImage); + setCurrentWidget(position); + } + }; + const handleRadioCheck = (data, position) => { + const res = position?.options?.response; + const defaultCheck = position?.options?.defaultValue; + if (res === data || defaultCheck === data) { + return true; + } else { + return false; + } + }; + + //function for show checked checkbox + const selectCheckbox = (ind, position) => { + const res = position?.options?.response; + const defaultCheck = position?.options?.defaultValue; + if (res && res?.length > 0) { + const isSelectIndex = res.indexOf(ind); + if (isSelectIndex > -1) { + return true; + } else { + return false; + } + } else if (defaultCheck) { + const isSelectIndex = defaultCheck.indexOf(ind); + if (isSelectIndex > -1) { + return true; + } else { + return false; + } + } else { + return false; + } + }; + const handleClearImage = (position) => { + let prefillPlaceholder = props?.xyPosition.filter( + (data) => data?.Role === "prefill" + ); + const updatedArray = prefillPlaceholder[0]?.placeHolder?.map((page) => ({ + ...page, + pos: page.pos.map((item) => { + if (item.options.name === position.options.name) { + return { + ...item, + SignUrl: "", + options: { + ...position.options, + response: "" + } + }; + } + return item; + }) + })); + const newUpdateSigner = props.xyPosition.map((obj) => { + if (obj.Role === "prefill") { + return { ...obj, placeHolder: updatedArray }; + } + return obj; + }); + props.setXyPosition(newUpdateSigner); + }; + const handleImageLoaded = (key) => { + // Prevent counting the same image multiple times. + // If this image (key) has not already been marked as loaded... + if (!loadedSet.current.has(key)) { + // Mark this image as loaded by adding its key to the Set + loadedSet.current.add(key); + // Increment the loadedImages state by 1 + // (tracks how many images have finished loading) + setLoadedImages((prev) => prev + 1); + } + }; + const handleWidgetType = (position) => { + switch (position?.type) { + case "checkbox": + return ( + <> + {position.options?.name} +
+ {position.options?.values?.map((data, ind) => ( +
+ { + handleCheckboxValue(e.target.checked, ind, position); + }} + /> + {!position.options?.isHideLabel && ( + + )} +
+ ))} +
+ + ); + case textWidget: + return ( + <> + {position.options?.name} + + + ); + case "dropdown": + return ( + <> + {position.options?.name} + + + ); + case "date": + return ( + <> + {position.options?.name} + ( +
+ + +
+ )} + closeOnScroll={true} + selected={handleDate(position)} + onChange={(date) => { + handleOnDateChange(date, position); + }} + customInput={} + dateFormat={position?.options?.validation?.format || "MM/dd/yyyy"} + /> + + ); + case "image": + return ( + + ); + case radioButtonWidget: + return ( + <> + {position.options?.name} +
+ {position.options?.values.map((data, ind) => ( +
+ { + handleWidgetDetails(position, data); + }} + /> + {!position.options?.isHideLabel && ( + + )} +
+ ))} +
+ + ); + default: + return position?.SignUrl ? ( +
+ image +
+ ) : ( +
+ No widget +
+ ); + } + }; + + const handleEmbedPrefill = (item) => { + props.handleCreateDocument(); + }; + //`loadOptions` function to use show all list of signer in dropdown + const loadOptions = async (inputValue) => { + try { + const baseURL = localStorage.getItem("baseUrl"); + const url = `${baseURL}functions/getsigners`; + const token = { + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + }; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + ...token + }; + const search = inputValue; + const axiosRes = await axios.post(url, { search }, { headers }); + const contactRes = axiosRes?.data?.result || []; + if (contactRes) { + const res = JSON.parse(JSON.stringify(contactRes)); + const result = res; + setUserList(result); + return await result.map((item) => ({ + label: `${item.Name}<${item.Email}>`, + value: item.objectId + })); + } + } catch (error) { + console.log("err", error); + } + }; + //`handleInputChange` function to get signers list from dropdown + const handleInputChange = (item, id) => { + const signerExist = props.forms.some((x) => x.label === item.label); + if (signerExist) { + alert(t("already-exist-signer")); + } else { + let newForm = [...props.forms]; + let signerId = newForm[id].value; + newForm[id].label = item?.label; + // newForm[id].value = item?.value; + props.setForms(newForm); + const getSigner = userList.find((x) => x.objectId === item.value); + props.handleAddUser(getSigner, signerId); + } + }; + //show modal to create new contact + const handleCreateNew = (e, id) => { + e.preventDefault(); + props.setIsNewContact({ status: true, id: id }); + }; + const closePopup = () => { + props.setIsNewContact({ status: false, id: "" }); + }; + return ( + <> + 0 ? t("prefill-widget") : "Recipients"} + isOpen={true} + handleClose={props.handleClosePrefillModal} + > +
+ {loading && ( +
+ +
+ )} + {uniqueWidget?.length > 0 && ( +
+
+ {uniqueWidget.map((x, id) => ( +
+ {handleWidgetType(x.widget)} +
+ ))} +
+
+ )} + +
+ {props.forms.length > 0 && ( +
+ {uniqueWidget?.length > 0 && ( +

+ {t("recipients")} +

+ )} +
+ {props.forms?.map((field, id) => { + return ( +
+ +
+
+ t("loading")} + noOptionsMessage={() => t("contact-not-found")} + loadOptions={loadOptions} + onChange={(item) => handleInputChange(item, id)} + unstyled + onFocus={() => loadOptions()} + classNames={{ + control: () => + "op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full h-full text-[11px]", + valueContainer: () => + "flex flex-row gap-x-[2px] gap-y-[2px] md:gap-y-0 w-full my-[2px]", + multiValue: () => + "op-badge op-badge-primary h-full text-[11px]", + multiValueLabel: () => "mb-[2px]", + menu: () => + "mt-1 shadow-md rounded-lg bg-base-200 text-base-content absolute z-9999", + menuList: () => "shadow-md rounded-lg ", + option: () => + "bg-base-200 text-base-content rounded-lg m-1 hover:bg-base-300 p-2 ", + noOptionsMessage: () => + "p-2 bg-base-200 rounded-lg m-1 p-2" + }} + menuPortalTarget={document.getElementById( + "selectSignerModal" + )} + /> +
+ +
+
+ ); + })} +
+
+ )} +
+
+ + +
+
+
+ + + + + ); +} + +export default PrefillWidgetModal; diff --git a/apps/OpenSign/src/components/pdf/PrevNext.jsx b/apps/OpenSign/src/components/pdf/PrevNext.jsx index 8c3cc166c4..b1f3bcdc83 100644 --- a/apps/OpenSign/src/components/pdf/PrevNext.jsx +++ b/apps/OpenSign/src/components/pdf/PrevNext.jsx @@ -20,7 +20,7 @@ function PrevNext({ pageNumber, allPages, changePage }) { onClick={previousPage} > - + @@ -32,7 +32,7 @@ function PrevNext({ pageNumber, allPages, changePage }) { onClick={nextPage} > - +
diff --git a/apps/OpenSign/src/components/pdf/RecipientList.jsx b/apps/OpenSign/src/components/pdf/RecipientList.jsx index 59ca1839bd..98e8285e2f 100644 --- a/apps/OpenSign/src/components/pdf/RecipientList.jsx +++ b/apps/OpenSign/src/components/pdf/RecipientList.jsx @@ -1,4 +1,4 @@ -import React, { useRef, useState } from "react"; +import { useRef, useState } from "react"; import { useAutoAnimate } from "@formkit/auto-animate/react"; import { color, @@ -12,6 +12,7 @@ const cursor = const RecipientList = (props) => { const [animationParent] = useAutoAnimate(); const [isHover, setIsHover] = useState(); + const [isPrefill, setIsPrefill] = useState(false); const [isEdit, setIsEdit] = useState(false); //function for onhover signer name change background color const inputRef = useRef(null); @@ -80,9 +81,43 @@ const RecipientList = (props) => { }); props?.setSignerPos(changeOrderSignerList); }; + const handleSelectRecipient = (e, index, obj, prefill) => { + e.preventDefault(); + props?.setIsSelectId(index); + props?.setUniqueId(obj.Id); + props?.setRoleName(obj.Role); + props?.setBlockColor(obj?.blockColor); + props?.handleModal && props?.handleModal(); + setIsPrefill(prefill ?? false); + props.setIsTour && props?.setIsTour(false); + }; + const isSelected = (ind) => { + const isUserSelected = + (!isMobile && isHover === ind) || + (!isPrefill && props.isSelectListId === ind); + return isUserSelected; + }; return ( <> - {props.signersdata?.length > 0 && + {props?.prefillSigner?.length > 0 && + props?.prefillSigner?.map((obj, ind) => ( +
handleSelectRecipient(e, ind, obj, true)} + > + + {obj.Name} +
+ ))} + {props.signersdata.length > 0 && props.signersdata.map((obj, ind) => { return (
{ : color[ind % color.length] : "transparent" }} - onClick={(e) => { - e.preventDefault(); - props.setIsSelectId(ind); - props.setUniqueId(obj.Id); - props.setRoleName(obj.Role); - props.setBlockColor(obj?.blockColor); - if (props.handleModal) { - props.handleModal(); - } - }} + onClick={(e) => handleSelectRecipient(e, ind, obj)} >
{ {isWidgetExist(obj.Id) ? ( ) : ( - <> - {obj.Name - ? getFirstLetter(obj.Name) - : getFirstLetter(obj.Role)} - + <>{getFirstLetter(obj?.Name ?? obj?.Role)} )}
{obj.Name ? ( - + {obj.Name} ) : ( { setIsEdit({ [obj.Id]: true }); props.setRoleName(obj.Role); @@ -204,14 +214,7 @@ const RecipientList = (props) => { )} {obj.Name && ( - + {obj?.Role || obj?.Email} )} @@ -247,18 +250,13 @@ const RecipientList = (props) => {
)} - {props.handleDeleteUser && ( + {props.handleDeleteUser && obj?.Role !== "prefill" && (
{ e.stopPropagation(); props.handleDeleteUser(obj.Id); }} - className={`${ - (!isMobile && isHover === ind) || - props.isSelectListId === ind - ? "text-[#424242]" - : "text-base-content" - } cursor-pointer`} + className={`${isSelected(ind) ? "text-[#424242]" : "text-base-content"} cursor-pointer`} >
diff --git a/apps/OpenSign/src/components/pdf/RenderAllPdfPage.jsx b/apps/OpenSign/src/components/pdf/RenderAllPdfPage.jsx index 393e85fe36..fdcf159793 100644 --- a/apps/OpenSign/src/components/pdf/RenderAllPdfPage.jsx +++ b/apps/OpenSign/src/components/pdf/RenderAllPdfPage.jsx @@ -17,7 +17,7 @@ function RenderAllPdfPage(props) { const mergePdfInputRef = useRef(null); const [signPageNumber, setSignPageNumber] = useState([]); const [bookmarkColor, setBookmarkColor] = useState(""); - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); const [pageWidth, setPageWidth] = useState(""); //set all number of pages after load pdf @@ -51,7 +51,7 @@ function RenderAllPdfPage(props) { const timer = setTimeout(updateSize, 100); // match the transition duration return () => clearTimeout(timer); - }, [isHeader, pageContainer, props?.containerWH]); + }, [isSidebar, pageContainer, props?.containerWH]); //'function `addSignatureBookmark` is used to display the page where the user's signature is located. const addSignatureBookmark = (index) => { const ispageNumber = signPageNumber.includes(index + 1); @@ -78,11 +78,11 @@ function RenderAllPdfPage(props) { const handleFileUpload = async (e) => { const file = e.target.files[0]; if (!file) { - alert("Please upload a valid PDF file."); + alert(t("please-select-pdf")); return; } if (!file.type.includes("pdf")) { - alert("Only PDF files are allowed."); + alert(t("only-pdf-allowed")); return; } const mb = Math.round(file?.size / Math.pow(1024, 2)); @@ -114,18 +114,18 @@ function RenderAllPdfPage(props) { // Upload the file to Parse Server } catch (err) { console.error("Incorrect password or decryption failed", err); - alert("Incorrect password or decryption failed."); + alert(t("incorrect-password-or-decryption-failed")); } } else { - alert("Please provided Password."); + alert(t("provide-password")); } } else { console.log("Err ", err); - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } } else { - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } const uploadedPdfDoc = await PDFDocument.load(uploadedPdfBytes, { diff --git a/apps/OpenSign/src/components/pdf/RenderPdf.jsx b/apps/OpenSign/src/components/pdf/RenderPdf.jsx index f27bba92a5..160dcc25b0 100644 --- a/apps/OpenSign/src/components/pdf/RenderPdf.jsx +++ b/apps/OpenSign/src/components/pdf/RenderPdf.jsx @@ -1,4 +1,10 @@ -import React, { useState, useRef } from "react"; +import React, { + useState, + useRef, + useCallback, + useLayoutEffect, + useEffect +} from "react"; import RSC from "react-scrollbars-custom"; import { Document, Page } from "react-pdf"; import { @@ -12,22 +18,30 @@ import Placeholder from "./Placeholder"; import Alert from "../../primitives/Alert"; import { useTranslation } from "react-i18next"; import usePdfPinchZoom from "../../hook/usePdfPinchZoom"; +import { useDispatch, useSelector } from "react-redux"; +import Guidelines from "./Guidelines"; +import { useGuidelinesContext } from "../../context/GuidelinesContext"; +import { toggleSidebar } from "../../redux/reducers/sidebarReducer"; function RenderPdf(props) { const { t } = useTranslation(); + const dispatch = useDispatch(); const [scaledHeight, setScaledHeight] = useState(); - const [guideline, setGuideline] = useState({ - show: false, - x1: 0, - x2: 0, - y1: 0, - y2: 0 - }); + const { guideline } = useGuidelinesContext(); //check isGuestSigner is present in local if yes than handle login flow header in mobile view const isGuestSigner = localStorage.getItem("isGuestSigner"); - + const scrollTriggerId = useSelector((state) => state.widget.scrollTriggerId); + const isOpen = useSelector((state) => state.sidebar.isOpen); + const scrollRef = useRef(null); const pdfContainerRef = useRef(null); + useEffect(() => { + dispatch(toggleSidebar(false)); + return () => { + dispatch(toggleSidebar(true)); + }; + }, []); + // enable pinch to zoom only on actual pdf wrapper usePdfPinchZoom( pdfContainerRef, @@ -36,20 +50,6 @@ function RenderPdf(props) { props.setZoomPercent ); - const handleGuideline = (isShow, x = 0, y = 0, width = 0, height = 0) => { - if (isShow) { - setGuideline({ - show: true, - x1: x, - x2: x + width, - y1: y, - y2: y + height - }); - } else { - setGuideline({ show: false, x1: 0, x2: 0, y1: 0, y2: 0 }); - } - }; - // handle signature block width and height according to screen const posWidth = (pos, signYourself) => { const containerScale = getContainerScale( @@ -111,6 +111,98 @@ function RenderPdf(props) { } }; + // `smoothScrollTo` is used to provide smooth scrolling while focus on widget + const smoothScrollTo = (targetY, duration = 500) => { + const sb = scrollRef.current; + if (!sb) return; + const start = sb.scrollTop; + const change = targetY - start; + const startTime = performance.now(); + + const animate = (now) => { + const elapsed = now - startTime; + const t = Math.min(1, elapsed / duration); + // easeInOutQuad + const ease = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; + sb.scrollTo(sb.scrollLeft, start + change * ease); + if (t < 1) requestAnimationFrame(animate); + }; + + requestAnimationFrame(animate); + }; + + // `scrollToTarget` is used to focus on widget and scroll to top + const scrollToTarget = useCallback(() => { + // Get the scrollbar container ref + const sb = scrollRef.current; + // If there's no content element or no widget details, bail out + if (!sb?.contentElement || !props.currWidgetsDetails) return; + + // The absolute Y position (relative to the document) where we want to scroll + const yPosition = props?.currWidgetsDetails?.yPosition || 0; + const containerScale = getContainerScale( + props.pdfOriginalWH, + props.pageNumber, + props.containerWH + ); + + const targetTop = yPosition * containerScale * props.scale; + // The Y offset of the scrollable content container itself + const { offsetTop } = sb.contentElement; + + // Account for the header height + a little extra padding + // Different header height if user is a guest signer + const headerOffset = isGuestSigner ? 10 : 79; + // Compute the scroll position inside the container + const positionTop = targetTop - offsetTop - headerOffset; + + const pageNumber = props.pageNumber > 0 ? props.pageNumber - 1 : 0; + const ogH = props.pdfOriginalWH[pageNumber]?.height; + // If the modal for this widget is open, we may need to expand the PDF container + if (props.isShowModal[scrollTriggerId]) { + // Original PDF height for this page + if (pdfContainerRef?.current) { + // Increase container height to include the area up to the target + pdfContainerRef.current.style.height = `${ogH + (targetTop - offsetTop)}px`; + } + } else { + // Otherwise, reset any inline height override + if (pdfContainerRef?.current) { + pdfContainerRef.current.style.height = ""; + } + } + // Actually perform the scroll: keep the same horizontal scroll, scroll vertically + if (targetTop > ogH * 0.75 && !isGuestSigner && isOpen) { + smoothScrollTo(positionTop - 300); + } else if (targetTop > ogH * 0.75 && !isGuestSigner && !isOpen) { + smoothScrollTo(positionTop - 100); + } else { + smoothScrollTo(positionTop); + } + + // Highlight only the target widget; reset others to default border + document.querySelectorAll(".signYourselfBlock").forEach((w) => { + w.style.border = + w.id === String(scrollTriggerId) + ? "1.5px solid red" // active widget in red + : "1.5px solid #007bff"; // others in blue + }); + }, [ + scrollTriggerId, + props.currWidgetsDetails?.yPosition, + props.isShowModal, + props.pdfOriginalWH, + props.pageNumber + ]); + + useLayoutEffect(() => { + // Whenever scrollTriggerId changes, fire off the scroll in the next rAF + // to ensure the DOM has painted/layout is stable before scrolling + if (scrollTriggerId) { + scrollToTarget(); + } + }, [scrollTriggerId, scrollToTarget]); + // function for render placeholder block over pdf document (all signing flow) const checkSignedSigners = (data) => { let checkSign = []; @@ -147,7 +239,6 @@ function RenderPdf(props) { isSignYourself={false} posWidth={posWidth} posHeight={posHeight} - showGuidelines={handleGuideline} isDragging={props.isDragging} pdfDetails={props.pdfDetails} unSignedWidgetId={props.unSignedWidgetId} @@ -164,7 +255,7 @@ function RenderPdf(props) { handleStop={props.handleStop} setUniqueId={props.setUniqueId} setIsSelectId={props.setIsSelectId} - handleDeleteSign={props.handleDeleteSign} + handleDeleteWidget={props.handleDeleteWidget} setIsPageCopy={props.setIsPageCopy} handleTextSettingModal={props.handleTextSettingModal} handleCellSettingModal={props.handleCellSettingModal} @@ -172,16 +263,14 @@ function RenderPdf(props) { isFreeResize={props.isSelfSign ? true : false} isOpenSignPad={true} assignedWidgetId={props.assignedWidgetId} - isApplyAll={true} setCellCount={props.setCellCount} setFontSize={props.setFontSize} fontSize={props.fontSize} fontColor={props.fontColor} setFontColor={props.setFontColor} - setRequestSignTour={props.setRequestSignTour} + setIsReqSignTourDisabled={props.setIsReqSignTourDisabled} calculateFontsize={calculateFontsize} currWidgetsDetails={props?.currWidgetsDetails} - setTempSignerId={props.setTempSignerId} /> ) @@ -218,6 +307,7 @@ function RenderPdf(props) { {t("success-email-alert")} )} ))} @@ -346,7 +439,9 @@ function RenderPdf(props) { key={id} pos={pos} setIsPageCopy={props.setIsPageCopy} - handleDeleteSign={props.handleDeleteSign} + handleDeleteWidget={ + props.handleDeleteWidget + } handleTabDrag={props.handleTabDrag} handleStop={props.handleStop} handleSignYourselfImageResize={ @@ -360,8 +455,6 @@ function RenderPdf(props) { isSignYourself={true} posWidth={posWidth} posHeight={posHeight} - showGuidelines={handleGuideline} - pdfDetails={props.pdfDetails[0]} isDragging={props.isDragging} setIsCheckbox={props.setIsCheckbox} setCurrWidgetsDetails={ @@ -388,6 +481,9 @@ function RenderPdf(props) { currWidgetsDetails={ props?.currWidgetsDetails } + setIsReqSignTourDisabled={ + props.setIsReqSignTourDisabled + } /> ) )} @@ -426,28 +522,12 @@ function RenderPdf(props) { /> {guideline.show && ( - <> - {/* top guide */} -
- {/* bottom guide */} -
- {/* left guide */} -
- {/* right guide */} -
- + )}
diff --git a/apps/OpenSign/src/components/pdf/SignerListPlace.jsx b/apps/OpenSign/src/components/pdf/SignerListPlace.jsx index 0c3e6dab11..8e43926e2b 100644 --- a/apps/OpenSign/src/components/pdf/SignerListPlace.jsx +++ b/apps/OpenSign/src/components/pdf/SignerListPlace.jsx @@ -1,16 +1,23 @@ -import React from "react"; import RecipientList from "./RecipientList"; -import { Tooltip } from "react-tooltip"; +// import { Tooltip } from "react-tooltip"; import { useTranslation } from "react-i18next"; function SignerListPlace(props) { const { t } = useTranslation(); + + const handleAddRecipient = () => { + props?.setIsAddSigner(true); + props.setIsTour && props.setIsTour(false); + }; return (
{props.title ? props.title : "Recipients"} - + props.setIsTour && props.setIsTour(true)}> + + + {/* {props?.title === "Roles" && ( <> @@ -30,7 +37,7 @@ function SignerListPlace(props) { )} - + */}
@@ -53,7 +60,7 @@ function SignerListPlace(props) { data-tut="addRecipient" className="op-btn op-btn-accent op-btn-outline w-full mt-[14px]" disabled={props?.isMailSend ? true : false} - onClick={() => props.setIsAddSigner(true)} + onClick={handleAddRecipient} > {t("add-recipients")}
diff --git a/apps/OpenSign/src/components/pdf/WidgetComponent.jsx b/apps/OpenSign/src/components/pdf/WidgetComponent.jsx index 1e87c60b16..28076fabb4 100644 --- a/apps/OpenSign/src/components/pdf/WidgetComponent.jsx +++ b/apps/OpenSign/src/components/pdf/WidgetComponent.jsx @@ -4,7 +4,6 @@ import RecipientList from "./RecipientList"; import { useDrag } from "react-dnd"; import WidgetList from "./WidgetList"; import { - color, isMobile, radioButtonWidget, textInputWidget, @@ -88,12 +87,12 @@ function WidgetComponent(props) { signature, stamp, initials, + textInput, name, jobTitle, company, date, text, - textInput, cells, checkbox, dropdown, @@ -110,6 +109,7 @@ function WidgetComponent(props) { // eslint-disable-next-line }, []); + //allow only (signature,stamp,initials,text,name, job title, company,email) widget when isAllowModification true and user have session token const modifiedWidgets = widget.filter( (data) => ![ @@ -121,6 +121,7 @@ function WidgetComponent(props) { "checkbox" ].includes(data.type) ); + //allow only (signature,stamp,initials,text) widget when isAllowModification true and user does not have session token const unlogedInUserWidgets = widget.filter( (data) => ![ @@ -136,25 +137,37 @@ function WidgetComponent(props) { "company" ].includes(data.type) ); - const filterWidgets = widget.filter( + const selfSignWidgets = widget.filter( (data) => - !["dropdown", radioButtonWidget, textInputWidget].includes( - data.type - ) + !["dropdown", radioButtonWidget, textInputWidget].includes(data.type) ); - const textWidgetData = widget.filter((data) => data.type !== textWidget); - const updateWidgets = props.isSignYourself - ? filterWidgets - : props.isTemplateFlow - ? textWidgetData - : props.isAlllowModify - ? userInformation - ? modifiedWidgets - : unlogedInUserWidgets - : widget; - + //if user select prefill role then allow only date,image,text,checkbox,radio,dropdownAdd commentMore actions + //dropdown widget should only be show in template flow + const prefillAllowWidgets = widget.filter((data) => + (props.isPrefillDropdown ? ["dropdown"] : []) + .concat([radioButtonWidget, textWidget, "date", "image", "checkbox"]) + .includes(data.type) + ); + //function to show widget on the base of conditionAdd commentMore actions + const handleWidgetType = () => { + if (props.isSignYourself) { + return selfSignWidgets; + } else if (props?.roleName === "prefill") { + return prefillAllowWidgets; + } else if (props.isAlllowModify) { + if (userInformation) { + return modifiedWidgets; + } else { + return unlogedInUserWidgets; + } + } else if (props?.roleName !== "prefill") { + return widget.filter((data) => ![textWidget].includes(data.type)); + } + }; const handleSelectRecipient = () => { - if ( + if (props?.roleName === "prefill") { + return "Prefill by owner"; + } else if ( props.signersdata[props.isSelectListId]?.Email || props.signersdata[props.isSelectListId]?.Role ) { @@ -180,9 +193,10 @@ function WidgetComponent(props) { className="w-full op-select op-select-bordered pointer-events-none" value={handleSelectRecipient()} style={{ - backgroundColor: props.blockColor - ? props.blockColor - : color[0] + backgroundColor: + props.roleName === "prefill" + ? "#edf6fc" + : props?.blockColor || "#edf6fc" }} >
- {props.signersdata.length > 0 ? ( + {props.signersdata.length > 0 || props.prefillSigner.length > 0 ? (
) : ( diff --git a/apps/OpenSign/src/components/pdf/WidgetList.jsx b/apps/OpenSign/src/components/pdf/WidgetList.jsx index f502eed2dc..ef298c4e07 100644 --- a/apps/OpenSign/src/components/pdf/WidgetList.jsx +++ b/apps/OpenSign/src/components/pdf/WidgetList.jsx @@ -1,10 +1,11 @@ -import React from "react"; -import { getWidgetType, isMobile } from "../../constant/Utils"; +import { isMobile } from "../../constant/Utils"; import { useTranslation } from "react-i18next"; +import getWidgetType from "./getWidgetType"; function WidgetList(props) { const { t } = useTranslation(); - return props.updateWidgets.map((item, ind) => { + const getWidgetList = props.updateWidgets(); + return getWidgetList?.map((item, ind) => { return (
{ const type = props.defaultdata?.type; if (type === "signature") { - return "Draw signature"; + return t("draw-signature"); } else if (type === "stamp" || type === "image") { - return `Upload ${type}`; + return type === "stamp" ? t("upload-stamp-image") : t("upload-image"); } else if (type === "initials") { - return "Draw initial"; + return t("draw-initials"); } else if (type === textInputWidget) { - return "Enter text"; + return t("enter-text"); } else { - return `Enter ${type}`; + return t("enter-widgettype", { widgetType: type }); } }; useEffect(() => { @@ -81,7 +81,7 @@ const WidgetNameModal = (props) => { if (enabledSignTypes.length === 0) { alert(t("at-least-one-signature-type")); } else if (isDefaultSignTypeOnly) { - alert(t("expect-default-one-more-signature-type")); + alert(t("expect-default-one-signature-type")); } else { const data = { ...formdata, signatureType }; props.handleData(data, props.defaultdata?.type); @@ -231,101 +231,105 @@ const WidgetNameModal = (props) => { />
)} - {[textInputWidget, cellsWidget].includes(props.defaultdata?.type) && ( - <> -
- - handledefaultChange(e)} - autoComplete="off" - maxLength={ - props.defaultdata?.type === cellsWidget - ? formdata.cellCount - : undefined - } - onBlur={() => { - if (isValid === false) { - setFormdata({ ...formdata, defaultValue: "" }); - setIsValid(true); + {[textInputWidget, cellsWidget].includes(props.defaultdata?.type) && + props?.roleName !== "prefill" && ( + <> +
+ + handledefaultChange(e)} + autoComplete="off" + maxLength={ + props.defaultdata?.type === cellsWidget + ? formdata.cellCount + : undefined } - }} - /> - {isValid === false && ( -
- - {t("invalid-default-value")} -
- )} -
- - )} - {!["signature", "initials", textWidget].includes( - props.defaultdata?.type - ) && ( -
-
- {statusArr.map((data, ind) => { - return ( + onBlur={() => { + if (isValid === false) { + setFormdata({ ...formdata, defaultValue: "" }); + setIsValid(true); + } + }} + /> + {isValid === false && (
+ + {t("invalid-default-value")} +
+ )} +
+ + )} + {!["signature", "initials"].includes(props.defaultdata?.type) && + props?.roleName !== "prefill" && ( +
+
+ {statusArr.map((data, ind) => { + return ( +
+ + setFormdata({ + ...formdata, + status: data.toLowerCase() + }) + } + checked={ + formdata.status.toLowerCase() === data.toLowerCase() + } + /> +
+ {t(`widget-status.${data}`)} +
+
+ ); + })} +
+ {[textInputWidget, cellsWidget].includes( + props.defaultdata?.type + ) && + props?.roleName !== "prefill" && ( +
- setFormdata({ ...formdata, status: data.toLowerCase() }) - } - checked={ - formdata.status.toLowerCase() === data.toLowerCase() + setFormdata((prev) => ({ + ...formdata, + isReadOnly: !prev.isReadOnly + })) } /> -
- {t(`widget-status.${data}`)} -
+
- ); - })} + )}
- {[textInputWidget, cellsWidget].includes( - props.defaultdata?.type - ) && ( -
- - setFormdata((prev) => ({ - ...formdata, - isReadOnly: !prev.isReadOnly - })) - } - /> - -
- )} -
- )} + )} {["signature", "initials"].includes(props.defaultdata?.type) && (
)} - {props.defaultdata?.type !== textWidget && ( + {props?.roleName !== "prefill" && (
@@ -1331,7 +1305,7 @@ function WidgetsValueModal(props) { )} {accesstoken && (
- {saveSignCheckbox?.isVisible && savesigncheckbox} + {mysign?.isVisible && savesigncheckbox}
)}
@@ -1364,8 +1338,8 @@ function WidgetsValueModal(props) { {currWidgetsDetails?.options?.values?.map((data, ind) => (
+ {isLoader && ( +
+ +
+ )} {isFinish ? ( <>
@@ -1956,7 +1946,7 @@ function WidgetsValueModal(props) { ) : ( )}
diff --git a/apps/OpenSign/src/components/pdf/getWidgetType.jsx b/apps/OpenSign/src/components/pdf/getWidgetType.jsx new file mode 100644 index 0000000000..f85ee2b4ff --- /dev/null +++ b/apps/OpenSign/src/components/pdf/getWidgetType.jsx @@ -0,0 +1,21 @@ +import { isMobile } from "../../constant/Utils"; + +// `getWidgetType` is used to load ui of widget in side list +const getWidgetType = (item, widgetName) => { + return ( +
+
+
+ {!isMobile && } + + {widgetName} + +
+
+ +
+
+
+ ); +}; +export default getWidgetType; diff --git a/apps/OpenSign/src/components/shared/fields/DateFormatSelector.jsx b/apps/OpenSign/src/components/preferences/DateFormatSelector.jsx similarity index 95% rename from apps/OpenSign/src/components/shared/fields/DateFormatSelector.jsx rename to apps/OpenSign/src/components/preferences/DateFormatSelector.jsx index 5e5a6aa6d5..8f6dad728e 100644 --- a/apps/OpenSign/src/components/shared/fields/DateFormatSelector.jsx +++ b/apps/OpenSign/src/components/preferences/DateFormatSelector.jsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { formatDateTime } from "../../../constant/Utils"; +import { formatDateTime } from "../../constant/Utils"; import { useTranslation } from "react-i18next"; const DateFormatSelector = (props) => { @@ -17,7 +17,9 @@ const DateFormatSelector = (props) => { "YYYY-MM-DD", "MM-DD-YYYY", "MM.DD.YYYY", - "MMM DD, YYYY" + "MMM DD, YYYY", + "DD.MM.YYYY", + "DD/MM/YYYY" ]; // Handle format change diff --git a/apps/OpenSign/src/components/preferences/FilenameFormatSelector.jsx b/apps/OpenSign/src/components/preferences/FilenameFormatSelector.jsx new file mode 100644 index 0000000000..2ee8cbf677 --- /dev/null +++ b/apps/OpenSign/src/components/preferences/FilenameFormatSelector.jsx @@ -0,0 +1,99 @@ +import { useState, useEffect, useMemo } from "react"; +import Parse from "parse"; +import { buildDownloadFilename } from "../../utils"; +import { useTranslation } from "react-i18next"; +import { Tooltip as ReactTooltip } from "react-tooltip"; + +/** + * Enum-like list of supported filename format IDs and their labels + * Keep IDs stable; you can freely change labels for UX. + */ +const FILENAME_FORMATS = [ + { id: "DOCNAME", label: "document Name.pdf" }, + { id: "DOCNAME_SIGNED", label: "document Name - Signed.pdf" }, + { id: "DOCNAME_EMAIL", label: "document Name - name@domain.com.pdf" }, + { + id: "DOCNAME_EMAIL_DATE", + label: "document Name - name@domain.com - date.pdf" + } +]; + +const FilenameFormatSelector = ({ fileNameFormat, setFileNameFormat }) => { + const { t } = useTranslation(); + const sampleDocName = "Agreement"; + const [value, setValue] = useState(fileNameFormat); + const [error, setError] = useState(""); + const currentUser = Parse?.User?.current(); + const email = currentUser?.get("email") || "user@example.com"; + + // Load preference from contracts_User + useEffect(() => { + (async () => { + try { + if (!currentUser) return; + const rec = await Parse.Cloud.run("getUserDetails"); + if (rec) { + const fmt = rec.get("DownloadFilenameFormat"); + if (fmt) setValue(fmt); + } + } catch (e) { + console.error("Load filename pref failed", e); + setError(e?.message || String(e)); + } + })(); + }, [currentUser]); + + const preview = useMemo(() => { + return buildDownloadFilename(value, { + docName: sampleDocName, + email, + isSigned: true // preview with signed true for that option + }); + }, [value, email, sampleDocName]); + + async function savePreference(nextValue) { + setFileNameFormat(nextValue); + } + return ( +
+ ); +}; + +export default FilenameFormatSelector; diff --git a/apps/OpenSign/src/components/shared/fields/TimezoneSelector.jsx b/apps/OpenSign/src/components/preferences/TimezoneSelector.jsx similarity index 100% rename from apps/OpenSign/src/components/shared/fields/TimezoneSelector.jsx rename to apps/OpenSign/src/components/preferences/TimezoneSelector.jsx diff --git a/apps/OpenSign/src/components/shared/fields/FolderModal.jsx b/apps/OpenSign/src/components/shared/fields/FolderModal.jsx index 07b802020d..6977a6aeb1 100644 --- a/apps/OpenSign/src/components/shared/fields/FolderModal.jsx +++ b/apps/OpenSign/src/components/shared/fields/FolderModal.jsx @@ -197,7 +197,7 @@ const FolderModal = (props) => { diff --git a/apps/OpenSign/src/components/shared/fields/SelectFolder.jsx b/apps/OpenSign/src/components/shared/fields/SelectFolder.jsx index 2fa6e58350..d8b7a17a4d 100644 --- a/apps/OpenSign/src/components/shared/fields/SelectFolder.jsx +++ b/apps/OpenSign/src/components/shared/fields/SelectFolder.jsx @@ -183,7 +183,7 @@ const SelectFolder = ({ required, onSuccess, folderCls, isReset }) => { @@ -262,7 +262,7 @@ const SelectFolder = ({ required, onSuccess, folderCls, isReset }) => { diff --git a/apps/OpenSign/src/components/shared/fields/SelectSigners.jsx b/apps/OpenSign/src/components/shared/fields/SelectSigners.jsx index c6fe69d4b6..cca65c3184 100644 --- a/apps/OpenSign/src/components/shared/fields/SelectSigners.jsx +++ b/apps/OpenSign/src/components/shared/fields/SelectSigners.jsx @@ -63,6 +63,10 @@ const SelectSigners = (props) => { if (props.closePopup) { props.closePopup(); } + } else if (selected?.value) { + if (props.closePopup) { + props.closePopup(); + } } else { setIsError(true); setTimeout(() => setIsError(false), 1000); diff --git a/apps/OpenSign/src/components/shared/fields/SignersInput.jsx b/apps/OpenSign/src/components/shared/fields/SignersInput.jsx index 8ecfffcf6a..967f31b828 100644 --- a/apps/OpenSign/src/components/shared/fields/SignersInput.jsx +++ b/apps/OpenSign/src/components/shared/fields/SignersInput.jsx @@ -217,6 +217,7 @@ const SignersInput = (props) => { {isModal && ( diff --git a/apps/OpenSign/src/components/sidebar/Sidebar.jsx b/apps/OpenSign/src/components/sidebar/Sidebar.jsx index 1775f12b47..71ae922fe8 100644 --- a/apps/OpenSign/src/components/sidebar/Sidebar.jsx +++ b/apps/OpenSign/src/components/sidebar/Sidebar.jsx @@ -5,9 +5,15 @@ import SocialMedia from "../SocialMedia"; import dp from "../../assets/images/dp.png"; import sidebarList, { subSetting } from "../../json/menuJson"; import { useNavigate } from "react-router"; +import { useDispatch, useSelector } from "react-redux"; +import { useWindowSize } from "../../hook/useWindowSize"; +import { toggleSidebar } from "../../redux/reducers/sidebarReducer"; -const Sidebar = ({ isOpen, closeSidebar }) => { +const Sidebar = () => { + const { width } = useWindowSize(); const navigate = useNavigate(); + const dispatch = useDispatch(); + const isOpen = useSelector((state) => state.sidebar.isOpen); const [menuList, setmenuList] = useState([]); const [submenuOpen, setSubmenuOpen] = useState(false); const username = localStorage.getItem("username"); @@ -22,6 +28,12 @@ const Sidebar = ({ isOpen, closeSidebar }) => { } }, []); + const closeSidebar = () => { + if (width <= 1023) { + dispatch(toggleSidebar(false)); + } + }; + const menuItem = async () => { try { if (localStorage.getItem("defaultmenuid")) { @@ -59,8 +71,8 @@ const Sidebar = ({ isOpen, closeSidebar }) => { }; return ( diff --git a/apps/OpenSign/src/constant/Utils.jsx b/apps/OpenSign/src/constant/Utils.js similarity index 85% rename from apps/OpenSign/src/constant/Utils.jsx rename to apps/OpenSign/src/constant/Utils.js index a960454ab2..51afafd904 100644 --- a/apps/OpenSign/src/constant/Utils.jsx +++ b/apps/OpenSign/src/constant/Utils.js @@ -6,10 +6,10 @@ import { appInfo } from "./appinfo"; import { saveAs } from "file-saver"; import printModule from "print-js"; import fontkit from "@pdf-lib/fontkit"; -import { - themeColor -} from "./const"; +import { themeColor } from "./const"; import { format, toZonedTime } from "date-fns-tz"; +import i18n from "../i18n"; +import { buildDownloadFilename } from "../utils"; export const fontsizeArr = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]; export const fontColorArr = ["red", "black", "blue", "yellow"]; @@ -24,7 +24,25 @@ export const cellsWidget = "cells"; export function getEnv() { return window?.RUNTIME_ENV || {}; } +const appName = "OpenSign™"; +export const defaultMailBody = `

Hi {{receiver_name}},


We hope this email finds you well. {{sender_name}} has requested you to review and sign {{document_title}}.

Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.


Sign here



If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.


Thanks

Team ${appName}


`; +export const defaultMailSubject = `{{sender_name}} has requested you to sign {{document_title}}`; + +export const randomId = (digit = 8) => { + // 1. Grab a cryptographically-secure 32-bit random value + // Use crypto for stronger randomness + const randomBytes = crypto.getRandomValues(new Uint32Array(1)); + const raw = randomBytes[0]; // 0 … 4,294,967,295 + + // Calculate the min and max for the given digit length + const min = Math.pow(10, digit - 1); // e.g., digit=3 → 100 + const max = Math.pow(10, digit) - 1; // e.g., digit=3 → 999 + const range = max - min + 1; + + // Collapse random value into the range and shift + return min + (raw % range); +}; //function for create list of year for date widget export const range = (start, end, step) => { const range = []; @@ -200,15 +218,12 @@ export const pdfNewWidthFun = (divRef) => { }; //`contractUsers` function is used to get contract_User details -export const contractUsers = async ( -) => { +export const contractUsers = async () => { try { const url = `${localStorage.getItem("baseUrl")}functions/getUserDetails`; const parseAppId = localStorage.getItem("parseAppId"); - const accesstoken = - localStorage.getItem("accesstoken"); - const token = - { "X-Parse-Session-Token": accesstoken }; + const accesstoken = localStorage.getItem("accesstoken"); + const token = { "X-Parse-Session-Token": accesstoken }; const headers = { headers: { "Content-Type": "application/json", @@ -308,12 +323,12 @@ export const widgets = [ { type: "signature", icon: "fa-light fa-pen-nib", iconSize: "20px" }, { type: "stamp", icon: "fa-light fa-stamp", iconSize: "19px" }, { type: "initials", icon: "fa-light fa-signature", iconSize: "15px" }, + { type: textInputWidget, icon: "fa-light fa-font", iconSize: "21px" }, { type: "name", icon: "fa-light fa-user", iconSize: "21px" }, { type: "job title", icon: "fa-light fa-address-card", iconSize: "17px" }, { type: "company", icon: "fa-light fa-building", iconSize: "25px" }, { type: "date", icon: "fa-light fa-calendar-days", iconSize: "20px" }, { type: textWidget, icon: "fa-light fa-text-width", iconSize: "20px" }, - { type: textInputWidget, icon: "fa-light fa-font", iconSize: "21px" }, { type: cellsWidget, icon: "fa-light fa-table-cells", iconSize: "20px" }, { type: "checkbox", icon: "fa-light fa-square-check", iconSize: "22px" }, { @@ -395,49 +410,60 @@ export const changeDateToMomentFormat = (format) => { return "L"; } }; -export const addWidgetOptions = (type, signer, widgetValue) => { - const status = { status: "required" }; +export const addWidgetOptions = (type, signer, placeholder, widgetValue) => { + let defaultOpt; + //condition to handle widgets name field + if (placeholder) { + const countSameWidget = placeholder?.reduce((count, page) => { + return count + page.pos.filter((item) => item.type === type).length; + }, 0); + const count = countSameWidget + 1; + defaultOpt = { + name: `${type}-${count}`, + status: "required" + }; + } else { + defaultOpt = { + name: `${type}-1`, + status: "required" + }; + } switch (type) { case "signature": - return { ...status, name: "Signature" }; + return defaultOpt; case "stamp": - return { ...status, name: "Upload stamp" }; + return defaultOpt; case "checkbox": return { - ...status, - name: "Checkbox", + ...defaultOpt, isReadOnly: false, isHideLabel: false }; case textInputWidget: - return { ...status, name: "Text", isReadOnly: false }; + return { ...defaultOpt, isReadOnly: false }; case cellsWidget: return { - ...status, - name: "Cells", + ...defaultOpt, cellCount: 5, defaultValue: "", validation: { type: "", pattern: "" }, isReadOnly: false }; case "initials": - return { ...status, name: "Initials" }; + return defaultOpt; case "name": return { - ...status, - name: "Name", + ...defaultOpt, defaultValue: widgetValue ? widgetValue : "" }; case "company": return { - ...status, - name: "Company", + ...defaultOpt, defaultValue: widgetValue ? widgetValue : "" }; case "job title": return { - ...status, - name: "Job title", + ...defaultOpt, defaultValue: widgetValue ? widgetValue : "" }; case "date": { @@ -445,73 +471,92 @@ export const addWidgetOptions = (type, signer, widgetValue) => { ? selectFormat(signer?.DateFormat) : "MM/dd/yyyy"; return { - ...status, - name: "Date", + ...defaultOpt, response: getDate(signer?.DateFormat), validation: { format: dateFormat, type: "date-format" } }; } case "image": - return { ...status, name: "Upload image" }; + return defaultOpt; case "email": return { - ...status, - name: "Email", + ...defaultOpt, validation: { type: "email", pattern: "" }, defaultValue: widgetValue ? widgetValue : "" }; case "dropdown": - return { ...status, name: "Choose one" }; + return defaultOpt; case radioButtonWidget: return { - ...status, - name: "Radio button", + ...defaultOpt, values: [], isReadOnly: false, isHideLabel: false }; case textWidget: - return { ...status, name: "Text" }; + return defaultOpt; default: return {}; } }; -export const addWidgetSelfsignOptions = (type, getWidgetValue, owner) => { +export const addWidgetSelfsignOptions = ( + type, + getWidgetValue, + owner, + placeholder +) => { + let defaultOpt; + //condition to handle widgets name field + if (placeholder) { + const countSameWidget = placeholder?.reduce((count, page) => { + return count + page.pos.filter((item) => item.type === type).length; + }, 0); + const count = countSameWidget + 1; + defaultOpt = { + name: `${type}-${count}`, + status: "required" + }; + } else { + defaultOpt = { + name: `${type}-1`, + status: "required" + }; + } switch (type) { case "signature": - return { name: "Signature" }; + return defaultOpt; case "stamp": - return { name: "Upload stamp" }; + return defaultOpt; case "checkbox": - return { name: "Checkbox" }; + return defaultOpt; case textWidget: - return { name: "Text" }; + return defaultOpt; case cellsWidget: return { - name: "Cells", + ...defaultOpt, cellCount: 5, defaultValue: "", validation: { type: "", pattern: "" }, isReadOnly: false }; case "initials": - return { name: "Initials" }; + return defaultOpt; case "name": return { - name: "Name", + ...defaultOpt, defaultValue: getWidgetValue(type), validation: { type: "text", pattern: "" } }; case "company": return { - name: "Company", + ...defaultOpt, defaultValue: getWidgetValue(type), validation: { type: "text", pattern: "" } }; case "job title": return { - name: "Job title", + ...defaultOpt, defaultValue: getWidgetValue(type), validation: { type: "text", pattern: "" } }; @@ -520,16 +565,16 @@ export const addWidgetSelfsignOptions = (type, getWidgetValue, owner) => { ? selectFormat(owner?.DateFormat) : "MM/dd/yyyy"; return { - name: "Date", + ...defaultOpt, response: getDate(owner?.DateFormat), validation: { format: dateFormat, type: "date-format" } }; } case "image": - return { name: "Upload image" }; + return defaultOpt; case "email": return { - name: "Email", + ...defaultOpt, defaultValue: getWidgetValue(type), validation: { type: "email", pattern: "" } }; @@ -537,23 +582,6 @@ export const addWidgetSelfsignOptions = (type, getWidgetValue, owner) => { return {}; } }; -export const getWidgetType = (item, widgetName) => { - return ( -
-
-
- {!isMobile && } - - {widgetName} - -
-
- -
-
-
- ); -}; export const defaultWidthHeight = (type) => { switch (type) { @@ -591,7 +619,6 @@ export const defaultWidthHeight = (type) => { return { width: 150, height: 60 }; } }; - export async function getBase64FromUrl(url, autosign) { const data = await fetch(url); const blob = await data.blob(); @@ -718,7 +745,7 @@ export const signPdfFun = async ( documentId, signerObjectId, objectId, - widgets, + widgets ) => { let isCustomCompletionMail = false; try { @@ -727,14 +754,10 @@ export const signPdfFun = async ( if (tenantDetails && tenantDetails === "user does not exist!") { return { status: "error", message: "User does not exist." }; } else { - if ( - tenantDetails?.CompletionBody && - tenantDetails?.CompletionSubject - ) { + if (tenantDetails?.CompletionBody && tenantDetails?.CompletionSubject) { isCustomCompletionMail = true; } } - // below for loop is used to get first signature of user to send if to signpdf // for adding it in completion certificate let getSignature; @@ -749,7 +772,7 @@ export const signPdfFun = async ( } } - let base64Sign = getSignature.SignUrl; + let base64Sign = getSignature?.SignUrl; //check https type signature (default signature exist) then convert in base64 const isUrl = base64Sign.includes("https"); if (isUrl) { @@ -791,26 +814,27 @@ export const signPdfFun = async ( } } }; - -export const randomId = () => { - // 1. Grab a cryptographically-secure 32-bit random value - const randomBytes = crypto.getRandomValues(new Uint32Array(1)); - const raw = randomBytes[0]; // 0 … 4 294 967 295 - - // 2. Collapse into a 90 000 000-wide band (0…89 999 999), then shift to 10 000 000…99 999 999 - const eightDigit = 10_000_000 + (raw % 90_000_000); - - return eightDigit; -}; - export const createDocument = async ( template, placeholders, signerData, - pdfUrl + SignedUrl, + isSendDoc ) => { if (template && template.length > 0) { const Doc = template[0]; + let extUserId = Doc.ExtUserPtr.objectId; + let creatorId = Doc.CreatedBy.objectId; + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); + if (extClass && extClass.length > 0) { + if (Doc.ExtUserPtr?.objectId !== extClass?.[0]?.objectId) { + if (extClass && extClass.length > 0) { + extUserId = extClass[0].objectId; + creatorId = extClass[0]?.UserId.objectId; + } + } + } let placeholdersArr = []; if (placeholders?.length > 0) { placeholdersArr = placeholders; @@ -831,9 +855,10 @@ export const createDocument = async ( const SignatureType = Doc?.SignatureType ? { SignatureType: Doc?.SignatureType } : {}; - const NotifyOnSignatures = Doc?.NotifyOnSignatures - ? { NotifyOnSignatures: Doc?.NotifyOnSignatures } - : {}; + const NotifyOnSignatures = + Doc?.NotifyOnSignatures !== undefined + ? { NotifyOnSignatures: Doc?.NotifyOnSignatures } + : {}; const Bcc = Doc?.Bcc?.length > 0 ? { Bcc: Doc?.Bcc } : {}; const RedirectUrl = Doc?.RedirectUrl ? { RedirectUrl: Doc?.RedirectUrl } @@ -849,8 +874,8 @@ export const createDocument = async ( : {}; const data = { Name: Doc.Name, - URL: pdfUrl, - SignedUrl: Doc.SignedUrl, + URL: SignedUrl ? SignedUrl : Doc?.URL, + SignedUrl: isSendDoc ? SignedUrl : Doc.SignedUrl, SentToOthers: Doc.SentToOthers, Description: Doc.Description, Note: Doc.Note, @@ -858,12 +883,12 @@ export const createDocument = async ( ExtUserPtr: { __type: "Pointer", className: "contracts_Users", - objectId: Doc.ExtUserPtr.objectId + objectId: extUserId }, CreatedBy: { __type: "Pointer", className: "_User", - objectId: Doc.CreatedBy.objectId + objectId: creatorId }, Signers: signers, SendinOrder: Doc?.SendinOrder || false, @@ -899,7 +924,7 @@ export const createDocument = async ( } ); if (res) { - return { status: "success", id: res.data.objectId }; + return { status: "success", id: res.data.objectId, data: res.data }; } } catch (err) { console.log("axois err ", err); @@ -965,7 +990,7 @@ export const addZIndex = (signerPos, key, setZIndex) => { //function for save widgets value on onchange function export const onChangeInput = ( value, - signKey, + currentPosition, xyPosition, index, setXyPosition, @@ -976,7 +1001,9 @@ export const onChangeInput = ( fontColor, isDateReadOnly ) => { - const isSigners = xyPosition.some((data) => data.signerPtr); + const isSigners = xyPosition.some( + (data) => data.signerPtr || data.Role === "prefill" + ); let filterSignerPos; if (isSigners) { if (userId) { @@ -992,9 +1019,12 @@ export const onChangeInput = ( ); if (getPageNumer.length > 0) { const getXYdata = getPageNumer[0].pos; - const getPosData = getXYdata; - const addSignPos = getPosData.map((position) => { - if (position.key === signKey) { + const addSignPos = getXYdata.map((position) => { + if ( + (position?.options?.name === currentPosition?.options?.name && + filterSignerPos[0].Role === "prefill") || + position.key === currentPosition.key + ) { if (dateFormat) { return { ...position, @@ -1043,7 +1073,7 @@ export const onChangeInput = ( } else { let getXYdata = xyPosition[index].pos; const updatePosition = getXYdata.map((positionData) => { - if (positionData.key === signKey) { + if (positionData.key === currentPosition.key) { if (dateFormat) { return { ...positionData, @@ -1227,8 +1257,7 @@ export const addInitialData = (signerPos, setXyPosition, value, userId) => { //function for embed document id export const embedDocId = async (pdfOriginalWH, pdfDoc, documentId) => { - const appName = - "OpenSign™"; + const appName = "OpenSign™"; // `fontBytes` is used to embed custom font in pdf const fontBytes = await fileasbytes( "https://cdn.opensignlabs.com/webfonts/times.ttf" @@ -1238,8 +1267,7 @@ export const embedDocId = async (pdfOriginalWH, pdfDoc, documentId) => { //pdfOriginalWH contained all pdf's pages width and height for (let i = 0; i < pdfOriginalWH?.length; i++) { const fontSize = 10; - const textContent = - documentId && `${appName} DocumentId: ${documentId} `; + const textContent = documentId && `${appName} DocumentId: ${documentId} `; const pages = pdfDoc.getPages(); const page = pages[i]; const getSize = pdfOriginalWH[i]; @@ -1449,9 +1477,11 @@ export async function convertBase64ToImg(base64Image, widgetDims) { const y = (maxHeight - drawH) / 2; ctx.drawImage(img, x, y, drawW, drawH); // 5. Return new base64 in same format as input - const quality = - inputMime.includes("jpeg") || inputMime.includes("jpg") ? 0.9 : undefined; - return canvas.toDataURL(inputMime, quality); + // const quality = + // inputMime.includes("jpeg") || inputMime.includes("jpg") ? 0.9 : undefined; + // return canvas.toDataURL(inputMime, quality); + // 5. Always return PNG (lossless, no quality param needed) + return canvas.toDataURL("image/png"); } //function to use After setting the signature URL for the first signature widget, clicking on subsequent @@ -1525,7 +1555,8 @@ export function onSaveImage( image, isAutoSign, widgetsType, - isApplyAll + isApplyAll, + imgUrl ) { // let getIMGWH; const isSignOrInitials = @@ -1536,15 +1567,17 @@ export function onSaveImage( if (position.key === signKey) { return { ...position, - SignUrl: image.src, + SignUrl: imgUrl || image.src, ImageType: image.imgType, ...(isSignOrInitials && { signatureType: signatureType || "" }), - options: { ...position.options, response: image.src } + options: { + ...position.options, + response: imgUrl || image.src + } }; } return position; }); - const updateXYposition = xyPosition.map((obj, ind) => { if (ind === index) { return { ...obj, pos: updateXYData }; @@ -1705,8 +1738,19 @@ const getWidgetsFontColor = (type) => { return rgb(0, 0, 0); } }; -//function for embed multiple signature using pdf-lib -export const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale) => { +export const isBase64 = (str) => { + const base64Pattern = + /^data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+)?;base64,[A-Za-z0-9+/=]+$/; + return base64Pattern.test(str); +}; +//function for embed all type widgets in document using pdf-lib +export const embedWidgetsToDoc = async ( + widgets, + pdfDoc, + signyourself, + scale, + prefillImg +) => { // `fontBytes` is used to embed custom font in pdf const fontBytes = await fileasbytes( "https://cdn.opensignlabs.com/webfonts/times.ttf" @@ -1757,23 +1801,37 @@ export const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale) => { // This is equivalent to `react-pdf`'s `page.view` array: [x0, y0, x1, y1] const { _, y, width, height } = page.getCropBox(); const originalHeight = height + y; + let images; const getSize = { height: originalHeight, width: width }; - const images = await Promise.all( - widgetsPositionArr.map(async (widget) => { - // `SignUrl` this is wrong nomenclature and maintain for older code in this options we save base64 of signature image from sign pad - let signbase64 = widget.SignUrl && widget.SignUrl; - const widgetDims = { Width: widget.Width, Height: widget.Height }; - if (signbase64) { - let arr = signbase64.split(","), - mime = arr[0].match(/:(.*?);/)[1]; - const signatureImg = await convertBase64ToImg(signbase64, widgetDims); - const res = await fetch(signatureImg); - const arrayBuffer = await res.arrayBuffer(); - const obj = { mimetype: mime, arrayBuffer: arrayBuffer }; - return obj; - } - }) - ); + try { + images = await Promise.all( + widgetsPositionArr.map(async (widget) => { + // `SignUrl` this is wrong nomenclature and maintain for older code in this options we save base64 of signature image from sign pad + let signbase64 = widget.SignUrl && widget.SignUrl; + const widgetDims = { Width: widget.Width, Height: widget.Height }; + if (signbase64) { + if (!isBase64(signbase64) && prefillImg) { + const imgData = prefillImg?.find((x) => x?.id === widget?.key); + signbase64 = imgData?.base64; + } + + // let arr = signbase64.split(","); + // const mime = arr[0].match(/:(.*?);/)[1]; + const signatureImg = await convertBase64ToImg( + signbase64, + widgetDims + ); + const mime = signatureImg?.split(",")?.[0]?.match(/:(.*?);/)?.[1]; + const res = await fetch(signatureImg); + const arrayBuffer = await res.arrayBuffer(); + const obj = { mimetype: mime, arrayBuffer: arrayBuffer }; + return obj; + } + }) + ); + } catch (e) { + console.log("error in image", e); + } for (let [id, position] of widgetsPositionArr.entries()) { if (hasError) break; // Stop the inner loop if an error occurred try { @@ -1863,7 +1921,7 @@ export const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale) => { const checkboxTextGapFromLeft = fontSize + 3.4; // gap between box and its label const verticalGap = fontSize + 3.4; // gap between two rows (vertical layout) let horizontalGap = 0; // will compute after drawing each label - if (position?.options?.values.length > 0) { + if (position?.options?.values?.length > 0) { position.options.values.forEach((item, ind) => { // 1. Advance the “cursor” on second+ iteration if (ind > 0) { @@ -1877,7 +1935,7 @@ export const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale) => { let isCheck = false; if ( position.options.response && - position.options.response.length > 0 + position.options.response?.length > 0 ) { isCheck = position.options.response.includes(ind); } else if (position.options.defaultValue) { @@ -2088,7 +2146,7 @@ export const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale) => { const isHorizontal = position?.options?.layout === "horizontal" ? true : false; // Loop through each option in the group - if (position?.options?.values.length > 0) { + if (position?.options?.values?.length > 0) { position.options.values.forEach((item, ind) => { // 1. Advance cursor on second+ iteration if (ind > 0) { @@ -2162,11 +2220,12 @@ export const multiSignEmbed = async (widgets, pdfDoc, signyourself, scale) => { page.drawImage(img, imageOptions); } } catch (err) { - console.log("Err in embed widget on page ", pageNo, err?.message); + console.log("Err in embed widget on page ", pageNo, err); hasError = true; // Set the flag to stop both loops break; // Exit inner loop } } + form?.flatten(); } if (!hasError) { const pdfBytes = await pdfDoc.saveAsBase64({ useObjectStreams: false }); @@ -2192,7 +2251,6 @@ export function urlValidator(url) { export const placeholderWidth = (pos) => { const defaultWidth = defaultWidthHeight(pos.type).width; const posWidth = pos.Width || defaultWidth; - //condition to handle old data saved from mobile view to get widthh if (pos.isMobile && pos.scale) { if (pos.IsResize) { @@ -2224,9 +2282,7 @@ export const placeholderHeight = (pos) => { }; //function for getting contracts_contactbook details -export const contactBook = async ( - objectId, -) => { +export const contactBook = async (objectId) => { const result = await axios .get( `${localStorage.getItem( @@ -2236,8 +2292,7 @@ export const contactBook = async ( headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": - localStorage.getItem("accesstoken") + "X-Parse-Session-Token": localStorage.getItem("accesstoken") } } ) @@ -2255,12 +2310,9 @@ export const contactBook = async ( }; //function for getting document details from contract_Documents class -export const contractDocument = async ( - documentId, -) => { - const data = { docId: documentId }; - const token = - { sessionToken: localStorage.getItem("accesstoken") }; +export const contractDocument = async (documentId, include) => { + const data = { docId: documentId, include: include }; + const token = { sessionToken: localStorage.getItem("accesstoken") }; const documentDeatils = await axios .post(`${localStorage.getItem("baseUrl")}functions/getDocument`, data, { headers: { @@ -2351,11 +2403,10 @@ export const getMonth = (date) => { const newMonth = new Date(date).getMonth(); return newMonth; }; - //function to create/copy widget next to already dropped widget export const handleCopyNextToWidget = ( + newId, position, - widgetType, xyPosition, index, setXyPosition, @@ -2367,18 +2418,18 @@ export const handleCopyNextToWidget = ( let newposition = position; const calculateXPosition = parseInt(position.xPosition) + 10; const calculateYPosition = parseInt(position.yPosition) + 10; - - const newId = randomId(); + const widgetName = `${newposition?.options?.name}${randomId(2)}`; newposition = { ...newposition, xPosition: calculateXPosition, yPosition: calculateYPosition, - key: newId + key: newId, + options: { ...newposition?.options, name: widgetName } }; //if condition to create widget in request-sign flow if (userId) { - filterSignerPos = xyPosition.filter((data) => data.Id === userId); - const getPlaceHolder = filterSignerPos && filterSignerPos[0]?.placeHolder; + filterSignerPos = xyPosition.find((data) => data.Id === userId); + const getPlaceHolder = filterSignerPos && filterSignerPos?.placeHolder; const getPageNumer = getPlaceHolder?.filter( (data) => data.pageNumber === index ); @@ -2427,39 +2478,36 @@ export const getFileName = (fileUrl) => { //fetch tenant app logo from `partners_Tenant` class by domain name export const getAppLogo = async () => { - const domain = window.location.host; - try { - const tenant = await Parse.Cloud.run("getlogobydomain", { - domain: domain - }); - if (tenant) { - localStorage.setItem("appname", "OpenSign™"); - return { - logo: tenant?.logo, - user: tenant?.user - }; - } - } catch (err) { - console.log("err in getlogo ", err); - if (err?.message?.includes("valid JSON")) { - return { logo: appInfo.applogo, user: "exist", error: "invalid_json" }; - } else { - return { logo: appInfo.applogo, user: "exist" }; - } + const domain = window.location.host; + try { + const tenant = await Parse.Cloud.run("getlogobydomain", { + domain: domain + }); + if (tenant) { + localStorage.setItem("appname", "OpenSign™"); + localStorage.setItem("favicon", appInfo.fev_Icon); + return { + logo: tenant?.logo, + user: tenant?.user + }; } + } catch (err) { + console.log("err in getlogo ", err); + localStorage.setItem("favicon", appInfo.fev_Icon); + if (err?.message?.includes("valid JSON")) { + return { logo: appInfo.applogo, user: "exist", error: "invalid_json" }; + } else { + return { logo: appInfo.applogo, user: "exist" }; + } + } }; -export const getTenantDetails = async ( - objectId, - contactId -) => { +export const getTenantDetails = async (objectId, contactId) => { try { const url = `${localStorage.getItem("baseUrl")}functions/gettenant`; const parseAppId = localStorage.getItem("parseAppId"); const accesstoken = localStorage.getItem("accesstoken"); - const token = - { "X-Parse-Session-Token": accesstoken }; - const data = - { userId: objectId, contactId: contactId }; + const token = { "X-Parse-Session-Token": accesstoken }; + const data = { userId: objectId, contactId: contactId }; const res = await axios.post(url, data, { headers: { "Content-Type": "application/json", @@ -2540,34 +2588,29 @@ export const handleSendOTP = async (email) => { "X-Parse-Application-Id": localStorage.getItem("parseAppId") }; const body = { - email: email, + email: email }; await axios.post(url, body, { headers: headers }); } catch (error) { alert(error.message); } }; -export const fetchUrl = async (url, pdfName) => { - const appName = - "OpenSign™"; +export const fetchUrl = async (url, fileName) => { try { const response = await fetch(url); if (!response.ok) { - alert("something went wrong, refreshing this page may solve this issue."); + alert(i18n.t("something-went-wrong-mssg")); throw new Error("Network response was not ok"); } const blob = await response.blob(); - saveAs(blob, `${sanitizeFileName(pdfName)}_signed_by_${appName}.pdf`); + saveAs(blob, fileName); } catch (error) { - alert("something went wrong, refreshing this page may solve this issue."); + alert(i18n.t("something-went-wrong-mssg")); console.error("Error downloading the file:", error); } }; -export const getSignedUrl = async ( - pdfUrl, - docId, - templateId -) => { + +export const getSignedUrl = async (pdfUrl, docId, templateId) => { //use only axios here due to public template sign const axiosRes = await axios.post( `${localStorage.getItem("baseUrl")}/functions/getsignedurl`, @@ -2620,32 +2663,36 @@ export const handleDownloadPdf = async ( pdfDetails?.[0]?.Name?.length > 100 ? pdfDetails?.[0]?.Name?.slice(0, 100) : pdfDetails?.[0]?.Name || "Document"; + const isCompleted = pdfDetails?.[0]?.IsCompleted || false; + const formatId = pdfDetails?.[0]?.ExtUserPtr?.DownloadFilenameFormat; + const docName = buildDownloadFilename(formatId, { + docName: pdfName, + email: pdfDetails?.[0]?.ExtUserPtr?.Email, + isSigned: isCompleted + }); if (pdfBase64) { - await fetchBase64(pdfBase64, pdfName); + await fetchBase64(pdfBase64, docName); setIsDownloading && setIsDownloading(""); } else { const pdfUrl = pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL; setIsDownloading && setIsDownloading("pdf"); const docId = pdfDetails?.[0]?.objectId || ""; try { - const url = await getSignedUrl( - pdfUrl, - docId, - ); - await fetchUrl(url, pdfName); + const url = await getSignedUrl(pdfUrl, docId); + await fetchUrl(url, docName); setIsDownloading && setIsDownloading(""); } catch (err) { console.log("err in getsignedurl", err); setIsDownloading(""); - alert("something went wrong, refreshing this page may solve this issue."); + alert(i18n.t("something-went-wrong-mssg")); } } }; -export const sanitizeFileName = (pdfName) => { +export function fileNameWithUnderscore(pdfName) { // Replace spaces with underscore return pdfName.replace(/ /g, "_"); -}; +} //function for print digital sign pdf export const handleToPrint = async (event, setIsDownloading, pdfDetails) => { event.preventDefault(); @@ -2661,7 +2708,7 @@ export const handleToPrint = async (event, setIsDownloading, pdfDetails) => { `${localStorage.getItem("baseUrl")}/functions/getsignedurl`, { url: pdfUrl, - docId: docId, + docId: docId }, { headers: { @@ -2695,7 +2742,7 @@ export const handleToPrint = async (event, setIsDownloading, pdfDetails) => { } catch (err) { setIsDownloading(""); console.log("err in getsignedurl", err); - alert("something went wrong, refreshing this page may solve this issue."); + alert(i18n.t("something-went-wrong-mssg")); } }; @@ -2705,8 +2752,7 @@ export const handleDownloadCertificate = async ( setIsDownloading, isZip ) => { - const appName = - "OpenSign™"; + const appName = "OpenSign™"; if (pdfDetails?.length > 0 && pdfDetails[0]?.CertificateUrl) { try { await fetch(pdfDetails[0] && pdfDetails[0]?.CertificateUrl); @@ -2782,7 +2828,7 @@ export const handleDownloadCertificate = async ( } catch (err) { setIsDownloading("certificate_err"); console.log("err in download in certificate", err); - alert("something went wrong, refreshing this page may solve this issue."); + alert(i18n.t("something-went-wrong-mssg")); } } }; @@ -2790,14 +2836,13 @@ export const handleDownloadCertificate = async ( export function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // Escape special characters } -export async function findContact( - value, -) { +export async function findContact(value) { try { const baseURL = localStorage.getItem("baseUrl"); const url = `${baseURL}functions/getsigners`; - const token = - { "X-Parse-Session-Token": localStorage.getItem("accesstoken") }; + const token = { + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + }; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -2897,7 +2942,6 @@ function getWidgetPosition(page, image, sizeRatio, getSize) { if (!image?.hasOwnProperty("vpWidth")) { image["vpWidth"] = pageWidth; } - const pageRatio = pageWidth / (image.vpWidth * sizeRatio); const imageWidth = image.width * sizeRatio * pageRatio; const imageHeight = image.height * sizeRatio * pageRatio; @@ -3008,24 +3052,28 @@ export function base64ToArrayBuffer(base64) { // Return the ArrayBuffer return bytes.buffer; } +export function removeBase64Prefix(base64String) { + return base64String.replace(/^data:.*;base64,/, ""); +} -export const convertBase64ToFile = async ( - pdfName, - pdfBase64, -) => { - const fileName = sanitizeFileName(pdfName) + ".pdf"; - try { - const pdfFile = new Parse.File(fileName, { base64: pdfBase64 }); - // Save the Parse File if needed - const pdfData = await pdfFile.save(); - const pdfUrl = pdfData.url(); - const fileRes = await getSecureUrl(pdfUrl); - if (fileRes?.url) { - return fileRes.url; - } - } catch (e) { - console.log("error in convertbase64tofile", e); +export const convertBase64ToFile = async (pdfName, pdfBase64, imgType) => { + let base64Str = pdfBase64; + const mime = imgType && imgType?.split("/")?.pop(); + let fileName = + fileNameWithUnderscore(pdfName) + (imgType ? `.${mime}` : ".pdf"); + try { + fileName = imgType ? pdfName : fileName; + const pdfFile = new Parse.File(fileName, { base64: base64Str }); + // Save the Parse File if needed + const pdfData = await pdfFile.save(); + const pdfUrl = pdfData.url(); + const fileRes = await getSecureUrl(pdfUrl); + if (fileRes?.url) { + return fileRes.url; } + } catch (e) { + console.log("error in convertbase64tofile", e); + } }; export const onClickZoomIn = (scale, zoomPercent, setScale, setZoomPercent) => { const newPercent = zoomPercent + 10; @@ -3330,14 +3378,10 @@ export const flattenPdf = async (pdfFile) => { }; export const mailTemplate = (param) => { - const appName = - "OpenSign™"; - const logo = - `
`; - - const opurl = - ` here.

`; + const appName = "OpenSign™"; + const logo = `
`; + const opurl = `
here.

`; const subject = `${param.senderName} has requested you to sign "${param.title}"`; const body = "
" + @@ -3379,13 +3423,20 @@ export function formatDateTime(date, dateFormat, timeZone, is12Hour) { : formatTimeInTimezone(date, timeZone); } -export const updateDateWidgetsRes = (documentData, signerId, journey) => { - const extUser = - localStorage.getItem("Extand_Class"); +export const updateDateWidgetsRes = ( + documentData, + signerId, + journey, + isRemovePrefill +) => { + const extUser = localStorage.getItem("Extand_Class"); const contactUser = documentData?.Signers.find( (data) => data.objectId === signerId ); - const placeHolders = documentData?.Placeholders; + let placeHolders = documentData?.Placeholders; + if (isRemovePrefill) { + placeHolders = placeHolders?.filter((x) => x.Role !== "prefill"); + } const userDetails = extUser ? JSON.parse(extUser)[0] : contactUser; return placeHolders?.map((item) => { if (item?.signerObjId === signerId) { @@ -3674,6 +3725,178 @@ export function getFileAsArrayBuffer(file) { }); } +export const sendEmailToSigners = async ( + pdfDetails, + signersdata, + customizeMail, + defaultMail, + isCustomize +) => { + let htmlReqBody; + const owner = pdfDetails?.[0]?.ExtUserPtr; + let sendMail; + const getDocumentExpDate = pdfDetails?.[0]?.ExpiryDate?.iso; + const getTemplateExpDate = new Date(pdfDetails[0]?.createdAt); + getTemplateExpDate.setDate( + getTemplateExpDate.getDate() + (pdfDetails[0]?.TimeToCompleteDays || 15) + ); + const expireDate = getDocumentExpDate + ? getDocumentExpDate + : getTemplateExpDate; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + + let senderEmail = pdfDetails?.[0]?.ExtUserPtr?.Email; + let senderPhone = pdfDetails?.[0]?.ExtUserPtr?.Phone; + let signerMail = signersdata.slice(); + if (pdfDetails?.[0]?.SendinOrder && pdfDetails?.[0]?.SendinOrder === true) { + signerMail.splice(1); + } + for (let i = 0; i < signerMail.length; i++) { + try { + let url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + const objectId = signerMail[i].objectId; + const hostUrl = window.location.origin; + //encode this url value `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function + const encodeBase64 = btoa( + `${pdfDetails[0]?.objectId}/${signerMail[i].Email}/${objectId}` + ); + let signPdf = `${hostUrl}/login/${encodeBase64}`; + const orgName = pdfDetails[0]?.ExtUserPtr.Company + ? pdfDetails[0].ExtUserPtr.Company + : ""; + const senderName = pdfDetails?.[0]?.ExtUserPtr.Name; + const documentName = `${pdfDetails?.[0].Name}`; + let replaceVar; + + if (customizeMail && isCustomize) { + const replacedRequestBody = customizeMail?.body.replace(/"/g, "'"); + htmlReqBody = + "" + + replacedRequestBody + + " "; + + const variables = { + document_title: documentName, + note: pdfDetails?.[0]?.Note, + sender_name: senderName, + sender_mail: senderEmail, + sender_phone: senderPhone || "", + receiver_name: signerMail[i]?.Name || "", + receiver_email: signerMail[i].Email, + receiver_phone: signerMail[i]?.Phone || "", + expiry_date: localExpireDate, + company_name: orgName, + signing_url: signPdf + }; + replaceVar = replaceMailVaribles( + customizeMail.subject, + htmlReqBody, + variables + ); + } else if (defaultMail) { + const mailBody = defaultMail?.body; + const mailSubject = defaultMail.subject; + const replacedRequestBody = mailBody.replace(/"/g, "'"); + const htmlReqBody = + "" + + replacedRequestBody + + " "; + const variables = { + document_title: documentName, + note: pdfDetails?.[0]?.Note, + sender_name: senderName, + sender_mail: senderEmail, + sender_phone: senderPhone || "", + receiver_name: signerMail[i]?.Name || "", + receiver_email: signerMail[i].Email, + receiver_phone: signerMail[i]?.Phone || "", + expiry_date: localExpireDate, + company_name: orgName, + signing_url: signPdf + }; + replaceVar = replaceMailVaribles(mailSubject, htmlReqBody, variables); + } + const mailparam = { + senderName: senderName, + note: pdfDetails?.[0]?.Note || "", + senderMail: senderEmail, + title: documentName, + organization: orgName, + localExpireDate: localExpireDate, + signingUrl: signPdf + }; + let params = { + extUserId: owner?.objectId, + recipient: signerMail[i].Email, + subject: replaceVar?.subject + ? replaceVar?.subject + : mailTemplate(mailparam).subject, + replyto: senderEmail, + from: senderEmail, + html: replaceVar?.body ? replaceVar?.body : mailTemplate(mailparam).body + }; + + sendMail = await axios.post(url, params, { headers: headers }); + } catch (error) { + console.log("error", error); + } + } + if (sendMail?.data?.result?.status === "success") { + const sessiontoken = localStorage.getItem("accesstoken"); + if (pdfDetails[0]?.objectId && sessiontoken) { + try { + let data; + if (customizeMail && isCustomize) { + data = { + RequestBody: customizeMail?.body, + RequestSubject: customizeMail.subject, + SendMail: true + }; + } else if (defaultMail?.body && defaultMail?.subject) { + data = { + RequestBody: defaultMail?.body, + RequestSubject: defaultMail?.subject, + SendMail: true + }; + } else { + data = { SendMail: true }; + } + try { + await axios.put( + `${localStorage.getItem("baseUrl")}classes/contracts_Document/${ + pdfDetails[0]?.objectId + }`, + data, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": sessiontoken + } + } + ); + } catch (err) { + console.log("axois err ", err); + } + } catch (e) { + console.log("error", e); + } + } + return { status: "success" }; + } else { + return { status: sendMail?.data?.result?.status }; + } +}; /** * Converts a JPEG/JPG File/Blob into a PNG File. * @@ -3729,3 +3952,82 @@ export function convertJpegToPng(base64Image, filename) { }); } } +//function is used to get assigned signer's email +export const getSignerEmail = (data, signers) => { + const getEmail = + signers?.length > 0 && + signers.find((x) => x.objectId === data.signerObjId)?.Email; + return getEmail; +}; + +//function is used to delete widgets +export const handleDeleteWidget = (key, Id, pageNumber, signerPos) => { + const updateData = []; + + const filterSignerPos = signerPos.filter((data) => data.Id === Id); + + if (filterSignerPos.length > 0) { + const getPlaceHolder = filterSignerPos[0].placeHolder; + + const getPageNumer = getPlaceHolder.filter( + (data) => data.pageNumber === pageNumber + ); + + if (getPageNumer.length > 0) { + const getXYdata = getPageNumer[0].pos.filter((data) => data.key !== key); + + if (getXYdata.length > 0) { + updateData.push(getXYdata); + const newUpdatePos = getPlaceHolder.map((obj) => { + if (obj.pageNumber === pageNumber) { + return { ...obj, pos: updateData[0] }; + } + return obj; + }); + + const newUpdateSigner = signerPos.map((obj) => { + if (obj.Id === Id) { + return { ...obj, placeHolder: newUpdatePos }; + } + return obj; + }); + return newUpdateSigner; + } else { + const getRemainPage = filterSignerPos[0].placeHolder.filter( + (data) => data.pageNumber !== pageNumber + ); + //condition to check placeholder length is greater than 1 do not need to remove whole placeholder + //array only resove particular widgets + if (getRemainPage && getRemainPage.length > 0) { + const newUpdatePos = filterSignerPos.map((obj) => { + if (obj.Id === Id) { + return { ...obj, placeHolder: getRemainPage }; + } + return obj; + }); + let signerupdate = []; + signerupdate = signerPos.filter((data) => data.Id !== Id); + signerupdate.push(newUpdatePos[0]); + + return signerupdate; + } else { + const updatedData = signerPos + .map((item) => { + if (item.Id === Id && item?.Role === "prefill") { + return null; // mark this item to remove + } + if (item.Id === Id) { + const updatedItem = { ...item }; + delete updatedItem.placeHolder; + return updatedItem; + } + return item; + }) + .filter(Boolean); // remove nulls (deleted items) + + return updatedData; + } + } + } + } +}; diff --git a/apps/OpenSign/src/constant/saveFileSize.js b/apps/OpenSign/src/constant/saveFileSize.js index f2f8ba657b..0f9fac1de8 100644 --- a/apps/OpenSign/src/constant/saveFileSize.js +++ b/apps/OpenSign/src/constant/saveFileSize.js @@ -4,13 +4,18 @@ const parseAppId = process.env.REACT_APP_APPID ? process.env.REACT_APP_APPID : "opensign"; const serverUrl = serverUrl_fn(); -export const SaveFileSize = async (size, imageUrl, tenantId) => { +export const SaveFileSize = async (size, imageUrl, tenantId, userId) => { //checking server url and save file's size const tenantPtr = { __type: "Pointer", className: "partners_Tenant", objectId: tenantId }; + const UserPtr = userId && { + __type: "Pointer", + className: "_User", + objectId: userId + }; const _tenantPtr = JSON.stringify(tenantPtr); try { const res = await axios.get( @@ -53,15 +58,16 @@ export const SaveFileSize = async (size, imageUrl, tenantId) => { } catch (err) { console.log("err in save usage", err); } - saveDataFile(size, imageUrl, tenantPtr); + saveDataFile(size, imageUrl, tenantPtr, UserPtr); }; //function for save fileUrl and file size in particular client db class partners_DataFiles -const saveDataFile = async (size, imageUrl, tenantPtr) => { +const saveDataFile = async (size, imageUrl, tenantPtr, UserId) => { const data = { FileUrl: imageUrl, FileSize: size, - TenantPtr: tenantPtr + TenantPtr: tenantPtr, + ...(UserId ? { UserId: UserId } : {}) }; // console.log("data save",file, data) diff --git a/apps/OpenSign/src/context/GuidelinesContext.jsx b/apps/OpenSign/src/context/GuidelinesContext.jsx new file mode 100644 index 0000000000..f39d0eaf4d --- /dev/null +++ b/apps/OpenSign/src/context/GuidelinesContext.jsx @@ -0,0 +1,43 @@ +import { createContext, useContext, useState, useCallback } from "react"; + +const GuidelinesContext = createContext(); + +export const GuidelinesProvider = ({ children }) => { + const [guideline, setGuideline] = useState({ + show: false, + x1: 0, + x2: 0, + y1: 0, + y2: 0 + }); + + const showGuidelines = useCallback((show, x, y, width, height) => { + if (show) { + setGuideline({ + show: true, + x1: x, + x2: x + width - 1.5, + y1: y, + y2: y + height - 1 + }); + } else { + setGuideline((prev) => ({ ...prev, show: false })); + } + }, []); + + return ( + + {children} + + ); +}; + +export const useGuidelinesContext = () => { + const context = useContext(GuidelinesContext); + if (!context) { + throw new Error( + "useGuidelinesContext must be used within a GuidelinesProvider" + ); + } + return context; +}; diff --git a/apps/OpenSign/src/hook/useManifestUrl.js b/apps/OpenSign/src/hook/useManifestUrl.js new file mode 100644 index 0000000000..1b479e9dc5 --- /dev/null +++ b/apps/OpenSign/src/hook/useManifestUrl.js @@ -0,0 +1,34 @@ +import { useEffect, useMemo } from "react"; + +export function useManifestUrl(appName, logo) { + const url = useMemo(() => { + const manifest = { + short_name: appName, + name: appName, + start_url: ".", + display: "standalone", + theme_color: "#000000", + background_color: "#ffffff", + ...(logo && { + icons: [ + { src: logo, type: "image/png", sizes: "64x64 32x32 24x24 16x16" }, + { src: logo, type: "image/png", sizes: "192x192" }, + { src: logo, type: "image/png", sizes: "512x512" } + ] + }) + }; + const blob = new Blob([JSON.stringify(manifest)], { + type: "application/json" + }); + return URL.createObjectURL(blob); + }, [appName, logo]); + + useEffect(() => { + // cleanup when unmounting or when url changes + return () => { + URL.revokeObjectURL(url); + }; + }, [url]); + + return url; +} diff --git a/apps/OpenSign/src/index.css b/apps/OpenSign/src/index.css index 55370b9886..f6b3f8e9b4 100644 --- a/apps/OpenSign/src/index.css +++ b/apps/OpenSign/src/index.css @@ -24,7 +24,7 @@ body { @media screen and (max-width: 766px) { .reactour__close { width: 17px !important; - padding-left: 3px !important; + padding-left: 3px !important; } } @@ -100,49 +100,62 @@ body { border-radius: 10px; } +.op-border-hover { + @apply border-gray-300 hover:border-base-content; +} + /* Note: Dark mode styling is now handled via Tailwind utilities in tailwind.config.js */ /* You can use classes like: icon-improved, icon-muted, icon-disabled, op-btn-vscode-disabled */ /* React-tour and ReactTooltip dark mode styling */ [data-theme="opensigndark"] { + .op-border-hover { + @apply border-gray-700 hover:border-base-content; + } + + /* for change calender icon of input date type */ + ::-webkit-calendar-picker-indicator { + filter: invert(1); + } + /* React-tour modal styling */ .reactour__helper { - background-color: #1F2937 !important; - color: #E5E7EB !important; + background-color: #1f2937 !important; + color: #e5e7eb !important; border: 1px solid #374151 !important; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5) !important; } .reactour__close { - color: #E5E7EB !important; + color: #e5e7eb !important; background-color: #374151 !important; - border: 1px solid #4B5563 !important; + border: 1px solid #4b5563 !important; } .reactour__close:hover { - background-color: #4B5563 !important; - color: #FFFFFF !important; + background-color: #4b5563 !important; + color: #ffffff !important; } /* React-tour navigation buttons */ .reactour__controls { - background-color: #1F2937 !important; + background-color: #1f2937 !important; border-top: 1px solid #374151 !important; } .reactour__controls button { background-color: #374151 !important; - color: #E5E7EB !important; - border: 1px solid #4B5563 !important; + color: #e5e7eb !important; + border: 1px solid #4b5563 !important; } .reactour__controls button:hover { - background-color: #4B5563 !important; - color: #FFFFFF !important; + background-color: #4b5563 !important; + color: #ffffff !important; } .reactour__controls button:disabled { - background-color: #3C3C3C !important; + background-color: #3c3c3c !important; color: #858585 !important; border-color: #565656 !important; cursor: not-allowed !important; @@ -150,28 +163,28 @@ body { /* ReactTooltip styling */ .react-tooltip { - background-color: #1F2937 !important; - color: #E5E7EB !important; + background-color: #1f2937 !important; + color: #e5e7eb !important; border: 1px solid #374151 !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4) !important; } .react-tooltip.type-dark { - background-color: #1F2937 !important; - color: #E5E7EB !important; + background-color: #1f2937 !important; + color: #e5e7eb !important; } .react-tooltip.place-top:after, .react-tooltip.place-bottom:after, .react-tooltip.place-left:after, .react-tooltip.place-right:after { - border-color: #1F2937 !important; + border-color: #1f2937 !important; } /* Tour content improvements */ .reactour__badge { - background-color: #007ACC !important; - color: #FFFFFF !important; + background-color: #007acc !important; + color: #ffffff !important; } .reactour__helper h1, @@ -180,82 +193,82 @@ body { .reactour__helper h4, .reactour__helper h5, .reactour__helper h6 { - color: #FFFFFF !important; + color: #ffffff !important; } .reactour__helper p { - color: #E5E7EB !important; + color: #e5e7eb !important; } /* VS Code-style tour buttons */ .reactour__controls .op-btn { - background-color: #007ACC !important; - color: #FFFFFF !important; - border: 1px solid #007ACC !important; + background-color: #007acc !important; + color: #ffffff !important; + border: 1px solid #007acc !important; } .reactour__controls .op-btn:hover { - background-color: #0086D1 !important; - border-color: #0086D1 !important; + background-color: #0086d1 !important; + border-color: #0086d1 !important; } .reactour__controls .op-btn-secondary { background-color: #374151 !important; - color: #E5E7EB !important; - border: 1px solid #4B5563 !important; + color: #e5e7eb !important; + border: 1px solid #4b5563 !important; } .reactour__controls .op-btn-secondary:hover { - background-color: #4B5563 !important; - color: #FFFFFF !important; + background-color: #4b5563 !important; + color: #ffffff !important; } /* React-datepicker dark mode styling */ .react-datepicker { - background-color: #1F2937 !important; + background-color: #1f2937 !important; border: 1px solid #374151 !important; - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__header { background-color: #374151 !important; - border-bottom: 1px solid #4B5563 !important; - color: #E5E7EB !important; + border-bottom: 1px solid #4b5563 !important; + color: #e5e7eb !important; } .react-datepicker__current-month, .react-datepicker__day-name { - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__day { - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__day:hover { - background-color: #4B5563 !important; - color: #FFFFFF !important; + background-color: #4b5563 !important; + color: #ffffff !important; } .react-datepicker__day--selected { - background-color: #007ACC !important; - color: #FFFFFF !important; + background-color: #007acc !important; + color: #ffffff !important; } .react-datepicker__day--keyboard-selected { background-color: #374151 !important; - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__day--outside-month { - color: #6B7280 !important; + color: #6b7280 !important; } .react-datepicker__navigation { - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__navigation:hover { - background-color: #4B5563 !important; + background-color: #4b5563 !important; } -} \ No newline at end of file +} diff --git a/apps/OpenSign/src/index.jsx b/apps/OpenSign/src/index.jsx index e3630ee9e1..46e55df442 100644 --- a/apps/OpenSign/src/index.jsx +++ b/apps/OpenSign/src/index.jsx @@ -1,19 +1,10 @@ -import React from "react"; import ReactDOM from "react-dom/client"; import "./index.css"; import "./styles/dark-theme-improvements.css"; import App from "./App"; +import { showUpgradeProgress, hideUpgradeProgress } from "./utils"; import { Provider } from "react-redux"; import { store } from "./redux/store"; -import { HTML5Backend } from "react-dnd-html5-backend"; -import { TouchBackend } from "react-dnd-touch-backend"; -import { - DndProvider, - TouchTransition, - MouseTransition, - Preview -} from "react-dnd-multi-backend"; -import DragElement from "./components/pdf/DragElement.jsx"; import Parse from "parse"; import "./polyfills"; import { serverUrl_fn } from "./constant/appinfo"; @@ -25,47 +16,22 @@ const serverUrl = serverUrl_fn(); Parse.initialize(appId); Parse.serverURL = serverUrl; +if (localStorage.getItem("showUpgradeProgress")) { + showUpgradeProgress(); +} + const savedTheme = localStorage.getItem("theme"); if (savedTheme === "dark") { document.documentElement.setAttribute("data-theme", "opensigndark"); } -const HTML5toTouch = { - backends: [ - { - id: "html5", - backend: HTML5Backend, - transition: MouseTransition - }, - { - id: "touch", - backend: TouchBackend, - options: { enableMouseEvents: true }, - preview: true, - transition: TouchTransition - } - ] -}; -const generatePreview = (props) => { - const { item, style } = props; - const newStyle = { - ...style - }; - - return ( -
- -
- ); -}; - const root = ReactDOM.createRoot(document.getElementById("root")); root.render( - - {generatePreview} - - + ); + +hideUpgradeProgress(); +localStorage.removeItem("showUpgradeProgress"); diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index 3f09c0a16a..37d4d0d9f1 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -1,9 +1,18 @@ +export const extraCols = [ + "Note", + "Time to complete (Days)", + "Enable Tour", + "Notify on signatures", + "Redirect url", + "Created Date", + "Updated Date" +]; + export default function reportJson(id) { - // console.log("json ", json); const head = ["Title", "Note", "Folder", "File", "Owner", "Signers"]; const declineHead = ["Title", "Reason", "Folder", "File", "Owner", "Signers"]; const iphead = ["Title", "Note", "Folder", "File", "Signers"]; - const contactbook = ["Name", "Email", "Phone"]; + const contactbook = ["Name", "Email", "Phone", "Company", "JobTitle"]; const dashboardReportHead = ["Title", "File", "Owner", "Signers"]; const templateReport = ["Title", "File", "Owner", "Signers"]; switch (id) { @@ -28,26 +37,26 @@ export default function reportJson(id) { btnIcon: "fa-light fa-trash", redirectUrl: "", action: "delete" - }, - { - btnId: "22534", - hoverLabel: "option", - btnColor: "", - restrictBtn: true, - textColor: "black", - btnIcon: "fa-light fa-ellipsis-vertical fa-lg", - action: "option", - subaction: [ - { - btnId: "1630", - btnLabel: "Save as template", - hoverLabel: "Save as template", - btnIcon: "fa-light fa-envelope", - redirectUrl: "", - action: "saveastemplate" - } - ] } + // { + // btnId: "22534", + // hoverLabel: "option", + // btnColor: "", + // restrictBtn: true, + // textColor: "black", + // btnIcon: "fa-light fa-ellipsis-vertical fa-lg", + // action: "option", + // subaction: [ + // { + // btnId: "1630", + // btnLabel: "Save as template", + // hoverLabel: "Save as template", + // btnIcon: "fa-light fa-envelope", + // redirectUrl: "", + // action: "saveastemplate" + // } + // ] + // } ], helpMsg: "These are documents you have started but have not finalized for sending." @@ -81,7 +90,7 @@ export default function reportJson(id) { btnId: "8901", hoverLabel: "Share", btnColor: "op-btn-primary", - btnIcon: "fa-light fa-share", + btnIcon: "fa-light fa-copy", redirectUrl: "", action: "share" }, @@ -317,7 +326,7 @@ export default function reportJson(id) { btnId: "1999", hoverLabel: "Share", btnColor: "op-btn-primary", - btnIcon: "fa-light fa-share", + btnIcon: "fa-light fa-copy", redirectUrl: "", action: "share" }, @@ -419,26 +428,26 @@ export default function reportJson(id) { btnIcon: "fa-light fa-trash", redirectUrl: "", action: "delete" - }, - { - btnId: "55534", - hoverLabel: "option", - btnColor: "", - restrictBtn: true, - textColor: "black", - btnIcon: "fa-light fa-ellipsis-vertical fa-lg", - action: "option", - subaction: [ - { - btnId: "6630", - btnLabel: "Save as template", - hoverLabel: "Save as template", - btnIcon: "fa-light fa-envelope", - redirectUrl: "", - action: "saveastemplate" - } - ] } + // { + // btnId: "55534", + // hoverLabel: "option", + // btnColor: "", + // restrictBtn: true, + // textColor: "black", + // btnIcon: "fa-light fa-ellipsis-vertical fa-lg", + // action: "option", + // subaction: [ + // { + // btnId: "6630", + // btnLabel: "Save as template", + // hoverLabel: "Save as template", + // btnIcon: "fa-light fa-envelope", + // redirectUrl: "", + // action: "saveastemplate" + // } + // ] + // } ] }; // contactbook report @@ -462,8 +471,6 @@ export default function reportJson(id) { action: "delete" } ], - import: true, - form: "ContactBook", helpMsg: "This is a list of contacts/signers added by you. These will appear as suggestions when you try to add signers to a new document." }; diff --git a/apps/OpenSign/src/json/ReportTour.jsx b/apps/OpenSign/src/json/ReportTour.jsx new file mode 100644 index 0000000000..42e134d2e6 --- /dev/null +++ b/apps/OpenSign/src/json/ReportTour.jsx @@ -0,0 +1,47 @@ +import { Trans } from "react-i18next"; + +export const templateReportTour = [ + { + selector: "[data-tut=reactourFirst]", + content: , + position: "top", + style: { fontSize: "13px" } + }, + { + selector: "[data-tut=reactourSecond]", + content: , + position: "top", + style: { fontSize: "13px" } + }, + { + selector: "[data-tut=tourbulksend]", + content: , + position: "top", + style: { fontSize: "13px" } + }, + { + selector: "[data-tut=reactourThird]", + content: ( + + This menu reveals more options such as Edit, Delete, Rename, Duplicate, + Share, etc. + + Click here + + to read more about all available options. +

+ Note: Changes to an existing template will apply to all future + documents created from that template but won't affect documents that + are already sent out. +

+
+ ), + position: "top", + style: { fontSize: "13px" } + } +]; diff --git a/apps/OpenSign/src/layout/HomeLayout.jsx b/apps/OpenSign/src/layout/HomeLayout.jsx index 8ef05b4f58..b7a80851e0 100644 --- a/apps/OpenSign/src/layout/HomeLayout.jsx +++ b/apps/OpenSign/src/layout/HomeLayout.jsx @@ -1,16 +1,14 @@ -import React, { useState, useEffect } from "react"; +import { useState, useEffect } from "react"; import Header from "../components/Header"; import Footer from "../components/Footer"; import Sidebar from "../components/sidebar/Sidebar"; -import { useWindowSize } from "../hook/useWindowSize"; import Tour from "../primitives/Tour"; import axios from "axios"; -import { useDispatch, useSelector } from "react-redux"; +import { useSelector } from "react-redux"; import Parse from "parse"; import ModalUi from "../primitives/ModalUi"; import { useNavigate, useLocation, Outlet } from "react-router"; import Loader from "../primitives/Loader"; -import { showHeader } from "../redux/reducers/showHeader"; import { useTranslation } from "react-i18next"; const HomeLayout = () => { @@ -19,9 +17,6 @@ const HomeLayout = () => { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const location = useLocation(); - const dispatch = useDispatch(); - const { width } = useWindowSize(); - const [isOpen, setIsOpen] = useState(true); const arr = useSelector((state) => state.TourSteps); const [isUserValid, setIsUserValid] = useState(true); const [isLoader, setIsLoader] = useState(true); @@ -29,7 +24,7 @@ const HomeLayout = () => { const [isTour, setIsTour] = useState(false); const [tourStatusArr, setTourStatusArr] = useState([]); const [tourConfigs, setTourConfigs] = useState([]); - + const [isLoggingOut, setIsLoggingOut] = useState(false); const tenantId = localStorage.getItem("TenantId"); useEffect(() => { @@ -67,15 +62,6 @@ const HomeLayout = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [tenantId]); - const showSidebar = () => { - setIsOpen((value) => !value); - dispatch(showHeader(!isOpen)); - }; - useEffect(() => { - if (width && width <= 768) { - setIsOpen(false); - } - }, [width]); useEffect(() => { if (arr && arr.length > 0) { @@ -87,6 +73,7 @@ const HomeLayout = () => { }, [arr]); const handleDynamicSteps = () => { + const github = "https://github.com/OpenSignLabs/OpenSign"; if (arr && arr.length > 0) { // const resArr = arr; const resArr = arr.map((obj, index) => { @@ -105,7 +92,7 @@ const HomeLayout = () => { { selector: '[data-tut="nonpresentmask"]', content: t("tour-mssg.home-layout-1"), - position: "center", + position: "center" }, { selector: '[data-tut="tourbutton"]', @@ -115,8 +102,23 @@ const HomeLayout = () => { ...resArr, { selector: '[data-tut="nonpresentmask"]', - content: t("tour-mssg.home-layout-3", { appName }), - position: "center", + content: () => ( +
+ {t("tour-mssg.home-layout-3", { appName })} +

+ ⭐ Star us on + + GitHub + +

+
+ ), + position: "center" } ]); checkTourStatus(); @@ -146,19 +148,11 @@ const HomeLayout = () => { updatedTourStatus = [{ loginTour: true }]; } - // console.log("updatedTourStatus ", updatedTourStatus); await axios.put( serverUrl + "classes/contracts_Users/" + extUserId, - { - TourStatus: updatedTourStatus - }, - { - headers: { - "X-Parse-Application-Id": appId - } - } + { TourStatus: updatedTourStatus }, + { headers: { "X-Parse-Application-Id": appId } } ); - // console.log("updatedRes ", updatedRes); }; async function checkTourStatus() { @@ -175,12 +169,6 @@ const HomeLayout = () => { } } - const closeSidebar = () => { - if (width <= 1023) { - setIsOpen(false); - } - }; - const handleLoginBtn = async () => { try { await Parse?.User?.logOut(); @@ -192,12 +180,11 @@ const HomeLayout = () => { } }; return ( -
-
- {!isLoader && ( -
- )} -
+
+ {/* HEADER */} +
+ {!isLoader &&
} +
{isUserValid ? ( <> {isLoader ? ( @@ -206,27 +193,37 @@ const HomeLayout = () => {
) : ( <> -
- -
+ +
+ )} + {/* BODY */} +
+ {/* SIDEBAR with width animation */} + + {/* MAIN (includes both content + footer in one scrollable column) */} +
-
{}
-
-
+
+ {/* your page content */} +
{}
+ {/* sticky-but-scrollable footer */} +
+
+
-
+
@@ -235,7 +232,7 @@ const HomeLayout = () => { ) : (
-

Your session has expired.

+

{t("session-expired")}

diff --git a/apps/OpenSign/src/pages/AddAdmin.jsx b/apps/OpenSign/src/pages/AddAdmin.jsx index 3e8211c9a2..ac3f38d519 100644 --- a/apps/OpenSign/src/pages/AddAdmin.jsx +++ b/apps/OpenSign/src/pages/AddAdmin.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Parse from "parse"; import { appInfo } from "../constant/appinfo"; import { NavLink, useNavigate } from "react-router"; @@ -11,7 +11,6 @@ import { import { useDispatch } from "react-redux"; import { showTenant } from "../redux/reducers/ShowTenant"; import Loader from "../primitives/Loader"; -import Title from "../components/Title"; import { useTranslation } from "react-i18next"; import { emailRegex } from "../constant/const"; @@ -73,6 +72,7 @@ const AddAdmin = () => { const defaultmenuid = localStorage.getItem("defaultmenuid"); const PageLanding = localStorage.getItem("PageLanding"); const userSettings = localStorage.getItem("userSettings"); + const favicon = localStorage.getItem("favicon"); localStorage.clear(); saveLanguageInLocal(i18n); @@ -84,12 +84,13 @@ const AddAdmin = () => { localStorage.setItem("userSettings", userSettings); localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); + localStorage.setItem("favicon", favicon); }; const handleSubmit = async (event) => { event.preventDefault(); if (!emailRegex.test(email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { if (lengthValid && caseDigitValid && specialCharValid) { clearStorage(); @@ -265,7 +266,6 @@ const AddAdmin = () => { }; return (
- {state.loading ? ( <div className="text-[grey] flex justify-center items-center text-lg md:text-2xl"> <Loader /> diff --git a/apps/OpenSign/src/pages/ChangePassword.jsx b/apps/OpenSign/src/pages/ChangePassword.jsx index bf693a9866..b162a4388a 100644 --- a/apps/OpenSign/src/pages/ChangePassword.jsx +++ b/apps/OpenSign/src/pages/ChangePassword.jsx @@ -1,7 +1,6 @@ -import React, { useState } from "react"; +import { useState } from "react"; import Parse from "parse"; import { Navigate } from "react-router"; -import Title from "../components/Title"; import { useTranslation } from "react-i18next"; function ChangePassword() { @@ -56,7 +55,6 @@ function ChangePassword() { } return ( <div className="w-full bg-base-100 text-base-content shadow rounded-box p-2"> - <Title title="Change Password" /> <div className="text-xl font-bold border-b-[1px] border-gray-300"> {t("change-password")} </div> diff --git a/apps/OpenSign/src/pages/Dashboard.jsx b/apps/OpenSign/src/pages/Dashboard.jsx index d135c3c0e5..4a50285285 100644 --- a/apps/OpenSign/src/pages/Dashboard.jsx +++ b/apps/OpenSign/src/pages/Dashboard.jsx @@ -1,7 +1,6 @@ import React, { useState, useEffect } from "react"; import GetDashboard from "../components/dashboard/GetDashboard"; import { useNavigate, useParams } from "react-router"; -import Title from "../components/Title"; import { useDispatch } from "react-redux"; import { saveTourSteps } from "../redux/reducers/TourStepsReducer"; import dashboardJson from "../json/dashboardJson"; @@ -57,7 +56,6 @@ const Dashboard = () => { return ( <React.Fragment> - <Title title="Dashboard" /> {loading ? ( <div className="h-[300px] w-full bg-white flex justify-center items-center rounded-md"> <Loader /> diff --git a/apps/OpenSign/src/pages/DebugPdf.jsx b/apps/OpenSign/src/pages/DebugPdf.jsx index 52b52a8303..1b45c40331 100644 --- a/apps/OpenSign/src/pages/DebugPdf.jsx +++ b/apps/OpenSign/src/pages/DebugPdf.jsx @@ -1,12 +1,12 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; -import Title from "../components/Title"; import RenderDebugPdf from "../components/RenderDebugPdf"; import { pdfjs } from "react-pdf"; import ModalUi from "../primitives/ModalUi"; import Alert from "../primitives/Alert"; import HandleError from "../primitives/HandleError"; import { useWindowSize } from "../hook/useWindowSize"; +import { useTranslation } from "react-i18next"; function processDimensions(x, y, width, height) { if (width < 0) { @@ -27,6 +27,7 @@ function processDimensions(x, y, width, height) { }; } const DebugPdf = () => { + const {t} = useTranslation() const { width } = useWindowSize(); const [pdf, setPdf] = useState(""); const [isModal, setIsModal] = useState(true); @@ -215,8 +216,7 @@ const DebugPdf = () => { }; return ( <div> - {copied && <Alert type="success">Copied</Alert>} - <Title title={"Debug Pdf"} /> + {copied && <Alert type="success">{t("copied")}</Alert>} {width < 800 ? ( <HandleError handleError={"Debug PDF only availble for PC"} /> ) : ( diff --git a/apps/OpenSign/src/pages/DocSuccessPage.jsx b/apps/OpenSign/src/pages/DocSuccessPage.jsx index 1cb63b16d6..81961f1ea2 100644 --- a/apps/OpenSign/src/pages/DocSuccessPage.jsx +++ b/apps/OpenSign/src/pages/DocSuccessPage.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import Confetti from "react-confetti"; // Import the confetti library import { @@ -10,7 +10,6 @@ import { import ModalUi from "../primitives/ModalUi"; import Loader from "../primitives/Loader"; import DownloadPdfZip from "../primitives/DownloadPdfZip"; -import Title from "../components/Title"; import CheckCircle from "../primitives/CheckCircle"; const DocSuccessPage = () => { @@ -62,7 +61,6 @@ const DocSuccessPage = () => { return ( <> - <Title title="Success" /> {/* Confetti Effect */} {showConfetti && ( <Confetti width={window.innerWidth} height={window.innerHeight} /> diff --git a/apps/OpenSign/src/pages/ForgetPassword.jsx b/apps/OpenSign/src/pages/ForgetPassword.jsx index 25d1469a5c..12bb2cb49f 100644 --- a/apps/OpenSign/src/pages/ForgetPassword.jsx +++ b/apps/OpenSign/src/pages/ForgetPassword.jsx @@ -1,5 +1,4 @@ -import React, { useEffect, useState } from "react"; -import Title from "../components/Title"; +import { useEffect, useState } from "react"; import { useNavigate } from "react-router"; import login_img from "../assets/images/login_img.svg"; import Parse from "parse"; @@ -40,7 +39,7 @@ function ForgotPassword() { const handleSubmit = async (event) => { event.preventDefault(); if (!emailRegex.test(state.email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { setIsLoading(true); localStorage.setItem("appLogo", appInfo.applogo); @@ -87,7 +86,6 @@ function ForgotPassword() { <Loader /> </div> )} - <Title title="Forgot password" /> {toast?.message && <Alert type={toast.type}>{toast.message}</Alert>} <div className="md:p-10 lg:p-16"> <div className="md:p-4 lg:p-10 p-4 bg-base-100 text-base-content op-card"> diff --git a/apps/OpenSign/src/pages/Form.jsx b/apps/OpenSign/src/pages/Form.jsx index 777ee89010..60a4a7a69d 100644 --- a/apps/OpenSign/src/pages/Form.jsx +++ b/apps/OpenSign/src/pages/Form.jsx @@ -5,7 +5,6 @@ import Parse from "parse"; import Alert from "../primitives/Alert"; import SelectFolder from "../components/shared/fields/SelectFolder"; import SignersInput from "../components/shared/fields/SignersInput"; -import Title from "../components/Title"; import PageNotFound from "./PageNotFound"; import { SaveFileSize } from "../constant/saveFileSize"; import { @@ -195,7 +194,9 @@ const Forms = (props) => { setIsDecrypting(false); setfileload(false); removeFile(e); - alert(`Incorrect password for file: ${file.name}`); + alert( + t("incorrect-password-for-file", { file: file.name }) + ); } } else { console.error("password not provided"); @@ -273,9 +274,8 @@ const Forms = (props) => { setfileload(false); removeFile(e); console.log("err in docx to pdf ", err); - const error = isOpenSignDomain - ? `${t("docx-error")} ${t("docx-error-contact")}` - : t("docx-error"); + const error = + t("docx-error"); alert(error); return; } @@ -321,7 +321,8 @@ const Forms = (props) => { } if (uploadedUrl) { const tenantId = localStorage.getItem("TenantId"); - SaveFileSize(pdfBytes.byteLength, uploadedUrl, tenantId); + const userId = extUserData?.UserId?.objectId; + SaveFileSize(pdfBytes.byteLength, uploadedUrl, tenantId, userId); setFileUpload(uploadedUrl); setfileload(false); const title = generateTitleFromFilename(filesNameArr?.[0]); @@ -555,6 +556,8 @@ const Forms = (props) => { e.preventDefault(); setIsPassword(false); setfileload(true); + const tenantId = localStorage.getItem("TenantId"); + const userId = extUserData?.UserId?.objectId; try { const size = formData?.file?.size; const name = generatePdfName(16); @@ -579,8 +582,7 @@ const Forms = (props) => { removeFile(); const title = generateTitleFromFilename(formData?.file?.name); setFormData((obj) => ({ ...obj, password: "", Name: title })); - const tenantId = localStorage.getItem("TenantId"); - SaveFileSize(size, fileRes.url, tenantId); + SaveFileSize(size, fileRes?.url, tenantId, userId); return fileRes.url; } else { removeFile(); @@ -630,7 +632,6 @@ const Forms = (props) => { return ( <div className="shadow-md rounded-box my-[2px] p-3 bg-base-100 text-base-content"> - <Title title={props?.title} /> {isAlert?.message && <Alert type={isAlert.type}>{isAlert.message}</Alert>} {isSubmit ? ( <div className="h-[300px] flex justify-center items-center"> @@ -791,6 +792,7 @@ const Forms = (props) => { onChange={handleSigners} isReset={isReset} helptextZindex={50} + isAddYourSelfCheckbox required /> )} @@ -1027,6 +1029,7 @@ const Forms = (props) => { helptextZindex={50} helpText={t("bcc-help")} isCaptureAllData + isAddYourSelfCheckbox /> )} </> @@ -1221,7 +1224,7 @@ const Forms = (props) => { {t("next")} </button> <div - className="op-btn op-btn-ghost" + className="op-btn op-btn-ghost text-base-content" onClick={() => handleCancel()} > {t("cancel")} diff --git a/apps/OpenSign/src/pages/GuestLogin.jsx b/apps/OpenSign/src/pages/GuestLogin.jsx index 4af963d7e7..51ef036992 100644 --- a/apps/OpenSign/src/pages/GuestLogin.jsx +++ b/apps/OpenSign/src/pages/GuestLogin.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import { useState, useEffect } from "react"; import { useNavigate, useParams } from "react-router"; import axios from "axios"; import { @@ -14,7 +14,6 @@ import Parse from "parse"; import { useTranslation } from "react-i18next"; import SelectLanguage from "../components/pdf/SelectLanguage"; import LoaderWithMsg from "../primitives/LoaderWithMsg"; -import Title from "../components/Title"; import ModalUi from "../primitives/ModalUi"; import Loader from "../primitives/Loader"; @@ -36,8 +35,14 @@ function GuestLogin() { const [documentId, setDocumentId] = useState(id); const [contactId, setContactId] = useState(contactBookId); const [sendmail, setSendmail] = useState(); - const [contact, setContact] = useState({ name: "", phone: "", email: "" }); - + const [contact, setContact] = useState({ + name: "", + phone: "", + email: "", + jobTitle: "", + company: "" + }); + const [isOptionalDetails, setIsOptionalDetails] = useState(false); const navigateToDoc = async (docId, contactId) => { try { @@ -72,8 +77,10 @@ function GuestLogin() { //function generate serverUrl and parseAppId from url and save it in local storage const handleServerUrl = async () => { setAppLogo(logo); + const favicon = localStorage.getItem("favicon"); localStorage.clear(); // Clears everything + localStorage.setItem("favicon", favicon); localStorage.setItem( "appname", "OpenSign™" @@ -214,7 +221,7 @@ function GuestLogin() { const handleUserData = async (e) => { e.preventDefault(); if (!emailRegex.test(contact.email?.toLowerCase()?.replace(/\s/g, ""))) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { const params = { ...contact, docId: documentId }; try { @@ -253,7 +260,6 @@ function GuestLogin() { return ( <div> - <Title title="Request Sign" /> {/* OTP Verification Modal */} {EnterOTP && ( @@ -356,7 +362,7 @@ function GuestLogin() { <div className="mb-2"> <label htmlFor="name" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("name")} <span className="text-[red] text-[13px]"> *</span> @@ -378,7 +384,7 @@ function GuestLogin() { <div className="mb-2"> <label htmlFor="email" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("email")} <span className="text-[red] text-[13px]"> *</span> @@ -393,23 +399,74 @@ function GuestLogin() { disabled /> </div> - <div className="mt-2.5"> - <label - htmlFor="phone" - className="block text-xs text-gray-700 font-semibold" - > - {t("phone")} - </label> - <input - type="text" - name="phone" - value={contact.phone} - onChange={handleInputChange} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - disabled={loading} - placeholder={t("phone-optional")} - /> - </div> + {isOptionalDetails && ( + <> + <div className="mb-2"> + <label + htmlFor="phone" + className="block text-xs font-semibold" + > + {t("phone")} + </label> + <input + type="text" + name="phone" + value={contact.phone} + onChange={handleInputChange} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + disabled={loading} + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-2"> + <label + htmlFor="company" + className="block text-xs font-semibold" + > + {t("company")} + </label> + <input + type="text" + id="company" + name="company" + value={contact.company} + onChange={handleInputChange} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + disabled={loading} + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-2"> + <label + htmlFor="jobTitle" + className="block text-xs font-semibold" + > + {t("job-title")} + </label> + <input + type="text" + id="jobTitle" + name="jobTitle" + value={contact.jobTitle} + onChange={handleInputChange} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + disabled={loading} + placeholder={t("phone-optional")} + /> + </div> + </> + )} + <button + onClick={(e) => { + e.preventDefault(); + setIsOptionalDetails(!isOptionalDetails); + }} + className="op-link op-link-secondary max-w-fit text-xs" + > + {isOptionalDetails + ? t("hide-optional-details") + : t("optional-details")} + </button> <div className="mt-2 flex justify-start"> <button type="submit" diff --git a/apps/OpenSign/src/pages/Login.jsx b/apps/OpenSign/src/pages/Login.jsx index 3c7db81b7f..b57f86aac8 100644 --- a/apps/OpenSign/src/pages/Login.jsx +++ b/apps/OpenSign/src/pages/Login.jsx @@ -1,8 +1,7 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Parse from "parse"; import { useDispatch } from "react-redux"; import axios from "axios"; -import Title from "../components/Title"; import { NavLink, useNavigate, useLocation } from "react-router"; import login_img from "../assets/images/login_img.svg"; import { useWindowSize } from "../hook/useWindowSize"; @@ -128,14 +127,14 @@ function Login() { if (error?.code === 1001) { showToast("danger", t("action-prohibited")); } else { - showToast("danger", "Invalid username/password or region"); + showToast("danger", t("invalid-username-password-region")); } } }; const handleLoginBtn = async (event) => { event.preventDefault(); if (!emailRegex.test(state.email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); return; } await handleLogin(); @@ -333,6 +332,7 @@ function Login() { let PageLanding = localStorage.getItem("PageLanding"); let baseUrl = localStorage.getItem("baseUrl"); let appid = localStorage.getItem("parseAppId"); + let favicon = localStorage.getItem("favicon"); localStorage.clear(); saveLanguageInLocal(i18n); @@ -343,6 +343,7 @@ function Login() { localStorage.setItem("userSettings", appdata); localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); + localStorage.setItem("favicon", favicon); }; const continueLoginFlow = async () => { @@ -407,8 +408,7 @@ function Login() { {errMsg} </div> ) : ( - <div> - <Title title="Login" /> + <> {state.loading && ( <div aria-live="assertive" @@ -543,7 +543,7 @@ function Login() { <label htmlFor="Company" style={{ display: "flex" }} - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("company")}{" "} <span className="text-[red] text-[13px]">*</span> @@ -570,7 +570,7 @@ function Login() { <label htmlFor="JobTitle" style={{ display: "flex" }} - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("job-title")} <span className="text-[red] text-[13px]">*</span> @@ -603,7 +603,7 @@ function Login() { </button> <button type="button" - className="op-btn op-btn-ghost" + className="op-btn op-btn-ghost text-base-content" onClick={logOutUser} > {t("cancel")} @@ -620,7 +620,7 @@ function Login() { <Loader /> </div> )} - </div> + </> ); } export default Login; diff --git a/apps/OpenSign/src/pages/Managesign.jsx b/apps/OpenSign/src/pages/Managesign.jsx index 6a1bbf68dc..eb5b267300 100644 --- a/apps/OpenSign/src/pages/Managesign.jsx +++ b/apps/OpenSign/src/pages/Managesign.jsx @@ -1,4 +1,4 @@ -import React, { useState, useRef, useEffect } from "react"; +import { useState, useRef, useEffect } from "react"; import SignatureCanvas from "react-signature-canvas"; import "../styles/managesign.css"; import "../styles/signature.css"; @@ -12,8 +12,7 @@ import { SaveFileSize } from "../constant/saveFileSize"; import Alert from "../primitives/Alert"; import Loader from "../primitives/Loader"; import { useTranslation } from "react-i18next"; -import sanitizeFileName from "../primitives/sanitizeFileName"; -import Title from "../components/Title"; +import { sanitizeFileName } from "../utils"; const ManageSign = () => { const { t } = useTranslation(); const [penColor, setPenColor] = useState("blue"); @@ -206,7 +205,8 @@ const ManageSign = () => { const fileRes = await getSecureUrl(response?.url()); if (fileRes?.url) { const tenantId = localStorage.getItem("TenantId"); - SaveFileSize(file.size, fileRes?.url, tenantId); + const userId = Parse?.User?.current()?.id; + SaveFileSize(file.size, fileRes?.url, tenantId, userId); return fileRes?.url; } else { alert(t("something-went-wrong-mssg")); @@ -298,7 +298,6 @@ const ManageSign = () => { }; return ( <div className="relative h-full bg-base-100 text-base-content flex shadow-md rounded-box overflow-auto"> - <Title title="My signature" /> {isLoader && ( <div className="absolute bg-black bg-opacity-30 z-50 w-full h-full flex justify-center items-center"> <Loader /> @@ -325,7 +324,7 @@ const ManageSign = () => { /> <div className="relative"> {image ? ( - <div className="mysignatureCanvas relative border-[2px] border-[#888] rounded-box overflow-hidden"> + <div className="mysignatureCanvas relative border-[2px] border-[#888] rounded-box overflow-hidden"> <img alt="signature" src={image} diff --git a/apps/OpenSign/src/pages/Opensigndrive.jsx b/apps/OpenSign/src/pages/Opensigndrive.jsx index 12095d06e3..36caacc095 100644 --- a/apps/OpenSign/src/pages/Opensigndrive.jsx +++ b/apps/OpenSign/src/pages/Opensigndrive.jsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState, useRef } from "react"; +import React, { useEffect, useState, useRef, useCallback } from "react"; +import { lazyWithRetry } from "../utils"; import "../styles/opensigndrive.css"; import { getThemeIconColor, @@ -7,7 +8,6 @@ import { getDrive } from "../constant/Utils"; import { useNavigate } from "react-router"; -import Title from "../components/Title"; import Parse from "parse"; import ModalUi from "../primitives/ModalUi"; import TourContentWithBtn from "../primitives/TourContentWithBtn"; @@ -16,7 +16,7 @@ import axios from "axios"; import Loader from "../primitives/Loader"; import { useTranslation } from "react-i18next"; -const DriveBody = React.lazy( +const DriveBody = lazyWithRetry( () => import("../components/opensigndrive/DriveBody") ); const dropdowncss = @@ -35,6 +35,8 @@ function Opensigndrive() { const { t } = useTranslation(); const navigate = useNavigate(); const scrollRef = useRef(null); + // Create a ref for the "sentinel" element at the bottom of the list + const bottomRef = useRef(null); const [isList, setIsList] = useState(false); const [selectedSort, setSelectedSort] = useState("Date"); const [sortingOrder, setSortingOrder] = useState("Descending"); @@ -60,7 +62,7 @@ function Opensigndrive() { const [loading, setLoading] = useState(false); const sortOrder = ["Ascending", "Descending"]; const sortingValue = ["Name", "Date"]; - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [tourData, setTourData] = useState(); const [showTourFirstTIme, setShowTourFirstTime] = useState(true); const [searchTerm, setSearchTerm] = useState(""); @@ -221,39 +223,38 @@ function Opensigndrive() { } }; - //function to fetch drive details list on scroll bottom - const handleScroll = () => { - //get document of render openSign-drive component using id - const documentList = document.getElementById("renderList"); - const { scrollTop, clientHeight, scrollHeight } = documentList; - const scrolled = Math.ceil(scrollTop + clientHeight); // ceil return e.g 3.14 => 4 - const totalHeight = Math.floor(scrollHeight); // floor return e.g 3.14 => 3 - - // clientHeight property returns the height of an element's content area, including padding but not including borders, margins, or scrollbars. - // scrollHeight property returns the entire height of an element,including the parts that are not visible due to overflow.. - // scrollTop property show height of element, how much the content has been scrolled from the top. - // When the sum of scrollTop and clientHeight is equal to scrollHeight, it means that the user has scrolled to the bottom of the div. - - if (scrolled >= totalHeight) { - //disableLoading is used disable initial loader - const disableLoading = true; - // If the fetched data length is less than the limit, it means there's no more data to fetch - if (!loading && pdfData.length % 50 === 0) { - getPdfDocumentList(disableLoading); - } + // Memoize the loader function so it only changes when deps change + const loadMore = useCallback(() => { + // Only fetch if we're not already loading and we've got a full "page" (50 items) + if (!loading && pdfData.length % 50 === 0) { + // Pass `true` to disable the initial loader UI + getPdfDocumentList(true); } - }; - //useEffect is used to call handleScroll function on scrolling event + }, [loading, pdfData.length, getPdfDocumentList]); + useEffect(() => { - const documentList = document.getElementById("renderList"); - if (documentList) { - documentList.addEventListener("scroll", handleScroll); - return () => { - documentList.removeEventListener("scroll", handleScroll); - }; - } - // eslint-disable-next-line - }, [loading, sortingOrder, selectedSort]); // Add/remove scroll event listener when loading changes + const container = document.getElementById("renderList") || null; + if (!container) return; + // Set up the IntersectionObserver + const observer = new IntersectionObserver( + ([entry]) => { + // 5. When the sentinel comes fully into view, trigger loadMore() + if (entry.isIntersecting) loadMore(); + }, + { + root: container, // Determine the scroll container (null = viewport) + rootMargin: "0px", // no extra margin + threshold: 1.0 // fire when 100% of sentinel is visible + } + ); + // Start observing the sentinel DOM node + if (bottomRef.current) observer.observe(bottomRef.current); + // Clean up on unmount or if loadMore changes + return () => { + if (bottomRef.current) observer.unobserve(bottomRef.current); + observer.disconnect(); + }; + }, [loadMore]); //function for handle folder name path const handleRoute = (index, folderData) => { @@ -554,9 +555,27 @@ function Opensigndrive() { }; }, []); + const handleHighlightClick = () => { + setIsTour(false); + setShowTourFirstTime(false); + }; + + const handleFolderOptions = () => { + setIsOptions(!isOptions); + handleHighlightClick(); + }; + + const handleSortOptions = () => { + setIsShowSort(!isShowSort); + handleHighlightClick(); + }; + + const handleViewOption = () => { + setIsList(!isList); + handleHighlightClick(); + }; return ( <div className="bg-base-100 text-base-content rounded-box w-full shadow-md"> - <Title title={`${drivename} Drive`} drive={true} /> <ModalUi isOpen={isAlert.isShow} title={t("alert")} @@ -614,7 +633,7 @@ function Opensigndrive() { </button> <button type="button" - className="op-btn op-btn-ghost ml-1" + className="op-btn op-btn-ghost text-base-content ml-1" onClick={oncloseFolder} > {t("close")} @@ -643,14 +662,13 @@ function Opensigndrive() { onRequestClose={closeTour} steps={tourData} isOpen={isTour} - closeWithMask={false} scrollOffset={-100} - rounded={5} /> )} <div data-tut="reactourFirst" onMouseEnter={(e) => handleMouseEnter(e)} + onClick={handleHighlightClick} ref={scrollRef} className="w-full whitespace-nowrap cursor-pointer select-none overflow-x-auto" > @@ -682,7 +700,7 @@ function Opensigndrive() { <div id="folder-menu" className={`${isOptions ? "dropdown show dropDownStyle" : "dropdown"} hidden md:block cursor-pointer hover:bg-gray-200 p-2 rounded-md`} - onClick={() => setIsOptions(!isOptions)} + onClick={handleFolderOptions} > <div data-tut="reactourSecond"> <i @@ -727,7 +745,7 @@ function Opensigndrive() { <div id="menu-container" className={isShowSort ? "dropdown show" : "dropdown"} - onClick={() => setIsShowSort(!isShowSort)} + onClick={handleSortOptions} > <div data-tut="reactourThird" @@ -739,7 +757,12 @@ function Opensigndrive() { aria-hidden="true" style={{ color: `${getThemeIconColor()}` }} ></i> - <span style={{ fontSize: "15px", color: `${getThemeIconColor()}` }}> + <span + style={{ + fontSize: "15px", + color: `${getThemeIconColor()}` + }} + > {selectedSort} </span> </div> @@ -796,7 +819,7 @@ function Opensigndrive() { <div className="cursor-pointer p-2 hover:bg-gray-200 rounded-md flex justify-center items-center" data-tut="reactourForth" - onClick={() => setIsList(!isList)} + onClick={handleViewOption} > <i className={`${isList ? "fa-light fa-th-large" : "fa-light fa-list"} text-[20px]`} @@ -891,6 +914,8 @@ function Opensigndrive() { setSkip={setSkip} sortingData={sortingData} /> + {/* sentinel */} + <div ref={bottomRef} className="h-1" /> {loading && ( <div className="text-center pb-[20px]">{t("loading")}</div> )} diff --git a/apps/OpenSign/src/pages/PageNotFound.jsx b/apps/OpenSign/src/pages/PageNotFound.jsx index 1c439b27f7..6edae68480 100644 --- a/apps/OpenSign/src/pages/PageNotFound.jsx +++ b/apps/OpenSign/src/pages/PageNotFound.jsx @@ -1,15 +1,13 @@ -// NotFound.js -import React from "react"; -import Title from "../components/Title"; +import { useTranslation } from "react-i18next"; const PageNotFound = ({ prefix }) => { + const { t } = useTranslation(); return ( <div className="flex items-center justify-center h-screen w-full bg-base-100 text-base-content rounded-box"> - <Title title={"Page Not Found"} /> <div className="text-center"> <h1 className="text-[60px] lg:text-[120px] font-semibold">404</h1> <p className="text-[30px] lg:text-[50px]"> - {prefix ? prefix : "Page"} Not Found + {prefix ? `${prefix} Not Found` : t("page-not-found")} </p> </div> </div> diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.jsx b/apps/OpenSign/src/pages/PdfRequestFiles.jsx index c7e7804f9f..044f5f354f 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.jsx +++ b/apps/OpenSign/src/pages/PdfRequestFiles.jsx @@ -3,8 +3,7 @@ import { PDFDocument } from "pdf-lib"; import "../styles/signature.css"; import Parse from "parse"; import axios from "axios"; -import { DndProvider, useDrop } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; +import { useDrop } from "react-dnd"; import { useDispatch, useSelector } from "react-redux"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import Tour from "../primitives/Tour"; @@ -14,11 +13,12 @@ import { setSaveSignCheckbox, setMyInitial, setDefaultSignImg, - resetWidgetState + resetWidgetState, + setPrefillImg } from "../redux/reducers/widgetSlice.js"; import { contractDocument, - multiSignEmbed, + embedWidgetsToDoc, embedDocId, pdfNewWidthFun, signPdfFun, @@ -48,13 +48,13 @@ import { widgetDataValue, getOriginalWH, handleCheckResponse, + convertJpegToPng } from "../constant/Utils"; import Header from "../components/pdf/PdfHeader"; import RenderPdf from "../components/pdf/RenderPdf"; -import Title from "../components/Title"; import DefaultSignature from "../components/pdf/DefaultSignature"; import SignerListComponent from "../components/pdf/SignerListComponent"; -import PdfZoom from "../components/pdf/PdfZoom"; +import PdfTools from "../components/pdf/PdfTools"; import { useTranslation } from "react-i18next"; import ModalUi from "../primitives/ModalUi"; import TourContentWithBtn from "../primitives/TourContentWithBtn"; @@ -68,12 +68,14 @@ import AgreementSign from "../components/pdf/AgreementSign"; import WidgetComponent from "../components/pdf/WidgetComponent"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; import TextFontSetting from "../components/pdf/TextFontSetting"; -import WidgetsValueModal from "../components/pdf/WidgetsValueModal.jsx"; +import WidgetsValueModal from "../components/pdf/WidgetsValueModal"; +import * as utils from "../utils"; function PdfRequestFiles( ) { const { t } = useTranslation(); const dispatch = useDispatch(); + const prefillImg = useSelector((state) => state.widget.prefillImg); const isShowModal = useSelector((state) => state.widget.isShowModal); const defaultSignImg = useSelector((state) => state.widget.defaultSignImg); const myInitial = useSelector((state) => state.widget.myInitial); @@ -88,8 +90,9 @@ function PdfRequestFiles( const [pageNumber, setPageNumber] = useState(1); const [handleError, setHandleError] = useState(); const [isCelebration, setIsCelebration] = useState(false); - const [requestSignTour, setRequestSignTour] = useState(true); + const [isReqSignTourDisabled, setIsReqSignTourDisabled] = useState(true); const [tourStatus, setTourStatus] = useState([]); + const [isDontShowCheckbox, setIsDontShowCheckbox] = useState(false); const [isLoading, setIsLoading] = useState({ isLoad: true, message: t("loading-mssg") @@ -107,11 +110,8 @@ function PdfRequestFiles( const [expiredDate, setExpiredDate] = useState(""); const [isResize, setIsResize] = useState(false); const [signerUserId, setSignerUserId] = useState(); - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [isDownloading, setIsDownloading] = useState(""); - // tempSignerId is used to temporarily store the currently selected signer's unique ID, When editing a text widget, it automatically attaches a prefill user, and since prefill users are not shown in the signer list, the selected signer from before editing would be lost. To handle this, we store the currently selected signer's unique ID in tempSignerId before entering the text widget edit mode. Once the text widget settings are completed, - // we restore the original selected signer by setting tempSignerId back to uniqueId.This ensures that the correct signer remains selected and visible in the UI even after interacting with a prefill-only widget like the text widget. - const [tempSignerId, setTempSignerId] = useState(""); const [defaultSignAlert, setDefaultSignAlert] = useState({ isShow: false, alertMessage: "" @@ -135,7 +135,7 @@ function PdfRequestFiles( const [scale, setScale] = useState(1); const [uniqueId, setUniqueId] = useState(""); const [documentId, setDocumentId] = useState(""); - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); const divRef = useRef(null); const [isDownloadModal, setIsDownloadModal] = useState(false); const [signatureType, setSignatureType] = useState([]); @@ -155,6 +155,11 @@ function PdfRequestFiles( const [assignedWidgetId, setAssignedWidgetId] = useState([]); const [showSignPagenumber, setShowSignPagenumber] = useState([]); const [owner, setOwner] = useState({}); + const [tenantMailTemplate, setTenantMailTemplate] = useState({ + body: "", + subject: "" + }); + const [isOptionalDetails, setIsOptionalDetails] = useState(false); const [, drop] = useDrop({ accept: "BOX", drop: (item, monitor) => addPositionOfSignature(item, monitor), @@ -211,7 +216,7 @@ function PdfRequestFiles( const timer = setTimeout(updateSize, 100); // match the transition duration return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [divRef.current, isHeader]); + }, [divRef.current, isSidebar]); const redirectUrl = pdfDetails?.[0]?.RedirectUrl || ""; useEffect(() => { if (isredirectCanceled) return; // Stop the redirect timer if canceled @@ -244,6 +249,12 @@ function PdfRequestFiles( const filterSignTypes = signatureType?.filter( (x) => x.enabled === true ); + if (tenantDetails?.RequestBody) { + setTenantMailTemplate({ + body: tenantDetails?.RequestBody, + subject: tenantDetails?.RequestSubject + }); + } return filterSignTypes; } @@ -258,7 +269,6 @@ function PdfRequestFiles( isSuccessPage = false, ) => { try { - let isUpdatedSubscribe; const senderUser = localStorage.getItem( `Parse/${localStorage.getItem("parseAppId")}/currentUser` ); @@ -274,7 +284,7 @@ function PdfRequestFiles( //getting document details const documentData = await contractDocument(docId); // Filter out 'prefill' roles from the Placeholder array - const filteredPlaceholder = documentData[0].Placeholders.filter( + const filteredPlaceholder = documentData[0]?.Placeholders?.filter( (data) => data.Role !== "prefill" ); // Reassign the updated Placeholder back to the documentData array @@ -283,6 +293,14 @@ function PdfRequestFiles( Placeholders: filteredPlaceholder }; if (documentData && documentData.length > 0) { + const prefillImg = await utils?.savePrefillImg( + documentData[0]?.Placeholders + ); + if (prefillImg && Array.isArray(prefillImg)) { + prefillImg.forEach((img) => { + dispatch(setPrefillImg(img)); + }); + } const userSignatureType = documentData[0]?.ExtUserPtr?.SignatureType || signatureTypes; const docSignTypes = @@ -310,7 +328,7 @@ function PdfRequestFiles( setOwner(documentData?.[0]?.ExtUserPtr); const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; - const expireDate = documentData[0].ExpiryDate.iso; + const expireDate = documentData[0]?.ExpiryDate?.iso; const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; const expireUpdateDate = new Date(expireDate).getTime(); @@ -365,7 +383,7 @@ function PdfRequestFiles( } } else { if (currUserId) { - const checkCurrentUser = documentData[0].Placeholders.find( + const checkCurrentUser = documentData[0]?.Placeholders?.find( (data) => data?.signerObjId === currUserId ); if (checkCurrentUser) { @@ -399,9 +417,11 @@ function PdfRequestFiles( let signers = []; let unSignedSigner = []; - + const removePrefill = documentData[0]?.Placeholders.filter( + (x) => x.Role !== "prefill" + ); const placeholdersOrSigners = []; - for (const placeholder of documentData[0].Placeholders) { + for (const placeholder of removePrefill) { //`emailExist` variable to handle condition for quick send flow and show unsigned signers list const signerIdExist = placeholder?.signerObjId; if (signerIdExist) { @@ -454,10 +474,9 @@ function PdfRequestFiles( checkAlreadySign || !currUserId || declined || - currDate > expireUpdateDate || - !isTourEnabled + currDate > expireUpdateDate ) { - setRequestSignTour(true); + setIsReqSignTourDisabled(true); } else { const isEnableOTP = documentData?.[0]?.IsEnableOTP || false; const sessionToken = localStorage.getItem("accesstoken"); @@ -471,17 +490,8 @@ function PdfRequestFiles( setContractName("_Users"); currUserId = res[0].objectId; setSignerUserId(currUserId); - const tourData = res[0].TourStatus && res[0].TourStatus; - if (tourData && tourData.length > 0) { - const checkTourRequest = tourData.filter( - (data) => data?.requestSign - ); - setTourStatus(tourData); - setRequestSignTour(checkTourRequest[0]?.requestSign || false); - } else { - setRequestSignTour(false); - } - + storeSignerDetails(res?.[0]); + handleTourStatus(isTourEnabled, res?.[0]?.TourStatus); //function to get default signatur of current user from `contracts_Signature` class const defaultSignRes = await getDefaultSignature( jsonSender?.objectId @@ -507,17 +517,9 @@ function PdfRequestFiles( } else if (res[0] && res.length) { setContractName("_Contactbook"); const objectId = res[0].objectId; + storeSignerDetails(res?.[0]); setSignerUserId(objectId); - const tourData = res[0].TourStatus && res[0].TourStatus; - if (tourData && tourData.length > 0) { - const checkTourRequest = tourData.filter( - (data) => data?.requestSign - ); - setTourStatus(tourData); - setRequestSignTour(checkTourRequest[0]?.requestSign || false); - } else { - setRequestSignTour(false); - } + handleTourStatus(isTourEnabled, res?.[0]?.TourStatus); } else if (res.length === 0) { setHandleError(t("user-not-exist")); } @@ -535,25 +537,10 @@ function PdfRequestFiles( } ); const contact = resContact?.data?.result; - localStorage.setItem( - "signer", - JSON.stringify({ - Name: contact?.Name, - Email: contact?.Email, - UserId: contact?.UserId?.objectId - }) - ); + storeSignerDetails(contact); setContractName("_Contactbook"); setSignerUserId(contact?.objectId); - const tourData = contact?.TourStatus && contact?.TourStatus; - if (tourData && tourData.length > 0) { - const checkTourRequest = - tourData?.some((data) => data?.requestSign) || false; - setTourStatus(tourData); - setRequestSignTour(checkTourRequest); - } else { - setRequestSignTour(false); - } + handleTourStatus(isTourEnabled, contact?.TourStatus); } catch (err) { console.log("err while getting tourstatus", err); } @@ -587,6 +574,38 @@ function PdfRequestFiles( setIsLoading({ isLoad: false }); } }; + + // `storeSignerDetails` is used to stor signer details to set in text type widgets + const storeSignerDetails = (signer) => { + localStorage.setItem( + "signer", + JSON.stringify({ + Name: signer?.Name, + Email: signer?.Email, + UserId: signer?.UserId?.objectId, + JobTitle: signer?.JobTitle, + Company: signer?.Company + }) + ); + }; + + // `handleTourStatus` is used to disable/enable tour + const handleTourStatus = (isTourEnabled, tourData) => { + if (isTourEnabled) { + if (tourData && tourData.length > 0) { + const checkTourRequest = + tourData?.some((data) => data?.requestSign) || false; + setTourStatus(tourData); + setIsDontShowCheckbox(!checkTourRequest); + setIsReqSignTourDisabled(checkTourRequest); + } else { + setIsReqSignTourDisabled(false); + } + } else { + setIsReqSignTourDisabled(true); + } + }; + //function for embed signature or image url in pdf async function embedWidgetsData( ) { @@ -645,6 +664,7 @@ function PdfRequestFiles( // `widgets` is Used to return widgets details with page number of current user const widgets = checkUser?.[0]?.placeHolder; let pdfArrBuffer; + const isSignYourSelfFlow = false; //`contractDocument` function used to get updated SignedUrl // to resolve issue of widgets get remove automatically when more than 1 signers try to sign doc at a time const documentData = await contractDocument(docId); @@ -657,6 +677,23 @@ function PdfRequestFiles( } else { pdfArrBuffer = arrayBuffer; } + const prefillDetails = signerPos.find( + (x) => x.Role === "prefill" + ); + //condition to embed prefill widgets details in pdf in public signing flow + if (prefillDetails && props.templateId) { + const prefillwidgets = prefillDetails?.placeHolder; + const pdfDoc = await PDFDocument.load(pdfArrBuffer); + const pdfbase64 = await embedWidgetsToDoc( + prefillwidgets, + pdfDoc, + isSignYourSelfFlow, + scale, + prefillImg + ); + //convert base64 to arraybuffer is used in pdf-lib + pdfArrBuffer = base64ToArrayBuffer(pdfbase64); + } } else if ( documentData === "Error: Something went wrong!" || (documentData.result && documentData.result.error) @@ -669,11 +706,8 @@ function PdfRequestFiles( } else { setHandleError("Document not Found!"); } - // Load a PDFDocument from the existing PDF bytes - const existingPdfBytes = pdfArrBuffer; try { - const pdfDoc = await PDFDocument.load(existingPdfBytes); - const isSignYourSelfFlow = false; + const pdfDoc = await PDFDocument.load(pdfArrBuffer); const extUserPtr = pdfDetails[0].ExtUserPtr; const HeaderDocId = extUserPtr?.HeaderDocId; //embed document's object id to all pages in pdf document @@ -684,7 +718,7 @@ function PdfRequestFiles( } } //embed all widgets in document - const pdfBytes = await multiSignEmbed( + const pdfBytes = await embedWidgetsToDoc( widgets, pdfDoc, isSignYourSelfFlow, @@ -719,11 +753,13 @@ function PdfRequestFiles( updatedDoc.updatedPdfDetails?.[0]?.Signers.findIndex( (x) => x.objectId === contactId ); + const removePrefill = + updatedDoc.updatedPdfDetails?.[0]?.Placeholders?.filter( + (x) => x.Role !== "prefill" + ); const newIndex = index + 1; const usermail = { - Email: - updatedDoc.updatedPdfDetails?.[0]?.Placeholders[newIndex] - ?.email || "" + Email: removePrefill[newIndex]?.email || "" }; const user = usermail?.Email ? usermail @@ -733,9 +769,11 @@ function PdfRequestFiles( sendInOrder ) { const requestBody = - updatedDoc.updatedPdfDetails?.[0]?.RequestBody; + updatedDoc.updatedPdfDetails?.[0]?.RequestBody || + tenantMailTemplate?.body; const requestSubject = - updatedDoc.updatedPdfDetails?.[0]?.RequestSubject; + updatedDoc.updatedPdfDetails?.[0]?.RequestSubject || + tenantMailTemplate?.subject; if (user) { const expireDate = expiry; const newDate = new Date(expireDate); @@ -923,8 +961,8 @@ function PdfRequestFiles( let filterSignerPos = []; if (signerObjId) { //get current signerObjId placeholder details - filterSignerPos = updateSignPos?.filter( - (data) => data.Id === signerObjId + filterSignerPos = updateSignPos.filter( + (data) => data.Id === signerObjId && data.Role !== "prefill" ); } @@ -957,7 +995,7 @@ function PdfRequestFiles( //update new placeholder of current signer const newUpdateSigner = updateSignPos.map((obj) => { if (signerObjId) { - if (obj.Id === signerObjId) { + if (obj.Id === uniqueId && obj.Role !== "prefill") { return { ...obj, placeHolder: newUpdateSignPos }; } } @@ -1090,19 +1128,18 @@ function PdfRequestFiles( }); }; //function to add default signature for all requested placeholder of sign - const addDefaultSignature = () => { + const addDefaultSignature = async () => { const type = defaultSignAlert?.type; //get current signers placeholder position data const currentSignerPosition = signerPos?.filter( (data) => data.signerObjId === signerObjectId ); const defaultSign = type === "signature" ? defaultSignImg : myInitial; + const placeHolder = currentSignerPosition[0].placeHolder; + const filename = type === "signature" ? "mysign" : "myinitials"; + const signImg = await convertJpegToPng(defaultSign, filename); //function for save default signature url for all placeholder position - const updatePlace = addDefaultSignatureImg( - currentSignerPosition[0].placeHolder, - defaultSign, - type - ); + const updatePlace = addDefaultSignatureImg(placeHolder, signImg, type); const updatesignerPos = signerPos.map((x) => x.signerObjId === signerObjectId ? { ...x, placeHolder: updatePlace } : x @@ -1115,7 +1152,7 @@ function PdfRequestFiles( }; //function to close tour and save tour status const closeRequestSignTour = async () => { - setRequestSignTour(true); + setIsReqSignTourDisabled(true); if (isDontShow) { const isEnableOTP = pdfDetails?.[0]?.IsEnableOTP || false; const sessionToken = localStorage.getItem("accesstoken"); @@ -1186,6 +1223,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-6", { pagenumbers })} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1197,6 +1235,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-1")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1208,6 +1247,19 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-2")} + isDontShowCheckbox={isDontShowCheckbox} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, + { + selector: '[data-tut="pdftools"]', + content: () => ( + <TourContentWithBtn + message={t("pdf-tools-tour")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1219,6 +1271,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-3")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1231,6 +1284,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-4")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1249,6 +1303,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-5")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1261,6 +1316,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.allowModify-widgets")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1297,12 +1353,14 @@ function PdfRequestFiles( onRequestClose={closeRequestSignTour} steps={isMobile ? mobileTour : defaultSignTour} isOpen={true} - closeWithMask={false} - rounded={5} /> ); }; + const handleCloseTour = () => { + closeTour(); + setIsReqSignTourDisabled(true); + }; const clickOnZoomIn = () => { onClickZoomIn(scale, zoomPercent, setScale, setZoomPercent); @@ -1312,11 +1370,17 @@ function PdfRequestFiles( }; const handleDownloadBtn = async () => { const url = pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL; + const isCompleted = pdfDetails?.[0]?.IsCompleted || false; const name = pdfDetails?.[0]?.Name?.length > 100 ? pdfDetails?.[0]?.Name?.slice(0, 100) : pdfDetails?.[0]?.Name || "Document"; - await fetchUrl(url, name); + const formatId = pdfDetails?.[0]?.ExtUserPtr?.DownloadFilenameFormat; + const docName = utils?.buildDownloadFilename(formatId, { + docName: name, + isSigned: isCompleted + }); + await fetchUrl(url, docName); }; const handleDeclineMssg = () => { const user = pdfDetails[0]?.DeclineBy?.email; @@ -1400,80 +1464,95 @@ function PdfRequestFiles( getSignerPos(item, monitor); }; const getSignerPos = (item, monitor) => { - const posZIndex = zIndex + 1; - setZIndex(posZIndex); - const key = randomId(); - const containerScale = getContainerScale( - pdfOriginalWH, - pageNumber, - containerWH - ); - let dropData = [], - dropObj; - let placeHolder; - const dragTypeValue = item?.text ? item.text : monitor.type; - const widgetWidth = - defaultWidthHeight(dragTypeValue).width * containerScale; - const widgetHeight = - defaultWidthHeight(dragTypeValue).height * containerScale; - const extUser = localStorage.getItem("Extand_Class"); - const parseUser = extUser && JSON.parse(extUser)[0]; - const widgetValue = widgetDataValue(dragTypeValue, parseUser); - //adding and updating drop position in array when user drop signature button in div - if (item === "onclick") { - // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div - const divWidth = divRef.current.getBoundingClientRect().width; - const divHeight = divRef.current.getBoundingClientRect().height; - // Compute the pixel‐space center within the PDF viewport: - const centerX_Pixels = divWidth / 2 - widgetWidth / 2; - const xPosition_Final = centerX_Pixels / (containerScale * scale); - dropObj = { - //onclick put placeholder center on pdf - xPosition: xPosition_Final, - yPosition: widgetHeight + divHeight / 2, - isStamp: - (dragTypeValue === "stamp" || dragTypeValue === "image") && true, - key: key, - scale: containerScale, - zIndex: posZIndex, - type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner, widgetValue), - Width: widgetWidth / (containerScale * scale), - Height: widgetHeight / (containerScale * scale) - }; - dropData.push(dropObj); - placeHolder = { pageNumber: pageNumber, pos: dropData }; - } else { - const offset = monitor.getClientOffset(); - //This method returns the offset of the current pointer (mouse) position relative to the client viewport. - const containerRect = document - .getElementById("container") - .getBoundingClientRect(); - //`containerRect.left`, The distance from the left of the viewport to the left side of the element. - //`containerRect.top` The distance from the top of the viewport to the top of the element. - const x = offset.x - containerRect.left; - const y = offset.y - containerRect.top; - const getXPosition = signBtnPosition[0] ? x - signBtnPosition[0].xPos : x; - const getYPosition = signBtnPosition[0] ? y - signBtnPosition[0].yPos : y; - dropObj = { - xPosition: getXPosition / (containerScale * scale), - yPosition: getYPosition / (containerScale * scale), - isStamp: - (dragTypeValue === "stamp" || dragTypeValue === "image") && true, - key: key, - scale: containerScale, - zIndex: posZIndex, - type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner, widgetValue), - Width: widgetWidth / (containerScale * scale), - Height: widgetHeight / (containerScale * scale) - }; - dropData.push(dropObj); - placeHolder = { pageNumber: pageNumber, pos: dropData }; - } if (uniqueId) { - let filterSignerPos, currentPagePosition; + const posZIndex = zIndex + 1; + setZIndex(posZIndex); + const key = randomId(); + const containerScale = getContainerScale( + pdfOriginalWH, + pageNumber, + containerWH + ); + let filterSignerPos, + currentPagePosition, + dropData = [], + dropObj, + placeHolder; filterSignerPos = signerPos?.find((data) => data.Id === uniqueId); + const dragTypeValue = item?.text ? item.text : monitor.type; + const widgetWidth = + defaultWidthHeight(dragTypeValue).width * containerScale; + const widgetHeight = + defaultWidthHeight(dragTypeValue).height * containerScale; + const extUser = localStorage.getItem("Extand_Class"); + const parseUser = extUser && JSON.parse(extUser)[0]; + const widgetValue = widgetDataValue(dragTypeValue, parseUser); + //adding and updating drop position in array when user drop signature button in div + if (item === "onclick") { + // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div + const divWidth = divRef.current.getBoundingClientRect().width; + const divHeight = divRef.current.getBoundingClientRect().height; + // Compute the pixel‐space center within the PDF viewport: + const centerX_Pixels = divWidth / 2 - widgetWidth / 2; + const xPosition_Final = centerX_Pixels / (containerScale * scale); + dropObj = { + //onclick put placeholder center on pdf + xPosition: xPosition_Final, + yPosition: widgetHeight + divHeight / 2, + isStamp: + (dragTypeValue === "stamp" || dragTypeValue === "image") && true, + key: key, + scale: containerScale, + zIndex: posZIndex, + type: dragTypeValue, + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder, + widgetValue + ), + Width: widgetWidth / (containerScale * scale), + Height: widgetHeight / (containerScale * scale) + }; + dropData.push(dropObj); + placeHolder = { pageNumber: pageNumber, pos: dropData }; + } else { + const offset = monitor.getClientOffset(); + //This method returns the offset of the current pointer (mouse) position relative to the client viewport. + const containerRect = document + .getElementById("container") + .getBoundingClientRect(); + //`containerRect.left`, The distance from the left of the viewport to the left side of the element. + //`containerRect.top` The distance from the top of the viewport to the top of the element. + const x = offset.x - containerRect.left; + const y = offset.y - containerRect.top; + const getXPosition = signBtnPosition[0] + ? x - signBtnPosition[0].xPos + : x; + const getYPosition = signBtnPosition[0] + ? y - signBtnPosition[0].yPos + : y; + dropObj = { + xPosition: getXPosition / (containerScale * scale), + yPosition: getYPosition / (containerScale * scale), + isStamp: + (dragTypeValue === "stamp" || dragTypeValue === "image") && true, + key: key, + scale: containerScale, + zIndex: posZIndex, + type: dragTypeValue, + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder, + widgetValue + ), + Width: widgetWidth / (containerScale * scale), + Height: widgetHeight / (containerScale * scale) + }; + dropData.push(dropObj); + placeHolder = { pageNumber: pageNumber, pos: dropData }; + } const getPlaceHolder = filterSignerPos?.placeHolder; if (getPlaceHolder) { //checking exist placeholder on same page @@ -1518,7 +1597,7 @@ function PdfRequestFiles( }; //function for delete signature block - const handleDeleteSign = (key, Id) => { + const handleDeleteWidget = (key, Id) => { const updateData = []; const filterSignerPos = signerPos?.filter((data) => data.Id === Id); if (filterSignerPos.length > 0) { @@ -1580,9 +1659,9 @@ function PdfRequestFiles( } } }; - //function to get first widget id and page number to assign correct signer and show tour message + //function to get first widget and page number to assign currect signer and tour message const showFirstWidget = () => { - if (!requestSignTour) { + if (!isReqSignTourDisabled) { const getCurrentUserPlaceholder = signerPos?.find( (x) => x.Id === uniqueId ); @@ -1604,13 +1683,39 @@ function PdfRequestFiles( setShowSignPagenumber(sortedPagenumber); } }; + + const RedirectNotice = () => { + return !isredirectCanceled && redirectUrl ? ( + <div + className="flex flex-row gap-1 items-center justify-center mb-3" + aria-live="polite" + > + <p>{t("redirecting-you-in", { redirectTimeLeft })}</p> + <button + onClick={handleRedirectCancel} + className="underline cursor-pointer op-text-primary focus:outline-none ml-2" + > + {t("cancel")} + </button> + </div> + ) : ( + <></> + ); + }; + const handleTourHelp = () => { + setIsReqSignTourDisabled(false); + }; + + const getSignerEmail = () => { + const isSignerAssigned = unsignedSigners[0]?.objectId; + let email = formData[0]?.email; + if (isSignerAssigned) { + email = unsignedSigners[0]?.Email; + } + return email; + }; return ( - <DndProvider backend={HTML5Backend}> - <Title - title={ - "Request Sign" - } - /> + <> {isLoading.isLoad ? ( <LoaderWithMsg isLoading={isLoading} /> ) : handleError ? ( @@ -1628,14 +1733,6 @@ function PdfRequestFiles( showFirstWidget={showFirstWidget} /> )} - {isUiLoading && ( - <div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"> - <Loader /> - <span className="text-[13px] text-base-content"> - {t("loading-mssg")} - </span> - </div> - )} {isCelebration && ( <div className="relative z-[1000]"> <Confetti @@ -1660,7 +1757,13 @@ function PdfRequestFiles( : "op-card" } relative overflow-hidden flex flex-col md:flex-row justify-between bg-base-300`} > - {!requestSignTour && + {isUiLoading && ( + <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2]/80"> + <Loader /> + <span className="text-[13px]">{t("loading-mssg")}</span> + </div> + )} + {!isReqSignTourDisabled && isAgree && signerObjectId && !alreadySign && @@ -1672,8 +1775,6 @@ function PdfRequestFiles( onRequestClose={closeTour} steps={tourConfig} isOpen={widgetsTour} - rounded={5} - closeWithMask={false} /> {/* this modal is used to show decline alert */} @@ -1759,14 +1860,15 @@ function PdfRequestFiles( signedUrl={pdfDetails?.[0]?.SignedUrl || ""} /> {/* pdf render view */} - <div className=" w-full md:w-[57%] flex mr-4"> - <PdfZoom + <div className="w-full md:w-[57%] flex mr-4"> + <PdfTools clickOnZoomIn={clickOnZoomIn} clickOnZoomOut={clickOnZoomOut} isDisableEditTools={true} allPages={allPages} setAllPages={setAllPages} setPageNumber={setPageNumber} + setIsTour={() => setIsReqSignTourDisabled(true)} /> <PlaceholderCopy isPageCopy={isPageCopy} @@ -1779,8 +1881,6 @@ function PdfRequestFiles( Id={uniqueId} widgetType={currWidgetsDetails?.type} setUniqueId={setUniqueId} - tempSignerId={tempSignerId} - setTempSignerId={setTempSignerId} /> <div className=" w-full md:w-[95%] "> {/* this modal is used show this document is already sign */} @@ -1798,20 +1898,8 @@ function PdfRequestFiles( <div className="h-full p-[20px] text-base-content"> {isCompleted?.message ? ( <> - <p>{isCompleted?.message}</p> - {!isredirectCanceled && redirectUrl && ( - <div className="flex flex-row gap-1 items-center justify-center mb-3 mt-2"> - <p> - Redirecting you in {redirectTimeLeft} sec... - </p> - <button - onClick={handleRedirectCancel} - className="underline cursor-pointer op-text-primary focus:outline-none ml-2" - > - Cancel - </button> - </div> - )} + <p className="mb-2">{isCompleted?.message}</p> + <RedirectNotice /> </> ) : ( <div className="px-[15px]"> @@ -1820,19 +1908,7 @@ function PdfRequestFiles( )} {!isCompleted?.message && ( <div className="flex flex-col mt-3 gap-1 px-[10px] justify-center items-center"> - {!isredirectCanceled && redirectUrl && ( - <div className="flex flex-row gap-1 items-center justify-center mb-3"> - <p> - Redirecting you in {redirectTimeLeft} sec... - </p> - <button - onClick={handleRedirectCancel} - className="underline cursor-pointer op-text-primary focus:outline-none ml-2" - > - Cancel - </button> - </div> - )} + <RedirectNotice /> <div className={`${!redirectUrl ? "m-2" : ""}`}> <button onClick={(e) => @@ -1945,11 +2021,11 @@ function PdfRequestFiles( pdfBase64={pdfBase64Url} isGuestSignFlow={isGuestSignFlow} /> - <div ref={divRef} data-tut="pdfArea" className="h-full md:h-[95%]" + onClick={() => setIsReqSignTourDisabled(true)} > {containerWH && ( <RenderPdf @@ -1980,17 +2056,18 @@ function PdfRequestFiles( scale={scale} uniqueId={uniqueId} pdfBase64Url={pdfBase64Url} + isAgree={isAgree} handleTabDrag={handleTabDrag} handleStop={handleStop} isDragging={isDragging} isAlllowModify={pdfDetails[0]?.AllowModifications} setUniqueId={setUniqueId} - handleDeleteSign={handleDeleteSign} + handleDeleteWidget={handleDeleteWidget} handleTextSettingModal={handleTextSettingModal} assignedWidgetId={assignedWidgetId} - setRequestSignTour={setRequestSignTour} + setIsReqSignTourDisabled={handleCloseTour} currWidgetsDetails={currWidgetsDetails} - setTempSignerId={setTempSignerId} + isShowModal={isShowModal} /> )} </div> @@ -2015,7 +2092,6 @@ function PdfRequestFiles( <SignerListComponent ind={ind} obj={obj} - isMenu={isHeader} signerPos={signerPos} /> </div> @@ -2027,25 +2103,24 @@ function PdfRequestFiles( {unsignedSigners.length > 0 && ( <> - <div - data-tut="reactourFirst" - className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300" - > - <span>{t("yet-to-sign")}</span> + <div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300"> + <span> + {t("yet-to-sign")} + <sup onClick={handleTourHelp}> + <i className="ml-1 cursor-pointer fa-light fa-question rounded-full border-[1px] border-base-content text-[11px] py-[1px] px-[3px]"></i> + </sup> + </span> </div> - <div className="mt-[5px]"> - {unsignedSigners.map((obj, ind) => { - return ( - <div key={ind}> - <SignerListComponent - ind={ind} - obj={obj} - isMenu={isHeader} - signerPos={signerPos} - /> - </div> - ); - })} + <div data-tut="reactourFirst" className="mt-[5px]"> + {unsignedSigners.map((obj, ind) => ( + <div key={ind}> + <SignerListComponent + ind={ind} + obj={obj} + signerPos={signerPos} + /> + </div> + ))} </div> </> )} @@ -2062,6 +2137,7 @@ function PdfRequestFiles( signatureType?.find((x) => x.name === "default") ?.enabled || false } + isAgree={isAgree} /> )} </div> @@ -2097,9 +2173,8 @@ function PdfRequestFiles( currWidgetsDetails={currWidgetsDetails} index={pageNumber} setUniqueId={setUniqueId} - tempSignerId={tempSignerId} signatureTypes={signatureType} - allowCellResize={pdfDetails[0]?.AllowModifications ?? false} + allowCellResize={false} /> )} <DownloadPdfZip @@ -2135,7 +2210,7 @@ function PdfRequestFiles( handleSaveFontSize={handleSaveFontSize} currWidgetsDetails={currWidgetsDetails} /> - </DndProvider> + </> ); } export default PdfRequestFiles; diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.jsx b/apps/OpenSign/src/pages/PlaceHolderSign.jsx index eba5650c86..b77051098c 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.jsx +++ b/apps/OpenSign/src/pages/PlaceHolderSign.jsx @@ -1,13 +1,8 @@ -import React, { useState, useRef, useEffect } from "react"; +import { useState, useRef, useEffect } from "react"; import axios from "axios"; import Parse from "parse"; import "../styles/signature.css"; import { PDFDocument } from "pdf-lib"; -import { - maxTitleLength -} from "../constant/const"; -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; import { useDrop } from "react-dnd"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import WidgetComponent from "../components/pdf/WidgetComponent"; @@ -24,7 +19,7 @@ import { addZIndex, randomId, defaultWidthHeight, - multiSignEmbed, + embedWidgetsToDoc, addWidgetOptions, textInputWidget, cellsWidget, @@ -46,17 +41,18 @@ import { getBase64FromUrl, generatePdfName, mailTemplate, - getOriginalWH + getOriginalWH, + defaultMailBody, + defaultMailSubject } from "../constant/Utils"; import RenderPdf from "../components/pdf/RenderPdf"; import { useNavigate } from "react-router"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; -import Title from "../components/Title"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import WidgetNameModal from "../components/pdf/WidgetNameModal"; import { SaveFileSize } from "../constant/saveFileSize"; -import { useSelector } from "react-redux"; -import PdfZoom from "../components/pdf/PdfZoom"; +import { useDispatch, useSelector } from "react-redux"; +import PdfTools from "../components/pdf/PdfTools"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; import Loader from "../primitives/Loader"; @@ -68,16 +64,17 @@ import LinkUserModal from "../primitives/LinkUserModal"; import { EmailBody } from "../components/pdf/EmailBody"; import LottieWithLoader from "../primitives/DotLottieReact"; import Alert from "../primitives/Alert"; -import AsyncSelect from "react-select/async"; -import AddContact from "../primitives/AddContact"; -import WidgetsValueModal from "../components/pdf/WidgetsValueModal.jsx"; +import WidgetsValueModal from "../components/pdf/WidgetsValueModal"; +import * as utils from "../utils"; +import { resetWidgetState, setPrefillImg } from "../redux/reducers/widgetSlice"; +import EditDocument from "../components/pdf/EditTemplate"; function PlaceHolderSign() { const { t } = useTranslation(); const copyUrlRef = useRef(null); + const dispatch = useDispatch(); + const prefillImg = useSelector((state) => state.widget.prefillImg); const isShowModal = useSelector((state) => state.widget.isShowModal); - const appName = - "OpenSign™"; const editorRef = useRef(); const { state } = useLocation(); const navigate = useNavigate(); @@ -113,7 +110,7 @@ function PlaceHolderSign() { const [handleError, setHandleError] = useState(); const [currentId, setCurrentId] = useState(""); const [pdfNewWidth, setPdfNewWidth] = useState(); - const [placeholderTour, setPlaceholderTour] = useState(true); + const [placeholderTour, setPlaceholderTour] = useState(false); const [checkTourStatus, setCheckTourStatus] = useState(false); const [tourStatus, setTourStatus] = useState([]); const [signerUserId, setSignerUserId] = useState(); @@ -125,9 +122,6 @@ function PlaceHolderSign() { const [selectedEmail, setSelectedEmail] = useState(false); const [isResize, setIsResize] = useState(false); const [zIndex, setZIndex] = useState(1); - // tempSignerId is used to temporarily store the currently selected signer's unique ID, When editing a text widget, it automatically attaches a prefill user, and since prefill users are not shown in the signer list, the selected signer from before editing would be lost. To handle this, we store the currently selected signer's unique ID in tempSignerId before entering the text widget edit mode. Once the text widget settings are completed, - // we restore the original selected signer by setting tempSignerId back to uniqueId.This ensures that the correct signer remains selected and visible in the UI even after interacting with a prefill-only widget like the text widget. - const [tempSignerId, setTempSignerId] = useState(""); const [blockColor, setBlockColor] = useState(""); const [isTextSetting, setIsTextSetting] = useState(false); const [pdfLoad, setPdfLoad] = useState(false); @@ -136,7 +130,7 @@ function PlaceHolderSign() { const [roleName, setRoleName] = useState(""); const [isAddUser, setIsAddUser] = useState({}); const [signerExistModal, setSignerExistModal] = useState(false); - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [isDragging, setIsDragging] = useState(false); const [showDropdown, setShowDropdown] = useState(false); const [isUiLoading, setIsUiLoading] = useState(false); @@ -147,7 +141,7 @@ function PlaceHolderSign() { const [mailStatus, setMailStatus] = useState(""); const [isCurrUser, setIsCurrUser] = useState(false); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); const [showRotateAlert, setShowRotateAlert] = useState({ status: false, degree: 0 @@ -165,20 +159,23 @@ function PlaceHolderSign() { const [isUploadPdf, setIsUploadPdf] = useState(false); //'signersName' variable used to show all signer's name that do not have a signature widget assigned const [signersName, setSignersName] = useState(""); - const [forms, setForms] = useState([]); - const [userList, setUserList] = useState([]); - const [isAttchSignerModal, setIsAttchSignerModal] = useState(false); - const [isNewContact, setIsNewContact] = useState({ status: false, id: "" }); + const [prefillSigner, setPrefillSigner] = useState([]); const [owner, setOwner] = useState({}); const [docTitle, setDocTitle] = useState(""); + const [isEditDoc, setIsEditDoc] = useState(false); const isMobile = window.innerWidth < 767; const [, drop] = useDrop({ accept: "BOX", drop: (item, monitor) => addPositionOfSignature(item, monitor), collect: (monitor) => ({ isOver: !!monitor.isOver() }) }); + const currentUser = localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ); + const user = currentUser && JSON.parse(currentUser); const documentId = docId; useEffect(() => { + dispatch(resetWidgetState([])); if (documentId) { getDocumentDetails(); } @@ -194,8 +191,8 @@ function PlaceHolderSign() { ); if (user) { try { - const defaultRequestBody = `<p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign {{document_title}}.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p><a href='{{signing_url}}' rel='noopener noreferrer' target='_blank'>Sign here</a></p><br><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br>`; - const defaultSubject = `{{sender_name}} has requested you to sign {{document_title}}`; + const defaultRequestBody = defaultMailBody; + const defaultSubject = defaultMailSubject; setDefaultBody(defaultRequestBody); setDefaultSubject(defaultSubject); setRequestBody(defaultRequestBody); @@ -243,46 +240,27 @@ function PlaceHolderSign() { const timer = setTimeout(updateSize, 100); // match the transition duration return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [divRef.current, isHeader]); + }, [divRef.current, isSidebar]); //function for get document details const getDocumentDetails = async () => { const tenantSignTypes = await fetchTenantDetails(); //getting document details - const documentData = await contractDocument(documentId); + const documentData = await contractDocument( + documentId, + "Bcc" + ); + if (documentData && documentData.length > 0) { - setDocTitle(documentData?.[0]?.Name); - if (documentData[0]?.Placeholders?.length > 0) { - const signerNotExist = documentData[0]?.Placeholders.some( - (data) => !data.signerObjId && data.Role !== "prefill" - ); - //condition to check any role does not attach signer - if (signerNotExist) { - const filterPrefill = documentData[0]?.Placeholders?.filter( - (x) => x.Role !== "prefill" - ); - let users = []; - filterPrefill?.forEach((element) => { - let label = ""; - const signerData = documentData[0]?.Signers.find( - (x) => element.signerObjId && element.signerObjId === x.objectId - ); - if (signerData) { - label = `${signerData.Name}<${signerData.Email}>`; - } - users = [ - ...users, - { - value: element.Id, - label: label || "", - role: element.Role - } - ]; - }); - setIsAttchSignerModal(true); - setForms(users); - } + const prefillImg = await utils?.savePrefillImg( + documentData[0]?.Placeholders + ); + if (prefillImg && Array.isArray(prefillImg)) { + prefillImg.forEach((img) => { + dispatch(setPrefillImg(img)); + }); } + setDocTitle(documentData?.[0]?.Name); const url = documentData[0] && documentData[0]?.URL; //convert document url in array buffer format to use embed widgets in pdf using pdf-lib const arrayBuffer = await convertPdfArrayBuffer(url); @@ -353,10 +331,18 @@ function PlaceHolderSign() { subject: documentData?.[0]?.RequestSubject }); } + if ( + documentData[0]?.Placeholders?.length === 0 && + documentData[0]?.Signers?.length === 0 + ) { + setSignersData([]); + setSignerPos([]); + setPrefillSigner([utils?.prefillObj()]); + } //condition when placeholder have empty array with role details and signers array have signers data //and both array length are same - //this case happen using placeholder form in auto save funtionality to save draft type document without adding any placehlder - if ( + //this case happen using placeholder form in auto save funtionality to save draft type document without adding any placeholder + else if ( documentData[0]?.Placeholders?.length === documentData[0]?.Signers?.length ) { @@ -368,6 +354,7 @@ function PlaceHolderSign() { Role: placeholder[index]?.Role, blockColor: placeholder[index]?.blockColor })); + setPrefillSigner([utils?.prefillObj()]); setSignerPos(placeholder); setSignersData(updatedSigners); setIsSelectId(0); @@ -390,6 +377,9 @@ function PlaceHolderSign() { const placeholder = documentData[0]?.Placeholders.filter( (data) => data.Role !== "prefill" ); + const prefillPlaceholder = documentData[0]?.Placeholders.find( + (data) => data.Role === "prefill" + ); let updatedSigners = placeholder.map((x) => { let matchingSigner = signers.find( (y) => x.signerObjId && x.signerObjId === y.objectId @@ -405,6 +395,11 @@ function PlaceHolderSign() { return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; } }); + if (prefillPlaceholder) { + setPrefillSigner([utils?.prefillObj(prefillPlaceholder.Id)]); + } else { + setPrefillSigner([utils?.prefillObj()]); + } setSignersData(updatedSigners); setUniqueId(updatedSigners[0].Id); setBlockColor(updatedSigners[0].blockColor); @@ -418,7 +413,7 @@ function PlaceHolderSign() { // Role: "User " + (index + 1), blockColor: color[index % color.length] })); - setSignersData(updatedSigners); + setPrefillSigner([utils?.prefillObj()]); const updatedPlaceholder = documentData[0].Signers.map((x, index) => { return { // Role: updatedSigners[index].Role, @@ -450,14 +445,24 @@ function PlaceHolderSign() { const placeholder = documentData[0]?.Placeholders.filter( (data) => data.Role !== "prefill" ); - let updatedSigners = placeholder.map((x) => { - return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; - }); setSignerPos(documentData[0].Placeholders); - setSignersData(updatedSigners); - setIsSelectId(0); - setUniqueId(updatedSigners[0].Id); - setBlockColor(updatedSigners[0].blockColor); + if (placeholder.length > 0) { + let updatedSigners = placeholder.map((x) => { + return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; + }); + setSignersData(updatedSigners); + setIsSelectId(0); + setUniqueId(updatedSigners[0].Id); + setBlockColor(updatedSigners[0].blockColor); + } + const prefillPlaceholder = documentData[0]?.Placeholders.find( + (data) => data.Role === "prefill" + ); + if (prefillPlaceholder) { + setPrefillSigner([utils?.prefillObj(prefillPlaceholder.Id)]); + } else { + setPrefillSigner([utils?.prefillObj()]); + } } } } else if ( @@ -486,12 +491,11 @@ function PlaceHolderSign() { setCheckTourStatus(true); } else if (tourstatus && tourstatus.length > 0) { setTourStatus(tourstatus); - const checkTourRecipients = tourstatus.filter( - (data) => data.placeholder - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].placeholder); - } + const tour = tourstatus?.some((data) => data.placeholder) || false; + setPlaceholderTour(!tour); + setCheckTourStatus(tour); + } else { + setPlaceholderTour(true); } setIsLoading({ isLoad: false }); } else if (res.length === 0) { @@ -506,85 +510,91 @@ function PlaceHolderSign() { }; const getSignerPos = (item, monitor) => { if (uniqueId) { - const posZIndex = zIndex + 1; - setZIndex(posZIndex); const signer = signersdata.find((x) => x.Id === uniqueId); - const key = randomId(); - const containerScale = getContainerScale( - pdfOriginalWH, - pageNumber, - containerWH - ); - let dropData = [], - dropObj; - let placeHolder; - const dragTypeValue = item?.text ? item.text : monitor.type; - const widgetWidth = - defaultWidthHeight(dragTypeValue).width * containerScale; - const widgetHeight = - defaultWidthHeight(dragTypeValue).height * containerScale; - //adding and updating drop position in array when user drop signature button in div - if (item === "onclick") { - // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div - const divWidth = divRef.current.getBoundingClientRect().width; - const divHeight = divRef.current.getBoundingClientRect().height; - // Compute the pixel‐space center within the PDF viewport: - const centerX_Pixels = divWidth / 2 - widgetWidth / 2; - const xPosition_Final = centerX_Pixels / (containerScale * scale); - dropObj = { - //onclick put placeholder center on pdf - xPosition: xPosition_Final, - yPosition: widgetHeight + divHeight / 2, - isStamp: - (dragTypeValue === "stamp" || dragTypeValue === "image") && true, - key: key, - scale: containerScale, - zIndex: posZIndex, - type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner), - Width: widgetWidth / (containerScale * scale), - Height: widgetHeight / (containerScale * scale) - }; - dropData.push(dropObj); - placeHolder = { pageNumber: pageNumber, pos: dropData }; - } else { - const offset = monitor.getClientOffset(); - //This method returns the offset of the current pointer (mouse) position relative to the client viewport. - const containerRect = document - .getElementById("container") - .getBoundingClientRect(); - //`containerRect.left`, The distance from the left of the viewport to the left side of the element. - //`containerRect.top` The distance from the top of the viewport to the top of the element. - const x = offset.x - containerRect.left; - const y = offset.y - containerRect.top; - const getXPosition = signBtnPosition[0] - ? x - signBtnPosition[0].xPos - : x; - const getYPosition = signBtnPosition[0] - ? y - signBtnPosition[0].yPos - : y; - dropObj = { - xPosition: getXPosition / (containerScale * scale), - yPosition: getYPosition / (containerScale * scale), - isStamp: - (dragTypeValue === "stamp" || dragTypeValue === "image") && true, - key: key, - scale: containerScale, - zIndex: posZIndex, - type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner), - Width: widgetWidth / (containerScale * scale), - Height: widgetHeight / (containerScale * scale) - }; - dropData.push(dropObj); - placeHolder = { pageNumber: pageNumber, pos: dropData }; - } - if (signer) { - let filterSignerPos, currentPagePosition; - if (dragTypeValue === textWidget) { - filterSignerPos = signerPos.find((data) => data.Role === "prefill"); + const prefillUser = prefillSigner.find((x) => x.Id === uniqueId); + if (signer || prefillUser) { + const posZIndex = zIndex + 1; + setZIndex(posZIndex); + const key = randomId(); + const containerScale = getContainerScale( + pdfOriginalWH, + pageNumber, + containerWH + ); + let dropData = [], + filterSignerPos, + currentPagePosition, + placeHolder, + dropObj; + filterSignerPos = signerPos.find((data) => data.Id === uniqueId); + const dragTypeValue = item?.text ? item.text : monitor.type; + const widgetWidth = + defaultWidthHeight(dragTypeValue).width * containerScale; + const widgetHeight = + defaultWidthHeight(dragTypeValue).height * containerScale; + //adding and updating drop position in array when user drop signature button in div + if (item === "onclick") { + // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div + const divWidth = divRef.current.getBoundingClientRect().width; + const divHeight = divRef.current.getBoundingClientRect().height; + // Compute the pixel‐space center within the PDF viewport: + const centerX_Pixels = divWidth / 2 - widgetWidth / 2; + const xPosition_Final = centerX_Pixels / (containerScale * scale); + dropObj = { + //onclick put placeholder center on pdf + xPosition: xPosition_Final, + yPosition: widgetHeight + divHeight / 2, + isStamp: + (dragTypeValue === "stamp" || dragTypeValue === "image") && true, + key: key, + scale: containerScale, + zIndex: posZIndex, + type: dragTypeValue, + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder + ), + Width: widgetWidth / (containerScale * scale), + Height: widgetHeight / (containerScale * scale) + }; + dropData.push(dropObj); + placeHolder = { pageNumber: pageNumber, pos: dropData }; } else { - filterSignerPos = signerPos.find((data) => data.Id === uniqueId); + const offset = monitor.getClientOffset(); + //This method returns the offset of the current pointer (mouse) position relative to the client viewport. + const containerRect = document + .getElementById("container") + .getBoundingClientRect(); + //`containerRect.left`, The distance from the left of the viewport to the left side of the element. + //`containerRect.top` The distance from the top of the viewport to the top of the element. + const x = offset.x - containerRect.left; + const y = offset.y - containerRect.top; + const getXPosition = signBtnPosition[0] + ? x - signBtnPosition[0].xPos + : x; + const getYPosition = signBtnPosition[0] + ? y - signBtnPosition[0].yPos + : y; + dropObj = { + xPosition: getXPosition / (containerScale * scale), + yPosition: getYPosition / (containerScale * scale), + isStamp: + (dragTypeValue === "stamp" || dragTypeValue === "image") && true, + key: key, + scale: containerScale, + zIndex: posZIndex, + type: dragTypeValue, + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder + ), + Width: widgetWidth / (containerScale * scale), + Height: widgetHeight / (containerScale * scale) + }; + dropData.push(dropObj); + placeHolder = { pageNumber: pageNumber, pos: dropData }; } const getPlaceHolder = filterSignerPos?.placeHolder; if (getPlaceHolder) { @@ -603,21 +613,16 @@ function PlaceHolderSign() { let xyPos = { pageNumber: pageNumber, pos: newSignPos }; updatePlace.push(xyPos); let updatesignerPos; - if (dragTypeValue === textWidget) { - updatesignerPos = signerPos.map((x) => - x.Role === "prefill" ? { ...x, placeHolder: updatePlace } : x - ); - } else { - updatesignerPos = signerPos.map((x) => - x.Id === uniqueId ? { ...x, placeHolder: updatePlace } : x - ); - } + + updatesignerPos = signerPos.map((x) => + x.Id === uniqueId ? { ...x, placeHolder: updatePlace } : x + ); + setSignerPos(updatesignerPos); } else { - //if condition when widget type is prefill label text widget - if (dragTypeValue === textWidget) { - //check text widgets data (prefill) already exist then and want to add text widget on new page - //create new page entry with old data and update placeholder + //condition for prefill role to attach prefill widget on multiple page first time there are no any prefill widget exist + if (roleName === "prefill") { + //if condition for prefill role only prefill object exist and placeholder empty then add prefill widget in placeholder if (filterSignerPos) { const addPrefillData = filterSignerPos && filterSignerPos?.placeHolder; @@ -626,20 +631,22 @@ function PlaceHolderSign() { x.Role === "prefill" ? { ...x, placeHolder: addPrefillData } : x ); setSignerPos(updatePrefillPos); - } //else condition if user do not have any text widget data + } //else condition if there are no prefill role exist in array then add prefill widget in placeholder else { const prefillTextWidget = { signerPtr: {}, signerObjId: "", - blockColor: "#f58f8c", + blockColor: utils?.prefillBlockColor, placeHolder: [placeHolder], Role: "prefill", - Id: key + Id: uniqueId }; - setSignerPos((prev) => [...prev, prefillTextWidget]); + const xyPosition = signerPos || []; + xyPosition.unshift(prefillTextWidget); + setSignerPos(xyPosition); } } else { - //else condition to add placeholder widgets on multiple page first time + //else condition to add placeholder widgets on multiple page first time for signers const updatesignerPos = signerPos.map((x) => x.Id === uniqueId && x?.placeHolder ? { ...x, placeHolder: [...x.placeHolder, placeHolder] } @@ -704,15 +711,9 @@ function PlaceHolderSign() { containerWH ); if (keyValue >= 0) { - let filterSignerPos; - if (signId) { - filterSignerPos = updateSignPos.filter((data) => data.Id === signId); - } else { - filterSignerPos = updateSignPos.filter( - (data) => data.Role === "prefill" - ); - } - + const filterSignerPos = updateSignPos.filter( + (data) => data.Id === signId + ); if (filterSignerPos.length > 0) { const getPlaceHolder = filterSignerPos[0].placeHolder; const getPageNumer = getPlaceHolder.filter( @@ -743,10 +744,6 @@ function PlaceHolderSign() { if (obj.Id === signId) { return { ...obj, placeHolder: newUpdateSignPos }; } - } else { - if (obj.Role === "prefill") { - return { ...obj, placeHolder: newUpdateSignPos }; - } } return obj; }); @@ -758,7 +755,7 @@ function PlaceHolderSign() { setTimeout(() => setIsDragging(false), 200); }; //function for delete signature block - const handleDeleteSign = (key, Id) => { + const handleDeleteWidget = (key, Id) => { const updateData = []; const filterSignerPos = signerPos.filter((data) => data.Id === Id); if (filterSignerPos.length > 0) { @@ -851,7 +848,7 @@ function PlaceHolderSign() { setSignBtnPosition([xySignature]); }; //embed prefill label widget data - const embedPrefilllData = async () => { + const embedPrefilllWidgets = async () => { const prefillExist = signerPos.filter((data) => data.Role === "prefill"); if (prefillExist && prefillExist.length > 0) { const placeholder = prefillExist[0].placeHolder; @@ -861,12 +858,14 @@ function PlaceHolderSign() { }); const isSignYourSelfFlow = false; try { + const docId = pdfDetails[0]?.objectId; //pdfOriginalWH contained all pdf's pages width,height & pagenumber in array format - const pdfBase64 = await multiSignEmbed( + const pdfBase64 = await embedWidgetsToDoc( placeholder, pdfDoc, isSignYourSelfFlow, - scale + scale, + prefillImg ); const pdfName = generatePdfName(16); const pdfUrl = await convertBase64ToFile( @@ -876,7 +875,7 @@ function PlaceHolderSign() { ); const tenantId = localStorage.getItem("TenantId"); const buffer = atob(pdfBase64); - SaveFileSize(buffer.length, pdfUrl, tenantId); + SaveFileSize(buffer.length, pdfUrl, tenantId, owner?.UserId?.objectId); return pdfUrl; } catch (err) { console.log("error to convertBase64ToFile in placeholder flow", err); @@ -899,71 +898,68 @@ function PlaceHolderSign() { return pdfDetails[0].URL; } }; - const alertSendEmail = async () => { - const filterPrefill = signerPos?.filter((data) => data.Role !== "prefill"); - const getPrefill = signerPos?.find((data) => data.Role === "prefill"); - //unassigned signature widgets signer's list - let unassignedWidget = []; - let isLabel = false; - let unfilledTextWidgetId = ""; - //checking all signers placeholder exist or not - const isPlaceholderExist = filterPrefill.every((data) => data.placeHolder); - const prefillPlaceholder = getPrefill?.placeHolder; - //condition is used to check text widget data is empty or have response - if (getPrefill) { - if (prefillPlaceholder) { - prefillPlaceholder.map((data) => { - if (!isLabel) { - const unfilledTextWidgets = data.pos.find( - (position) => !position.options.response - ); - if (unfilledTextWidgets) { - isLabel = true; - unfilledTextWidgetId = unfilledTextWidgets.key; - } - } - }); - } - } - //for loop is used to check signature widget exist or not - //if signature widget does not exist then show tour messages on signature widgets - //and show list of signers who need to add signature widget - for (let item of filterPrefill) { - let signatureExist = false; // Reset for each iteration - //condition if placeholder filed exist then check which signer do not have signature widget - if (item.placeHolder) { - for (let x of item.placeHolder) { - if (!signatureExist) { - signatureExist = x.pos.some((data) => data?.type === "signature"); + const handleSaveDoc = async () => { + let isPrefillEmpty = false, + unfilledTextWidgetId; + const prefillExist = signerPos?.find((data) => data.Role === "prefill"); + //condition to check prefill widget exit or not + if (prefillExist) { + const getPlaceholder = prefillExist?.placeHolder; + //if prefill widget exist then make sure there are no any empty prefill widget + //if empty widget exist and user try to send document then throw tour message + for (const placeholder of getPlaceholder || []) { + const requiredWidgets = placeholder.pos.filter( + (position) => position.type !== "checkbox" + ); + for (const widget of requiredWidgets) { + const hasResponse = widget?.options?.response; + const hasDefault = widget?.options?.defaultValue; + if (!hasResponse && !hasDefault && !isPrefillEmpty) { + isPrefillEmpty = true; + unfilledTextWidgetId = widget.key; + setPageNumber(placeholder.pageNumber); + setUniqueId(placeholder.Id); + break; } } - if (!signatureExist) { - unassignedWidget.push(item); - } - } else { - //condition if placeholder filed does not exist then it means there are no any signature widget for any signer - unassignedWidget.push(item); + if (isPrefillEmpty) break; } } + // keep only non-prefill signers + const filterPrefill = (signerPos ?? []).filter((s) => s.Role !== "prefill"); + + //checking all signers placeholder exist or not + const isPlaceholderExist = + filterPrefill?.length > 0 && + filterPrefill.some((data) => data.placeHolder); + // signers who don't have a signature widget (or have no placeholders at all) + const unassignedWidget = filterPrefill?.filter( + (s) => !utils?.hasSignatureWidget(s) + ); + //checking if there are any signer list which do not have signture widget then show signers name on tour messages if (unassignedWidget.length > 0) { const getSigner = unassignedWidget.map((x) => { return signersdata.find((y) => y.Id === x.Id).Name; }); - const signersName = getSigner.join(", "); - setSignersName(signersName); + const signerName = getSigner.join(", "); + setSignersName(signerName); setIsSendAlert({ mssg: "sure", alert: true }); + setUniqueId(unassignedWidget[0]?.Id); + setRoleName(""); } - if (getPrefill && isLabel) { - setIsSendAlert({ mssg: textWidget, alert: true }); + if (prefillExist && isPrefillEmpty) { + setIsSendAlert({ mssg: "prefill", alert: true }); setUnSignedWidgetId(unfilledTextWidgetId); + } else if (signersdata?.length === 0) { + alert(t("atleast-one-recipient-alert")); } else if (isPlaceholderExist && unassignedWidget.length === 0) { const IsSignerNotExist = filterPrefill?.filter((x) => !x.signerObjId); if (IsSignerNotExist && IsSignerNotExist?.length > 0) { setSignerExistModal(true); - setCurrWidgetsDetails(IsSignerNotExist[0]?.placeHolder?.[0]?.pos); + setCurrWidgetsDetails(IsSignerNotExist[0]?.placeHolder?.[0]?.pos[0]); } else { saveDocumentDetails(); } @@ -972,14 +968,16 @@ function PlaceHolderSign() { useEffect(() => { const timer = setTimeout(() => { - if (!pdfDetails?.[0]?.IsCompleted) { + if ( + !pdfDetails?.[0]?.IsCompleted && + pdfDetails?.[0]?.CreatedBy?.objectId === user?.objectId + ) { autosavedetails(); } }, 2000); return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps }, [signerPos, signersdata, signatureType, pdfBase64Url]); - // `autosavedetails` is used to save doc details after every 2 sec when changes are happern in placeholder like drag-drop widgets, remove signers const autosavedetails = async () => { const signers = signersdata?.reduce((acc, x) => { @@ -1029,9 +1027,12 @@ function PlaceHolderSign() { if (pdfDetails?.[0]?.SendinOrder && pdfDetails?.[0]?.SendinOrder === true) { signerMail.splice(1); } - const pdfUrl = await embedPrefilllData(); + const pdfUrl = await embedPrefilllWidgets(); if (pdfUrl) { - const signers = signersdata?.map((x) => { + const removePrefillSigner = signersdata.filter( + (x) => x.Role !== "prefill" + ); + const signers = removePrefillSigner?.map((x) => { return { __type: "Pointer", className: "contracts_Contactbook", @@ -1056,14 +1057,12 @@ function PlaceHolderSign() { // Compute expiry date with extra days let updateExpiryDate = new Date(); updateExpiryDate.setDate(updateExpiryDate.getDate() + addExtraDays); - - // Filter out prefill roles - const filterPrefill = signerPos.filter((data) => data.Role !== "prefill"); try { const data = { Name: docTitle || pdfDetails?.[0]?.Name, - Placeholders: filterPrefill, + Placeholders: signerPos, SignedUrl: pdfUrl, + URL: pdfUrl, Signers: signers, SentToOthers: true, SignatureType: pdfDetails?.[0]?.SignatureType, @@ -1083,7 +1082,6 @@ function PlaceHolderSign() { setIsMailSend(true); setIsLoading({ isLoad: false }); setIsUiLoading(false); - setSignerPos([]); setIsSendAlert({ mssg: "confirm", alert: true }); if (docTitle) { const updatedPdfDetails = [...pdfDetails]; @@ -1129,7 +1127,7 @@ function PlaceHolderSign() { key={ind} > {copied && <Alert type="success">{t("copied")}</Alert>} - <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> + <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis"> {data.signerEmail} </span> <div className="flex flex-row items-center gap-3 "> @@ -1146,7 +1144,7 @@ function PlaceHolderSign() { text={t("sign-url")} url={data.url} > - <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> + <i className="fa-light fa-share-from-square op-link data-[theme=opensigndark]:op-link-primary data-[theme=opensigncss]:op-link-secondary no-underline"></i> </ShareButton> </div> </div> @@ -1170,7 +1168,6 @@ function PlaceHolderSign() { pdfDetails?.[0]?.ExtUserPtr?.Email; let senderPhone = pdfDetails?.[0]?.ExtUserPtr?.Phone; let signerMail = signersdata.slice(); - if (pdfDetails?.[0]?.SendinOrder && pdfDetails?.[0]?.SendinOrder === true) { signerMail.splice(1); } @@ -1350,11 +1347,24 @@ function PlaceHolderSign() { //here you can add your messages in content and selector is key of particular steps const tourConfig = [ + { + selector: '[data-tut="prefillTour"]', + content: () => ( + <TourContentWithBtn + message={t("prefill-tour")} + isDontShowCheckbox={!checkTourStatus} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, { selector: '[data-tut="recipientArea"]', content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-1")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1366,6 +1376,7 @@ function PlaceHolderSign() { content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-3")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1377,6 +1388,7 @@ function PlaceHolderSign() { content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-4")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1388,6 +1400,19 @@ function PlaceHolderSign() { content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-5")} + isDontShowCheckbox={!checkTourStatus} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, + { + selector: '[data-tut="pdftools"]', + content: () => ( + <TourContentWithBtn + message={t("pdf-tools-tour")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1399,6 +1424,7 @@ function PlaceHolderSign() { content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-6")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1668,7 +1694,6 @@ function PlaceHolderSign() { setFontColor(); handleNameModal(); }; - const handleNameModal = () => { setIsNameModal(false); setCurrWidgetsDetails({}); @@ -1676,18 +1701,12 @@ function PlaceHolderSign() { setIsRadio(false); setIsCheckbox(false); setIsPageCopy(false); - //condition for text widget type after set all values for text widget - //change setUniqueId which is set in tempsignerId - //because textwidget do not have signer user so for selected signers we have to do - if (currWidgetsDetails.type === textWidget) { - setUniqueId(tempSignerId); - setTempSignerId(""); - } }; //function for update TourStatus const closeTour = async () => { setPlaceholderTour(false); - if (isDontShow) { + setIsDontShow(true); + if (!checkTourStatus && isDontShow) { let updatedTourStatus = []; if (tourStatus.length > 0) { updatedTourStatus = [...tourStatus]; @@ -1716,6 +1735,7 @@ function PlaceHolderSign() { } } ); + setCheckTourStatus(true); } catch (err) { console.log("axois err ", err); } @@ -1733,7 +1753,7 @@ function PlaceHolderSign() { }; //`handleAddUser` function to use add new user const handleAddUser = (data, signerObjId) => { - const id = signerObjId ? signerObjId : isNewContact?.id || uniqueId; + const id = signerObjId ? signerObjId : uniqueId; if (isAddSigner) { handleAddNewRecipients(data); } else { @@ -1745,7 +1765,18 @@ function PlaceHolderSign() { }; const updatePlaceHolder = signerPos.map((x) => { if (x.Id === id || x.signerObjId === id) { - return { ...x, signerPtr: signerPtr, signerObjId: data.objectId }; + const updated = { + ...x, + signerPtr, + signerObjId: data.objectId + }; + + // Only update email if it already exists in `x` + if ("email" in x) { + updated.email = data?.Email || ""; // keep old if no new email + } + + return updated; } return { ...x }; }); @@ -1771,14 +1802,6 @@ function PlaceHolderSign() { ); setIsSelectId(index); } - if (isNewContact.status) { - let newForm = [...forms]; - const label = `${data.Name}<${data.Email}>`; - const index = newForm.findIndex((x) => x.value === id); - newForm[index].label = label; - newForm[index].value = data?.objectId; - setForms(newForm); - } } }; //function to add new signer in document signers list @@ -1810,7 +1833,6 @@ function PlaceHolderSign() { const closePopup = () => { setIsAddUser({}); setIsAddSigner(false); - setIsNewContact({ status: false, id: "" }); }; //function for handle ontext change and save again text in delta in Request Email flow @@ -1820,7 +1842,6 @@ function PlaceHolderSign() { setRequestBody(html); } }; - const signerAssignTour = [ { selector: '[data-tut="assignSigner"]', @@ -1829,7 +1850,7 @@ function PlaceHolderSign() { style: { fontSize: "13px" } } ]; - const textFieldTour = [ + const prefillWidgetTour = [ { selector: '[data-tut="IsSigned"]', content: t("text-field-tour"), @@ -1852,7 +1873,9 @@ function PlaceHolderSign() { .filter((x) => x.Id !== Id) .map((x, i) => ({ ...x, blockColor: color[i] })); setSignersData(updateSigner); - const updatePlaceholderUser = signerPos + const prefillObj = signerPos.find((x) => x.Role === "prefill"); + const filterPrefill = signerPos.filter((x) => x.Role !== "prefill"); + const updatePlaceholderUser = filterPrefill .filter((x) => x.Id !== Id) .map((x, i) => ({ ...x, blockColor: color[i] })); const index = signersdata.findIndex((x) => x.Id === Id); @@ -1865,6 +1888,9 @@ function PlaceHolderSign() { setIsSelectId(index); setBlockColor(color[index]); } + if (prefillObj) { + updatePlaceholderUser.unshift(prefillObj); + } setSignerPos(updatePlaceholderUser); setIsMailSend(false); }; @@ -1915,765 +1941,615 @@ function PlaceHolderSign() { setPdfArrayBuffer(urlDetails.arrayBuffer); setPdfBase64Url(urlDetails.base64); }; - const handleSendDoc = () => { - if (docTitle?.length > maxTitleLength) { - alert(t("title-length-alert")); - return; - } - setIsAttchSignerModal(false); - setCheckTourStatus(true); - alertSendEmail(); - }; - //show modal to create new contact - const handleCreateNew = (e, id) => { - e.preventDefault(); - setIsNewContact({ status: true, id: id }); - }; - //`handleInputChange` function to get signers list from dropdown - const handleInputChange = (item, id) => { - const signerExist = signersdata?.some( - (x) => x.objectId && x.objectId === item.value - ); - if (signerExist) { - alert(t("already-exist-signer")); - } else { - let newForm = [...forms]; - let signerId = newForm[id].value; - newForm[id].label = item?.label; - newForm[id].value = item?.value; - setForms(newForm); - const getSigner = userList.find((x) => x.objectId === item.value); - handleAddUser(getSigner, signerId); - } + const handleEditDocumentModal = () => { + setIsEditDoc(!isEditDoc); }; - //`loadOptions` function to use show all list of signer in dropdown - const loadOptions = async (inputValue) => { + const handleEditDocumentForm = async (data) => { + setIsEditDoc(false); + const updateDocument = pdfDetails.map((x) => { + return { ...x, ...data }; + }); + setPdfDetails(updateDocument); try { - const baseURL = localStorage.getItem("baseUrl"); - const url = `${baseURL}functions/getsigners`; - const token = { - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - }; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - ...token + const Bcc = updateDocument?.[0]?.Bcc?.length + ? { + Bcc: updateDocument?.[0]?.Bcc?.map((x) => ({ + __type: "Pointer", + className: "contracts_Contactbook", + objectId: x.objectId + })) + } + : {}; + const RedirectUrl = updateDocument?.[0]?.RedirectUrl + ? { RedirectUrl: updateDocument?.[0]?.RedirectUrl } + : {}; + const data = { + ...(updateDocument?.[0]?.URL ? { URL: updateDocument?.[0]?.URL } : {}), + Name: updateDocument?.[0]?.Name || "", + Note: updateDocument?.[0]?.Note || "", + Description: updateDocument?.[0]?.Description || "", + SendinOrder: updateDocument?.[0]?.SendinOrder || false, + AutomaticReminders: updateDocument?.[0]?.AutomaticReminders, + IsEnableOTP: updateDocument?.[0]?.IsEnableOTP === true ? true : false, + IsTourEnabled: + updateDocument?.[0]?.IsTourEnabled === true ? true : false, + NotifyOnSignatures: + updateDocument?.[0]?.NotifyOnSignatures !== undefined + ? updateDocument?.[0]?.NotifyOnSignatures + : false, + TimeToCompleteDays: + parseInt(updateDocument?.[0]?.TimeToCompleteDays) || 15, + ...Bcc, + ...RedirectUrl }; - const search = inputValue; - const axiosRes = await axios.post(url, { search }, { headers }); - const contactRes = axiosRes?.data?.result || []; - if (contactRes) { - const res = JSON.parse(JSON.stringify(contactRes)); - const result = res; - setUserList(result); - return await result.map((item) => ({ - label: `${item.Name}<${item.Email}>`, - value: item.objectId - })); + const updateTemplateObj = new Parse.Object("contracts_Document"); + updateTemplateObj.id = pdfDetails?.[0]?.objectId; + for (const key in data) { + updateTemplateObj.set(key, data[key]); } - } catch (error) { - console.log("err", error); + await updateTemplateObj.save(); + } catch (err) { + console.log("error in save document", err); } }; - const handleDisable = () => { - const isAllSigner = signerPos.some( - (x) => !x.signerObjId && x.Role !== "prefill" - ); - return isAllSigner; - }; - const handleCloseAttachSigner = () => { - if (docTitle?.length > maxTitleLength) { - alert(t("title-length-alert")); - return; - } - setIsAttchSignerModal(false); - }; return ( <> - <Title title={state?.title ? state.title : "New Document"} /> - <DndProvider backend={HTML5Backend}> - {isLoading.isLoad ? ( - <LoaderWithMsg isLoading={isLoading} /> - ) : handleError ? ( - <HandleError handleError={handleError} /> - ) : ( - <div> - {isUiLoading && ( - <div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"> - <Loader /> - <span className="text-[13px] text-base-content"> - {t("loading-mssg")} - </span> - </div> - )} - <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> - {/* this component used for UI interaction and show their functionality */} - {!checkTourStatus && !isAttchSignerModal && ( - //this tour component used in your html component where you want to put - //onRequestClose function to close tour - //steps is defined what will be your messages and style also - //isOpen is takes boolean value to open - <Tour - onRequestClose={closeTour} - steps={tourConfig} - isOpen={placeholderTour} - rounded={5} - closeWithMask={false} - /> - )} - <Tour - onRequestClose={() => setSignerExistModal(false)} - steps={signerAssignTour} - isOpen={signerExistModal} - rounded={5} - closeWithMask={false} - /> - <Tour - onRequestClose={() => setIsSendAlert({})} - steps={textFieldTour} - isOpen={isSendAlert.mssg === textWidget} - rounded={5} - closeWithMask={false} - /> - <Tour - onRequestClose={() => handleCloseSendmailModal()} - steps={signatureWidgetTour} - isOpen={isSendAlert.mssg === "sure" && true} - rounded={5} - closeWithMask={false} - /> - {/* this component used to render all pdf pages in left side */} - <RenderAllPdfPage - allPages={allPages} - setAllPages={setAllPages} - setPageNumber={setPageNumber} - setSignBtnPosition={setSignBtnPosition} - pageNumber={pageNumber} - pdfBase64Url={pdfBase64Url} - signedUrl={pdfDetails?.[0]?.SignedUrl || ""} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} - setIsUploadPdf={setIsUploadPdf} - pdfArrayBuffer={pdfArrayBuffer} - isMergePdfBtn={true} - /> - {/* pdf render view */} - <div className=" w-full md:w-[57%] flex mr-4"> - <PdfZoom - clickOnZoomIn={clickOnZoomIn} - clickOnZoomOut={clickOnZoomOut} - handleRotationFun={handleRotationFun} - pdfArrayBuffer={pdfArrayBuffer} - pageNumber={pageNumber} - setPdfBase64Url={setPdfBase64Url} - setPdfArrayBuffer={setPdfArrayBuffer} - setIsUploadPdf={setIsUploadPdf} - setSignerPos={setSignerPos} - signerPos={signerPos} - userId={uniqueId} - allPages={allPages} - setAllPages={setAllPages} - setPageNumber={setPageNumber} - /> - <div className=" w-full md:w-[95%] "> - {/* this modal is used show alert set placeholder for all signers before send mail */} - <ModalUi - isOpen={ - isSendAlert.alert && - isSendAlert.mssg !== textWidget && - isSendAlert.mssg === "confirm" - } - title={isSendAlert.mssg === "confirm" && t("send-mail")} - handleClose={() => handleCloseSendmailModal()} - > - <div className="max-h-96 overflow-y-scroll scroll-hide p-[20px] text-base-content"> - {isSendAlert.mssg === "confirm" && ( - <> - {!isCustomize && ( - <span>{t("placeholder-alert-3")}</span> + {isLoading.isLoad ? ( + <LoaderWithMsg isLoading={isLoading} /> + ) : handleError ? ( + <HandleError handleError={handleError} /> + ) : ( + <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> + {isUiLoading && ( + <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2]/80"> + <Loader /> + <span className="text-[13px]">{t("loading-mssg")}</span> + </div> + )} + {/* + this component used for UI interaction and show their functionality + this tour component used in your html component where you want to put + onRequestClose function to close tour + steps is defined what will be your messages and style also + isOpen is takes boolean value to open + */} + <Tour + onRequestClose={closeTour} + steps={tourConfig} + isOpen={placeholderTour} + rounded={5} + closeWithMask={false} + /> + <Tour + onRequestClose={() => setSignerExistModal(false)} + steps={signerAssignTour} + isOpen={signerExistModal} + /> + <Tour + onRequestClose={() => setIsSendAlert({})} + steps={prefillWidgetTour} + isOpen={isSendAlert.mssg === "prefill"} + /> + <Tour + onRequestClose={() => handleCloseSendmailModal()} + steps={signatureWidgetTour} + isOpen={isSendAlert?.mssg === "sure" && true} + /> + {/* this component used to render all pdf pages in left side */} + <RenderAllPdfPage + allPages={allPages} + setAllPages={setAllPages} + setPageNumber={setPageNumber} + setSignBtnPosition={setSignBtnPosition} + pageNumber={pageNumber} + pdfBase64Url={pdfBase64Url} + signedUrl={pdfDetails?.[0]?.SignedUrl || ""} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + setIsUploadPdf={setIsUploadPdf} + pdfArrayBuffer={pdfArrayBuffer} + isMergePdfBtn={true} + /> + {/* pdf render view */} + <div className="w-full md:w-[57%] flex mr-4"> + <PdfTools + clickOnZoomIn={clickOnZoomIn} + clickOnZoomOut={clickOnZoomOut} + handleRotationFun={handleRotationFun} + pdfArrayBuffer={pdfArrayBuffer} + pageNumber={pageNumber} + setPdfBase64Url={setPdfBase64Url} + setPdfArrayBuffer={setPdfArrayBuffer} + setIsUploadPdf={setIsUploadPdf} + setSignerPos={setSignerPos} + signerPos={signerPos} + userId={uniqueId} + allPages={allPages} + setAllPages={setAllPages} + setPageNumber={setPageNumber} + setIsTour={setPlaceholderTour} + /> + <div className=" w-full md:w-[95%] "> + {/* this modal is used show alert set placeholder for all signers before send mail */} + <ModalUi + isOpen={isSendAlert.alert && isSendAlert.mssg === "confirm"} + title={isSendAlert.mssg === "confirm" && t("send-mail")} + handleClose={() => handleCloseSendmailModal()} + > + <div className="max-h-96 overflow-y-scroll scroll-hide p-[20px] text-base-content"> + {isSendAlert.mssg === "confirm" && ( + <> + {!isCustomize && <span>{t("placeholder-alert-3")}</span>} + { + isCustomize && ( + <> + <EmailBody + editorRef={editorRef} + requestBody={requestBody} + requestSubject={requestSubject} + handleOnchangeRequest={handleOnchangeRequest} + setRequestSubject={setRequestSubject} + /> + <div + className="flex justify-end items-center gap-1 mt-2 op-link op-link-primary" + onClick={() => { + setRequestBody(defaultBody); + setRequestSubject(defaultSubject); + }} + > + <span>{t("reset-to-default")}</span> + </div> + </> + ) + } + <div className="flex flex-row items-center gap-2 md:gap-6 mt-2"> + <div className="flex flex-row gap-2"> + <button + onClick={() => sendEmailToSigners()} + className="op-btn op-btn-primary font-[500] text-sm shadow" + > + {t("send")} + </button> + {isCustomize && ( + <button + onClick={() => setIsCustomize(false)} + className="op-btn op-btn-ghost font-[500] text-sm" + > + {t("close")} + </button> )} - { - isCustomize && ( - <> - <EmailBody - editorRef={editorRef} - requestBody={requestBody} - requestSubject={requestSubject} - handleOnchangeRequest={ - handleOnchangeRequest - } - setRequestSubject={setRequestSubject} - /> - <div - className="flex justify-end items-center gap-1 mt-2 op-link op-link-primary" - onClick={() => { - setRequestBody(defaultBody); - setRequestSubject(defaultSubject); - }} - > - <span>{t("reset-to-default")}</span> - </div> - </> - ) - } - <div className="flex flex-row items-center gap-2 md:gap-6 mt-2"> - <div className="flex flex-row gap-2"> - <button - onClick={() => sendEmailToSigners()} - className="op-btn op-btn-primary font-[500] text-sm shadow" + </div> + { + !isCustomize && ( + <span + className="op-link op-link-accent text-sm" + onClick={() => setIsCustomize(!isCustomize)} > - {t("send")} - </button> - {isCustomize && ( - <button - onClick={() => setIsCustomize(false)} - className="op-btn op-btn-ghost font-[500] text-sm" - > - {t("close")} - </button> - )} - </div> - { - !isCustomize && ( - <span - className="op-link op-link-accent text-sm" - onClick={() => setIsCustomize(!isCustomize)} - > - {t("cutomize-email")} - </span> - ) - } - </div> - </> - )} - {isSendAlert.mssg === "confirm" && ( - <> - <div className="flex justify-center items-center mt-3"> - <span className="h-[1px] w-[20%] bg-[#ccc]"></span> - <span className="ml-[5px] mr-[5px]">{t("or")}</span> - <span className="h-[1px] w-[20%] bg-[#ccc]"></span> - </div> - <div className="my-3">{handleShareList()}</div> - <p - id="copyUrl" - ref={copyUrlRef} - className="hidden" - ></p> - </> + {t("cutomize-email")} + </span> + ) + } + </div> + </> + )} + {isSendAlert.mssg === "confirm" && ( + <> + <div className="flex justify-center items-center mt-3"> + <span className="h-[1px] w-[20%] bg-[#ccc]"></span> + <span className="ml-[5px] mr-[5px]">{t("or")}</span> + <span className="h-[1px] w-[20%] bg-[#ccc]"></span> + </div> + <div className="my-3">{handleShareList()}</div> + <p id="copyUrl" ref={copyUrlRef} className="hidden"></p> + </> + )} + </div> + </ModalUi> + {/* this modal is used show send mail message and after send mail success message */} + <ModalUi + isOpen={isSend} + title={ + mailStatus === "success" + ? t("mails-sent") + : mailStatus === "quotareached" + ? t("quota-mail-head") + : t("mail-not-delivered") + } + handleClose={() => { + setIsSend(false); + setSignerPos([]); + navigate("/report/1MwEuxLEkF"); + }} + > + <div className="h-[100%] p-[20px] text-base-content"> + {mailStatus === "success" ? ( + <div className="text-center mb-[10px]"> + <LottieWithLoader /> + {pdfDetails[0].SendinOrder ? ( + <p> + {isCurrUser + ? t("placeholder-mail-alert-you") + : t("placeholder-mail-alert", { + name: signersdata[0]?.Name + })} + </p> + ) : ( + <p>{t("placeholder-alert-4")}</p> )} + {isCurrUser && <p>{t("placeholder-alert-5")}</p>} </div> - </ModalUi> - {/* this modal is used show send mail message and after send mail success message */} - <ModalUi - isOpen={isSend} - title={ - mailStatus === "success" - ? t("mails-sent") - : mailStatus === "quotareached" - ? t("quota-mail-head") - : t("mail-not-delivered") - } - handleClose={() => { - setIsSend(false); - setSignerPos([]); - navigate("/report/1MwEuxLEkF"); - }} - > - <div className="h-[100%] p-[20px] text-base-content"> - {mailStatus === "success" ? ( - <div className="text-center mb-[10px]"> - <LottieWithLoader /> - {pdfDetails[0].SendinOrder ? ( - <p> - {isCurrUser - ? t("placeholder-mail-alert-you") - : t("placeholder-mail-alert", { - name: signersdata[0]?.Name - })} - </p> - ) : ( - <p>{t("placeholder-alert-4")}</p> - )} - {isCurrUser && <p>{t("placeholder-alert-5")}</p>} - </div> - ) : mailStatus === "quotareached" ? ( - <div className="flex flex-col gap-y-3"> - <div className="my-3">{handleShareList()}</div> - </div> + ) : mailStatus === "quotareached" ? ( + <div className="flex flex-col gap-y-3"> + <div className="my-3">{handleShareList()}</div> + </div> + ) : ( + <div className="mb-[10px]"> + {mailStatus === "dailyquotareached" ? ( + <p>{t("daily-quota-reached")}</p> ) : ( - <div className="mb-[10px]"> - {mailStatus === "dailyquotareached" ? ( - <p>{t("daily-quota-reached")}</p> - ) : ( - <p>{t("placeholder-alert-6")}</p> - )} - {isCurrUser && ( - <p className="mt-1">{t("placeholder-alert-5")}</p> - )} - </div> + <p>{t("placeholder-alert-6")}</p> )} - {!mailStatus && ( - <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + {isCurrUser && ( + <p className="mt-1">{t("placeholder-alert-5")}</p> )} - {mailStatus !== "quotareached" && ( - <div - className={ - mailStatus === "success" - ? "flex justify-center mt-1" - : "" - } + </div> + )} + {!mailStatus && ( + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + )} + {mailStatus !== "quotareached" && ( + <div + className={ + mailStatus === "success" + ? "flex justify-center mt-1" + : "" + } + > + {isCurrUser && ( + <button + onClick={() => handleRecipientSign()} + type="button" + className="op-btn op-btn-primary mr-1" > - {isCurrUser && ( - <button - onClick={() => handleRecipientSign()} - type="button" - className="op-btn op-btn-primary mr-1" - > - {t("yes")} - </button> - )} - <button - onClick={() => { - setIsSend(false); - setSignerPos([]); - navigate("/report/1MwEuxLEkF"); - }} - type="button" - className="op-btn op-btn-ghost" - > - {isCurrUser ? t("no") : t("close")} - </button> - </div> + {t("yes")} + </button> )} - </div> - </ModalUi> - <ModalUi - isOpen={isShowEmail} - title={t("signers-alert")} - handleClose={() => setIsShowEmail(false)} - > - <div className="h-[100%] p-[20px]"> - <p>{t("placeholder-alert-7")}</p> - <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> <button - onClick={() => setIsShowEmail(false)} + onClick={() => { + setIsSend(false); + setSignerPos([]); + navigate("/report/1MwEuxLEkF"); + }} type="button" - className="op-btn op-btn-primary" + className="op-btn op-btn-ghost text-base-content" > - {t("ok")} + {isCurrUser ? t("no") : t("close")} </button> </div> - </ModalUi> - <ModalUi - isOpen={isAttchSignerModal} - title={t("create-document")} - handleClose={() => handleCloseAttachSigner()} - > - <div className="h-[100%] px-[20px] py-[10px]"> - <div> - <label - htmlFor="doctitle" - className="block text-xs font-semibold" - > - Title - </label> - <input - type="text" - name="doctitle" - value={docTitle} - onChange={(e) => setDocTitle(e.target.value)} - required - onInvalid={(e) => - e.target.setCustomValidity(t("input-required")) - } - onInput={(e) => e.target.setCustomValidity("")} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-[11px] py-[18px]" - /> - </div> - {pdfDetails[0].Placeholders?.some( - (x) => !x.signerObjId - ) && ( - <> - <div className="min-h-max max-h-[250px] overflow-y-auto"> - <div className="py-2 text-base-content flex flex-col gap-2 relative"> - {forms?.map((field, id) => { - return ( - <div - className="flex flex-col" - key={field?.value} - > - <label className="block text-xs font-semibold"> - {field?.role} - </label> - <div className="flex justify-between items-center gap-1"> - <div className="flex-1"> - <AsyncSelect - cacheOptions - defaultOptions - value={field} - loadingMessage={() => t("loading")} - noOptionsMessage={() => - t("contact-not-found") - } - loadOptions={loadOptions} - onChange={(item) => - handleInputChange(item, id) - } - unstyled - onFocus={() => loadOptions()} - classNames={{ - control: () => - "op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full h-full text-[11px]", - valueContainer: () => - "flex flex-row gap-x-[2px] gap-y-[2px] md:gap-y-0 w-full my-[2px]", - multiValue: () => - "op-badge op-badge-primary h-full text-[11px]", - multiValueLabel: () => "mb-[2px]", - menu: () => - "mt-1 shadow-md rounded-lg bg-base-200 text-base-content absolute z-9999", - menuList: () => - "shadow-md rounded-lg ", - option: () => - "bg-base-200 text-base-content rounded-lg m-1 hover:bg-base-300 p-2 ", - noOptionsMessage: () => - "p-2 bg-base-200 rounded-lg m-1 p-2" - }} - menuPortalTarget={document.getElementById( - "selectSignerModal" - )} - /> - </div> - <button - onClick={(e) => - handleCreateNew(e, field.value) - } - className="op-btn op-btn-accent op-btn-outline op-btn-sm" - > - <i className="fa-light fa-plus"></i> - </button> - </div> - </div> - ); - })} - </div> - </div> - <div className="w-full h-[0.5px] bg-[#9f9f9f] mt-[8px] mb-[15px]"></div> - <div className="flex mx-2 mb-2 gap-3"> - <button - disabled={handleDisable()} - onClick={() => handleSendDoc()} - type="submit" - className="op-btn op-btn-primary focus:outline-none" - > - <i className="fa-light fa-paper-plane"></i>{" "} - <span>{t("next")}</span> - </button> - <button - onClick={() => handleCloseAttachSigner()} - type="submit" - className="op-btn op-btn-secondary focus:outline-none" - > - <i className="fa-regular fa-pen-to-square"></i> - <span>{t("edit")}</span> - </button> - </div> - </> - )} - </div> - </ModalUi> - <ModalUi - title={""} - isOpen={isNewContact.status} - handleClose={closePopup} + )} + </div> + </ModalUi> + <ModalUi + isOpen={isShowEmail} + title={t("signers-alert")} + handleClose={() => setIsShowEmail(false)} + > + <div className="h-[100%] p-[20px]"> + <p>{t("placeholder-alert-7")}</p> + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + <button + onClick={() => setIsShowEmail(false)} + type="button" + className="op-btn op-btn-primary" > - <AddContact - details={handleAddUser} - closePopup={closePopup} - /> - </ModalUi> - <PlaceholderCopy - isPageCopy={isPageCopy} - setIsPageCopy={setIsPageCopy} - xyPosition={signerPos} - setXyPosition={setSignerPos} - allPages={allPages} + {t("ok")} + </button> + </div> + </ModalUi> + <PlaceholderCopy + isPageCopy={isPageCopy} + setIsPageCopy={setIsPageCopy} + xyPosition={signerPos} + setXyPosition={setSignerPos} + allPages={allPages} + pageNumber={pageNumber} + signKey={currWidgetsDetails?.key} + Id={uniqueId} + widgetType={currWidgetsDetails?.type} + setUniqueId={setUniqueId} + /> + <DropdownWidgetOption + type={radioButtonWidget} + title={t("radio-group")} + showDropdown={isRadio} + setShowDropdown={setIsRadio} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <DropdownWidgetOption + type="checkbox" + title={t("checkbox")} + showDropdown={isCheckbox} + setShowDropdown={setIsCheckbox} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <DropdownWidgetOption + type="dropdown" + title={t("dropdown-options")} + showDropdown={showDropdown} + setShowDropdown={setShowDropdown} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + + {/* pdf header which contain funish back button */} + <Header + completeBtnTitle={t("next")} + isPlaceholder={true} + pageNumber={pageNumber} + allPages={allPages} + changePage={changePage} + pdfDetails={pdfDetails} + signerPos={signerPos} + signersdata={signersdata} + isMailSend={isMailSend} + handleSaveDoc={handleSaveDoc} + isShowHeader={true} + currentSigner={true} + handleRotationFun={handleRotationFun} + clickOnZoomIn={clickOnZoomIn} + clickOnZoomOut={clickOnZoomOut} + setIsUploadPdf={setIsUploadPdf} + pdfArrayBuffer={pdfArrayBuffer} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + setSignerPos={setSignerPos} + userId={uniqueId} + pdfBase64={pdfBase64Url} + setIsEditTemplate={handleEditDocumentModal} + /> + + <div + ref={divRef} + data-tut="pdfArea" + className="h-full md:h-[95%]" + onClick={() => setPlaceholderTour(false)} + > + {containerWH && ( + <RenderPdf pageNumber={pageNumber} - signKey={currWidgetsDetails?.key} - Id={uniqueId} - widgetType={currWidgetsDetails?.type} + pdfNewWidth={pdfNewWidth} + pdfDetails={pdfDetails} + signerPos={signerPos} + successEmail={false} + numPages={numPages} + pageDetails={pageDetails} + placeholder={true} + drop={drop} + handleDeleteWidget={handleDeleteWidget} + handleTabDrag={handleTabDrag} + handleStop={handleStop} + setPdfLoad={setPdfLoad} + pdfLoad={pdfLoad} + setSignerPos={setSignerPos} + containerWH={containerWH} + setIsResize={setIsResize} + isResize={isResize} + setZIndex={setZIndex} + setIsPageCopy={setIsPageCopy} + signersdata={signersdata} + handleLinkUser={handleLinkUser} setUniqueId={setUniqueId} - tempSignerId={tempSignerId} - setTempSignerId={setTempSignerId} - /> - <DropdownWidgetOption - type={radioButtonWidget} - title={t("radio-group")} - showDropdown={isRadio} - setShowDropdown={setIsRadio} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <DropdownWidgetOption - type="checkbox" - title={t("checkbox")} - showDropdown={isCheckbox} - setShowDropdown={setIsCheckbox} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <DropdownWidgetOption - type="dropdown" - title={t("dropdown-options")} - showDropdown={showDropdown} + isDragging={isDragging} setShowDropdown={setShowDropdown} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} + setIsRadio={setIsRadio} + setIsCheckbox={setIsCheckbox} setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} + handleNameModal={setIsNameModal} + uniqueId={uniqueId} + pdfOriginalWH={pdfOriginalWH} + setScale={setScale} + scale={scale} + setIsSelectId={setIsSelectId} + pdfBase64Url={pdfBase64Url} fontSize={fontSize} setFontSize={setFontSize} fontColor={fontColor} setFontColor={setFontColor} - isShowAdvanceFeature={true} + unSignedWidgetId={unSignedWidgetId} + divRef={divRef} + currWidgetsDetails={currWidgetsDetails} + setRoleName={setRoleName} + isShowModal={isShowModal} /> + )} + </div> + </div> + </div> - {/* pdf header which contain funish back button */} - <Header - completeBtnTitle={t("next")} - isPlaceholder={true} - pageNumber={pageNumber} - allPages={allPages} - changePage={changePage} - pdfDetails={pdfDetails} + {/* signature button */} + <div className="w-full md:w-[23%] bg-base-100 overflow-y-auto hide-scrollbar"> + <div className={`max-h-screen`}> + {isMobile ? ( + <div> + <WidgetComponent + pdfUrl={isMailSend} + handleDivClick={handleDivClick} + handleMouseLeave={handleMouseLeave} + isSignYourself={false} + addPositionOfSignature={addPositionOfSignature} signerPos={signerPos} signersdata={signersdata} + isSelectListId={isSelectListId} + setIsSelectId={setIsSelectId} + isSigners={true} + setIsShowEmail={setIsShowEmail} isMailSend={isMailSend} - alertSendEmail={alertSendEmail} - isShowHeader={true} - currentSigner={true} - handleRotationFun={handleRotationFun} - clickOnZoomIn={clickOnZoomIn} - clickOnZoomOut={clickOnZoomOut} - setIsUploadPdf={setIsUploadPdf} - pdfArrayBuffer={pdfArrayBuffer} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} + setSelectedEmail={setSelectedEmail} + selectedEmail={selectedEmail} + setUniqueId={setUniqueId} + setRoleName={setRoleName} + initial={true} + sendInOrder={pdfDetails[0].SendinOrder} + setSignersData={setSignersData} + blockColor={blockColor} + setBlockColor={setBlockColor} + setIsAddSigner={setIsAddSigner} + handleDeleteUser={handleDeleteUser} + uniqueId={uniqueId} setSignerPos={setSignerPos} - userId={uniqueId} - pdfBase64={pdfBase64Url} + roleName={roleName} + isPrefillDropdown={false} // In document editing flow there should not be any prefill dropdown widget + prefillSigner={prefillSigner} /> - + </div> + ) : ( + <div> <div - ref={divRef} - data-tut="pdfArea" - className="h-full md:h-[95%]" + className="hidden md:block w-full h-full bg-base-100" + aria-disabled > - {containerWH && ( - <RenderPdf - pageNumber={pageNumber} - pdfNewWidth={pdfNewWidth} - pdfDetails={pdfDetails} - signerPos={signerPos} - successEmail={false} - numPages={numPages} - pageDetails={pageDetails} - placeholder={true} - drop={drop} - handleDeleteSign={handleDeleteSign} - handleTabDrag={handleTabDrag} - handleStop={handleStop} - setPdfLoad={setPdfLoad} - pdfLoad={pdfLoad} - setSignerPos={setSignerPos} - containerWH={containerWH} - setIsResize={setIsResize} - isResize={isResize} - setZIndex={setZIndex} - setIsPageCopy={setIsPageCopy} - signersdata={signersdata} - handleLinkUser={handleLinkUser} - setUniqueId={setUniqueId} - isDragging={isDragging} - setShowDropdown={setShowDropdown} - setIsRadio={setIsRadio} - setIsCheckbox={setIsCheckbox} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleNameModal={setIsNameModal} - setTempSignerId={setTempSignerId} - uniqueId={uniqueId} - pdfOriginalWH={pdfOriginalWH} - setScale={setScale} - scale={scale} - setIsSelectId={setIsSelectId} - pdfBase64Url={pdfBase64Url} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - unSignedWidgetId={unSignedWidgetId} - divRef={divRef} - currWidgetsDetails={currWidgetsDetails} - /> - )} - </div> - </div> - </div> - - {/* signature button */} - <div className="w-full md:w-[23%] bg-base-100 overflow-y-auto hide-scrollbar"> - <div className={`max-h-screen`}> - {isMobile ? ( - <div> + <SignerListPlace + setSignerPos={setSignerPos} + signerPos={signerPos} + signersdata={signersdata} + isSelectListId={isSelectListId} + setIsSelectId={setIsSelectId} + setUniqueId={setUniqueId} + setRoleName={setRoleName} + sendInOrder={pdfDetails[0].SendinOrder} + setSignersData={setSignersData} + blockColor={blockColor} + setBlockColor={setBlockColor} + isMailSend={isMailSend} + setIsAddSigner={setIsAddSigner} + handleDeleteUser={handleDeleteUser} + roleName={roleName} + uniqueId={uniqueId} + prefillSigner={prefillSigner} + setIsTour={setPlaceholderTour} + /> + <div data-tut="addWidgets"> <WidgetComponent - pdfUrl={isMailSend} + isMailSend={isMailSend} handleDivClick={handleDivClick} handleMouseLeave={handleMouseLeave} isSignYourself={false} addPositionOfSignature={addPositionOfSignature} - signerPos={signerPos} - signersdata={signersdata} - isSelectListId={isSelectListId} - setIsSelectId={setIsSelectId} - isSigners={true} - setIsShowEmail={setIsShowEmail} - isMailSend={isMailSend} - setSelectedEmail={setSelectedEmail} - selectedEmail={selectedEmail} - setUniqueId={setUniqueId} - setRoleName={setRoleName} initial={true} - sendInOrder={pdfDetails[0].SendinOrder} - setSignersData={setSignersData} - blockColor={blockColor} - setBlockColor={setBlockColor} - setIsAddSigner={setIsAddSigner} - handleDeleteUser={handleDeleteUser} - uniqueId={uniqueId} - setSignerPos={setSignerPos} + isPrefillDropdown={false} + roleName={roleName} /> </div> - ) : ( - <div> - <div - className="hidden md:block w-full h-full bg-base-100" - aria-disabled - > - <SignerListPlace - setSignerPos={setSignerPos} - signerPos={signerPos} - signersdata={signersdata} - isSelectListId={isSelectListId} - setIsSelectId={setIsSelectId} - setUniqueId={setUniqueId} - setRoleName={setRoleName} - sendInOrder={pdfDetails[0].SendinOrder} - setSignersData={setSignersData} - blockColor={blockColor} - setBlockColor={setBlockColor} - isMailSend={isMailSend} - setIsAddSigner={setIsAddSigner} - handleDeleteUser={handleDeleteUser} - roleName={roleName} - uniqueId={uniqueId} - // handleAddSigner={handleAddSigner} - /> - <div data-tut="addWidgets"> - <WidgetComponent - isMailSend={isMailSend} - handleDivClick={handleDivClick} - handleMouseLeave={handleMouseLeave} - isSignYourself={false} - addPositionOfSignature={addPositionOfSignature} - initial={true} - /> - </div> - </div> - </div> - )} + </div> </div> - </div> + )} </div> </div> - )} - {isShowModal[currWidgetsDetails?.key] && ( - <WidgetsValueModal - key={currWidgetsDetails?.key} - xyPosition={signerPos} - pageNumber={pageNumber} - setXyPosition={setSignerPos} - uniqueId={uniqueId} - setPageNumber={setPageNumber} - setCurrWidgetsDetails={setCurrWidgetsDetails} - currWidgetsDetails={currWidgetsDetails} - index={pageNumber} - isSave={true} - tempSignerId={tempSignerId} - setUniqueId={setUniqueId} - signatureTypes={signatureType} - /> - )} - <ModalUi - isOpen={isAlreadyPlace.status} - title={t("document-alert")} - showClose={false} - > - <div className="h-[100%] p-[20px] text-base-content"> - <p>{isAlreadyPlace.message}</p> - <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> - <button - onClick={() => handleRecipientSign()} - type="button" - className="op-btn op-btn-primary" - > - {t("view")} - </button> - </div> - </ModalUi> - {(isAddSigner || (isAddUser && isAddUser[uniqueId])) && ( - <LinkUserModal - handleAddUser={handleAddUser} - uniqueId={uniqueId} - closePopup={closePopup} - signersData={signersdata} - signerPos={signerPos} - /> - )} - <WidgetNameModal - signatureType={signatureType} - widgetName={currWidgetsDetails?.options?.name} - defaultdata={currWidgetsDetails} - isOpen={isNameModal} - handleClose={handleNameModal} - handleData={handleWidgetdefaultdata} - isTextSetting={isTextSetting} - setIsTextSetting={setIsTextSetting} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} + </div> + )} + {isShowModal[currWidgetsDetails?.key] && ( + <WidgetsValueModal + key={currWidgetsDetails?.key} + xyPosition={signerPos} + pageNumber={pageNumber} + setXyPosition={setSignerPos} + uniqueId={uniqueId} + setPageNumber={setPageNumber} + setCurrWidgetsDetails={setCurrWidgetsDetails} + currWidgetsDetails={currWidgetsDetails} + index={pageNumber} + isSave={true} + setUniqueId={setUniqueId} + signatureTypes={signatureType} + /> + )} + <ModalUi + isOpen={isAlreadyPlace.status} + title={t("document-alert")} + showClose={false} + > + <div className="h-[100%] p-[20px] text-base-content"> + <p>{isAlreadyPlace.message}</p> + <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> + <button + onClick={() => handleRecipientSign()} + type="button" + className="op-btn op-btn-primary" + > + {t("view")} + </button> + </div> + </ModalUi> + {(isAddSigner || (isAddUser && isAddUser[uniqueId])) && ( + <LinkUserModal + handleAddUser={handleAddUser} + uniqueId={uniqueId} + closePopup={closePopup} + signersData={signersdata} + signerPos={signerPos} + isAddYourSelfCheckbox /> - <RotateAlert - showRotateAlert={showRotateAlert.status} - setShowRotateAlert={setShowRotateAlert} - handleRemoveWidgets={handleRemovePlaceholder} + )} + <WidgetNameModal + signatureType={signatureType} + widgetName={currWidgetsDetails?.options?.name} + defaultdata={currWidgetsDetails} + isOpen={isNameModal} + handleClose={handleNameModal} + handleData={handleWidgetdefaultdata} + isTextSetting={isTextSetting} + setIsTextSetting={setIsTextSetting} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + roleName={roleName} + /> + <RotateAlert + showRotateAlert={showRotateAlert.status} + setShowRotateAlert={setShowRotateAlert} + handleRemoveWidgets={handleRemovePlaceholder} + /> + {isEditDoc && ( + <EditDocument + title={t("edit-document")} + handleClose={handleEditDocumentModal} + pdfbase64={pdfBase64Url} + template={pdfDetails?.[0]} + onSuccess={handleEditDocumentForm} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + isAddYourSelfCheckbox={true} /> - </DndProvider> + )} </> ); } diff --git a/apps/OpenSign/src/pages/Preferences.jsx b/apps/OpenSign/src/pages/Preferences.jsx index 3e54209a93..b34ef2df1f 100644 --- a/apps/OpenSign/src/pages/Preferences.jsx +++ b/apps/OpenSign/src/pages/Preferences.jsx @@ -1,5 +1,4 @@ import React, { useEffect, useState, useRef } from "react"; -import Title from "../components/Title"; import Alert from "../primitives/Alert"; import { useTranslation } from "react-i18next"; import Loader from "../primitives/Loader"; @@ -12,7 +11,6 @@ import { } from "../constant/Utils"; import Parse from "parse"; import { Tooltip as ReactTooltip } from "react-tooltip"; -import TimezoneSelector from "../components/shared/fields/TimezoneSelector"; import ReactQuill from "react-quill-new"; import "../styles/quill.css"; import EditorToolbar, { @@ -20,7 +18,9 @@ import EditorToolbar, { module2, formats } from "../components/pdf/EditorToolbar"; -import DateFormatSelector from "../components/shared/fields/DateFormatSelector"; +import TimezoneSelector from "../components/preferences/TimezoneSelector"; +import DateFormatSelector from "../components/preferences/DateFormatSelector"; +import FilenameFormatSelector from "../components/preferences/FilenameFormatSelector"; const Preferences = () => { const appName = @@ -60,6 +60,7 @@ const Preferences = () => { requestMail: false, completionMail: false }); + const [fileNameFormat, setFileNameFormat] = useState("DOCNAME"); useEffect(() => { fetchSignType(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -125,6 +126,9 @@ const Preferences = () => { const isLTVEnabled = _getUser?.IsLTVEnabled !== undefined ? _getUser?.IsLTVEnabled : false; setIsLTVEnabled(isLTVEnabled); + const downloadFilenameFormat = + _getUser?.DownloadFilenameFormat || "DOCNAME"; + setFileNameFormat(downloadFilenameFormat); } } catch (err) { console.log("err while getting user details", err); @@ -164,11 +168,17 @@ const Preferences = () => { type: "danger", msg: t("at-least-one-signature-type") }); + setIsLoader(false); + setTimeout(() => setIsAlert({ type: "success", msg: "" }), 2000); + return; } else if (isDefaultSignTypeOnly) { setIsAlert({ type: "danger", - msg: t("expect-default-one-more-signature-type") + msg: t("expect-default-one-signature-type") }); + setIsLoader(false); + setTimeout(() => setIsAlert({ type: "success", msg: "" }), 2000); + return; } else { params = { ...params, SignatureType: signatureType }; } @@ -183,7 +193,8 @@ const Preferences = () => { IsTourEnabled: isTourEnabled, DateFormat: dateFormat, Is12HourTime: is12HourTime, - IsLTVEnabled: isLTVEnabled + IsLTVEnabled: isLTVEnabled, + DownloadFilenameFormat: fileNameFormat }; const updateRes = await Parse.Cloud.run("updatepreferences", params); if (updateRes) { @@ -197,6 +208,7 @@ const Preferences = () => { extUser.IsTourEnabled = isTourEnabled; extUser.DateFormat = dateFormat; extUser.Is12HourTime = is12HourTime; + extUser.DownloadFilenameFormat = fileNameFormat; const _extUser = JSON.parse(JSON.stringify(extUser)); localStorage.setItem("Extand_Class", JSON.stringify([_extUser])); } @@ -389,7 +401,6 @@ const Preferences = () => { }; return ( <React.Fragment> - <Title title={t("Preferences")} /> {isalert.msg && <Alert type={isalert.type}>{isalert.msg}</Alert>} {isTopLoader ? ( <div className="flex justify-center items-center h-screen"> @@ -761,6 +772,12 @@ const Preferences = () => { setDateFormat={setDateFormat} /> </div> + <div className="mb-6"> + <FilenameFormatSelector + fileNameFormat={fileNameFormat} + setFileNameFormat={setFileNameFormat} + /> + </div> </div> {/* Save Button - Full Width */} <div className="md:col-span-12 flex justify-start mt-2"> diff --git a/apps/OpenSign/src/pages/Report.jsx b/apps/OpenSign/src/pages/Report.jsx index 3139c84312..d7689190fa 100644 --- a/apps/OpenSign/src/pages/Report.jsx +++ b/apps/OpenSign/src/pages/Report.jsx @@ -1,19 +1,20 @@ -import React, { useEffect, useState, useRef } from "react"; -import ReportTable from "../primitives/GetReportDisplay"; +import { useEffect, useState, useRef } from "react"; import Parse from "parse"; import axios from "axios"; -import reportJson from "../json/ReportJson"; +import reportJson, { extraCols } from "../json/ReportJson"; import { useParams } from "react-router"; -import Title from "../components/Title"; import PageNotFound from "./PageNotFound"; -import TourContentWithBtn from "../primitives/TourContentWithBtn"; import Loader from "../primitives/Loader"; -import { useTranslation } from "react-i18next"; +import Contactbook from "../reports/contact/Contactbook"; +import ColumnSelector from "../components/ColumnSelector"; +import TemplatesReport from "../reports/template/TemplatesReport"; +import DocumentsReport from "../reports/document/DocumentsReport"; +import { templateReportTour } from "../json/ReportTour"; const Report = () => { - const { t } = useTranslation(); const { id } = useParams(); - const [List, setList] = useState([]); + const abortController = new AbortController(); + const [list, setList] = useState([]); const [isLoader, setIsLoader] = useState(true); const [reportName, setReportName] = useState(""); const [reporthelp, setReportHelp] = useState(""); @@ -21,16 +22,17 @@ const Report = () => { const [heading, setHeading] = useState([]); const [isNextRecord, setIsNextRecord] = useState(false); const [isMoreDocs, setIsMoreDocs] = useState(true); - const [form, setForm] = useState(""); const [tourData, setTourData] = useState([]); - const [isDontShow, setIsDontShow] = useState(false); - const [isImport, setIsImport] = useState(false); - const abortController = new AbortController(); - const docPerPage = 10; const [searchTerm, setSearchTerm] = useState(""); const [mobileSearchOpen, setMobileSearchOpen] = useState(false); const [isSearchResult, setIsSearchResult] = useState(false); + const [allColumns, setAllColumns] = useState([]); + const [visibleColumns, setVisibleColumns] = useState([]); + const [columnLabels, setColumnLabels] = useState({}); + const [defaultColumns, setDefaultColumns] = useState([]); + const [isColumnModal, setIsColumnModal] = useState(false); const debounceTimer = useRef(null); + const docPerPage = 20; // below useEffect is call when id param change useEffect(() => { @@ -38,6 +40,14 @@ const Report = () => { setList([]); setSearchTerm(""); setMobileSearchOpen(false); + const saved = JSON.parse(localStorage.getItem("reportColumns") || "{}"); + if (saved[id]) { + setVisibleColumns(saved[id].visible || saved[id]); + setColumnLabels(saved[id].labels || {}); + } else { + setVisibleColumns([]); + setColumnLabels({}); + } getReportData(0, docPerPage, ""); // Function returned from useEffect is called on unmount @@ -54,15 +64,11 @@ const Report = () => { // below useEffect call when isNextRecord state is true and fetch next record useEffect(() => { if (isNextRecord) { - getReportData(List.length, 20, searchTerm); + getReportData(list.length, 20, searchTerm); } // eslint-disable-next-line }, [isNextRecord]); - const handleDontShow = (isChecked) => { - setIsDontShow(isChecked); - }; - const handleSearchChange = async (e) => { const term = e.target.value.toLowerCase(); setSearchTerm(term); @@ -118,11 +124,21 @@ const Report = () => { const json = reportJson(id); if (json) { setActions(json.actions); - setHeading(json.heading); + const savedCols = JSON.parse( + localStorage.getItem("reportColumns") || "{}" + ); + const visible = savedCols[id]?.visible || json.heading; + const labels = savedCols[id]?.labels || {}; + if (!savedCols[id] || id === "contacts") { + savedCols[id] = { visible: json.heading, labels: {} }; + localStorage.setItem("reportColumns", JSON.stringify(savedCols)); + } + setVisibleColumns(visible); + setColumnLabels(labels); + setHeading(visible); + setDefaultColumns(json.heading); setReportName(json.reportName); - setForm(json.form); setReportHelp(json?.helpMsg); - setIsImport(json?.import || false); const currentUser = Parse.User.current().id; const headers = { @@ -142,39 +158,11 @@ const Report = () => { headers: headers, signal: abortController.signal // is used to cancel fetch query }); + const extraHeads = + id === "4Hhwbp482K" ? [...extraCols, "Expiry Date"] : extraCols; + setAllColumns(Array.from(new Set([...json.heading, ...extraHeads]))); if (id === "6TeaPr321t") { - const tourConfig = [ - { - selector: "[data-tut=reactourFirst]", - content: () => ( - <TourContentWithBtn - message={t("tour-mssg.report-1")} - isChecked={handleDontShow} - /> - ), - position: "top", - style: { fontSize: "13px" } - } - ]; - - if (res.data.result && res.data.result?.length > 0) { - json.actions.map((data) => { - const newConfig = { - selector: `[data-tut="${data?.selector}"]`, - content: () => ( - <TourContentWithBtn - message={t(`tour-mssg.${data?.action}`)} - isChecked={handleDontShow} - /> - ), - position: "top", - style: { fontSize: "13px" } - }; - tourConfig.push(newConfig); - }); - } - - setTourData(tourConfig); + setTourData(templateReportTour); } if (id === "4Hhwbp482K") { const listData = res.data?.result.filter((x) => x.Signers.length > 0); @@ -234,42 +222,66 @@ const Report = () => { setIsLoader(false); } }; + + const commonProps = { + ReportName: reportName, + List: list, + setList, + actions: actions, + heading: heading, + setIsNextRecord, + isMoreDocs, + docPerPage, + mobileSearchOpen, + setMobileSearchOpen, + searchTerm, + handleSearchChange, + handleSearchPaste, + isSearchResult, + columnLabels, + openColumnModal: () => setIsColumnModal(true) + }; return ( <> - <Title title={reportName} /> {isLoader ? ( <div className="h-[100vh] flex justify-center items-center"> <Loader /> </div> ) : ( <> - {reportName ? ( - <ReportTable - ReportName={reportName} - List={List} - setList={setList} - actions={actions} - heading={heading} - setIsNextRecord={setIsNextRecord} - isMoreDocs={isMoreDocs} - docPerPage={docPerPage} - form={form} + {id === "contacts" ? ( + <Contactbook {...commonProps} /> + ) : id === "6TeaPr321t" ? ( + <TemplatesReport + {...commonProps} report_help={reporthelp} tourData={tourData} - isDontShow={isDontShow} - mobileSearchOpen={mobileSearchOpen} - setMobileSearchOpen={setMobileSearchOpen} - searchTerm={searchTerm} - handleSearchChange={handleSearchChange} - handleSearchPaste={handleSearchPaste} - isSearchResult={isSearchResult} - isImport={isImport} /> + ) : reportName ? ( + <DocumentsReport {...commonProps} report_help={reporthelp} /> ) : ( <PageNotFound prefix={"Report"} /> )} </> )} + <ColumnSelector + isOpen={isColumnModal} + allColumns={allColumns} + visibleColumns={visibleColumns} + columnLabels={columnLabels} + defaultColumns={defaultColumns} + onApply={(cols, labels) => { + setVisibleColumns(cols); + setHeading(cols); + setColumnLabels(labels); + const saved = JSON.parse( + localStorage.getItem("reportColumns") || "{}" + ); + saved[id] = { visible: cols, labels }; + localStorage.setItem("reportColumns", JSON.stringify(saved)); + }} + onClose={() => setIsColumnModal(false)} + /> </> ); }; diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.jsx b/apps/OpenSign/src/pages/SignyourselfPdf.jsx index 6da6ab0c0a..fd56eba993 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.jsx +++ b/apps/OpenSign/src/pages/SignyourselfPdf.jsx @@ -5,8 +5,6 @@ import Parse from "parse"; import Confetti from "react-confetti"; import axios from "axios"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; import { useDrop } from "react-dnd"; import EmailComponent from "../components/pdf/EmailComponent"; import WidgetComponent from "../components/pdf/WidgetComponent"; @@ -14,7 +12,7 @@ import { getTenantDetails, contractDocument, embedDocId, - multiSignEmbed, + embedWidgetsToDoc, calculateInitialWidthHeight, defaultWidthHeight, contractUsers, @@ -47,12 +45,11 @@ import Signedby from "../components/pdf/Signedby"; import Header from "../components/pdf/PdfHeader"; import RenderPdf from "../components/pdf/RenderPdf"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; -import Title from "../components/Title"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import { useDispatch, useSelector } from "react-redux"; import TextFontSetting from "../components/pdf/TextFontSetting"; import VerifyEmail from "../components/pdf/VerifyEmail"; -import PdfZoom from "../components/pdf/PdfZoom"; +import PdfTools from "../components/pdf/PdfTools"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; import DownloadPdfZip from "../primitives/DownloadPdfZip"; @@ -124,7 +121,7 @@ function SignYourSelf() { const openCellsSettingModal = () => setIsCellsSetting(true); const [pdfLoad, setPdfLoad] = useState(false); const [isAlert, setIsAlert] = useState({ isShow: false, alertMessage: "" }); - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [isCompleted, setIsCompleted] = useState(false); const [isCelebration, setIsCelebration] = useState(false); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); @@ -132,7 +129,7 @@ function SignYourSelf() { const [isVerifyModal, setIsVerifyModal] = useState(false); const [otp, setOtp] = useState(""); const [zoomPercent, setZoomPercent] = useState(0); - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); const [scale, setScale] = useState(1); const [pdfBase64Url, setPdfBase64Url] = useState(""); const [showRotateAlert, setShowRotateAlert] = useState({ @@ -195,7 +192,7 @@ function SignYourSelf() { const timer = setTimeout(updateSize, 100); // match the transition duration return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [divRef.current, isHeader]); + }, [divRef.current, isSidebar]); //function for get document details for perticular signer with signer'object id const getDocumentDetails = async (showComplete) => { @@ -281,18 +278,14 @@ function SignYourSelf() { } else if (contractUsersRes[0] && contractUsersRes.length > 0) { setContractName("_Users"); setSignerUserId(contractUsersRes[0].objectId); - const tourstatuss = - contractUsersRes[0].TourStatus && contractUsersRes[0].TourStatus; - if (tourstatuss && tourstatuss.length > 0 && !isCompleted) { - setTourStatus(tourstatuss); - const checkTourRecipients = tourstatuss.filter( - (data) => data.signyourself - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].signyourself); - } + const tourstatus = contractUsersRes?.[0]?.TourStatus || []; + if (tourstatus && tourstatus.length > 0 && !isCompleted) { + setTourStatus(tourstatus); + const tour = tourstatus?.some((data) => data.signyourself) || false; + setSignTour(!tour); + setCheckTourStatus(tour); } else { - setCheckTourStatus(false); + setSignTour(true); } setIsLoading({ isLoad: false }); } else if (contractUsersRes.length === 0) { @@ -300,28 +293,19 @@ function SignYourSelf() { if (contractContactBook && contractContactBook.length > 0) { setContractName("_Contactbook"); setSignerUserId(contractContactBook[0].objectId); - const tourstatuss = - contractContactBook[0].TourStatus && - contractContactBook[0].TourStatus; - - if (tourstatuss && tourstatuss.length > 0 && !isCompleted) { - setTourStatus(tourstatuss); - const checkTourRecipients = tourstatuss.filter( - (data) => data.signyourself - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].signyourself); - } + const tourstatus = contractContactBook?.[0]?.TourStatus || []; + if (tourstatus && tourstatus.length > 0 && !isCompleted) { + setTourStatus(tourstatus); + const tour = tourstatus?.some((data) => data.signyourself) || false; + setSignTour(!tour); + setCheckTourStatus(tour); } else { - setCheckTourStatus(true); + setSignTour(true); } } else { setHandleError(t("no-data-avaliable")); } - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); + setIsLoading({ isLoad: false }); } } catch (err) { console.log("Error: error in getDocumentDetails", err); @@ -347,7 +331,6 @@ function SignYourSelf() { return ""; } }; - //function for setting position after drop signature button over pdf const addPositionOfSignature = (item, monitor) => { setCurrWidgetsDetails({}); @@ -394,7 +377,12 @@ function SignYourSelf() { scale: containerScale, Width: getWidth, Height: getHeight, - options: addWidgetSelfsignOptions(dragTypeValue, getWidgetValue, owner) + options: addWidgetSelfsignOptions( + dragTypeValue, + getWidgetValue, + owner, + xyPosition + ) }; dropData.push(dropObj); } else { @@ -423,7 +411,12 @@ function SignYourSelf() { type: dragTypeValue, Width: getWidth / (containerScale * scale), Height: getHeight / (containerScale * scale), - options: addWidgetSelfsignOptions(dragTypeValue, getWidgetValue, owner), + options: addWidgetSelfsignOptions( + dragTypeValue, + getWidgetValue, + owner, + xyPosition + ), scale: containerScale }; dropData.push(dropObj); @@ -502,7 +495,10 @@ function SignYourSelf() { }; useEffect(() => { const timer = setTimeout(() => { - if (!pdfDetails?.[0]?.IsCompleted) { + if ( + !pdfDetails?.[0]?.IsCompleted && + pdfDetails?.[0]?.CreatedBy?.objectId === jsonSender?.objectId + ) { autosavedetails(); } }, 2000); @@ -643,7 +639,7 @@ function SignYourSelf() { await embedDocId(pdfOriginalWH, pdfDoc, documentId); } //embed all widgets in document - const pdfBytes = await multiSignEmbed( + const pdfBytes = await embedWidgetsToDoc( xyPosition, pdfDoc, isSignYourSelfFlow, @@ -835,7 +831,7 @@ function SignYourSelf() { setSignBtnPosition([xySignature]); }; //function for delete signature block - const handleDeleteSign = (key) => { + const handleDeleteWidget = (key) => { setCurrWidgetsDetails({}); const updateResizeData = []; let filterData = xyPosition[index].pos.filter((data) => data.key !== key); @@ -872,6 +868,7 @@ function SignYourSelf() { content: () => ( <TourContentWithBtn message={t("tour-mssg.signyour-self-1")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -883,6 +880,19 @@ function SignYourSelf() { content: () => ( <TourContentWithBtn message={t("tour-mssg.signyour-self-2")} + isDontShowCheckbox={!checkTourStatus} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, + { + selector: '[data-tut="pdftools"]', + content: () => ( + <TourContentWithBtn + message={t("pdf-tools-tour")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -894,7 +904,8 @@ function SignYourSelf() { //function for update TourStatus const closeTour = async () => { setSignTour(false); - if (isDontShow) { + setIsDontShow(true); + if (!checkTourStatus && isDontShow) { let updatedTourStatus = []; if (tourStatus.length > 0) { updatedTourStatus = [...tourStatus]; @@ -1184,22 +1195,13 @@ function SignYourSelf() { setShowRotateAlert({ status: false, degree: 0 }); }; return ( - <DndProvider backend={HTML5Backend}> - <Title title={"Signyourself"} /> + <> {isLoading.isLoad ? ( <LoaderWithMsg isLoading={isLoading} /> ) : handleError ? ( <HandleError handleError={handleError} /> ) : ( <div> - {isUiLoading && ( - <div className="absolute h-[100vh] w-full z-[999] flex flex-col justify-center items-center bg-[#e6f2f2] bg-opacity-80"> - <Loader /> - <span style={{ fontSize: "13px", fontWeight: "bold" }}> - {t("loader")} - </span> - </div> - )} {isCelebration && ( <div className="relative z-[1000]"> <Confetti @@ -1211,6 +1213,12 @@ function SignYourSelf() { </div> )} <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> + {isUiLoading && ( + <div className="absolute h-full w-full z-[999] flex flex-col justify-center items-center bg-[#e6f2f2]/80"> + <Loader /> + <span className="text-[13px]">{t("loader")}</span> + </div> + )} {!isEmailVerified && ( <VerifyEmail isVerifyModal={isVerifyModal} @@ -1224,18 +1232,14 @@ function SignYourSelf() { /> )} {/* this component used for UI interaction and show their functionality */} - {pdfLoad && !checkTourStatus && !isCompleted && ( + {pdfLoad && !isCompleted && ( <Tour onRequestClose={closeTour} steps={tourConfig} isOpen={signTour} - rounded={5} - closeWithMask={false} /> )} - {/* this component used to render all pdf pages in left side */} - <RenderAllPdfPage allPages={allPages} setAllPages={setAllPages} @@ -1251,8 +1255,8 @@ function SignYourSelf() { pdfArrayBuffer={pdfArrayBuffer} isMergePdfBtn={!pdfDetails?.[0]?.IsCompleted} /> - <div className=" w-full md:w-[57%] flex mr-4"> - <PdfZoom + <div className="w-full md:w-[57%] flex mr-4"> + <PdfTools clickOnZoomIn={clickOnZoomIn} clickOnZoomOut={clickOnZoomOut} handleRotationFun={handleRotationFun} @@ -1280,7 +1284,6 @@ function SignYourSelf() { <p>{isAlert.alertMessage}</p> </div> </ModalUi> - {/* this modal is used show this document is already sign */} <ModalUi isOpen={showAlreadySignDoc.status} @@ -1291,7 +1294,7 @@ function SignYourSelf() { <p>{showAlreadySignDoc.mssg}</p> <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> <button - className="op-btn op-btn-ghost shadow-md" + className="op-btn op-btn-ghost text-base-content shadow-md" onClick={() => setShowAlreadySignDoc({ status: false })} > {t("close")} @@ -1370,7 +1373,7 @@ function SignYourSelf() { handleTabDrag={handleTabDrag} handleStop={handleStop} isDragging={isDragging} - handleDeleteSign={handleDeleteSign} + handleDeleteWidget={handleDeleteWidget} pdfDetails={pdfDetails} setIsDragging={setIsDragging} xyPosition={xyPosition} @@ -1401,6 +1404,7 @@ function SignYourSelf() { setIsResize={setIsResize} divRef={divRef} currWidgetsDetails={currWidgetsDetails} + isShowModal={isShowModal} /> )} </div> @@ -1409,21 +1413,18 @@ function SignYourSelf() { <div className="w-full md:w-[23%] bg-base-100 overflow-y-auto hide-scrollbar"> <div className={`max-h-screen`}> {!isCompleted ? ( - <div> - <WidgetComponent - pdfUrl={pdfUrl} - handleDivClick={handleDivClick} - handleMouseLeave={handleMouseLeave} - xyPosition={xyPosition} - isSignYourself={true} - addPositionOfSignature={addPositionOfSignature} - isMailSend={false} - /> - </div> + <WidgetComponent + pdfUrl={pdfUrl} + handleDivClick={handleDivClick} + handleMouseLeave={handleMouseLeave} + xyPosition={xyPosition} + isSignYourself={true} + addPositionOfSignature={addPositionOfSignature} + isMailSend={false} + setIsTour={setSignTour} + /> ) : ( - <div> - <Signedby pdfDetails={pdfDetails[0]} /> - </div> + <Signedby pdfDetails={pdfDetails[0]} /> )} </div> </div> @@ -1484,7 +1485,7 @@ function SignYourSelf() { handleSaveFontSize={handleSaveFontSize} currWidgetsDetails={currWidgetsDetails} /> - </DndProvider> + </> ); } diff --git a/apps/OpenSign/src/pages/TemplatePlaceholder.jsx b/apps/OpenSign/src/pages/TemplatePlaceholder.jsx index a5eea26f37..71c444011b 100644 --- a/apps/OpenSign/src/pages/TemplatePlaceholder.jsx +++ b/apps/OpenSign/src/pages/TemplatePlaceholder.jsx @@ -3,17 +3,14 @@ import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import { useParams, useNavigate } from "react-router"; import axios from "axios"; import "../styles/signature.css"; -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; import { useDrop } from "react-dnd"; import WidgetComponent from "../components/pdf/WidgetComponent"; import Tour from "../primitives/Tour"; import SignerListPlace from "../components/pdf/SignerListPlace"; import Header from "../components/pdf/PdfHeader"; import WidgetNameModal from "../components/pdf/WidgetNameModal"; -import { PDFDocument } from "pdf-lib"; -import { SaveFileSize } from "../constant/saveFileSize"; import { + copytoData, pdfNewWidthFun, contractUsers, randomId, @@ -39,19 +36,20 @@ import { convertPdfArrayBuffer, generatePdfName, textWidget, - multiSignEmbed, - getOriginalWH + getOriginalWH, + defaultMailBody, + defaultMailSubject, + handleDeleteWidget } from "../constant/Utils"; import RenderPdf from "../components/pdf/RenderPdf"; import "../styles/AddUser.css"; -import Title from "../components/Title"; import EditTemplate from "../components/pdf/EditTemplate"; import AddRoleModal from "../components/pdf/AddRoleModal"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import Parse from "parse"; -import { useSelector } from "react-redux"; -import PdfZoom from "../components/pdf/PdfZoom"; +import { useDispatch, useSelector } from "react-redux"; +import PdfTools from "../components/pdf/PdfTools"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; import ModalUi from "../primitives/ModalUi"; @@ -59,14 +57,30 @@ import TourContentWithBtn from "../primitives/TourContentWithBtn"; import HandleError from "../primitives/HandleError"; import LoaderWithMsg from "../primitives/LoaderWithMsg"; import LinkUserModal from "../primitives/LinkUserModal"; +import WidgetsValueModal from "../components/pdf/WidgetsValueModal"; +import Loader from "../primitives/Loader"; +import PrefillWidgetModal from "../components/pdf/PrefillWidgetsModal"; +import Alert from "../primitives/Alert"; +import LottieWithLoader from "../primitives/DotLottieReact"; +import * as utils from "../utils"; +import CustomizeMail from "../components/pdf/CustomizeMail"; +import { + resetWidgetState, + setPrefillImg +} from "../redux/reducers/widgetSlice.js"; +import ShareButton from "../primitives/ShareButton"; const TemplatePlaceholder = () => { const { t } = useTranslation(); + const journey = "Use Template"; const { templateId } = useParams(); + const dispatch = useDispatch(); + const prefillImg = useSelector((state) => state.widget.prefillImg); const divRef = useRef(null); const navigate = useNavigate(); const numPages = 1; - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); + const isShowModal = useSelector((state) => state.widget.isShowModal); const [pdfDetails, setPdfDetails] = useState([]); const [allPages, setAllPages] = useState(null); const [pageNumber, setPageNumber] = useState(1); @@ -90,7 +104,7 @@ const TemplatePlaceholder = () => { }); const [handleError, setHandleError] = useState(); const [pdfNewWidth, setPdfNewWidth] = useState(); - const [templateTour, setTemplateTour] = useState(true); + const [templateTour, setTemplateTour] = useState(false); const [checkTourStatus, setCheckTourStatus] = useState(false); const [tourStatus, setTourStatus] = useState([]); const [signerUserId, setSignerUserId] = useState(); @@ -119,11 +133,10 @@ const TemplatePlaceholder = () => { const [isModalRole, setIsModalRole] = useState(false); const [roleName, setRoleName] = useState(""); const [isAddUser, setIsAddUser] = useState({}); - const [isCreateDoc, setIsCreateDoc] = useState(false); const [isEditTemplate, setIsEditTemplate] = useState(false); const [isPageCopy, setIsPageCopy] = useState(false); const [IsReceipent, setIsReceipent] = useState(true); - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [isDragging, setIsDragging] = useState(false); const [currWidgetsDetails, setCurrWidgetsDetails] = useState([]); const [isCheckbox, setIsCheckbox] = useState(false); @@ -137,7 +150,27 @@ const TemplatePlaceholder = () => { const [updatedPdfUrl, setUpdatedPdfUrl] = useState(""); const [unSignedWidgetId, setUnSignedWidgetId] = useState(""); const [owner, setOwner] = useState({}); + const [prefillSigner, setPrefillSigner] = useState([]); + const [isPrefillModal, setIsPrefillModal] = useState(false); + const [mailStatus, setMailStatus] = useState(""); + const [isSend, setIsSend] = useState(false); + const [documentId, setDocumentId] = useState(""); + const [forms, setForms] = useState([]); + const [isUiLoading, setIsUiLoading] = useState(false); + const [isNewContact, setIsNewContact] = useState({ status: false, id: "" }); + const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); + const [isMailModal, setIsMailModal] = useState(false); + const [customizeMail, setCustomizeMail] = useState({ body: "", subject: "" }); + const [defaultMail, setDefaultMail] = useState({ body: "", subject: "" }); + const [currUserId, setCurrUserId] = useState(false); + const [documentDetails, setDocumentDetails] = useState(); + const [copied, setCopied] = useState(false); + const currentUser = localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ); + const user = currentUser && JSON.parse(currentUser); useEffect(() => { + dispatch(resetWidgetState([])); fetchTemplate(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -161,7 +194,7 @@ const TemplatePlaceholder = () => { return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [divRef.current, isHeader]); + }, [divRef.current, isSidebar]); //function to fetch tenant Details @@ -181,6 +214,28 @@ const TemplatePlaceholder = () => { const filterSignTypes = signatureType?.filter( (x) => x.enabled === true ); + if (tenantDetails?.RequestBody) { + //customize mail state is handle to when user want to customize already set tenant email format then use that format + setCustomizeMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + setDefaultMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + } else { + const defaultRequestBody = defaultMailBody; + const defaultSubject = defaultMailSubject; + setCustomizeMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + setDefaultMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + } return filterSignTypes; } } catch (e) { @@ -190,7 +245,6 @@ const TemplatePlaceholder = () => { alert(t("user-not-exist")); } }; - // `fetchTemplate` function in used to get Template from server and setPlaceholder ,setSigner if present const fetchTemplate = async () => { try { @@ -213,6 +267,14 @@ const TemplatePlaceholder = () => { : []; if (documentData && documentData.length > 0) { + const prefillImg = await utils?.savePrefillImg( + documentData[0]?.Placeholders + ); + if (prefillImg && Array.isArray(prefillImg)) { + prefillImg.forEach((img) => { + dispatch(setPrefillImg(img)); + }); + } setOwner(documentData?.[0]?.ExtUserPtr); const url = documentData[0] && documentData[0]?.URL; if (url) { @@ -247,7 +309,8 @@ const TemplatePlaceholder = () => { const placeholder = documentData[0]?.Placeholders.filter( (data) => data.Role !== "prefill" ); - setSignerPos(placeholder); + setSignerPos(documentData[0]?.Placeholders); + let signers = [...documentData[0].Signers]; signersdata.forEach((x) => { if (x.objectId) { const obj = { @@ -258,7 +321,7 @@ const TemplatePlaceholder = () => { signers.push(obj); } }); - let signers = [...documentData[0].Signers]; + let updatedSigners = placeholder.map((x) => { let matchingSigner = signers.find( (y) => x.signerObjId && x.signerObjId === y.objectId @@ -275,9 +338,18 @@ const TemplatePlaceholder = () => { return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; } }); + const prefillPlaceholder = documentData[0]?.Placeholders.find( + (data) => data.Role === "prefill" + ); + if (prefillPlaceholder) { + setPrefillSigner([utils?.prefillObj(prefillPlaceholder.Id)]); + } else { + setPrefillSigner([utils?.prefillObj()]); + } setSignersData(updatedSigners); setUniqueId(updatedSigners[0].Id); setBlockColor(updatedSigners[0].blockColor); + setIsSelectId(0); } else { const updatedSigners = documentData[0].Signers.map((x, index) => ({ ...x, @@ -287,24 +359,37 @@ const TemplatePlaceholder = () => { setSignersData(updatedSigners); setUniqueId(updatedSigners[0].Id); setBlockColor(updatedSigners[0].blockColor); + setPrefillSigner([utils?.prefillObj()]); } } else { - setRoleName("Role 1"); if ( documentData[0].Placeholders && documentData[0].Placeholders.length > 0 ) { - const placeholder = documentData[0]?.Placeholders.filter( + const prefillPlaceholder = documentData[0]?.Placeholders.find( + (data) => data.Role === "prefill" + ); + if (prefillPlaceholder) { + setPrefillSigner([utils?.prefillObj(prefillPlaceholder.Id)]); + } else { + setPrefillSigner([utils?.prefillObj()]); + } + setSignerPos(documentData[0]?.Placeholders); + const signerPlaceholder = documentData[0]?.Placeholders.filter( (data) => data.Role !== "prefill" ); - let updatedSigners = placeholder.map((x) => { - return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; - }); - setSignerPos(placeholder); - setUniqueId(updatedSigners[0].Id); - setSignersData(updatedSigners); - setIsSelectId(0); - setBlockColor(updatedSigners[0].blockColor); + if (signerPlaceholder) { + let updatedSigners = signerPlaceholder.map((x) => { + return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; + }); + setUniqueId(updatedSigners[0]?.Id); + setSignersData(updatedSigners); + setIsSelectId(0); + setBlockColor(updatedSigners[0]?.blockColor); + setRoleName("Role 1"); + } + } else { + setPrefillSigner([utils?.prefillObj()]); } } } else if ( @@ -318,17 +403,16 @@ const TemplatePlaceholder = () => { setIsLoading({ isLoad: false }); } const res = await contractUsers(); - if (res[0] && res.length) { + if (res[0] && res.length > 0) { setSignerUserId(res[0].objectId); const tourstatus = res[0].TourStatus && res[0].TourStatus; if (tourstatus && tourstatus.length > 0) { setTourStatus(tourstatus); - const checkTourRecipients = tourstatus.filter( - (data) => data.templateTour - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].templateTour); - } + const tour = tourstatus?.some((data) => data.template) || false; + setTemplateTour(!tour); + setCheckTourStatus(tour); + } else { + setTemplateTour(true); } setIsLoading({ isLoad: false }); } else if (res === "Error: Something went wrong!") { @@ -357,7 +441,8 @@ const TemplatePlaceholder = () => { const getSignerPos = (item, monitor) => { if (uniqueId) { const signer = signersdata.find((x) => x.Id === uniqueId); - if (signer) { + const prefillUser = prefillSigner.find((x) => x.Id === uniqueId); + if (signer || prefillUser) { const posZIndex = zIndex + 1; setZIndex(posZIndex); const containerScale = getContainerScale( @@ -374,8 +459,9 @@ const TemplatePlaceholder = () => { let dropData = [], dropObj, currentPagePosition, - filterSignerPos; - let placeHolder; + filterSignerPos, + placeHolder; + filterSignerPos = signerPos.find((data) => data.Id === uniqueId); if (item === "onclick") { // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div const divWidth = divRef.current.getBoundingClientRect().width; @@ -393,7 +479,11 @@ const TemplatePlaceholder = () => { scale: containerScale, zIndex: posZIndex, type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner), + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder + ), Width: widgetWidth / (containerScale * scale), Height: widgetHeight / (containerScale * scale) }; @@ -423,7 +513,11 @@ const TemplatePlaceholder = () => { // isMobile: isMobile, zIndex: posZIndex, type: item.text, - options: addWidgetOptions(dragTypeValue, owner), + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder + ), Width: widgetWidth / (containerScale * scale), Height: widgetHeight / (containerScale * scale) }; @@ -431,11 +525,7 @@ const TemplatePlaceholder = () => { dropData.push(dropObj); placeHolder = { pageNumber: pageNumber, pos: dropData }; } - if (dragTypeValue === textWidget) { - filterSignerPos = signerPos.find((data) => data.Role === "prefill"); - } else { - filterSignerPos = signerPos.find((data) => data.Id === uniqueId); - } + const getPlaceHolder = filterSignerPos?.placeHolder; if (getPlaceHolder) { //checking exist placeholder on same page @@ -452,41 +542,36 @@ const TemplatePlaceholder = () => { const newSignPos = getPos.concat(dropData); let xyPos = { pageNumber: pageNumber, pos: newSignPos }; updatePlace.push(xyPos); - let updatesignerPos; - if (dragTypeValue === textWidget) { - updatesignerPos = signerPos.map((x) => - x.Role === "prefill" ? { ...x, placeHolder: updatePlace } : x - ); - } else { - updatesignerPos = signerPos.map((x) => - x.Id === uniqueId ? { ...x, placeHolder: updatePlace } : x - ); - } + const updatesignerPos = signerPos.map((x) => + x.Id === uniqueId ? { ...x, placeHolder: updatePlace } : x + ); setSignerPos(updatesignerPos); } else { - //if condition when widget type is prefill label text widget - if (dragTypeValue === textWidget) { - //check text widgets data (prefill) already exist then and want to add text widget on new page - //create new page entry with old data and update placeholder + //condition for prefill role to attach prefill widget on multiple page first time there are no any prefill widget exist + if (roleName === "prefill") { + //if condition for prefill role only prefill object exist and placeholder empty then add prefill widget in placeholder if (filterSignerPos) { - const addPrefillData = - filterSignerPos && filterSignerPos?.placeHolder; - addPrefillData.push(placeHolder); - const updatePrefillPos = signerPos.map((x) => - x.Role === "prefill" ? { ...x, placeHolder: addPrefillData } : x + const updatesignerPos = signerPos.map((x) => + x.Id === uniqueId && x?.placeHolder + ? { ...x, placeHolder: [...x.placeHolder, placeHolder] } + : x.Id === uniqueId + ? { ...x, placeHolder: [placeHolder] } + : x ); - setSignerPos(updatePrefillPos); - } //else condition if user do not have any text widget data + setSignerPos(updatesignerPos); + } //else condition if there are no prefill role exist in array then add prefill widget in placeholder else { const prefillTextWidget = { signerPtr: {}, signerObjId: "", - blockColor: "#f58f8c", + blockColor: utils?.prefillBlockColor, placeHolder: [placeHolder], Role: "prefill", - Id: key + Id: uniqueId }; - setSignerPos((prev) => [...prev, prefillTextWidget]); + const xyPosition = signerPos || []; + xyPosition.unshift(prefillTextWidget); + setSignerPos(xyPosition); } } else { //else condition to add placeholder widgets on multiple page first time @@ -558,7 +643,7 @@ const TemplatePlaceholder = () => { const dataNewPlace = addZIndex(signerPos, key, setZIndex); let updateSignPos = [...signerPos]; updateSignPos.splice(0, updateSignPos.length, ...dataNewPlace); - const signId = signerId; //? signerId : signerObjId; + const signId = signerId ? signerId : uniqueId; const keyValue = key ? key : dragKey; const containerScale = getContainerScale( pdfOriginalWH, @@ -566,14 +651,9 @@ const TemplatePlaceholder = () => { containerWH ); if (keyValue >= 0) { - let filterSignerPos; - if (signId) { - filterSignerPos = updateSignPos.filter((data) => data.Id === signId); - } else { - filterSignerPos = updateSignPos.filter( - (data) => data.Role === "prefill" - ); - } + const filterSignerPos = updateSignPos.filter( + (data) => data.Id === signId + ); if (filterSignerPos.length > 0) { const getPlaceHolder = filterSignerPos[0].placeHolder; @@ -605,10 +685,6 @@ const TemplatePlaceholder = () => { if (obj.Id === signId) { return { ...obj, placeHolder: newUpdateSignPos }; } - } else { - if (obj.Role === "prefill") { - return { ...obj, placeHolder: newUpdateSignPos }; - } } return obj; }); @@ -619,72 +695,11 @@ const TemplatePlaceholder = () => { } setTimeout(() => setIsDragging(false), 200); }; - //function for delete signature block - const handleDeleteSign = (key, Id) => { - const updateData = []; - const filterSignerPos = signerPos.filter((data) => data.Id === Id); - - if (filterSignerPos.length > 0) { - const getPlaceHolder = filterSignerPos[0].placeHolder; - - const getPageNumer = getPlaceHolder.filter( - (data) => data.pageNumber === pageNumber - ); - - if (getPageNumer.length > 0) { - const getXYdata = getPageNumer[0].pos.filter( - (data) => data.key !== key - ); - - if (getXYdata.length > 0) { - updateData.push(getXYdata); - const newUpdatePos = getPlaceHolder.map((obj) => { - if (obj.pageNumber === pageNumber) { - return { ...obj, pos: updateData[0] }; - } - return obj; - }); - - const newUpdateSigner = signerPos.map((obj) => { - if (obj.Id === Id) { - return { ...obj, placeHolder: newUpdatePos }; - } - return obj; - }); - - setSignerPos(newUpdateSigner); - } else { - const getRemainPage = filterSignerPos[0].placeHolder.filter( - (data) => data.pageNumber !== pageNumber - ); - //condition to check placeholder length is greater than 1 do not need to remove whole placeholder - //array only resove particular widgets - if (getRemainPage && getRemainPage.length > 0) { - const newUpdatePos = filterSignerPos.map((obj) => { - if (obj.Id === Id) { - return { ...obj, placeHolder: getRemainPage }; - } - return obj; - }); - let signerupdate = []; - signerupdate = signerPos.filter((data) => data.Id !== Id); - signerupdate.push(newUpdatePos[0]); - - setSignerPos(signerupdate); - } else { - const updatedData = signerPos.map((item) => { - if (item.Id === Id) { - // Create a copy of the item object and delete the placeHolder field - const updatedItem = { ...item }; - delete updatedItem.placeHolder; - return updatedItem; - } - return item; - }); - setSignerPos(updatedData); - } - } - } + //function is used to delete widgets + const handleDeleteWidgetObj = (key, Id) => { + const res = handleDeleteWidget(key, Id, pageNumber, signerPos); + if (res) { + setSignerPos(res); } }; @@ -716,44 +731,31 @@ const TemplatePlaceholder = () => { const handleMouseLeave = () => { setSignBtnPosition([xySignature]); }; - const alertSendEmail = async () => { - const isPlaceholderExist = signerPos.every((data) => data.placeHolder); - const getPrefill = signerPos?.find((data) => data.Role === "prefill"); - const prefillPlaceholder = getPrefill?.placeHolder; - let isLabel = false; - let unfilledTextWidgetId = ""; - //condition is used to check text widget data is empty or have response - if (getPrefill && prefillPlaceholder) { - prefillPlaceholder.map((data) => { - if (!isLabel) { - const unfilledTextWidgets = data.pos.find( - (position) => !position.options.response - ); - if (unfilledTextWidgets) { - isLabel = true; - unfilledTextWidgetId = unfilledTextWidgets.key; - } - } - }); - } - if (getPrefill && isLabel) { - setUnSignedWidgetId(unfilledTextWidgetId); - } else if (isPlaceholderExist) { - handleSaveTemplate(); - } else { - const signerList = signerPos.filter( - (data) => !data.placeHolder && data.Role !== "prefill" - ); - const getSigner = signerList.map((x) => { - return signersdata.find((y) => y.Id === x.Id).Role; - }); - const signersName = getSigner.join(", "); + const handleSaveDoc = async () => { + // keep only non-prefill signers + const filterPrefill = (signerPos ?? []).filter((s) => s.Role !== "prefill"); + + // signers who don't have a signature widget (or have no placeholders at all) + const unassignedWidget = filterPrefill?.filter( + (s) => !utils?.hasSignatureWidget(s) + ); + + if (unassignedWidget?.length > 0) { + const signersName = unassignedWidget + ?.map((x) => signersdata.find((y) => y.Id === x.Id)?.Role) + ?.join(", "); setSignersName(signersName); setIsSendAlert(true); + setUniqueId(unassignedWidget[0]?.Id); + setRoleName(""); + } else if (filterPrefill && filterPrefill?.length === 0) { + setIsAddRole(true); + } else { + handleSaveTemplate(); } }; - useEffect(() => { + if (pdfDetails?.[0]?.CreatedBy?.objectId !== user?.objectId) return; const timer = setTimeout(() => { autosavedetails(); }, 2000); @@ -788,14 +790,15 @@ const TemplatePlaceholder = () => { try { const templateCls = new Parse.Object("contracts_Template"); templateCls.id = templateId; - if (signerPos?.length > 0) { - const removePrefill = signerPos.filter((x) => x.Role !== "prefill"); - if (removePrefill.length > 0) { - templateCls.set("Placeholders", removePrefill); - } + if (signerPos && signerPos?.length > 0) { + templateCls.set("Placeholders", signerPos); + } + if (signers && signers?.length > 0) { + templateCls.set("Signers", signers); + } + if (signatureType && signatureType?.length > 0) { + templateCls.set("SignatureType", signatureType); } - templateCls.set("Signers", signers); - templateCls.set("SignatureType", signatureType); if (pdfUrl) { templateCls.set("URL", pdfUrl); } @@ -821,38 +824,8 @@ const TemplatePlaceholder = () => { }; //embed prefill label widget data - const embedPrefilllData = async () => { - const prefillExist = signerPos.filter((data) => data.Role === "prefill"); - if (prefillExist && prefillExist.length > 0) { - const placeholder = prefillExist[0].placeHolder; - const existingPdfBytes = pdfArrayBuffer; - const pdfDoc = await PDFDocument.load(existingPdfBytes, { - ignoreEncryption: true - }); - const isSignYourSelfFlow = false; - try { - //pdfOriginalWH contained all pdf's pages width,height & pagenumber in array format - const pdfBase64 = await multiSignEmbed( - placeholder, - pdfDoc, - isSignYourSelfFlow, - scale - ); - const pdfName = generatePdfName(16); - const pdfUrl = await convertBase64ToFile( - pdfName, - pdfBase64, - "", - ); - const tenantId = localStorage.getItem("TenantId"); - const buffer = atob(pdfBase64); - SaveFileSize(buffer.length, pdfUrl, tenantId); - return pdfUrl; - } catch (err) { - console.log("error to convertBase64ToFile in placeholder flow", err); - alert(err?.message); - } - } else if (pdfBase64Url) { + const embedPrefilllWidgets = async () => { + if (pdfBase64Url) { try { const pdfName = generatePdfName(16); const pdfUrl = await convertBase64ToFile( @@ -879,7 +852,7 @@ const TemplatePlaceholder = () => { alert(t("only-15-reminder-allowed")); return; } - setIsLoading({ isLoad: true, message: t("loading-mssg") }); + setIsUiLoading(true); setIsSendAlert(false); let signers = [], pdfUrl; @@ -897,7 +870,7 @@ const TemplatePlaceholder = () => { } if (pdfBase64Url) { try { - pdfUrl = await embedPrefilllData(); + pdfUrl = await embedPrefilllWidgets(); setUpdatedPdfUrl(pdfUrl); } catch (e) { console.log("error to convertBase64ToFile in placeholder flow", e); @@ -916,9 +889,8 @@ const TemplatePlaceholder = () => { const RedirectUrl = pdfDetails[0]?.RedirectUrl ? { RedirectUrl: pdfDetails[0]?.RedirectUrl } : {}; - const removePrefill = signerPos.filter((x) => x?.Role !== "prefill"); const data = { - Placeholders: removePrefill, + Placeholders: signerPos, Signers: signers, Name: pdfDetails[0]?.Name || "", Note: pdfDetails[0]?.Note || "", @@ -948,9 +920,9 @@ const TemplatePlaceholder = () => { } await updateTemplate.save(); setIsCreateDocModal(true); - setIsLoading({ isLoad: false }); + setIsUiLoading(false); } catch (e) { - setIsLoading(false); + setIsUiLoading(false); alert(t("something-went-wrong-mssg")); console.log("error", e); } @@ -958,7 +930,71 @@ const TemplatePlaceholder = () => { setIsReceipent(false); } }; - + const handleCreateDocument = async () => { + try { + setIsUiLoading(true); + const res = await utils?.handleCheckPrefillCreateDoc( + signerPos, + signersdata, + setIsPrefillModal, + scale, + updatedPdfUrl, + pdfDetails, + prefillImg, + owner?.UserId?.objectId, + ); + if (res?.status === "unfilled") { + setIsUiLoading(false); + const emptyWidget = res?.emptyResponseObjects.map((item, index) => ( + <span className="font-medium" key={index}> + {item.options.name} + </span> + )); + showAlert( + "danger", + <> + The following required field(s) cannot be left empty:{" "} + {emptyWidget.map((item, index) => ( + <span key={index}> + {index > 0 && ", "} + {item} + </span> + ))} + . Please fill them out to proceed. + </>, + 6000 + ); + } else if (res?.status === "unattach signer") { + setIsUiLoading(false); + showAlert("danger", "please attach all role to signer"); + } else if (res?.status === "success") { + setDocumentId(res.id); + setIsMailModal(true); + } + } catch (e) { + console.log("error in create document function", e); + } + }; + const navigatePageToDoc = async () => { + try { + setIsUiLoading(true); + const res = await createDocument( + pdfDetails, + signerPos, + signersdata, + updatedPdfUrl + ); + if (res.status === "success") { + navigate(`/placeHolderSign/${res.id}`, { + state: { title: "Use Template" } + }); + } else { + setHandleError(t("something-went-wrong-mssg")); + } + } catch (e) { + console.log("error in createDocument function", e); + } + }; const handleDontShow = (isChecked) => { setIsDontShow(isChecked); }; @@ -966,34 +1002,36 @@ const TemplatePlaceholder = () => { //here you can add your messages in content and selector is key of particular steps const tourConfig = [ { - selector: '[data-tut="reactourAddbtn"]', + selector: '[data-tut="prefillTour"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-1")} + message={t("prefill-tour")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), position: "top", - observe: '[data-tut="reactourAddbtn--observe"]', style: { fontSize: "13px" } }, { - selector: '[data-tut="nonpresentmask"]', + selector: '[data-tut="reactourAddbtn"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-2")} + message={t("tour-mssg.template-placeholder-1")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), - position: "center", - style: { fontSize: "13px" }, - action: () => handleCloseRoleModal() + position: "top", + observe: '[data-tut="reactourAddbtn--observe"]', + style: { fontSize: "13px" } }, { selector: '[data-tut="addWidgets"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-3")} + message={t("tour-mssg.template-placeholder-2")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1001,10 +1039,11 @@ const TemplatePlaceholder = () => { style: { fontSize: "13px" } }, { - selector: '[data-tut="reactourThird"]', + selector: '[data-tut="pdftools"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-4")} + message={t("pdf-tools-tour")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1015,7 +1054,8 @@ const TemplatePlaceholder = () => { selector: '[data-tut="headerArea"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-5")} + message={t("tour-mssg.template-placeholder-3")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1027,26 +1067,25 @@ const TemplatePlaceholder = () => { //function for update TourStatus const closeTour = async () => { setTemplateTour(false); - if (isDontShow) { + setIsDontShow(true); + if (!checkTourStatus && isDontShow) { let updatedTourStatus = []; if (tourStatus.length > 0) { updatedTourStatus = [...tourStatus]; - const templatetourIndex = tourStatus.findIndex( - (obj) => obj["templateTour"] === false || obj["templateTour"] === true + const templateIndex = tourStatus.findIndex( + (obj) => obj["template"] === false || obj["template"] === true ); - if (templatetourIndex !== -1) { - updatedTourStatus[templatetourIndex] = { templateTour: true }; + if (templateIndex !== -1) { + updatedTourStatus[templateIndex] = { template: true }; } else { - updatedTourStatus.push({ templateTour: true }); + updatedTourStatus.push({ template: true }); } } else { - updatedTourStatus = [{ templateTour: true }]; + updatedTourStatus = [{ template: true }]; } - await axios - .put( - `${localStorage.getItem( - "baseUrl" - )}classes/contracts_Users/${signerUserId}`, + try { + await axios.put( + `${localStorage.getItem("baseUrl")}classes/contracts_Users/${signerUserId}`, { TourStatus: updatedTourStatus }, { headers: { @@ -1055,37 +1094,11 @@ const TemplatePlaceholder = () => { sessionToken: localStorage.getItem("accesstoken") } } - ) - .then(() => { - // const json = Listdata.data; - // const res = json.results; - }) - .catch((err) => { - console.log("axois err ", err); - }); - } - }; - - // `handleCreateDocModal` is used to create Document from template when user click on yes from modal - const handleCreateDocModal = async () => { - setIsCreateDocModal(false); - setIsCreateDoc(true); - const removePrefill = signerPos.filter((x) => x.Role !== "prefill"); - // handle create document - const res = await createDocument( - pdfDetails, - removePrefill, - signersdata, - updatedPdfUrl - ); - if (res.status === "success") { - navigate(`/placeHolderSign/${res.id}`, { - state: { title: "Use Template" } - }); - setIsCreateDoc(false); - } else { - setHandleError(t(res.id)); - setIsCreateDoc(false); + ); + setCheckTourStatus(true); + } catch (err) { + console.log("axois err ", err); + } } }; // `handleAddSigner` is used to open Add Role Modal @@ -1128,9 +1141,14 @@ const TemplatePlaceholder = () => { .filter((x) => x.Id !== Id) .map((x, i) => ({ ...x, blockColor: color[i] })); setSignersData(updateSigner); - const updatePlaceholderUser = signerPos + const prefillObject = signerPos.find((x) => x.Role === "prefill"); + const filterPrefill = signerPos.filter((x) => x.Role !== "prefill"); + const updatePlaceholderUser = filterPrefill .filter((x) => x.Id !== Id) - .map((x, i) => ({ ...x, blockColor: color[i] })); + .map((x, i) => ({ + ...x, + blockColor: color[i] + })); const index = signersdata.findIndex((x) => x.Id === Id); if (index === signersdata.length - 1) { setUniqueId(updateSigner[updateSigner.length - 1]?.Id || ""); @@ -1141,6 +1159,9 @@ const TemplatePlaceholder = () => { setIsSelectId(index); setBlockColor(color[index]); } + if (prefillObject) { + updatePlaceholderUser.unshift(prefillObject); + } setSignerPos(updatePlaceholderUser); }; @@ -1150,14 +1171,15 @@ const TemplatePlaceholder = () => { setIsAddUser({ [id]: true }); }; // `handleAddUser` is used to adduser - const handleAddUser = (data) => { + const handleAddUser = (data, id) => { + const UserId = id ? id : uniqueId; const signerPtr = { __type: "Pointer", className: "contracts_Contactbook", objectId: data.objectId }; const updatePlaceHolder = signerPos.map((x) => { - if (x.Id === uniqueId) { + if (x.Id === UserId) { return { ...x, signerPtr: signerPtr, signerObjId: data.objectId }; } return { ...x }; @@ -1165,7 +1187,7 @@ const TemplatePlaceholder = () => { setSignerPos(updatePlaceHolder); const updateSigner = signersdata.map((x) => { - if (x.Id === uniqueId) { + if (x.Id === UserId) { return { ...x, ...data, className: "contracts_Contactbook" }; } return { ...x }; @@ -1173,6 +1195,14 @@ const TemplatePlaceholder = () => { setSignersData(updateSigner); const index = signersdata.findIndex((x) => x.Id === uniqueId); setIsSelectId(index); + if (isNewContact.status) { + let newForm = [...forms]; + const label = `${data.Name}<${data.Email}>`; + const index = newForm.findIndex((x) => x.value === id); + newForm[index].label = label; + newForm[index].value = id; + setForms(newForm); + } }; // `closePopup` is used to close Add/Choose signer modal @@ -1468,13 +1498,7 @@ const TemplatePlaceholder = () => { parseInt(defaultdata?.cellCount || 5) ), validation: - isSubscribe && inputype - ? { - type: inputype, - pattern: - inputype === "regex" ? defaultdata.textvalidate : "" - } - : {}, + {}, isReadOnly: defaultdata?.isReadOnly || false, fontSize: fontSize || currWidgetsDetails?.options?.fontSize || 12, @@ -1605,7 +1629,10 @@ const TemplatePlaceholder = () => { style: { fontSize: "13px" } } ]; - + const showAlert = (type, message, duration = 1500) => { + setAlertMsg({ type: type, message: message }); + setTimeout(() => setAlertMsg({ type: "success", message: "" }), duration); + }; const textFieldTour = [ { selector: '[data-tut="IsSigned"]', @@ -1614,410 +1641,618 @@ const TemplatePlaceholder = () => { style: { fontSize: "13px" } } ]; + const copytoclipboard = (text) => { + copytoData(text); + setCopied(true); + setTimeout(() => setCopied(false), 1500); // Reset copied state after 1.5 seconds + }; + //function show signer list and share link to share signUrl + const handleShareList = () => { + const shareLinkList = []; + let signerMail = signersdata; + for (let i = 0; i < signerMail.length; i++) { + const objectId = signerMail[i].objectId; + const hostUrl = window.location.origin; + const sendMail = false; + //encode this url value `${documentId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function + const encodeBase64 = btoa( + `${documentId}/${signerMail[i].Email}/${objectId}/${sendMail}` + ); + let signPdf = `${hostUrl}/login/${encodeBase64}`; + shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); + } + return shareLinkList.map((data, ind) => { + return ( + <div + className="flex flex-row justify-between items-center mb-1" + key={ind} + > + {copied && <Alert type="success">{t("copied")}</Alert>} + <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> + {data.signerEmail} + </span> + <div className="flex flex-row items-center gap-3 "> + <button + onClick={() => copytoclipboard(data.url)} + type="button" + className="flex flex-row items-center op-link op-link-primary" + > + <i className="fa-light fa-copy" /> + <span className=" hidden md:block ml-1 ">{t("copy-link")}</span> + </button> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={data.url} + > + <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> + </ShareButton> + </div> + </div> + ); + }); + }; + const handleClosePrefillModal = () => { + setIsPrefillModal(false); + setIsCreateDocModal(true); + setIsUiLoading(false); + }; + + const handleUseButton = async () => { + setIsCreateDocModal(false); + //this function is used to open modal to show signers list + await utils?.handleDisplaySignerList(signerPos, signersdata, setForms); + setIsPrefillModal(true); + }; + + const handleRecipientSign = (docId, currUserId) => { + if (currUserId) { + navigate(`/recipientSignPdf/${docId}/${currUserId}`); + } else { + navigate(`/recipientSignPdf/${docId}`); + } + }; return ( <> - <Title title={"Template"} /> - <DndProvider backend={HTML5Backend}> - {isLoading.isLoad ? ( - <LoaderWithMsg isLoading={isLoading} /> - ) : handleError ? ( - <HandleError handleError={handleError} /> - ) : ( - <div> - <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> - {/* this component used for UI interaction and show their functionality */} - {!checkTourStatus && ( - //this tour component used in your html component where you want to put - //onRequestClose function to close tour - //steps is defined what will be your messages and style also - //isOpen is takes boolean value to open - <Tour - onRequestClose={closeTour} - steps={tourConfig} - isOpen={templateTour} - rounded={5} - closeWithMask={false} - /> - )} - {isAddRole && ( - <Tour - onRequestClose={() => setIsAddRole(false)} - steps={tourAddRole} - isOpen={isAddRole} - rounded={5} - closeWithMask={false} - /> - )} - {isSendAlert && ( - <Tour - onRequestClose={() => setIsSendAlert(false)} - steps={signatureWidgetTour} - isOpen={true} - rounded={5} - closeWithMask={false} - /> // this is the tour for add signature widget for all role - )} - {unSignedWidgetId && ( - <Tour - onRequestClose={() => setUnSignedWidgetId("")} - steps={textFieldTour} - isOpen={true} - rounded={5} - closeWithMask={false} - /> - )} + {isLoading.isLoad ? ( + <LoaderWithMsg isLoading={isLoading} /> + ) : handleError ? ( + <HandleError handleError={handleError} /> + ) : ( + <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> + {isUiLoading && ( + <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2]/80"> + <Loader /> + <span className="text-[13px]">{t("loading-mssg")}</span> + </div> + )} + {alertMsg.message && ( + <Alert type={alertMsg.type}>{alertMsg.message}</Alert> + )} + {/* + this component used for UI interaction and show their functionality + this tour component used in your html component where you want to put + onRequestClose function to close tour + steps is defined what will be your messages and style also + isOpen is takes boolean value to open + */} + <Tour + onRequestClose={closeTour} + steps={tourConfig} + isOpen={templateTour} + /> + {isAddRole && ( + <Tour + onRequestClose={() => setIsAddRole(false)} + steps={tourAddRole} + isOpen={isAddRole} + /> + )} + {isSendAlert && ( + <Tour + onRequestClose={() => setIsSendAlert(false)} + steps={signatureWidgetTour} + isOpen={true} + /> // this is the tour for add signature widget for all role + )} + {unSignedWidgetId && ( + <Tour + onRequestClose={() => setUnSignedWidgetId("")} + steps={textFieldTour} + isOpen={true} + /> + )} + + {/* this component used to render all pdf pages in left side */} + <RenderAllPdfPage + allPages={allPages} + setAllPages={setAllPages} + setPageNumber={setPageNumber} + setSignBtnPosition={setSignBtnPosition} + pageNumber={pageNumber} + pdfBase64Url={pdfBase64Url} + signedUrl={pdfDetails?.[0]?.SignedUrl || ""} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + setIsUploadPdf={setIsUploadPdf} + pdfArrayBuffer={pdfArrayBuffer} + isMergePdfBtn={true} + /> - {/* this component used to render all pdf pages in left side */} - <RenderAllPdfPage + {/* pdf render view */} + <div className="w-full md:w-[57%] flex mr-4"> + <PdfTools + clickOnZoomIn={clickOnZoomIn} + clickOnZoomOut={clickOnZoomOut} + handleRotationFun={handleRotationFun} + pdfArrayBuffer={pdfArrayBuffer} + pageNumber={pageNumber} + setPdfBase64Url={setPdfBase64Url} + setPdfArrayBuffer={setPdfArrayBuffer} + setIsUploadPdf={setIsUploadPdf} + setSignerPos={setSignerPos} + signerPos={signerPos} + userId={uniqueId} + allPages={allPages} + setAllPages={setAllPages} + setPageNumber={setPageNumber} + /> + <div className="w-full md:w-[95%]"> + <ModalUi + isOpen={!IsReceipent} + title={t("roles")} + handleClose={() => setIsReceipent(true)} + > + <div className="h-full p-[20px] text-center font-medium"> + <p>{t("template-role-alert")}</p> + </div> + </ModalUi> + {/* this modal is used show send mail message and after send mail success message */} + <ModalUi + isOpen={isCreateDocModal} + title={t("create-document")} + handleClose={() => { + setIsCreateDocModal(false); + navigate("/report/6TeaPr321t"); + }} + > + <div className="h-full p-[20px] mb-2 text-base-content"> + <p>{t("template-created-alert")}</p> + <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> + <div className="flex gap-1 flex-col md:flex-row"> + <button + onClick={() => { + handleUseButton(); + }} + type="button" + className="op-btn op-btn-sm op-btn-primary" + > + {t("use-template")} + </button> + </div> + </div> + </ModalUi> + <ModalUi + isOpen={isShowEmail} + title={t("signers-alert")} + handleClose={() => setIsShowEmail(false)} + > + <div className="h-full p-[20px]"> + <p>{t("template-creation-alert-1")}</p> + <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> + <button + onClick={() => setIsShowEmail(false)} + type="button" + className="op-btn op-btn-primary" + > + {t("ok")} + </button> + </div> + </ModalUi> + <DropdownWidgetOption + type={radioButtonWidget} + title={t("radio-group")} + showDropdown={isRadio} + setShowDropdown={setIsRadio} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <DropdownWidgetOption + type="checkbox" + title={t("checkbox")} + showDropdown={isCheckbox} + setShowDropdown={setIsCheckbox} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <DropdownWidgetOption + type="dropdown" + title={t("dropdown-options")} + showDropdown={showDropdown} + setShowDropdown={setShowDropdown} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <PlaceholderCopy + isPageCopy={isPageCopy} + setIsPageCopy={setIsPageCopy} + xyPosition={signerPos} + setXyPosition={setSignerPos} allPages={allPages} - setAllPages={setAllPages} - setPageNumber={setPageNumber} - setSignBtnPosition={setSignBtnPosition} pageNumber={pageNumber} - pdfBase64Url={pdfBase64Url} - signedUrl={pdfDetails?.[0]?.SignedUrl || ""} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} + signKey={currWidgetsDetails?.key} + Id={uniqueId} + widgetType={currWidgetsDetails?.type} + setUniqueId={setUniqueId} + /> + {/* pdf header which contain funish back button */} + <Header + completeBtnTitle={t("next")} + isPlaceholder={true} + pageNumber={pageNumber} + allPages={allPages} + changePage={changePage} + pdfDetails={pdfDetails} + signerPos={signerPos} + signersdata={signersdata} + handleSaveDoc={handleSaveDoc} + isShowHeader={true} + currentSigner={true} + setIsEditTemplate={handleEditTemplateModal} + dataTut4="reactourFour" + handleRotationFun={handleRotationFun} + clickOnZoomIn={clickOnZoomIn} + clickOnZoomOut={clickOnZoomOut} + setSignerPos={setSignerPos} setIsUploadPdf={setIsUploadPdf} pdfArrayBuffer={pdfArrayBuffer} - isMergePdfBtn={true} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + userId={uniqueId} + pdfBase64={pdfBase64Url} /> - - {/* pdf render view */} - <div className=" w-full md:w-[57%] flex mr-4"> - <PdfZoom - clickOnZoomIn={clickOnZoomIn} - clickOnZoomOut={clickOnZoomOut} - handleRotationFun={handleRotationFun} - pdfArrayBuffer={pdfArrayBuffer} - pageNumber={pageNumber} - setPdfBase64Url={setPdfBase64Url} - setPdfArrayBuffer={setPdfArrayBuffer} - setIsUploadPdf={setIsUploadPdf} - setSignerPos={setSignerPos} - signerPos={signerPos} - userId={uniqueId} - allPages={allPages} - setAllPages={setAllPages} - setPageNumber={setPageNumber} - /> - <div className="w-full md:w-[95%]"> - <ModalUi - isOpen={!IsReceipent} - title={t("roles")} - handleClose={() => setIsReceipent(true)} - > - <div className="h-full p-[20px] text-center font-medium"> - <p>{t("template-role-alert")}</p> - </div> - </ModalUi> - {/* this modal is used show send mail message and after send mail success message */} - <ModalUi - isOpen={isCreateDocModal} - title={t("create-document")} - handleClose={() => { - setIsCreateDocModal(false); - navigate("/report/6TeaPr321t"); - }} - > - <div className="h-full p-[20px] mb-2 text-base-content"> - <p>{t("template-created-alert")}</p> - <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> - <div className="flex gap-1 flex-col md:flex-row"> - <button - onClick={() => handleCreateDocModal()} - type="button" - className="op-btn op-btn-sm op-btn-primary" - > - {t("create-document")} - </button> - </div> - </div> - </ModalUi> - {isCreateDoc && <LoaderWithMsg isLoading={isLoading} />} - <ModalUi - isOpen={isShowEmail} - title={t("signers-alert")} - handleClose={() => setIsShowEmail(false)} - > - <div className="h-full p-[20px]"> - <p>{t("template-creation-alert-1")}</p> - <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> - <button - onClick={() => setIsShowEmail(false)} - type="button" - className="op-btn op-btn-primary" - > - {t("ok")} - </button> - </div> - </ModalUi> - <DropdownWidgetOption - type={radioButtonWidget} - title={t("radio-group")} - showDropdown={isRadio} - setShowDropdown={setIsRadio} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <DropdownWidgetOption - type="checkbox" - title={t("checkbox")} - showDropdown={isCheckbox} - setShowDropdown={setIsCheckbox} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <DropdownWidgetOption - type="dropdown" - title={t("dropdown-options")} - showDropdown={showDropdown} + <div ref={divRef} data-tut="reactourThird" className="h-[95%]"> + {containerWH && ( + <RenderPdf + pageNumber={pageNumber} + pdfNewWidth={pdfNewWidth} + pdfDetails={pdfDetails} + signerPos={signerPos} + successEmail={false} + numPages={numPages} + pageDetails={pageDetails} + placeholder={true} + drop={drop} + handleDeleteWidget={handleDeleteWidgetObj} + handleTabDrag={handleTabDrag} + handleStop={handleStop} + setPdfLoad={setPdfLoad} + pdfLoad={pdfLoad} + setSignerPos={setSignerPos} + containerWH={containerWH} + setIsResize={setIsResize} + setZIndex={setZIndex} + handleLinkUser={handleLinkUser} + setUniqueId={setUniqueId} + signersdata={signersdata} + setIsPageCopy={setIsPageCopy} + isDragging={isDragging} setShowDropdown={setShowDropdown} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} + setIsRadio={setIsRadio} + setIsCheckbox={setIsCheckbox} + handleNameModal={setIsNameModal} + pdfOriginalWH={pdfOriginalWH} + setScale={setScale} + scale={scale} + setIsSelectId={setIsSelectId} + pdfBase64Url={pdfBase64Url} fontSize={fontSize} setFontSize={setFontSize} + setCellCount={setCellCount} fontColor={fontColor} setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <PlaceholderCopy - isPageCopy={isPageCopy} - setIsPageCopy={setIsPageCopy} - xyPosition={signerPos} - setXyPosition={setSignerPos} - allPages={allPages} - pageNumber={pageNumber} - signKey={currWidgetsDetails?.key} - Id={uniqueId} - widgetType={currWidgetsDetails?.type} - setUniqueId={setUniqueId} - /> - {/* pdf header which contain funish back button */} - <Header - completeBtnTitle={t("next")} - isPlaceholder={true} - pageNumber={pageNumber} - allPages={allPages} - changePage={changePage} - pdfDetails={pdfDetails} - signerPos={signerPos} - signersdata={signersdata} - alertSendEmail={alertSendEmail} - isShowHeader={true} - currentSigner={true} - setIsEditTemplate={handleEditTemplateModal} - dataTut4="reactourFour" - handleRotationFun={handleRotationFun} - clickOnZoomIn={clickOnZoomIn} - clickOnZoomOut={clickOnZoomOut} - setSignerPos={setSignerPos} - setIsUploadPdf={setIsUploadPdf} - pdfArrayBuffer={pdfArrayBuffer} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} - userId={uniqueId} - pdfBase64={pdfBase64Url} + isResize={isResize} + divRef={divRef} + uniqueId={uniqueId} + unSignedWidgetId={unSignedWidgetId} + currWidgetsDetails={currWidgetsDetails} + setRoleName={setRoleName} + isShowModal={isShowModal} /> - <div - ref={divRef} - data-tut="reactourThird" - className="h-[95%]" - > - {containerWH && ( - <RenderPdf - pageNumber={pageNumber} - pdfNewWidth={pdfNewWidth} - pdfDetails={pdfDetails} - signerPos={signerPos} - successEmail={false} - numPages={numPages} - pageDetails={pageDetails} - placeholder={true} - drop={drop} - handleDeleteSign={handleDeleteSign} - handleTabDrag={handleTabDrag} - handleStop={handleStop} - setPdfLoad={setPdfLoad} - pdfLoad={pdfLoad} - setSignerPos={setSignerPos} - containerWH={containerWH} - setIsResize={setIsResize} - setZIndex={setZIndex} - handleLinkUser={handleLinkUser} - setUniqueId={setUniqueId} - signersdata={signersdata} - setIsPageCopy={setIsPageCopy} - isDragging={isDragging} - setShowDropdown={setShowDropdown} - setCurrWidgetsDetails={setCurrWidgetsDetails} - setIsRadio={setIsRadio} - setIsCheckbox={setIsCheckbox} - handleNameModal={setIsNameModal} - pdfOriginalWH={pdfOriginalWH} - setScale={setScale} - scale={scale} - setIsSelectId={setIsSelectId} - pdfBase64Url={pdfBase64Url} - fontSize={fontSize} - setFontSize={setFontSize} - setCellCount={setCellCount} - fontColor={fontColor} - setFontColor={setFontColor} - isResize={isResize} - divRef={divRef} - uniqueId={uniqueId} - unSignedWidgetId={unSignedWidgetId} - currWidgetsDetails={currWidgetsDetails} - /> - )} - </div> - </div> + )} </div> - {/* signature button */} - {isMobile ? ( - <div> + </div> + </div> + {/* signature button */} + {isMobile ? ( + <div> + <WidgetComponent + dataTut2="reactourSecond" + handleDivClick={handleDivClick} + handleMouseLeave={handleMouseLeave} + isSignYourself={false} + addPositionOfSignature={addPositionOfSignature} + signerPos={signerPos} + signersdata={signersdata} + isSelectListId={isSelectListId} + setIsSelectId={setIsSelectId} + isSigners={isSigners} + setIsShowEmail={setIsShowEmail} + setSelectedEmail={setSelectedEmail} + selectedEmail={selectedEmail} + handleAddSigner={handleAddSigner} + setUniqueId={setUniqueId} + setRoleName={setRoleName} + handleDeleteUser={handleDeleteUser} + handleRoleChange={handleRoleChange} + handleOnBlur={handleOnBlur} + title={t("roles")} + initial={true} + sendInOrder={pdfDetails[0].SendinOrder} + setSignersData={setSignersData} + blockColor={blockColor} + setBlockColor={setBlockColor} + setSignerPos={setSignerPos} + uniqueId={uniqueId} + isTemplateFlow={true} // Prefill dropdown widget should be only in template flowAdd commentMore actions + roleName={roleName} + isPrefillDropdown={true} + prefillSigner={prefillSigner} + /> + </div> + ) : ( + <div className="w-[23%] bg-base-100 min-h-screen overflow-y-auto hide-scrollbar"> + <div className="max-h-screen"> + <SignerListPlace + signerPos={signerPos} + setSignerPos={setSignerPos} + signersdata={signersdata} + isSelectListId={isSelectListId} + setRoleName={setRoleName} + setIsSelectId={setIsSelectId} + handleAddSigner={handleAddSigner} + setUniqueId={setUniqueId} + handleDeleteUser={handleDeleteUser} + handleRoleChange={handleRoleChange} + handleOnBlur={handleOnBlur} + title={t("roles")} + sendInOrder={pdfDetails[0]?.SendinOrder} + setSignersData={setSignersData} + blockColor={blockColor} + setBlockColor={setBlockColor} + uniqueId={uniqueId} + prefillSigner={prefillSigner} + setIsTour={setTemplateTour} + /> + <div data-tut="addWidgets"> <WidgetComponent - dataTut2="reactourSecond" handleDivClick={handleDivClick} handleMouseLeave={handleMouseLeave} isSignYourself={false} addPositionOfSignature={addPositionOfSignature} - signerPos={signerPos} - signersdata={signersdata} - isSelectListId={isSelectListId} - setIsSelectId={setIsSelectId} - isSigners={isSigners} - setIsShowEmail={setIsShowEmail} - setSelectedEmail={setSelectedEmail} - selectedEmail={selectedEmail} - handleAddSigner={handleAddSigner} - setUniqueId={setUniqueId} - setRoleName={setRoleName} - handleDeleteUser={handleDeleteUser} - handleRoleChange={handleRoleChange} - handleOnBlur={handleOnBlur} title={t("roles")} initial={true} - sendInOrder={pdfDetails[0].SendinOrder} - setSignersData={setSignersData} - blockColor={blockColor} - setBlockColor={setBlockColor} - setSignerPos={setSignerPos} - uniqueId={uniqueId} isTemplateFlow={true} + roleName={roleName} + Add + commentMore + actions + isPrefillDropdown={true} /> </div> - ) : ( - <div className="w-[23%] bg-base-100 min-h-screen overflow-y-auto hide-scrollbar"> - <div className="max-h-screen"> - <SignerListPlace - signerPos={signerPos} - setSignerPos={setSignerPos} - signersdata={signersdata} - isSelectListId={isSelectListId} - setRoleName={setRoleName} - setIsSelectId={setIsSelectId} - handleAddSigner={handleAddSigner} - setUniqueId={setUniqueId} - handleDeleteUser={handleDeleteUser} - handleRoleChange={handleRoleChange} - handleOnBlur={handleOnBlur} - title={t("roles")} - sendInOrder={pdfDetails[0]?.SendinOrder} - setSignersData={setSignersData} - blockColor={blockColor} - setBlockColor={setBlockColor} - uniqueId={uniqueId} - /> - <div data-tut="addWidgets"> - <WidgetComponent - handleDivClick={handleDivClick} - handleMouseLeave={handleMouseLeave} - isSignYourself={false} - addPositionOfSignature={addPositionOfSignature} - title={t("roles")} - initial={true} - isTemplateFlow={true} - /> - </div> - </div> - </div> - )} + </div> </div> - </div> - )} - <div data-tut="reactourAddbtn--observe"> - <AddRoleModal - isModalRole={isModalRole} - roleName={roleName} - signersdata={signersdata} - setRoleName={setRoleName} - handleAddRole={handleAddRole} - handleCloseRoleModal={handleCloseRoleModal} - /> - </div> - <div> - {isAddUser && isAddUser[uniqueId] && ( - <LinkUserModal - handleAddUser={handleAddUser} - uniqueId={uniqueId} - closePopup={closePopup} - signersData={signersdata} - signerPos={signerPos} - setSignerPos={setSignerPos} - setSignersData={setSignersData} - isRemove={true} - /> )} </div> - {isEditTemplate && ( - <EditTemplate - title={t("edit-template")} - handleClose={handleEditTemplateModal} - pdfbase64={pdfBase64Url} - template={pdfDetails?.[0]} - onSuccess={handleEditTemplateForm} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} + )} + <div data-tut="reactourAddbtn--observe"> + <AddRoleModal + isModalRole={isModalRole} + roleName={roleName} + signersdata={signersdata} + setRoleName={setRoleName} + handleAddRole={handleAddRole} + handleCloseRoleModal={handleCloseRoleModal} + /> + </div> + <div> + {isAddUser && isAddUser[uniqueId] && ( + <LinkUserModal + handleAddUser={handleAddUser} + uniqueId={uniqueId} + closePopup={closePopup} + signersData={signersdata} + signerPos={signerPos} + setSignerPos={setSignerPos} + setSignersData={setSignersData} + isRemove={true} + isAddYourSelfCheckbox /> )} - <WidgetNameModal - signatureType={signatureType} - widgetName={currWidgetsDetails?.options?.name} - defaultdata={currWidgetsDetails} - isOpen={isNameModal} - handleClose={handleNameModal} - handleData={handleWidgetdefaultdata} - isTextSetting={isTextSetting} - setIsTextSetting={setIsTextSetting} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} + </div> + {isEditTemplate && ( + <EditTemplate + title={t("edit-template")} + handleClose={handleEditTemplateModal} + pdfbase64={pdfBase64Url} + template={pdfDetails?.[0]} + onSuccess={handleEditTemplateForm} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + isAddYourSelfCheckbox={true} + /> + )} + <WidgetNameModal + signatureType={signatureType} + widgetName={currWidgetsDetails?.options?.name} + defaultdata={currWidgetsDetails} + isOpen={isNameModal} + handleClose={handleNameModal} + handleData={handleWidgetdefaultdata} + isTextSetting={isTextSetting} + setIsTextSetting={setIsTextSetting} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + roleName={roleName} + /> + {isPrefillModal && ( + <PrefillWidgetModal + isPrefillModal={isPrefillModal} + prefillData={signerPos.find((x) => x.Role === "prefill")} + forms={forms} + setForms={setForms} + xyPosition={signerPos} + setXyPosition={setSignerPos} + handleCreateDocument={handleCreateDocument} + handleClosePrefillModal={handleClosePrefillModal} + handleAddUser={handleAddUser} + navigatePageToDoc={navigatePageToDoc} + setIsNewContact={setIsNewContact} + isNewContact={isNewContact} + documentFlow={"template"} + docId={pdfDetails[0]?.objectId} /> - <RotateAlert - showRotateAlert={showRotateAlert.status} - setShowRotateAlert={setShowRotateAlert} - handleRemoveWidgets={handleRemovePlaceholder} + )} + {isShowModal[currWidgetsDetails?.key] && ( + <WidgetsValueModal + key={currWidgetsDetails?.key} + xyPosition={signerPos} + pageNumber={pageNumber} + setXyPosition={setSignerPos} + uniqueId={uniqueId} + setPageNumber={setPageNumber} + setCurrWidgetsDetails={setCurrWidgetsDetails} + currWidgetsDetails={currWidgetsDetails} + index={pageNumber} + isSave={true} + setUniqueId={setUniqueId} + signatureTypes={signatureType} /> - </DndProvider> + )} + <RotateAlert + showRotateAlert={showRotateAlert.status} + setShowRotateAlert={setShowRotateAlert} + handleRemoveWidgets={handleRemovePlaceholder} + /> + <CustomizeMail + setIsMailModal={setIsMailModal} + setCustomizeMail={setCustomizeMail} + documentId={documentId} + signerList={signersdata} + setIsSend={setIsSend} + setMailStatus={setMailStatus} + customizeMail={customizeMail} + defaultMail={defaultMail} + isMailModal={isMailModal} + setCurrUserId={setCurrUserId} + handleShareList={handleShareList} + setDocumentDetails={setDocumentDetails} + /> + <ModalUi + isOpen={isSend} + title={ + mailStatus === "success" + ? t("mails-sent") + : mailStatus === "quotareached" + ? t("quota-mail-head") + : t("mail-not-delivered") + } + handleClose={() => { + setIsSend(false); + navigate("/report/1MwEuxLEkF"); + }} + > + <div className="h-[100%] p-[20px] text-base-content"> + {mailStatus === "success" ? ( + <div className="text-center mb-[10px]"> + <LottieWithLoader /> + {documentDetails.SendinOrder ? ( + <p> + {currUserId + ? t("placeholder-mail-alert-you") + : t("placeholder-mail-alert", { + name: signersdata[0]?.Name + })} + </p> + ) : ( + <p>{t("placeholder-alert-4")}</p> + )} + {currUserId && <p>{t("placeholder-alert-5")}</p>} + </div> + ) : mailStatus === "quotareached" ? ( + <div className="flex flex-col gap-y-3"> + <div className="my-3">{handleShareList()}</div> + </div> + ) : ( + <div className="mb-[10px]"> + {mailStatus === "dailyquotareached" ? ( + <p>{t("daily-quota-reached")}</p> + ) : ( + <p>{t("placeholder-alert-6")}</p> + )} + {currUserId && <p className="mt-1">{t("placeholder-alert-5")}</p>} + </div> + )} + {!mailStatus && ( + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + )} + {mailStatus !== "quotareached" && ( + <div + className={ + mailStatus === "success" ? "flex justify-center mt-1" : "" + } + > + {currUserId && ( + <button + onClick={() => + handleRecipientSign(documentDetails?.objectId, currUserId) + } + type="button" + className="op-btn op-btn-primary mr-1" + > + {t("yes")} + </button> + )} + <button + onClick={() => { + navigate("/report/1MwEuxLEkF"); + }} + type="button" + className="op-btn op-btn-ghost text-base-content" + > + {currUserId ? t("no") : t("close")} + </button> + </div> + )} + </div> + </ModalUi> </> ); }; diff --git a/apps/OpenSign/src/pages/UpdateExistUserAdmin.jsx b/apps/OpenSign/src/pages/UpdateExistUserAdmin.jsx index 743238aaec..0c5138ee6c 100644 --- a/apps/OpenSign/src/pages/UpdateExistUserAdmin.jsx +++ b/apps/OpenSign/src/pages/UpdateExistUserAdmin.jsx @@ -1,9 +1,8 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Loader from "../primitives/Loader"; import Parse from "parse"; import { NavLink, useNavigate } from "react-router"; import Alert from "../primitives/Alert"; -import Title from "../components/Title"; import { useTranslation } from "react-i18next"; import { emailRegex } from "../constant/const"; const UpdateExistUserAdmin = () => { @@ -39,7 +38,7 @@ const UpdateExistUserAdmin = () => { e.preventDefault(); e.stopPropagation(); if (!emailRegex.test(formdata.email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { setIsSubmitLoading(true); try { @@ -73,7 +72,6 @@ const UpdateExistUserAdmin = () => { }; return ( <div className="h-screen flex justify-center"> - <Title title={"Add Admin"} /> {isAlert.msg && <Alert type={isAlert.type}>{isAlert.msg}</Alert>} {loader ? ( <div className="text-[grey] flex justify-center items-center text-lg md:text-2xl"> diff --git a/apps/OpenSign/src/pages/UserList.jsx b/apps/OpenSign/src/pages/UserList.jsx index 52d2d20e69..aab50554ea 100644 --- a/apps/OpenSign/src/pages/UserList.jsx +++ b/apps/OpenSign/src/pages/UserList.jsx @@ -7,10 +7,23 @@ import ModalUi from "../primitives/ModalUi"; import pad from "../assets/images/pad.svg"; import Tooltip from "../primitives/Tooltip"; import AddUser from "../components/AddUser"; -import Title from "../components/Title"; import { useTranslation } from "react-i18next"; +import DeleteUserModal from "../primitives/DeleteUserModal"; +import axios from "axios"; + +const actions = [ + { + btnId: "4741", + hoverLabel: "Delete", + btnColor: "op-btn-secondary", + btnIcon: "fa-light fa-trash", + redirectUrl: "", + action: "delete", + restrictAdmin: true + }, +]; const heading = ["Sr.No", "Name", "Email", "Phone", "Role", "Team", "Active"]; const UserList = () => { const { t } = useTranslation(); @@ -30,6 +43,11 @@ const UserList = () => { const [isActLoader, setIsActLoader] = useState({}); const [isAdmin, setIsAdmin] = useState(false); const [formHeader, setFormHeader] = useState(t("add-user")); + const [deleteUserRes, setDeleteUserRes] = useState(""); + const [deleting, setDeleting] = useState(false); + const [isActModal, setIsActModal] = useState({}); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); const recordperPage = 10; const startIndex = (currentPage - 1) * recordperPage; // user per page @@ -194,9 +212,59 @@ const UserList = () => { setIsAlert({ type, msg }); setTimeout(() => setIsAlert({ type: "success", msg: "" }), 1500); }; + + const handleDeleteAccount = async (item) => { + setDeleting(true); + if (item?.UserId?.objectId) { + const url = localStorage.getItem("baseUrl")?.replace(/\/app\/?$/, "/"); + const deleteUrl = `${url}deleteuser/${item.UserId.objectId}`; + try { + await axios.post(deleteUrl, null, { + headers: { sessiontoken: localStorage.getItem("accesstoken") } + }); + setUserList((prev) => + prev.filter((user) => user.objectId !== item.objectId) + ); + showAlert("success", t("user-deleted-successfully")); + } catch (err) { + const message = err?.response?.data?.message || err?.message; + setDeleteUserRes(message); + showAlert("danger", message); + console.log("Err in deleteuser acc", err); + } finally { + setDeleting(false); + } + } else { + showAlert("danger", t("something-went-wrong-mssg")); + setDeleteUserRes(t("something-went-wrong-mssg")); + setDeleting(false); + } + }; + const handleCloseModal = () => { + setIsActModal({}); + setDeleteUserRes(""); + setDeleting(false); + }; + + const handleActionBtn = async (act, item) => { + if (act.action === "delete") { + setIsActModal({ [`delete_${item.objectId}`]: true }); + } + }; + const handleBtnVisibility = (act, item) => { + if (act.restrictAdmin) { + return item?.objectId !== extClass?.[0]?.objectId; + } else if ( + act.restrictBtn === true && + item?.objectId === extClass?.[0]?.objectId + ) { + return true; + } else { + return true; + } + }; return ( <div className="relative"> - <Title title={isAdmin ? "Users" : "Page not found"} /> {isLoader && ( <div className="absolute w-full h-[300px] md:h-[400px] flex justify-center items-center z-30 rounded-box"> <Loader /> @@ -241,6 +309,11 @@ const UserList = () => { {t(`report-heading.${item}`)} </th> ))} + {actions?.length > 0 && ( + <th className="p-2 text-transparent pointer-events-none"> + {t("action")} + </th> + )} </tr> </thead> {userList?.length > 0 && ( @@ -315,6 +388,59 @@ const UserList = () => { ) : ( <td className="px-4 py-2 font-semibold"></td> )} + + {isAdmin && ( + <td className="px-3 py-2"> + <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> + {actions?.length > 0 && + actions.map((act, index) => ( + <React.Fragment key={index}> + {handleBtnVisibility(act, item) && ( + <div + role="button" + data-tut={act?.selector} + onClick={() => + handleActionBtn(act, item) + } + title={t( + `btnLabel.${act.hoverLabel}` + )} + className={ + act.action !== "option" + ? `${act?.btnColor || ""} op-btn op-btn-sm mr-1 ` + : "text-base-content focus:outline-none text-lg mr-2 relative" + } + > + <i className={act.btnIcon}></i> + {act.btnLabel && ( + <span className="uppercase font-medium"> + {t( + `btnLabel.${act.btnLabel}` + )} + </span> + )} + </div> + )} + <DeleteUserModal + title={t("delete-account")} + deleting={deleting} + userEmail={item?.Email} + isOpen={ + isActModal[ + "delete_" + item.objectId + ] + } + onConfirm={() => + handleDeleteAccount(item) + } + deleteRes={deleteUserRes} + handleClose={handleCloseModal} + /> + </React.Fragment> + ))} + </div> + </td> + )} </tr> ))} </tbody> diff --git a/apps/OpenSign/src/pages/UserProfile.jsx b/apps/OpenSign/src/pages/UserProfile.jsx index a3e2670a13..fd1f25e84c 100644 --- a/apps/OpenSign/src/pages/UserProfile.jsx +++ b/apps/OpenSign/src/pages/UserProfile.jsx @@ -6,8 +6,7 @@ import { Navigate, useNavigate } from "react-router"; import Parse from "parse"; import { SaveFileSize } from "../constant/saveFileSize"; import dp from "../assets/images/dp.png"; -import Title from "../components/Title"; -import sanitizeFileName from "../primitives/sanitizeFileName"; +import { sanitizeFileName } from "../utils"; import axios from "axios"; import Tooltip from "../primitives/Tooltip"; import { @@ -22,8 +21,12 @@ import SelectLanguage from "../components/pdf/SelectLanguage"; function UserProfile() { const navigate = useNavigate(); const { t } = useTranslation(); - let UserProfile = JSON.parse(localStorage.getItem("UserInformation")); - let extendUser = JSON.parse(localStorage.getItem("Extand_Class")); + let UserProfile = + localStorage.getItem("UserInformation") && + JSON.parse(localStorage.getItem("UserInformation")); + let extendUser = + localStorage.getItem("Extand_Class") && + JSON.parse(localStorage.getItem("Extand_Class")); const [parseBaseUrl] = useState(localStorage.getItem("baseUrl")); const [parseAppId] = useState(localStorage.getItem("parseAppId")); const [editmode, setEditMode] = useState(false); @@ -42,6 +45,9 @@ function UserProfile() { const [otp, setOtp] = useState(""); const [otpLoader, setOtpLoader] = useState(false); const [isEmailVerified, setIsEmailVerified] = useState(false); + const [isdeleteModal, setIsdeleteModal] = useState(false); + const [deleteUserRes, setDeleteUserRes] = useState(""); + const [isDelLoader, setIsDelLoader] = useState(false); useEffect(() => { getUserDetail(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -183,7 +189,8 @@ function UserProfile() { setImage(fileRes?.url); setpercentage(0); const tenantId = localStorage.getItem("TenantId"); - SaveFileSize(size, fileRes?.url, tenantId); + const userId = extendUser?.[0]?.UserId?.objectId; + SaveFileSize(size, fileRes?.url, tenantId, userId); return fileRes?.url; } } @@ -249,9 +256,37 @@ function UserProfile() { setJobTitle(extendUser?.[0]?.JobTitle); }; + const handleDeleteAccountBtn = () => { + const isAdmin = extendUser?.[0]?.UserRole === "contracts_Admin"; + if (!isAdmin) { + setDeleteUserRes(t("delete-action-prohibited")); + } + setIsdeleteModal(true); + }; + + const handleDeleteAccount = async (e) => { + e.preventDefault(); + setIsDelLoader(true); + try { + await Parse.Cloud.run("senddeleterequest", { + userId: Parse.User.current().id + }); + setDeleteUserRes(t("account-deletion-request-sent-via-mail")); + } catch (err) { + setDeleteUserRes(err.message); + console.log("Err in deleteuser acc", err); + } finally { + setIsDelLoader(false); + } + }; + + const handleCloseDeleteModal = () => { + setIsdeleteModal(false); + setDeleteUserRes(""); + }; + return ( <React.Fragment> - <Title title={"Profile"} /> {isLoader ? ( <div className="h-[100vh] flex justify-center items-center"> <Loader /> @@ -383,15 +418,15 @@ function UserProfile() { <span className="font-semibold">{t("is-email-verified")}:</span>{" "} <span> {isEmailVerified ? ( - "Verified" + t("verified") ) : ( <span> - Not verified( + {t("not-verified")} ( <span onClick={() => handleVerifyBtn()} className="hover:underline text-blue-600 cursor-pointer" > - verify + {t("verify")} </span> ) </span> @@ -410,13 +445,13 @@ function UserProfile() { /> </li> </ul> - <div className="flex justify-center gap-2 pt-2 pb-3 md:pt-3 md:pb-4"> + <div className="flex flex-col md:flex-row justify-center gap-2 pt-2 pb-3 md:pt-3 md:pb-4 mx-2 md:mx-0"> <button type="button" onClick={(e) => { editmode ? handleSubmit(e) : setEditMode(true); }} - className="op-btn op-btn-primary w-[100px]" + className="op-btn op-btn-primary md:w-[100px]" > {editmode ? t("save") : t("edit")} </button> @@ -431,8 +466,55 @@ function UserProfile() { > {editmode ? t("cancel") : t("change-password")} </button> + <button + onClick={() => handleDeleteAccountBtn()} + className="op-link op-link-accent text-sm mx-2" + > + {t("delete-account")} + </button> </div> </div> + {isdeleteModal && ( + <ModalUi + isOpen + title={t("delete-account")} + handleClose={handleCloseDeleteModal} + > + {isDelLoader ? ( + <div className="h-[100px] flex justify-center items-center"> + <Loader /> + </div> + ) : ( + <> + {deleteUserRes ? ( + <div className="h-[100px] p-[20px] flex justify-center items-center text-sm md:text-base"> + {deleteUserRes} + </div> + ) : ( + <form onSubmit={(e) => handleDeleteAccount(e)}> + <div className="px-6 py-3 text-base-content text-sm md:text-base"> + {t("delete-account-que")} + </div> + <div className="px-6 mb-3"> + <button + type="submit" + className="op-btn op-btn-primary w-[100px]" + > + {t("yes")} + </button> + <button + className="op-btn op-btn-secondary ml-2 w-[100px]" + onClick={handleCloseDeleteModal} + > + {t("cancel")} + </button> + </div> + </form> + )} + </> + )} + </ModalUi> + )} {isVerifyModal && ( <ModalUi isOpen diff --git a/apps/OpenSign/src/pages/VerifyDocument.jsx b/apps/OpenSign/src/pages/VerifyDocument.jsx index 70e13fec5b..8d874ac79c 100644 --- a/apps/OpenSign/src/pages/VerifyDocument.jsx +++ b/apps/OpenSign/src/pages/VerifyDocument.jsx @@ -1,61 +1,65 @@ -import React, { useState, useEffect } from 'react'; -import { useTranslation } from 'react-i18next'; -import { PDFDocument, PDFName, PDFSignature, PDFRef, PDFDict } from 'pdf-lib'; // Updated import -import * as asn1js from 'asn1js'; -import { Certificate, ContentInfo, SignedData, IssuerAndSerialNumber } from 'pkijs'; -// import * as jsrsasign from 'jsrsasign'; // Removed for dynamic loading +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { PDFDocument, PDFName, PDFSignature, PDFRef, PDFDict } from "pdf-lib"; // Updated import +import * as asn1js from "asn1js"; +import { + Certificate, + ContentInfo, + SignedData, + IssuerAndSerialNumber +} from "pkijs"; const VerifyDocument = () => { const { t } = useTranslation(); const [selectedFile, setSelectedFile] = useState(null); const [fileBuffer, setFileBuffer] = useState(null); - const [verificationResult, setVerificationResult] = useState(''); + const [verificationResult, setVerificationResult] = useState(""); const [detailedResults, setDetailedResults] = useState([]); const [collapsedSections, setCollapsedSections] = useState({}); // const [jsrsasignStatus, setJsrsasignStatus] = useState('loading'); // Removed // OID to human-readable label mapping const oidMapping = { - '2.5.4.6': 'Country', - '2.5.4.10': 'Organization', - '2.5.4.11': 'Organizational Unit', - '2.5.4.17': 'Postal Code', - '2.5.4.8': 'State', - '2.5.4.7': 'Locality', // Alternative for City - '2.5.4.9': 'City', - '2.5.4.51': 'Address', - '2.5.4.3': 'Common Name', - '2.5.4.4': 'Surname', - '2.5.4.5': 'Serial Number', - '2.5.4.12': 'Title', - '2.5.4.13': 'Description', - '2.5.4.16': 'Postal Address', - '2.5.4.18': 'Post Office Box', - '2.5.4.20': 'Telephone Number', - '1.2.840.113549.1.9.1': 'Email Address', + "2.5.4.6": "Country", + "2.5.4.10": "Organization", + "2.5.4.11": "Organizational Unit", + "2.5.4.17": "Postal Code", + "2.5.4.8": "State", + "2.5.4.7": "Locality", // Alternative for City + "2.5.4.9": "City", + "2.5.4.51": "Address", + "2.5.4.3": "Common Name", + "2.5.4.4": "Surname", + "2.5.4.5": "Serial Number", + "2.5.4.12": "Title", + "2.5.4.13": "Description", + "2.5.4.16": "Postal Address", + "2.5.4.18": "Post Office Box", + "2.5.4.20": "Telephone Number", + "1.2.840.113549.1.9.1": "Email Address", // Common alternative OIDs - 'C': 'Country', - 'O': 'Organization', - 'OU': 'Organizational Unit', - 'CN': 'Common Name', - 'ST': 'State', - 'L': 'Locality', - 'STREET': 'Address', - 'emailAddress': 'Email Address', - 'serialNumber': 'Serial Number' + C: "Country", + O: "Organization", + OU: "Organizational Unit", + CN: "Common Name", + ST: "State", + L: "Locality", + STREET: "Address", + emailAddress: "Email Address", + serialNumber: "Serial Number" }; // Function to parse certificate subject/issuer into structured data const parseCertificateInfo = (certString) => { if (!certString) return {}; - + const parsed = {}; - + // Find all OID patterns and their positions const oidPattern = /(\d+\.\d+\.\d+\.\d+|\w+)=/g; const matches = []; let match; - + while ((match = oidPattern.exec(certString)) !== null) { matches.push({ oid: match[1], @@ -63,67 +67,67 @@ const VerifyDocument = () => { equalIndex: match.index + match[1].length }); } - + // Extract value for each OID for (let i = 0; i < matches.length; i++) { const currentMatch = matches[i]; const nextMatch = matches[i + 1]; - + const valueStart = currentMatch.equalIndex + 1; // Skip the "=" character const valueEnd = nextMatch ? nextMatch.startIndex - 2 : certString.length; // -2 to remove ", " before next OID - + const value = certString.substring(valueStart, valueEnd).trim(); const label = oidMapping[currentMatch.oid] || currentMatch.oid; - + parsed[label] = value; } - + return parsed; }; // Function to determine if status should show success icon const isSuccessStatus = (status) => { - const successTerms = ['valid', 'success', 'parsed', 'verified']; - const errorTerms = ['error', 'invalid', 'failed', 'expired']; - + const successTerms = ["valid", "success", "parsed", "verified"]; + const errorTerms = ["error", "invalid", "failed", "expired"]; + const statusLower = status.toLowerCase(); - + // Check for explicit error terms first - if (errorTerms.some(term => statusLower.includes(term))) { + if (errorTerms.some((term) => statusLower.includes(term))) { return false; } - + // Check for success terms - return successTerms.some(term => statusLower.includes(term)); + return successTerms.some((term) => statusLower.includes(term)); }; // Function to determine if certificate validity should show success icon const isCertificateValid = (validityText) => { const validityLower = validityText.toLowerCase(); - + // If it contains "valid" and doesn't contain negative terms - return validityLower.includes('valid') && - !validityLower.includes('expired') && - !validityLower.includes('not yet valid') && - !validityLower.includes('invalid'); + return ( + validityLower.includes("valid") && + !validityLower.includes("expired") && + !validityLower.includes("not yet valid") && + !validityLower.includes("invalid") + ); }; // Toggle collapsible sections const toggleSection = (signatureIndex, section) => { const key = `${signatureIndex}-${section}`; - setCollapsedSections(prev => ({ + setCollapsedSections((prev) => ({ ...prev, [key]: !prev[key] })); }; - // useEffect for jsrsasign loading removed - const handleFileChange = (event) => { const file = event.target.files[0]; - if (file && file.type === 'application/pdf') { + if (file && file.type === "application/pdf") { setSelectedFile(file); - setVerificationResult(''); + setVerificationResult(""); setDetailedResults([]); const reader = new FileReader(); reader.onload = (e) => { @@ -134,14 +138,17 @@ const VerifyDocument = () => { setSelectedFile(null); setFileBuffer(null); setDetailedResults([]); - setVerificationResult(t('please-select-pdf')); + setVerificationResult(t("please-select-pdf")); } }; const parseSignature = async (pdfDoc) => { - const signatureFields = pdfDoc.getForm().getFields().filter(field => field instanceof PDFSignature); // Updated filter logic + const signatureFields = pdfDoc + .getForm() + .getFields() + .filter((field) => field instanceof PDFSignature); // Updated filter logic if (!signatureFields.length) { - return { error: t('no-signature-found') }; + return { error: t("no-signature-found") }; } const results = []; @@ -150,25 +157,25 @@ const VerifyDocument = () => { try { if (!field.acroField || !field.acroField.dict) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-acrofield-dict'), - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-acrofield-dict"), + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); - continue; + continue; } // New logic to determine the actual signature dictionary const fieldDict = field.acroField.dict; - const vEntry = fieldDict.get(PDFName.of('V')); + const vEntry = fieldDict.get(PDFName.of("V")); let actualSignatureDict = null; if (vEntry) { @@ -185,50 +192,52 @@ const VerifyDocument = () => { // Use actualSignatureDict if found, otherwise behavior might be problematic (as per existing logic) // If actualSignatureDict is null, subsequent checks for byteRangeObject etc. will fail, // leading to an error message for this signature, which is acceptable. - const signatureDict = actualSignatureDict; + const signatureDict = actualSignatureDict; // Check if signatureDict is null (meaning actualSignatureDict was not resolved) // and push an error if it is, before trying to get ByteRange or Contents. if (!signatureDict) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('signature-dictionary-not-found-or-invalid'), // New error message - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("signature-dictionary-not-found-or-invalid"), // New error message + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } - const byteRangeObject = signatureDict.get(PDFName.of('ByteRange')); + const byteRangeObject = signatureDict.get(PDFName.of("ByteRange")); let byteRange; // Will be assigned after validation // Comprehensive validation for byteRangeObject and its contents - if (!byteRangeObject || - !byteRangeObject.array || - !Array.isArray(byteRangeObject.array) || - byteRangeObject.array.length === 0 || - byteRangeObject.array.length % 2 !== 0) { + if ( + !byteRangeObject || + !byteRangeObject.array || + !Array.isArray(byteRangeObject.array) || + byteRangeObject.array.length === 0 || + byteRangeObject.array.length % 2 !== 0 + ) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-byterange'), - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-byterange"), + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } @@ -236,12 +245,13 @@ const VerifyDocument = () => { const byteRangeNumbers = []; let byteRangeIsValid = true; for (const pdfObject of byteRangeObject.array) { - if (!pdfObject || typeof pdfObject.asNumber !== 'function') { + if (!pdfObject || typeof pdfObject.asNumber !== "function") { byteRangeIsValid = false; break; } const num = pdfObject.asNumber(); - if (!Number.isFinite(num)) { // Checks for NaN, Infinity, -Infinity + if (!Number.isFinite(num)) { + // Checks for NaN, Infinity, -Infinity byteRangeIsValid = false; break; } @@ -250,43 +260,43 @@ const VerifyDocument = () => { if (!byteRangeIsValid) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-byterange'), // Or a more specific error like "ByteRange contains non-numeric values" - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-byterange"), // Or a more specific error like "ByteRange contains non-numeric values" + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } byteRange = byteRangeNumbers; // Assign the validated numbers to byteRange - const contentsObject = signatureDict.get(PDFName.of('Contents')); - if (!contentsObject || typeof contentsObject.asString !== 'function') { + const contentsObject = signatureDict.get(PDFName.of("Contents")); + if (!contentsObject || typeof contentsObject.asString !== "function") { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-contents'), - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-contents"), + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } const contents = contentsObject.asString(); - + // The old basic check can be removed now as the more specific checks above cover these cases. // if (!byteRange || !contents) { ... } @@ -298,18 +308,18 @@ const VerifyDocument = () => { if (totalSignedLength <= 0) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-byterange'), // totalSignedLength being non-positive implies invalid ByteRange - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-byterange"), // totalSignedLength being non-positive implies invalid ByteRange + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } @@ -319,131 +329,160 @@ const VerifyDocument = () => { for (let i = 0; i < byteRange.length; i += 2) { const start = byteRange[i]; - const length = byteRange[i+1]; + const length = byteRange[i + 1]; - if (start < 0 || length <= 0 || start + length > fileBuffer.byteLength) { + if ( + start < 0 || + length <= 0 || + start + length > fileBuffer.byteLength + ) { reconstructionFailed = true; break; } - pdfSignedDataBytes.set(new Uint8Array(fileBuffer.slice(start, start + length)), offset); + pdfSignedDataBytes.set( + new Uint8Array(fileBuffer.slice(start, start + length)), + offset + ); offset += length; } if (reconstructionFailed) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-byterange'), // Error during reconstruction due to invalid segment - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-byterange"), // Error during reconstruction due to invalid segment + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } - + // Remove leading/trailing null bytes from hex if present from PDF content - const pkcs7Hex = contents.trim(); - - if (!pkcs7Hex) { - results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('signature-invalid-basic'), - errorDetails: t('missing-signature-contents'), // New i18n key - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), - }); - continue; + const pkcs7Hex = contents.trim(); + + if (!pkcs7Hex) { + results.push({ + name: field.getName() || t("unnamed-signature-field"), + status: t("signature-invalid-basic"), + errorDetails: t("missing-signature-contents"), // New i18n key + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") + }); + continue; } // Convert hex string to ArrayBuffer let cmsContentBuffer; try { - cmsContentBuffer = new Uint8Array(pkcs7Hex.match(/.{1,2}/g).map(byte => parseInt(byte, 16))).buffer; + cmsContentBuffer = new Uint8Array( + pkcs7Hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)) + ).buffer; } catch (hexError) { - // console.error('Error converting hex string to ArrayBuffer:', hexError); // Removed - results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('signature-invalid-basic'), - errorDetails: t('invalid-signature-hex-format'), // New i18n key - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), - }); - continue; + // console.error('Error converting hex string to ArrayBuffer:', hexError); // Removed + results.push({ + name: field.getName() || t("unnamed-signature-field"), + status: t("signature-invalid-basic"), + errorDetails: t("invalid-signature-hex-format"), // New i18n key + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") + }); + continue; } - // Parse the CMS ContentInfo const asn1 = asn1js.fromBER(cmsContentBuffer); if (asn1.offset === -1) { // console.error('Error parsing ASN.1 from signature data'); // Removed results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('signature-invalid-basic'), - errorDetails: 'ASN.1 parsing error from signature data.', - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("signature-invalid-basic"), + errorDetails: "ASN.1 parsing error from signature data.", + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") }); continue; } const cmsContentInfo = new ContentInfo({ schema: asn1.result }); - if (String(cmsContentInfo.contentType).trim() !== String(ContentInfo.SIGNED_DATA).trim()) { - // console.error('Not a SignedData content type. Actual type:', cmsContentInfo.contentType, 'Expected:', ContentInfo.SIGNED_DATA); // Removed - results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('signature-invalid-basic'), - errorDetails: t('unsupported-signature-format-not-signeddata'), // New i18n key - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), - }); - continue; + if ( + String(cmsContentInfo.contentType).trim() !== + String(ContentInfo.SIGNED_DATA).trim() + ) { + // console.error('Not a SignedData content type. Actual type:', cmsContentInfo.contentType, 'Expected:', ContentInfo.SIGNED_DATA); // Removed + results.push({ + name: field.getName() || t("unnamed-signature-field"), + status: t("signature-invalid-basic"), + errorDetails: t("unsupported-signature-format-not-signeddata"), // New i18n key + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") + }); + continue; } - + const signedData = new SignedData({ schema: cmsContentInfo.content }); - let signerInfoText = t('signer-info-not-available'); - let certSubject = ''; - let certIssuer = ''; - let certValidity = t('cert-validity-not-checked'); - let isValid = false; + let signerInfoText = t("signer-info-not-available"); + let certSubject = ""; + let certIssuer = ""; + let certValidity = t("cert-validity-not-checked"); + let isValid = false; if (signedData.signerInfos && signedData.signerInfos.length > 0) { - const signerInfo = signedData.signerInfos[0]; + const signerInfo = signedData.signerInfos[0]; if (signedData.certificates && signedData.certificates.length > 0) { let signerCertificate = null; for (const cert of signedData.certificates) { - if (cert instanceof Certificate) { + if (cert instanceof Certificate) { const issuerAndSerialNumber = signerInfo.sid; if (issuerAndSerialNumber instanceof IssuerAndSerialNumber) { let certMatch = true; - if (cert.issuer.typesAndValues.length === issuerAndSerialNumber.issuer.typesAndValues.length) { - for (let i = 0; i < cert.issuer.typesAndValues.length; i++) { - if (cert.issuer.typesAndValues[i].type !== issuerAndSerialNumber.issuer.typesAndValues[i].type || - cert.issuer.typesAndValues[i].value.valueBlock.value !== issuerAndSerialNumber.issuer.typesAndValues[i].value.valueBlock.value) { - certMatch = false; - break; - } + if ( + cert.issuer.typesAndValues.length === + issuerAndSerialNumber.issuer.typesAndValues.length + ) { + for ( + let i = 0; + i < cert.issuer.typesAndValues.length; + i++ + ) { + if ( + cert.issuer.typesAndValues[i].type !== + issuerAndSerialNumber.issuer.typesAndValues[i].type || + cert.issuer.typesAndValues[i].value.valueBlock.value !== + issuerAndSerialNumber.issuer.typesAndValues[i].value + .valueBlock.value + ) { + certMatch = false; + break; + } } } else { - certMatch = false; + certMatch = false; } - - if (certMatch && cert.serialNumber.valueBlock.valueHexView.join('') === issuerAndSerialNumber.serialNumber.valueBlock.valueHexView.join('')) { + + if ( + certMatch && + cert.serialNumber.valueBlock.valueHexView.join("") === + issuerAndSerialNumber.serialNumber.valueBlock.valueHexView.join( + "" + ) + ) { signerCertificate = cert; break; } @@ -452,74 +491,87 @@ const VerifyDocument = () => { } if (signerCertificate) { - certSubject = signerCertificate.subject.typesAndValues.map(tv => `${tv.type}=${tv.value.valueBlock.value}`).join(', '); - certIssuer = signerCertificate.issuer.typesAndValues.map(tv => `${tv.type}=${tv.value.valueBlock.value}`).join(', '); - signerInfoText = `${t('signer')}: ${certSubject}, ${t('issuer')}: ${certIssuer}`; - + certSubject = signerCertificate.subject.typesAndValues + .map((tv) => `${tv.type}=${tv.value.valueBlock.value}`) + .join(", "); + certIssuer = signerCertificate.issuer.typesAndValues + .map((tv) => `${tv.type}=${tv.value.valueBlock.value}`) + .join(", "); + signerInfoText = `${t("signer")}: ${certSubject}, ${t("issuer")}: ${certIssuer}`; + const notBefore = signerCertificate.notBefore.value; const notAfter = signerCertificate.notAfter.value; const currentDate = new Date(); - certValidity = `${t('valid-from')} ${notBefore.toLocaleDateString()} ${t('to')} ${notAfter.toLocaleDateString()}`; + certValidity = `${t("valid-from")} ${notBefore.toLocaleDateString()} ${t("to")} ${notAfter.toLocaleDateString()}`; if (currentDate < notBefore || currentDate > notAfter) { - certValidity += ` (${t('expired-or-not-yet-valid')})`; - isValid = false; // Explicitly false if expired + certValidity += ` (${t("expired-or-not-yet-valid")})`; + isValid = false; // Explicitly false if expired } else { - certValidity += ` (${t('valid')})`; - isValid = true; + certValidity += ` (${t("valid")})`; + isValid = true; } } else { - signerInfoText = t('signer-certificate-not-found'); // New i18n key + signerInfoText = t("signer-certificate-not-found"); // New i18n key } } else { - signerInfoText = t('no-certificates-in-signature'); // New i18n key + signerInfoText = t("no-certificates-in-signature"); // New i18n key } } else { - signerInfoText = t('no-signer-info-in-pkcs7'); // Re-use existing key, or make new one + signerInfoText = t("no-signer-info-in-pkcs7"); // Re-use existing key, or make new one } results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: isValid ? t('signature-valid-basic') : t('signature-invalid-basic'), + name: field.getName() || t("unnamed-signature-field"), + status: isValid + ? t("signature-valid-basic") + : t("signature-invalid-basic"), signerInfo: signerInfoText, certificateSubject: certSubject, certificateIssuer: certIssuer, certificateValidity: certValidity, - errorDetails: !isValid && signerInfoText === t('signer-info-not-available') ? t('could-not-parse-signer-info') : undefined, // New i18n key + errorDetails: + !isValid && signerInfoText === t("signer-info-not-available") + ? t("could-not-parse-signer-info") + : undefined // New i18n key }); - } catch (e) { - console.error('Error processing signature field with pkijs:', field.getName(), e); - results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: e.message, - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + console.error( + "Error processing signature field with pkijs:", + field.getName(), + e + ); + results.push({ + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: e.message, + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") }); } } return { results }; }; - const handleVerifyDocument = async () => { // Removed jsrsasignStatus check if (!fileBuffer) { - setVerificationResult(t('please-select-file-to-verify')); + setVerificationResult(t("please-select-file-to-verify")); setDetailedResults([]); return; } - setVerificationResult(t('verification-in-progress')); + setVerificationResult(t("verification-in-progress")); setDetailedResults([]); try { // Removed window.KJUR and window.X509 check - const pdfDoc = await PDFDocument.load(fileBuffer, { ignoreEncryption: true }); + const pdfDoc = await PDFDocument.load(fileBuffer, { + ignoreEncryption: true + }); const signatureInfo = await parseSignature(pdfDoc); if (signatureInfo.error) { @@ -527,14 +579,23 @@ const VerifyDocument = () => { } else if (signatureInfo.results && signatureInfo.results.length > 0) { setDetailedResults(signatureInfo.results); // Overall status can be determined by checking if all signatures are valid - const allValid = signatureInfo.results.every(res => res.status === t('signature-valid-basic')); - setVerificationResult(allValid ? t('all-signatures-verified-convincing') : t('some-signatures-invalid-basic')); + const allValid = signatureInfo.results.every( + (res) => res.status === t("signature-valid-basic") + ); + setVerificationResult( + allValid + ? t("all-signatures-verified-convincing") + : t("some-signatures-invalid-basic") + ); } else { - setVerificationResult(t('no-signatures-processed')); // Should be caught by no-signature-found earlier + setVerificationResult(t("no-signatures-processed")); // Should be caught by no-signature-found earlier } } catch (e) { - console.error('Error during PDF processing or signature verification:', e); - setVerificationResult(`${t('error-verifying-pdf')}: ${e.message}`); + console.error( + "Error during PDF processing or signature verification:", + e + ); + setVerificationResult(`${t("error-verifying-pdf")}: ${e.message}`); setDetailedResults([]); } }; @@ -594,7 +655,7 @@ const VerifyDocument = () => { } `}</style> <h1 className="text-3xl font-bold mb-6 text-center text-base-content"> - {t('verify-document-signature')} + {t("verify-document-signature")} </h1> <div className="mb-6 p-6 border border-base-300 rounded-lg bg-base-200/30 shadow-sm"> @@ -602,7 +663,7 @@ const VerifyDocument = () => { htmlFor="document-upload" className="block text-lg font-medium text-base-content mb-2" > - {t('select-pdf-document')} + {t("select-pdf-document")} </label> <input type="file" @@ -613,7 +674,7 @@ const VerifyDocument = () => { /> {selectedFile && ( <p className="mt-2 text-sm text-base-content w-full truncate"> - {t('selected-file')}: {selectedFile.name} + {t("selected-file")}: {selectedFile.name} </p> )} </div> @@ -622,240 +683,388 @@ const VerifyDocument = () => { <button onClick={handleVerifyDocument} className="op-btn op-btn-primary op-btn-md" - disabled={!selectedFile || verificationResult === t('verification-in-progress')} + disabled={ + !selectedFile || + verificationResult === t("verification-in-progress") + } > {/* Removed jsrsasignStatus === 'loading' condition for spinner */} - {verificationResult === t('verification-in-progress') ? ( + {verificationResult === t("verification-in-progress") ? ( <span className="loading loading-spinner"></span> ) : ( - t('verify-signature') + t("verify-signature") )} </button> </div> - {verificationResult && verificationResult !== t('verification-in-progress') && ( - <div className="mt-8 p-6 border border-base-300 rounded-lg bg-base-200 shadow-md min-h-[120px] flex flex-col items-center justify-center"> - <h2 className="text-2xl font-bold mb-4 text-base-content text-center"> - {t('verification-status')} - </h2> - {verificationResult === "Document Verified: All signatures have been successfully validated." && ( - <div className="flex flex-col items-center my-4"> - <svg className="checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52"> - <circle className="checkmark__circle" cx="26" cy="26" r="25" fill="none"/> - <path className="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/> - </svg> - </div> - )} - <p className="text-lg text-base-content mb-4 text-center">{verificationResult}</p> - {detailedResults.length > 0 && ( - <div className="w-full space-y-6"> - {detailedResults.map((res, index) => { - const signerInfo = parseCertificateInfo(res.certificateSubject); - const issuerInfo = parseCertificateInfo(res.certificateIssuer); - - return ( - <div key={index} className="bg-white border border-gray-200 rounded-xl shadow-lg overflow-hidden"> - {/* Header Section */} - <div className="bg-gradient-to-r from-blue-600 to-indigo-600 text-white p-6"> - <div className="flex items-center space-x-3"> - <span className="text-2xl">🔏</span> - <div> - <h4 className="text-xl font-bold">Signature Details</h4> - <p className="text-blue-100 text-sm">Digital Certificate Information</p> + {verificationResult && + verificationResult !== t("verification-in-progress") && ( + <div className="mt-8 p-6 border border-base-300 rounded-lg bg-base-200 shadow-md min-h-[120px] flex flex-col items-center justify-center"> + <h2 className="text-2xl font-bold mb-4 text-base-content text-center"> + {t("verification-status")} + </h2> + {verificationResult === + "Document Verified: All signatures have been successfully validated." && ( + <div className="flex flex-col items-center my-4"> + <svg + className="checkmark" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 52 52" + > + <circle + className="checkmark__circle" + cx="26" + cy="26" + r="25" + fill="none" + /> + <path + className="checkmark__check" + fill="none" + d="M14.1 27.2l7.1 7.2 16.7-16.8" + /> + </svg> + </div> + )} + <p className="text-lg text-base-content mb-4 text-center"> + {verificationResult} + </p> + {detailedResults.length > 0 && ( + <div className="w-full space-y-6"> + {detailedResults.map((res, index) => { + const signerInfo = parseCertificateInfo( + res.certificateSubject + ); + const issuerInfo = parseCertificateInfo( + res.certificateIssuer + ); + + return ( + <div + key={index} + className="bg-white border border-gray-200 rounded-xl shadow-lg overflow-hidden" + > + {/* Header Section */} + <div className="bg-gradient-to-r from-blue-600 to-indigo-600 text-white p-6"> + <div className="flex items-center space-x-3"> + <span className="text-2xl">🔏</span> + <div> + <h4 className="text-xl font-bold"> + Signature Details + </h4> + <p className="text-blue-100 text-sm"> + Digital Certificate Information + </p> + </div> </div> </div> - </div> - {/* Basic Info Section */} - <div className="p-6 border-b border-gray-100"> - <div className="grid grid-cols-1 md:grid-cols-2 gap-4"> - <div> - <span className="text-sm font-medium text-gray-500 uppercase tracking-wide">Field Name</span> - <p className="mt-1 text-lg font-semibold text-gray-900 font-mono">{res.name}</p> - </div> - <div> - <span className="text-sm font-medium text-gray-500 uppercase tracking-wide">Overall Status</span> - <div className="mt-1 flex items-center space-x-2"> - <span className={`text-lg ${isSuccessStatus(res.status) ? 'text-green-600' : 'text-red-600'}`}> - {isSuccessStatus(res.status) ? '✅' : '❌'} + {/* Basic Info Section */} + <div className="p-6 border-b border-gray-100"> + <div className="grid grid-cols-1 md:grid-cols-2 gap-4"> + <div> + <span className="text-sm font-medium text-gray-500 uppercase tracking-wide"> + Field Name + </span> + <p className="mt-1 text-lg font-semibold text-gray-900 font-mono"> + {res.name} + </p> + </div> + <div> + <span className="text-sm font-medium text-gray-500 uppercase tracking-wide"> + Overall Status </span> - <span className="text-lg font-semibold text-gray-900">{res.status}</span> + <div className="mt-1 flex items-center space-x-2"> + <span + className={`text-lg ${isSuccessStatus(res.status) ? "text-green-600" : "text-red-600"}`} + > + {isSuccessStatus(res.status) ? "✅" : "❌"} + </span> + <span className="text-lg font-semibold text-gray-900"> + {res.status} + </span> + </div> </div> </div> </div> - </div> - {/* Signer Information Section */} - {Object.keys(signerInfo).length > 0 && ( - <div className="border-b border-gray-100"> - <button - onClick={() => toggleSection(index, 'signer')} - className="w-full px-6 py-4 text-left hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:bg-gray-50" - > - <div className="flex items-center justify-between"> - <div className="flex items-center space-x-3"> - <span className="text-xl">📇</span> - <h5 className="text-lg font-semibold text-gray-900">Signer Information</h5> + {/* Signer Information Section */} + {Object.keys(signerInfo).length > 0 && ( + <div className="border-b border-gray-100"> + <button + onClick={() => toggleSection(index, "signer")} + className="w-full px-6 py-4 text-left hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:bg-gray-50" + > + <div className="flex items-center justify-between"> + <div className="flex items-center space-x-3"> + <span className="text-xl">📇</span> + <h5 className="text-lg font-semibold text-gray-900"> + Signer Information + </h5> + </div> + <svg + className={`w-5 h-5 text-gray-400 transition-transform duration-200 ${ + collapsedSections[`${index}-signer`] + ? "transform rotate-180" + : "" + }`} + fill="none" + stroke="currentColor" + viewBox="0 0 24 24" + > + <path + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth={2} + d="M19 9l-7 7-7-7" + /> + </svg> </div> - <svg - className={`w-5 h-5 text-gray-400 transition-transform duration-200 ${ - collapsedSections[`${index}-signer`] ? 'transform rotate-180' : '' - }`} - fill="none" - stroke="currentColor" - viewBox="0 0 24 24" - > - <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" /> - </svg> - </div> - </button> - {!collapsedSections[`${index}-signer`] && ( - <div className="px-6 pb-6"> - <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> - {Object.entries(signerInfo).map(([label, value]) => ( - <div key={label} className="bg-gray-50 rounded-lg p-4"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide">{label}</span> - <p className="mt-1 text-sm font-mono text-gray-900 break-all">{value}</p> - </div> - ))} + </button> + {!collapsedSections[`${index}-signer`] && ( + <div className="px-6 pb-6"> + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> + {Object.entries(signerInfo).map( + ([label, value]) => ( + <div + key={label} + className="bg-gray-50 rounded-lg p-4" + > + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide"> + {label} + </span> + <p className="mt-1 text-sm font-mono text-gray-900 break-all"> + {value} + </p> + </div> + ) + )} + </div> </div> - </div> - )} - </div> - )} - - {/* Issuer Information Section */} - {Object.keys(issuerInfo).length > 0 && ( - <div className="border-b border-gray-100"> - <button - onClick={() => toggleSection(index, 'issuer')} - className="w-full px-6 py-4 text-left hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:bg-gray-50" - > - <div className="flex items-center justify-between"> - <div className="flex items-center space-x-3"> - <span className="text-xl">🏢</span> - <h5 className="text-lg font-semibold text-gray-900">Issuer Details</h5> + )} + </div> + )} + + {/* Issuer Information Section */} + {Object.keys(issuerInfo).length > 0 && ( + <div className="border-b border-gray-100"> + <button + onClick={() => toggleSection(index, "issuer")} + className="w-full px-6 py-4 text-left hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:bg-gray-50" + > + <div className="flex items-center justify-between"> + <div className="flex items-center space-x-3"> + <span className="text-xl">🏢</span> + <h5 className="text-lg font-semibold text-gray-900"> + Issuer Details + </h5> + </div> + <svg + className={`w-5 h-5 text-gray-400 transition-transform duration-200 ${ + collapsedSections[`${index}-issuer`] + ? "transform rotate-180" + : "" + }`} + fill="none" + stroke="currentColor" + viewBox="0 0 24 24" + > + <path + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth={2} + d="M19 9l-7 7-7-7" + /> + </svg> + </div> + </button> + {!collapsedSections[`${index}-issuer`] && ( + <div className="px-6 pb-6"> + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> + {Object.entries(issuerInfo).map( + ([label, value]) => ( + <div + key={label} + className="bg-gray-50 rounded-lg p-4" + > + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide"> + {label} + </span> + <p className="mt-1 text-sm font-mono text-gray-900 break-all"> + {value} + </p> + </div> + ) + )} + </div> </div> - <svg - className={`w-5 h-5 text-gray-400 transition-transform duration-200 ${ - collapsedSections[`${index}-issuer`] ? 'transform rotate-180' : '' - }`} - fill="none" - stroke="currentColor" - viewBox="0 0 24 24" - > - <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" /> - </svg> + )} + </div> + )} + + {/* Certificate Validity Section */} + {res.certificateValidity && ( + <div className="p-6 bg-gray-50"> + <div className="flex items-center space-x-3 mb-4"> + <span className="text-xl">🕒</span> + <h5 className="text-lg font-semibold text-gray-900"> + Certificate Validity + </h5> </div> - </button> - {!collapsedSections[`${index}-issuer`] && ( - <div className="px-6 pb-6"> - <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> - {Object.entries(issuerInfo).map(([label, value]) => ( - <div key={label} className="bg-gray-50 rounded-lg p-4"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide">{label}</span> - <p className="mt-1 text-sm font-mono text-gray-900 break-all">{value}</p> - </div> - ))} + <div className="bg-white rounded-lg p-4 border"> + <div className="flex items-center space-x-2"> + <span + className={`text-lg ${isCertificateValid(res.certificateValidity) ? "text-green-600" : "text-red-600"}`} + > + {isCertificateValid(res.certificateValidity) + ? "✅" + : "❌"} + </span> + <span className="text-sm font-mono text-gray-900"> + {res.certificateValidity} + </span> </div> </div> - )} - </div> - )} - - {/* Certificate Validity Section */} - {res.certificateValidity && ( - <div className="p-6 bg-gray-50"> - <div className="flex items-center space-x-3 mb-4"> - <span className="text-xl">🕒</span> - <h5 className="text-lg font-semibold text-gray-900">Certificate Validity</h5> </div> - <div className="bg-white rounded-lg p-4 border"> - <div className="flex items-center space-x-2"> - <span className={`text-lg ${isCertificateValid(res.certificateValidity) ? 'text-green-600' : 'text-red-600'}`}> - {isCertificateValid(res.certificateValidity) ? '✅' : '❌'} - </span> - <span className="text-sm font-mono text-gray-900">{res.certificateValidity}</span> - </div> + )} + + {/* Technical Details Section (if any) */} + {(res.calculatedDocumentHash || + res.messageDigestInSignature || + res.hashComparisonResult || + res.authenticatedAttributesSignatureResult || + res.errorDetails || + res.certificateSubject || + res.certificateIssuer) && ( + <div className="p-6 bg-gray-50 border-t"> + <details className="group"> + <summary className="flex items-center justify-between cursor-pointer text-sm font-medium text-gray-700 hover:text-gray-900"> + <span>🔧 Technical Details</span> + <svg + className="w-4 h-4 transition-transform group-open:rotate-180" + fill="none" + stroke="currentColor" + viewBox="0 0 24 24" + > + <path + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth={2} + d="M19 9l-7 7-7-7" + /> + </svg> + </summary> + <div className="mt-4 space-y-3"> + {/* Raw Certificate Data */} + {res.certificateSubject && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Raw Certificate Subject + </span> + <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block"> + {res.certificateSubject} + </code> + </div> + )} + {res.certificateIssuer && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Raw Certificate Issuer + </span> + <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block"> + {res.certificateIssuer} + </code> + </div> + )} + {res.calculatedDocumentHash && + res.calculatedDocumentHash !== + t("not-available") && + res.calculatedDocumentHash !== + t("not-calculated") && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Calculated Document Hash + </span> + <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block"> + {res.calculatedDocumentHash} + </code> + </div> + )} + {res.messageDigestInSignature && + res.messageDigestInSignature !== + t("not-available") && + res.messageDigestInSignature !== + t("not-found-in-signature") && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Message Digest in Signature + </span> + <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block"> + {res.messageDigestInSignature} + </code> + </div> + )} + {res.hashComparisonResult && + res.hashComparisonResult !== + t("not-performed") && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Hash Comparison + </span> + <span className="text-sm text-gray-800"> + {res.hashComparisonResult} + </span> + </div> + )} + {res.authenticatedAttributesSignatureResult && + res.authenticatedAttributesSignatureResult !== + t("not-performed") && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Attributes Signature Verification + </span> + <span className="text-sm text-gray-800"> + { + res.authenticatedAttributesSignatureResult + } + </span> + </div> + )} + {res.errorDetails && ( + <div className="bg-red-50 border border-red-200 rounded p-3"> + <span className="text-xs font-medium text-red-600 uppercase tracking-wide block mb-1"> + Error Details + </span> + <span className="text-sm text-red-800"> + {res.errorDetails} + </span> + </div> + )} + </div> + </details> </div> - </div> - )} - - {/* Technical Details Section (if any) */} - {(res.calculatedDocumentHash || res.messageDigestInSignature || res.hashComparisonResult || res.authenticatedAttributesSignatureResult || res.errorDetails || res.certificateSubject || res.certificateIssuer) && ( - <div className="p-6 bg-gray-50 border-t"> - <details className="group"> - <summary className="flex items-center justify-between cursor-pointer text-sm font-medium text-gray-700 hover:text-gray-900"> - <span>🔧 Technical Details</span> - <svg className="w-4 h-4 transition-transform group-open:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24"> - <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" /> - </svg> - </summary> - <div className="mt-4 space-y-3"> - {/* Raw Certificate Data */} - {res.certificateSubject && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Raw Certificate Subject</span> - <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block">{res.certificateSubject}</code> - </div> - )} - {res.certificateIssuer && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Raw Certificate Issuer</span> - <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block">{res.certificateIssuer}</code> - </div> - )} - {res.calculatedDocumentHash && res.calculatedDocumentHash !== t('not-available') && res.calculatedDocumentHash !== t('not-calculated') && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Calculated Document Hash</span> - <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block">{res.calculatedDocumentHash}</code> - </div> - )} - {res.messageDigestInSignature && res.messageDigestInSignature !== t('not-available') && res.messageDigestInSignature !== t('not-found-in-signature') && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Message Digest in Signature</span> - <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block">{res.messageDigestInSignature}</code> - </div> - )} - {res.hashComparisonResult && res.hashComparisonResult !== t('not-performed') && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Hash Comparison</span> - <span className="text-sm text-gray-800">{res.hashComparisonResult}</span> - </div> - )} - {res.authenticatedAttributesSignatureResult && res.authenticatedAttributesSignatureResult !== t('not-performed') && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Attributes Signature Verification</span> - <span className="text-sm text-gray-800">{res.authenticatedAttributesSignatureResult}</span> - </div> - )} - {res.errorDetails && ( - <div className="bg-red-50 border border-red-200 rounded p-3"> - <span className="text-xs font-medium text-red-600 uppercase tracking-wide block mb-1">Error Details</span> - <span className="text-sm text-red-800">{res.errorDetails}</span> - </div> - )} - </div> - </details> - </div> - )} - </div> - ); - })} - </div> - )} + )} + </div> + ); + })} + </div> + )} + </div> + )} + {verificationResult === t("verification-in-progress") && ( + <div className="mt-8 p-4 border border-base-300 rounded-lg bg-base-200 min-h-[100px] flex justify-center items-center"> + <span className="loading loading-lg loading-dots"></span> </div> )} - {verificationResult === t('verification-in-progress') && ( - <div className="mt-8 p-4 border border-base-300 rounded-lg bg-base-200 min-h-[100px] flex justify-center items-center"> - <span className="loading loading-lg loading-dots"></span> - </div> - )} {!verificationResult && !selectedFile && ( - <div className="mt-8 p-4 border border-base-300 rounded-lg bg-base-200 min-h-[100px] flex justify-center items-center"> {/* Added flex for centering */} - <p className="text-base-content/60 italic text-center">{t('verification-results-will-appear-here')}</p> - </div> + <div className="mt-8 p-4 border border-base-300 rounded-lg bg-base-200 min-h-[100px] flex justify-center items-center"> + {" "} + {/* Added flex for centering */} + <p className="text-base-content/60 italic text-center"> + {t("verification-results-will-appear-here")} + </p> + </div> )} </div> ); diff --git a/apps/OpenSign/src/polyfills.js b/apps/OpenSign/src/polyfills.js index fb63675d13..9ca76e5f23 100644 --- a/apps/OpenSign/src/polyfills.js +++ b/apps/OpenSign/src/polyfills.js @@ -13,4 +13,4 @@ if (typeof Promise.withResolvers === "undefined") { // Usage: // const { promise, resolve, reject } = Promise.withResolvers() // console.log(promise, resolve, reject) // Promise { <pending> } [Function (anonymous)] [Function (anonymous)] -// ... Do something async and then call resolve or reject! \ No newline at end of file +// ... Do something async and then call resolve or reject! diff --git a/apps/OpenSign/src/primitives/AddContact.jsx b/apps/OpenSign/src/primitives/AddContact.jsx index e73ad291a4..255b08c26b 100644 --- a/apps/OpenSign/src/primitives/AddContact.jsx +++ b/apps/OpenSign/src/primitives/AddContact.jsx @@ -9,9 +9,12 @@ const AddContact = (props) => { const [name, setName] = useState(""); const [phone, setPhone] = useState(""); const [email, setEmail] = useState(""); + const [jobTitle, setJobTitle] = useState(""); + const [company, setCompany] = useState(""); const [addYourself, setAddYourself] = useState(false); const [isLoader, setIsLoader] = useState(false); const [isUserExist, setIsUserExist] = useState(false); + const [isOptionalDetails, setIsOptionalDetails] = useState(false); useEffect(() => { checkUserExist(); @@ -26,6 +29,8 @@ const AddContact = (props) => { setName(savedUserDetails.name); setPhone(savedUserDetails?.phone || ""); setEmail(savedUserDetails.email); + setJobTitle(savedUserDetails?.jobTitle || ""); + setCompany(savedUserDetails?.company || ""); } }, [addYourself]); @@ -54,7 +59,7 @@ const AddContact = (props) => { e.preventDefault(); e.stopPropagation(); if (!emailRegex.test(email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { setIsLoader(true); const user = JSON.parse( @@ -75,7 +80,7 @@ const AddContact = (props) => { { "X-Parse-Session-Token": localStorage.getItem("accesstoken") }; - const data = { name, email, phone, tenantId }; + const data = { name, email, phone, tenantId, jobTitle, company }; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -84,15 +89,12 @@ const AddContact = (props) => { const axiosRes = await axios.post(url, data, { headers }); const contactRes = axiosRes?.data?.result || {}; if (contactRes?.objectId) { - props.details(contactRes); + props.details(contactRes, props?.newContactId); if (props.closePopup) { props.closePopup(); setIsLoader(false); // Reset the form fields - setAddYourself(false); - setName(""); - setPhone(""); - setEmail(""); + handleReset(); } } } catch (err) { @@ -114,10 +116,7 @@ const AddContact = (props) => { // Define a function to handle the "add yourself" checkbox const handleAddYourselfChange = () => { if (addYourself) { - setAddYourself(false); - setName(""); - setPhone(""); - setEmail(""); + handleReset(); } else { setAddYourself(true); } @@ -127,6 +126,8 @@ const AddContact = (props) => { setName(""); setPhone(""); setEmail(""); + setJobTitle(""); + setCompany(""); }; return ( @@ -140,7 +141,7 @@ const AddContact = (props) => { {!props?.isDisableTitle && ( <div className="text-[14px] font-[700]">{t("add-contact")}</div> )} - {isUserExist && ( + {isUserExist && props?.isAddYourSelfCheckbox && ( <div className="mb-[0.75rem] flex items-center mt-1"> <input type="checkbox" @@ -194,20 +195,63 @@ const AddContact = (props) => { className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs lowercase" /> </div> - <div className="mb-[0.75rem]"> - <label htmlFor="phone" className="text-[13px]"> - {t("phone")} - </label> - <input - type="text" - id="phone" - value={phone} - onChange={(e) => setPhone(e.target.value)} - disabled={addYourself} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - placeholder={t("phone-optional")} - /> - </div> + {isOptionalDetails && ( + <> + <div className="mb-[0.75rem]"> + <label htmlFor="phone" className="text-[13px]"> + {t("phone")} + </label> + <input + type="text" + id="phone" + value={phone} + onChange={(e) => setPhone(e.target.value)} + // disabled={addYourself} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-[0.75rem]"> + <label htmlFor="company" className="text-[13px]"> + {t("company")} + </label> + <input + type="text" + id="company" + value={company} + onChange={(e) => setCompany(e.target.value)} + // disabled={addYourself} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-[0.75rem]"> + <label htmlFor="jobTitle" className="text-[13px]"> + {t("job-title")} + </label> + <input + type="text" + id="jobTitle" + value={jobTitle} + onChange={(e) => setJobTitle(e.target.value)} + // disabled={addYourself} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> + </> + )} + <button + onClick={(e) => { + e.preventDefault(); + setIsOptionalDetails(!isOptionalDetails); + }} + className="op-link op-link-secondary no-underline hover:underline" + > + {isOptionalDetails + ? t("hide-optional-details") + : t("optional-details")} + </button> <div className="mt-6 flex justify-start gap-2"> <button type="submit" className="op-btn op-btn-primary"> diff --git a/apps/OpenSign/src/primitives/DeleteUserModal.jsx b/apps/OpenSign/src/primitives/DeleteUserModal.jsx new file mode 100644 index 0000000000..36a45d61ac --- /dev/null +++ b/apps/OpenSign/src/primitives/DeleteUserModal.jsx @@ -0,0 +1,127 @@ +import { useState, useEffect, useMemo, useRef } from "react"; +import ModalUi from "./ModalUi"; +import Loader from "./Loader"; +import { Trans, useTranslation } from "react-i18next"; + +const DeleteUserModal = ({ + isOpen, + userEmail, + deleting = false, + deleteRes, + onConfirm, + handleClose +}) => { + const { t } = useTranslation(); + const [confirmEmail, setConfirmEmail] = useState(""); + const [error, setError] = useState(null); + const inputRef = useRef(null); + + // Reset and focus when modal opens + useEffect(() => { + if (isOpen) { + setConfirmEmail(""); + setError(null); + // small timeout to ensure the modal is mounted before focusing + setTimeout(() => inputRef.current?.focus(), 50); + } + }, [isOpen]); + + // Adjust matching rule as needed (strict vs case-insensitive) + const isMatch = useMemo(() => { + const a = confirmEmail.trim().toLowerCase(); + const b = userEmail.trim().toLowerCase(); + return a.length > 0 && a === b; + }, [confirmEmail, userEmail]); + + const handleSubmit = async (e) => { + e?.preventDefault(); + e?.stopPropagation(); + setError(null); + if (!isMatch || deleting) return; + try { + await onConfirm(); + } catch (err) { + console.log("err ", err); + setError(err?.message || t("something-went-wron-mssg")); + } + }; + + return ( + <ModalUi + title={t("delete-account")} + isOpen={isOpen} + handleClose={() => !deleting && handleClose()} + > + {deleting ? ( + <div className="h-[100px] flex justify-center items-center"> + <Loader /> + </div> + ) : ( + <> + {deleteRes ? ( + <div className="h-[100px] flex justify-center items-center text-sm md:text-base"> + {deleteRes} + </div> + ) : ( + <form + className="px-6 mb-3 mt-2 text-base-content text-sm md:text-base" + onSubmit={(e) => handleSubmit(e)} + > + <p className="text-base-content"> + {t("delete-account-que-user")} + </p> + <label className="mt-2 mb-0"> + <p className="text-xs text-base-content cursor-text mb-1"> + <Trans + i18nKey={"please-type-to-confirm"} + values={{ userEmail }} + components={{ 1: <b /> }} + /> + </p> + <input + type="text" + value={confirmEmail} + onChange={(e) => setConfirmEmail(e.target.value?.trim())} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + aria-invalid={!isMatch && confirmEmail.length > 0} + required + /> + <div className="op-label h-5"> + {!isMatch && confirmEmail.length > 0 ? ( + <span className="op-label-text-alt text-error"> + {t("email-does-not-match")} + </span> + ) : ( + <span className="op-label-text-alt"> + {error ? error : <> </>} + </span> + )} + </div> + </label> + + <div className="mt-1"> + <button + type="submit" + className="op-btn op-btn-primary w-[100px]" + disabled={!isMatch || deleting} + aria-disabled={!isMatch || deleting} + title={!isMatch ? t("type-exact-email-delete") : t("delete")} + > + {t("delete")} + </button> + <button + className="op-btn op-btn-secondary ml-2 w-[100px]" + onClick={handleClose} + > + {t("cancel")} + </button> + </div> + </form> + )} + </> + )} + </ModalUi> + ); +}; + +export default DeleteUserModal; diff --git a/apps/OpenSign/src/primitives/DownloadPdfZip.jsx b/apps/OpenSign/src/primitives/DownloadPdfZip.jsx index f6e59d21e7..19199709e3 100644 --- a/apps/OpenSign/src/primitives/DownloadPdfZip.jsx +++ b/apps/OpenSign/src/primitives/DownloadPdfZip.jsx @@ -5,7 +5,7 @@ import { getSignedUrl, handleDownloadCertificate, handleDownloadPdf, - sanitizeFileName + fileNameWithUnderscore } from "../constant/Utils"; import Loader from "./Loader"; import JSZip from "jszip"; @@ -67,7 +67,7 @@ function DownloadPdfZip(props) { const pdf2Blob = await pdf2Response.blob(); // Add files to ZIP zip.file( - `${sanitizeFileName(pdfName)}_signed_by_${appName}.pdf`, + `${fileNameWithUnderscore(pdfName)}_signed_by_${appName}.pdf`, pdf1Blob ); zip.file(`Certificate_signed_by_${appName}.pdf`, pdf2Blob); @@ -75,13 +75,17 @@ function DownloadPdfZip(props) { const zipBlob = await zip.generateAsync({ type: "blob" }); saveAs( zipBlob, - `${sanitizeFileName(pdfName)}_signed_by_${appName}.zip` + `${fileNameWithUnderscore(pdfName)}_signed_by_${appName}.zip` ); setSelectType(1); props.setIsDownloadModal(false); setIsDownloading(""); } catch (error) { - console.error("Error creating ZIP file:", error); + alert(t("something-went-wrong-mssg")); + setSelectType(1); + props.setIsDownloadModal(false); + setIsDownloading(""); + console.log("Error creating ZIP file:", error); } } }; diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.jsx b/apps/OpenSign/src/primitives/GetReportDisplay.jsx deleted file mode 100644 index 2ae4b1ff81..0000000000 --- a/apps/OpenSign/src/primitives/GetReportDisplay.jsx +++ /dev/null @@ -1,2617 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import pad from "../assets/images/pad.svg"; -import recreatedoc from "../assets/images/recreatedoc.png"; -import { Link, useLocation, useNavigate } from "react-router"; -import axios from "axios"; -import ModalUi from "./ModalUi"; -import AddSigner from "../components/AddSigner"; -import { - emailRegex, - iconColor, -} from "../constant/const"; -import Alert from "./Alert"; -import Tooltip from "./Tooltip"; -import ShareButton from "./ShareButton"; -import Tour from "../primitives/Tour"; -import Parse from "parse"; -import { - copytoData, - fetchUrl, - formatDate, - formatDateTime, - getSignedUrl, - getTenantDetails, - handleSignatureType, - replaceMailVaribles, - signatureTypes, - openInNewTab -} from "../constant/Utils"; -import EditorToolbar, { - module1, - formats -} from "../components/pdf/EditorToolbar"; -import ReactQuill from "react-quill-new"; -import "../styles/quill.css"; -import BulkSendUi from "../components/BulkSendUi"; -import Loader from "./Loader"; -import { serverUrl_fn } from "../constant/appinfo"; -import { useTranslation } from "react-i18next"; -import DownloadPdfZip from "./DownloadPdfZip"; -import * as XLSX from "xlsx"; -import EditContactForm from "../components/EditContactForm"; -import { useElSize } from "../hook/useElSize"; - -const ReportTable = (props) => { - const copyUrlRef = useRef(null); - const titleRef = useRef(null); - const titleElement = useElSize(titleRef); - const appName = - "OpenSign™"; - const drivename = appName === "OpenSign™" ? "OpenSign™" : ""; - const { t } = useTranslation(); - const navigate = useNavigate(); - const location = useLocation(); - const isDashboard = - location?.pathname === "/dashboard/35KBoSgoAK" ? true : false; - const [currentPage, setCurrentPage] = useState(1); - const [actLoader, setActLoader] = useState({}); - const [isContactform, setIsContactform] = useState(false); - const [isDeleteModal, setIsDeleteModal] = useState({}); - const [isRevoke, setIsRevoke] = useState({}); - const [isShare, setIsShare] = useState({}); - const [shareUrls, setShareUrls] = useState([]); - const [copied, setCopied] = useState(false); - const [isOption, setIsOption] = useState({}); - const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); - const [isTour, setIsTour] = useState(false); - const [tourStatusArr, setTourStatusArr] = useState([]); - const [isResendMail, setIsResendMail] = useState({}); - const [mail, setMail] = useState({ subject: "", body: "" }); - const [userDetails, setUserDetails] = useState({}); - const [isNextStep, setIsNextStep] = useState({}); - const [isBulkSend, setIsBulkSend] = useState({}); - const [templateDeatils, setTemplateDetails] = useState({}); - const [placeholders, setPlaceholders] = useState([]); - const [isLoader, setIsLoader] = useState({}); - const [isShareWith, setIsShareWith] = useState({}); - const [selectedTeam, setSelectedTeam] = useState([]); - const [isViewShare, setIsViewShare] = useState({}); - const [isModal, setIsModal] = useState({}); - const [reason, setReason] = useState(""); - const [isDownloadModal, setIsDownloadModal] = useState(false); - const [signatureType, setSignatureType] = useState([]); - const [expiryDate, setExpiryDate] = useState(""); - const Extand_Class = localStorage.getItem("Extand_Class"); - const extClass = Extand_Class && JSON.parse(Extand_Class); - const [importedData, setImportedData] = useState([]); - const [currentImportPage, setCurrentImportPage] = useState(1); - const [isShowAllSigners, setIsShowAllSigners] = useState({}); - const [invalidRecords, setInvalidRecords] = useState(0); - const [renameDoc, setRenameDoc] = useState(""); - const [contact, setContact] = useState({ Name: "", Email: "", Phone: "" }); - const [isSuccess, setIsSuccess] = useState({}); - const [templateId, setTemplateId] = useState(""); - const [sortOrder, setSortOrder] = useState("asc"); - const isTemplateReport = props.ReportName === "Templates"; - const recordsPerPage = 5; - const startIndex = (currentPage - 1) * props.docPerPage; - const { isMoreDocs, setIsNextRecord } = props; - - useEffect(() => { - if (props.isSearchResult) { - setCurrentPage(1); - } - }, [props.isSearchResult]); - - const getPaginationRange = () => { - const totalPageNumbers = 7; // Adjust this value to show more/less page numbers - const pages = []; - const totalPages = Math.ceil(props.List.length / props.docPerPage); - if (totalPages <= totalPageNumbers) { - for (let i = 1; i <= totalPages; i++) { - pages.push(i); - } - } else { - const leftSiblingIndex = Math.max(currentPage - 1, 1); - const rightSiblingIndex = Math.min(currentPage + 1, totalPages); - - const showLeftDots = leftSiblingIndex > 2; - const showRightDots = rightSiblingIndex < totalPages - 2; - - const firstPageIndex = 1; - const lastPageIndex = totalPages; - - if (!showLeftDots && showRightDots) { - let leftItemCount = 3; - let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); - - pages.push(...leftRange); - pages.push("..."); - pages.push(totalPages); - } else if (showLeftDots && !showRightDots) { - let rightItemCount = 3; - let rightRange = Array.from( - { length: rightItemCount }, - (_, i) => totalPages - rightItemCount + i + 1 - ); - - pages.push(firstPageIndex); - pages.push("..."); - pages.push(...rightRange); - } else if (showLeftDots && showRightDots) { - let middleRange = Array.from( - { length: 3 }, - (_, i) => leftSiblingIndex + i - ); - - pages.push(firstPageIndex); - pages.push("..."); - pages.push(...middleRange); - pages.push("..."); - pages.push(lastPageIndex); - } - } - - return pages; - }; - const showAlert = (type, message, time = 1500) => { - setAlertMsg({ type: type, message: message }); - setTimeout(() => setAlertMsg({ type: "", message: "" }), time); - }; - const pageNumbers = getPaginationRange(); - // below useEffect reset currenpage to 1 if user change route - useEffect(() => { - checkTourStatus(); - fetchTeamList(); - return () => setCurrentPage(1); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - // `fetchTeamList` is used to fetch team list for share with functionality - const fetchTeamList = async () => { - if (isTemplateReport) { - try { - const extUser = JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; - if (extUser?.OrganizationId?.objectId) { - const teamtRes = await Parse.Cloud.run("getteams", { active: true }); - if (teamtRes.length > 0) { - const _teamRes = JSON.parse(JSON.stringify(teamtRes)); - const selected = _teamRes.map( - (x) => - x.Name === "All Users" && { - label: x.Name, - value: x.objectId - } - ); - setSelectedTeam(selected); - } - } - } catch (err) { - console.log("Err in fetch top level teamlist", err); - } - } - }; - // `formatRow` is used to show data in poper manner like - // if data is of array type then it will join array items with "," - // if data is of object type then it Name values will be show in row - // if no data available it will show hyphen "-" - const formatRow = (row) => { - if (Array.isArray(row)) { - let updateArr = row.map((x) => x.Name); - return updateArr.join(", "); - } else if (typeof row === "object" && row !== null) { - return row?.Name || "-"; - } else { - return "-"; - } - }; - // below useEffect is used to render next record if IsMoreDoc is true - // second last value of pageNumber array is same as currentPage - useEffect(() => { - if (isMoreDocs && pageNumbers[pageNumbers.length - 1] === currentPage) { - setIsNextRecord(true); - } - }, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]); - - //function to fetch tenant Details - const fetchTenantDetails = async () => { - const user = JSON.parse( - localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ) - ); - if (user) { - try { - const tenantDetails = await getTenantDetails(user?.objectId); - if (tenantDetails && tenantDetails === "user does not exist!") { - alert(t("user-not-exist")); - } else if (tenantDetails) { - const signatureType = tenantDetails?.SignatureType || []; - const filterSignTypes = signatureType?.filter( - (x) => x.enabled === true - ); - return filterSignTypes; - } - } catch (e) { - alert(t("user-not-exist")); - } - } else { - alert(t("user-not-exist")); - } - }; - - // `handleURL` is used to open microapp - const handleURL = async (item, act) => { - if (isTemplateReport) { - if (act.hoverLabel === "Edit") { - navigate(`/${act.redirectUrl}/${item.objectId}`); - } else { - setActLoader({ [`${item.objectId}_${act.btnId}`]: true }); - handleUseTemplate(item.objectId, act.redirectUrl); - } - } else { - navigate(`/${act.redirectUrl}?docId=${item?.objectId}`); - } - }; - - const handleUseTemplate = async (templateId, redirectUrl) => { - try { - const params = { templateId: templateId }; - const templateDeatils = await axios.post( - `${localStorage.getItem("baseUrl")}functions/getTemplate`, - params, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - } - } - ); - const templateData = templateDeatils.data && templateDeatils.data.result; - if (!templateData.error) { - const Doc = templateData; - - let signers = []; - if (Doc.Signers?.length > 0) { - Doc.Signers?.forEach((x) => { - if (x.objectId) { - signers.push({ - __type: "Pointer", - className: "contracts_Contactbook", - objectId: x.objectId - }); - } - }); - } - - let extUserId = Doc.ExtUserPtr.objectId; - let creatorId = Doc.CreatedBy.objectId; - if (extClass && extClass.length > 0) { - if (Doc.ExtUserPtr?.objectId !== extClass[0].objectId) { - const Extand_Class = localStorage.getItem("Extand_Class"); - const extClass = Extand_Class && JSON.parse(Extand_Class); - if (extClass && extClass.length > 0) { - extUserId = extClass[0].objectId; - creatorId = extClass[0]?.UserId.objectId; - } - } - } - const tenantSignTypes = await fetchTenantDetails(); - const docSignTypes = Doc?.SignatureType || signatureTypes; - const updatedSignatureType = await handleSignatureType( - tenantSignTypes, - docSignTypes - ); - const SignatureType = - updatedSignatureType.length > 0 - ? { SignatureType: updatedSignatureType } - : {}; - const NotifyOnSignatures = - Doc?.NotifyOnSignatures !== undefined - ? { NotifyOnSignatures: Doc.NotifyOnSignatures } - : {}; - const Bcc = Doc?.Bcc?.length > 0 ? { Bcc: Doc?.Bcc } : {}; - const RedirectUrl = Doc?.RedirectUrl - ? { RedirectUrl: Doc?.RedirectUrl } - : {}; - const TemplateId = Doc?.objectId - ? { - TemplateId: { - __type: "Pointer", - className: "contracts_Template", - objectId: Doc?.objectId - } - } - : {}; - let placeholdersArr = []; - if (Doc.Placeholders?.length > 0) { - placeholdersArr = Doc.Placeholders; - const data = { - Name: Doc.Name, - URL: Doc.URL, - SignedUrl: Doc.SignedUrl, - SentToOthers: Doc?.SentToOthers || false, - Description: Doc.Description, - Note: Doc.Note, - Placeholders: placeholdersArr, - ExtUserPtr: { - __type: "Pointer", - className: "contracts_Users", - objectId: extUserId - }, - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: creatorId - }, - Signers: signers, - SendinOrder: Doc?.SendinOrder || false, - AutomaticReminders: Doc?.AutomaticReminders || false, - RemindOnceInEvery: Doc?.RemindOnceInEvery || 5, - IsEnableOTP: Doc?.IsEnableOTP || false, - TimeToCompleteDays: parseInt(Doc?.TimeToCompleteDays) || 15, - AllowModifications: Doc?.AllowModifications || false, - ...SignatureType, - ...NotifyOnSignatures, - ...Bcc, - ...RedirectUrl, - ...TemplateId - }; - try { - const res = await axios.post( - `${localStorage.getItem("baseUrl")}classes/contracts_Document`, - data, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ); - if (res.data && res.data.objectId) { - setActLoader({}); - navigate(`/${redirectUrl}/${res.data.objectId}`, { - state: { title: "Use Template" } - }); - } - } catch (err) { - console.log("Err", err); - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - } - } else { - setActLoader({}); - } - } else { - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - } - } catch (err) { - console.log("err", err); - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - } - }; - const handleActionBtn = async (act, item) => { - if (act.action === "redirect") { - handleURL(item, act); - } else if (act.action === "delete") { - setIsDeleteModal({ [item.objectId]: true }); - } else if (act.action === "share") { - handleShare(item); - } else if (act.action === "revoke") { - setIsRevoke({ [item.objectId]: true }); - } else if (act.action === "option") { - setIsOption({ [item.objectId]: !isOption[item.objectId] }); - } else if (act.action === "resend") { - setIsResendMail({ [item.objectId]: true }); - } else if (act.action === "bulksend") { - handleBulkSend(item); - } else if (act.action === "sharewithteam") { - if (item?.SharedWith && item?.SharedWith.length > 0) { - // below code is used to get existing sharewith teams and formated them as per react-select - const formatedList = item?.SharedWith.map((x) => ({ - label: x.Name, - value: x.objectId - })); - setSelectedTeam(formatedList); - } - setIsShareWith({ [item.objectId]: true }); - } - else if (act.action === "duplicate") { - setIsModal({ [`duplicate_${item.objectId}`]: true }); - } else if (act.action === "rename") { - setIsModal({ [`rename_${item.objectId}`]: true }); - } else if (act.action === "edit") { - setContact(item); - setIsModal({ [`edit_${item.objectId}`]: true }); - } else if (act.action === "saveastemplate") { - setIsModal({ [`saveastemplate_${item.objectId}`]: true }); - } else if (act.action === "recreatedocument") { - setIsModal({ [`recreatedocument_${item.objectId}`]: true }); - } else if (act.action === "extendexpiry") { - setIsModal({ [`extendexpiry_${item.objectId}`]: true }); - } - }; - // Get current list - const indexOfLastDoc = currentPage * props.docPerPage; - const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; - const sortedList = React.useMemo(() => { - if (props.ReportName === "Contactbook") { - const contacts = [...props.List]; - contacts.sort((a, b) => { - const nameA = a?.Name?.toLowerCase() || ""; - const nameB = b?.Name?.toLowerCase() || ""; - if (nameA < nameB) return sortOrder === "asc" ? -1 : 1; - if (nameA > nameB) return sortOrder === "asc" ? 1 : -1; - return 0; - }); - return contacts; - } - return props.List; - }, [props.List, sortOrder, props.ReportName]); - - const currentList = sortedList?.slice(indexOfFirstDoc, indexOfLastDoc); - - // Change page - const paginateFront = () => { - const lastValue = pageNumbers?.[pageNumbers?.length - 1]; - if (currentPage < lastValue) { - setCurrentPage(currentPage + 1); - } - }; - - const paginateBack = () => { - if (startIndex > 0) { - setCurrentPage(currentPage - 1); - } - }; - - const handleContactFormModal = () => { - setIsContactform(!isContactform); - }; - - const toggleSortOrder = () => { - setSortOrder(sortOrder === "asc" ? "desc" : "asc"); - }; - - const handleUserData = (data) => { - props.setList((prevData) => [data, ...prevData]); - }; - - const handleDelete = async (item) => { - setIsDeleteModal({}); - setActLoader({ [`${item.objectId}`]: true }); - const clsObj = { - Contactbook: "contracts_Contactbook", - Templates: "contracts_Template" - }; - try { - const serverUrl = serverUrl_fn(); - const cls = clsObj[props.ReportName] || "contracts_Document"; - const url = serverUrl + `/classes/${cls}/`; - const body = - props.ReportName === "Contactbook" - ? { IsDeleted: true } - : { IsArchive: true }; - const res = await axios.put(url + item.objectId, body, { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - }); - if (res.data && res.data.updatedAt) { - setActLoader({}); - showAlert("success", t("record-delete-alert")); - const upldatedList = props.List.filter( - (x) => x.objectId !== item.objectId - ); - props.setList(upldatedList); - } - } catch (err) { - console.log("err", err); - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - } - }; - const handleClose = ( - ) => { - setIsRevoke({}); - setIsDeleteModal({}); - setReason(""); - }; - const handleShare = (item) => { - setActLoader({ [item.objectId]: true }); - const host = window.location.origin; - const sendMail = item?.SendMail || false; - const getUrl = (x) => { - //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function - if (x?.signerObjId) { - const encodeBase64 = btoa( - `${item.objectId}/${x.signerPtr.Email}/${x.signerPtr.objectId}/${sendMail}` - ); - return `${host}/login/${encodeBase64}`; - } else { - const encodeBase64 = btoa(`${item.objectId}/${x.email}`); - return `${host}/login/${encodeBase64}`; - } - }; - const urls = item?.Placeholders?.map((x) => ({ - email: x.email ? x.email : x.signerPtr.Email, - url: getUrl(x) - })); - setShareUrls(urls); - setIsShare({ [item.objectId]: true }); - }; - - const copytoclipboard = (share) => { - copytoData(share.url); - if (copyUrlRef.current) { - copyUrlRef.current.textContent = share.url; // Update text safely - } - setCopied({ ...copied, [share.email]: true }); - }; - //function to handle revoke/decline docment - const handleRevoke = async (item) => { - const senderUser = localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ); - const jsonSender = JSON.parse(senderUser); - setIsRevoke({}); - setActLoader({ [`${item.objectId}`]: true }); - const data = { - IsDeclined: true, - DeclineReason: reason, - DeclineBy: { - __type: "Pointer", - className: "_User", - objectId: jsonSender?.objectId - } - }; - await axios - .put( - `${localStorage.getItem("baseUrl")}classes/contracts_Document/${ - item.objectId - }`, - data, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then(async (result) => { - const res = result.data; - if (res) { - setActLoader({}); - showAlert("success", t("record-revoke-alert")); - const upldatedList = props.List.filter( - (x) => x.objectId !== item.objectId - ); - props.setList(upldatedList); - } - setReason(""); - }) - .catch((err) => { - console.log("err", err); - setReason(""); - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - }); - }; - - async function checkTourStatus() { - const cloudRes = await Parse.Cloud.run("getUserDetails"); - if (cloudRes) { - const extUser = JSON.parse(JSON.stringify(cloudRes)); - localStorage.setItem("Extand_Class", JSON.stringify([extUser])); - const tourStatus = extUser?.TourStatus || []; - setTourStatusArr(tourStatus); - const templateTour = tourStatus.find( - (obj) => obj.templateTour - )?.templateTour; - setIsTour(!templateTour); - } else { - setIsTour(true); - } - } - - const closeTour = async () => { - setIsTour(false); - if (props.isDontShow) { - const serverUrl = localStorage.getItem("baseUrl"); - const appId = localStorage.getItem("parseAppId"); - const json = JSON.parse(localStorage.getItem("Extand_Class")); - const extUserId = json && json.length > 0 && json[0].objectId; - let updatedTourStatus = []; - if (tourStatusArr.length > 0) { - updatedTourStatus = [...tourStatusArr]; - const templateTourIndex = tourStatusArr.findIndex( - (obj) => obj["templateTour"] === false || obj["templateTour"] === true - ); - if (templateTourIndex !== -1) { - updatedTourStatus[templateTourIndex] = { templateTour: true }; - } else { - updatedTourStatus.push({ templateTour: true }); - } - } else { - updatedTourStatus = [{ templateTour: true }]; - } - - await axios.put( - serverUrl + "classes/contracts_Users/" + extUserId, - { TourStatus: updatedTourStatus }, - { headers: { "X-Parse-Application-Id": appId } } - ); - } - }; - - // `handleDownload` is used to get valid doc url available in completed report - const handleDownload = async (item) => { - setActLoader({ [`${item.objectId}`]: true }); - const url = item?.SignedUrl || item?.URL || ""; - const pdfName = - item?.Name?.length > 100 - ? item?.Name?.slice(0, 100) - : item?.Name || "Document"; - const isCompleted = item?.IsCompleted || false; - const templateId = props?.ReportName === "Templates" && item.objectId; - const docId = props?.ReportName !== "Templates" && item.objectId; - if (url) { - try { - if (isCompleted) { - setIsDownloadModal({ [item.objectId]: true }); - } else { - const signedUrl = await getSignedUrl( - url, - docId, - templateId - ); - await fetchUrl(signedUrl, pdfName); - } - setActLoader({}); - } catch (err) { - console.log("err in getsignedurl", err); - alert(t("something-went-wrong-mssg")); - setActLoader({}); - } - } - }; - - // `handleSubjectChange` is used to add or change subject of resend mail - const handleSubjectChange = (subject, doc) => { - const encodeBase64 = userDetails?.objectId - ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) - : btoa(`${doc.objectId}/${userDetails.Email}`); - const expireDate = doc.ExpiryDate.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString("en-US", { - day: "numeric", - month: "long", - year: "numeric" - }); - const signPdf = `${window.location.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - note: doc?.Note || "", - sender_name: - doc.ExtUserPtr.Name, - sender_mail: - doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: userDetails?.Name || "", - receiver_email: userDetails?.Email, - receiver_phone: userDetails?.Phone || "", - expiry_date: localExpireDate, - company_name: doc.ExtUserPtr.Company, - signing_url: signPdf - }; - const res = replaceMailVaribles(subject, "", variables); - setMail((prev) => ({ ...prev, subject: res.subject })); - }; - // `handlebodyChange` is used to add or change body of resend mail - const handlebodyChange = (body, doc) => { - const encodeBase64 = userDetails?.objectId - ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) - : btoa(`${doc.objectId}/${userDetails.Email}`); - const expireDate = doc.ExpiryDate.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString("en-US", { - day: "numeric", - month: "long", - year: "numeric" - }); - const signPdf = `${window.location.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - note: doc?.Note || "", - sender_name: - doc.ExtUserPtr.Name, - sender_mail: - doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: userDetails?.Name || "", - receiver_email: userDetails?.Email || "", - receiver_phone: userDetails?.Phone || "", - expiry_date: localExpireDate, - company_name: doc.ExtUserPtr.Company, - signing_url: signPdf - }; - const res = replaceMailVaribles("", body, variables); - - if (body) { - setMail((prev) => ({ ...prev, body: res.body })); - } - }; - // `handleNextBtn` is used to open edit mail template screen in resend mail modal - // as well as replace variable with original one - const handleNextBtn = (user, doc) => { - const userdata = { - Name: user?.signerPtr?.Name, - Email: user.email ? user?.email : user.signerPtr?.Email, - Phone: user?.signerPtr?.Phone, - objectId: user?.signerPtr?.objectId - }; - setUserDetails(userdata); - const encodeBase64 = user.email - ? btoa(`${doc.objectId}/${user.email}`) - : btoa( - `${doc.objectId}/${user.signerPtr.Email}/${user.signerPtr.objectId}` - ); - const expireDate = doc.ExpiryDate.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString("en-US", { - day: "numeric", - month: "long", - year: "numeric" - }); - const signPdf = `${window.location.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - note: doc?.Note || "", - sender_name: - doc.ExtUserPtr.Name, - sender_mail: - doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: user?.signerPtr?.Name || "", - receiver_email: user?.email ? user?.email : user?.signerPtr?.Email, - receiver_phone: user?.signerPtr?.Phone || "", - expiry_date: localExpireDate, - company_name: doc?.ExtUserPtr?.Company || "", - signing_url: signPdf - }; - const subject = - doc?.RequestSubject || - doc?.ExtUserPtr?.TenantId?.RequestSubject || - `{{sender_name}} has requested you to sign "{{document_title}}"`; - const body = - doc?.RequestBody || - doc?.ExtUserPtr?.TenantId?.RequestBody || - `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p><a href='{{signing_url}}' rel='noopener noreferrer' target='_blank'>Sign here</a></p><br><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br></body> </html>`; - const res = replaceMailVaribles(subject, body, variables); - setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); - setIsNextStep({ [user.Id]: true }); - }; - const handleResendMail = async (e, doc, user) => { - e.preventDefault(); - setActLoader({ [user?.Id]: true }); - const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - }; - let params = { - replyto: - doc?.ExtUserPtr?.Email || - "", - extUserId: doc?.ExtUserPtr?.objectId, - recipient: userDetails?.Email, - subject: mail.subject, - from: - doc?.ExtUserPtr?.Email, - html: mail.body - }; - try { - const res = await axios.post(url, params, { headers: headers }); - if (res?.data?.result?.status === "success") { - showAlert("success", t("mail-sent-alert")); - setIsResendMail({}); - } - else { - showAlert("danger", t("something-went-wrong-mssg")); - } - } catch (err) { - console.log("err in sendmail", err); - showAlert("danger", t("something-went-wrong-mssg")); - } finally { - setIsNextStep({}); - setUserDetails({}); - setActLoader({}); - } - }; - const fetchUserStatus = (user, doc) => { - const email = user.email ? user.email : user.signerPtr.Email; - const audit = doc?.AuditTrail?.find((x) => x.UserPtr.Email === email); - - return ( - <div className="flex flex-row gap-2 justify-center items-center"> - <div className="flex justify-center items-center bg-base-300 text-base-content shadow-md op-card w-[65px] h-[32px] cursor-default"> - {audit?.Activity ? audit?.Activity : "Awaited"} - </div> - - <button - onClick={() => handleNextBtn(user, doc)} - className={ - audit?.Activity !== "Signed" - ? "op-btn op-btn-primary op-btn-sm" - : " text-transparent cursor-default pointer-events-none" - } - disabled={audit?.Activity === "Signed"} - > - {audit?.Activity !== "Signed" && "Resend"} - </button> - </div> - ); - }; - // `handleQuickSendClose` is trigger when bulk send component trigger close event - const handleQuickSendClose = (status, count) => { - setIsBulkSend({}); - if (status === "success") { - showAlert("success", count + " " + t("document-sent-alert")); - } else { - showAlert("danger", t("something-went-wrong-mssg")); - } - }; - - // `handleBulkSend` is used to open modal as well as fetch template - // and show Ui on the basis template response - const handleBulkSend = async (template) => { - setIsBulkSend({ [template.objectId]: true }); - setIsLoader({ [template.objectId]: true }); - try { - const params = { - templateId: template.objectId, - include: ["Placeholders.signerPtr"] - }; - const axiosRes = await axios.post( - `${localStorage.getItem("baseUrl")}functions/getTemplate`, - params, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - } - } - ); - const templateRes = axiosRes.data && axiosRes.data.result; - const tenantSignTypes = await fetchTenantDetails(); - const docSignTypes = templateRes?.SignatureType || signatureTypes; - const updatedSignatureType = await handleSignatureType( - tenantSignTypes, - docSignTypes - ); - setSignatureType(updatedSignatureType); - setPlaceholders(templateRes?.Placeholders); - setTemplateDetails(templateRes); - setIsLoader({}); - } catch (err) { - console.log("err in fetch template in bulk modal", err); - setIsBulkSend({}); - showAlert("danger", t("something-went-wrong-mssg")); - } - }; - - const handleViewSigners = (item) => { - setIsViewShare({ [item.objectId]: true }); - }; - // `handleShareWith` is used to save teams in sharedWith field - const handleShareWith = async (e, template) => { - e.preventDefault(); - e.stopPropagation(); - setIsShareWith({}); - setActLoader({ [template.objectId]: true }); - try { - const templateCls = new Parse.Object("contracts_Template"); - templateCls.id = template.objectId; - const teamArr = selectedTeam.map((x) => ({ - __type: "Pointer", - className: "contracts_Teams", - objectId: x.value - })); - templateCls.set("SharedWith", teamArr); - const res = await templateCls.save(); - if (res) { - showAlert("success", t("template-share-alert")); - } - } catch (err) { - showAlert("danger", t("something-went-wrong-mssg")); - } finally { - setActLoader({}); - } - }; - const handleUpdateExpiry = async (e, item) => { - e.preventDefault(); - e.stopPropagation(); - if (expiryDate) { - const oldExpiryDate = new Date(item?.ExpiryDate?.iso); - const newExpiryDate = new Date(expiryDate); - if (newExpiryDate > oldExpiryDate) { - setActLoader({ [`${item.objectId}`]: true }); - const updateExpiryDate = new Date(expiryDate).toISOString(); - const expiryIsoFormat = { iso: updateExpiryDate, __type: "Date" }; - try { - const serverUrl = serverUrl_fn(); - const cls = "contracts_Document"; - const url = serverUrl + `/classes/${cls}/`; - const body = { ExpiryDate: expiryIsoFormat }; - const res = await axios.put(url + item.objectId, body, { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - }); - if (res.data && res.data.updatedAt) { - showAlert( - "success", - t("expiry-date-updated", { - newexpirydate: new Date(expiryDate)?.toLocaleDateString() - }), - 2000 - ); - if (props.ReportName === "Expired Documents") { - const upldatedList = props.List.filter( - (x) => x.objectId !== item.objectId - ); - props.setList(upldatedList); - } - } - } catch (err) { - console.log("err", err); - showAlert("danger", t("something-went-wrong-mssg"), 2000); - } finally { - setActLoader({}); - setExpiryDate(); - setIsModal({}); - } - } else { - showAlert("danger", t("expiry-date-error"), 2000); - } - } else { - showAlert("danger", t("expiry-date-error"), 2000); - } - }; - // `formatStatusRow` is used to format status row - const formatStatusRow = (item) => { - const timezone = extClass?.[0]?.Timezone || ""; - const DateFormat = extClass?.[0]?.DateFormat || "MM/DD/YYYY"; - const Is12Hr = extClass?.[0]?.Is12HourTime || false; - const isCompletedReport = props?.ReportName === "Completed Documents"; - const signers = item?.Placeholders?.map((x, i) => { - const audit = item?.AuditTrail?.find( - (audit) => audit?.UserPtr?.objectId === x.signerObjId - ); - const format = (date) => - date - ? formatDateTime(new Date(date), DateFormat, timezone, Is12Hr) - : "-"; - return { - id: i, - Email: x?.signerPtr?.Email || x?.email, - Activity: audit?.Activity?.toUpperCase() || "SENT", - SignedOn: format(audit?.SignedOn), - ViewedOn: format(audit?.ViewedOn) - }; - }); - // Decide how many signers to display based on `showAllSignes` state - const displaySigners = isShowAllSigners[item.objectId] - ? signers - : signers.slice(0, 3); - return ( - <> - {displaySigners?.map((x, i) => ( - <div - key={i} - className={`text-sm flex flex-row gap-2 items-center ${ - i !== displaySigners.length - 1 ? "mb-2" : "" - }`} - > - {!isCompletedReport && ( - <button - onClick={() => setIsModal({ [`${item.objectId}_${i}`]: true })} - className={`${ - x.Activity === "SIGNED" - ? "op-border-primary op-text-primary" - : x.Activity === "VIEWED" - ? "border-green-400 text-green-400" - : "border-base-content text-base-content" - } focus:outline-none border-2 w-[60px] h-[30px] text-[11px] rounded-full`} - > - {x?.Activity?.toUpperCase() || "-"} - </button> - )} - <div className="text-[12px]">{x?.Email || "-"}</div> - {!isCompletedReport && isModal[`${item.objectId}_${i}`] && ( - <ModalUi - isOpen - title={t("document-logs")} - handleClose={handleCloseModal} - > - <div className="pl-3 first:mt-2 border-t-[1px] border-gray-600 text-[12px] py-2"> - <p className="font-bold"> {x?.Email}</p> - <p>Viewed on: {x?.ViewedOn}</p> - <p>Signed on: {x?.SignedOn}</p> - </div> - </ModalUi> - )} - </div> - ))} - {/* Show More / Hide button */} - {signers?.length > 3 && ( - <button - onClick={() => - setIsShowAllSigners({ - [item.objectId]: !isShowAllSigners[item.objectId] - }) - } - className="ml-2 mt-1 text-xs font-medium text-blue-500 underline focus:outline-none" - > - {isShowAllSigners[item.objectId] ? "Hide" : "Show More"} - </button> - )} - </> - ); - }; - - // `handleImportBtn` is trigger when user click on upload icon from contactbook - const handleImportBtn = () => { - setIsModal({ export: true }); - }; - - // `capitalize` is used to make word capitalize - const capitalize = (s) => - s && String(s[0]).toUpperCase() + String(s).slice(1); - - // `checkRequiredHeaders` is used to check required headers present or not in csv/excel file - const checkRequiredHeaders = (headers) => { - const requiredHeaders = ["Name", "Email"]; - // Normalize headers to lowercase once - const headersSet = new Set(headers.map((header) => header.toLowerCase())); - - // Check all required headers - const allPresent = requiredHeaders.every((requiredHeader) => - headersSet.has(requiredHeader.toLowerCase()) - ); - return allPresent; - }; - - const processCSVFile = async (file, event) => { - const reader = new FileReader(); - reader.onload = (e) => { - const text = e.target.result; - // Parse CSV data - const rows = text.split("\n").map((row) => row.trim()); - const headers = rows[0].split(",").map((header) => header.trim()); - if (checkRequiredHeaders(headers)) { - const records = rows.slice(1).reduce((acc, row) => { - const values = row?.split(",").map((value) => value.trim()) || []; - if (values.length > 1) { - acc.push( - headers.reduce( - (obj, header, index) => ({ - ...obj, - [capitalize(header)]: values[index] || "" - }), - {} - ) - ); - } - return acc; - }, []); - if (records.length <= 100) { - const validRecords = records.length - ? records.filter((x) => emailRegex.test(x.Email)) - : []; - const invalidItems = records?.length - validRecords?.length; - setInvalidRecords(invalidItems); - setImportedData(validRecords); - } else { - alert(t("100-records-only")); - event.target.value = ""; - setImportedData([]); - } - } else { - alert(t("invalid-data")); - event.target.value = ""; - } - }; - reader.readAsText(file); - }; - - const processExcelFile = (file, event) => { - if (file) { - const reader = new FileReader(); - reader.onload = (e) => { - const arrayBuffer = e.target.result; - const workbook = XLSX.read(new Uint8Array(arrayBuffer), { - type: "array" - }); - - // Get the first sheet - const sheetName = workbook.SheetNames[0]; - const sheet = workbook.Sheets[sheetName]; - - // Convert sheet to JSON - const sheetData = XLSX.utils.sheet_to_json(sheet); - if (sheetData.length <= 100) { - // Get all unique keys from the data to handle missing fields - const headers = [ - ...new Set(sheetData.flatMap((item) => Object.keys(item))) - ]; - - if (checkRequiredHeaders(headers)) { - const updateSheetData = sheetData.map((obj) => { - for (let key in obj) { - const capitalizedKey = capitalize(key); - if (capitalizedKey !== key) { - obj[capitalizedKey] = obj[key]; - delete obj[key]; // delete the old key to avoid duplicates - } - } - return obj; - }); - const validRecords = updateSheetData.length - ? updateSheetData.filter((x) => emailRegex.test(x.Email)) - : []; - const invalidItems = updateSheetData?.length - validRecords?.length; - setInvalidRecords(invalidItems); - setImportedData(validRecords); - } else { - alert(t("invalid-data")); - event.target.value = ""; - } - } else { - alert(t("100-records-only")); - event.target.value = ""; - setImportedData([]); - } - }; - - reader.readAsArrayBuffer(file); - } - }; - // `handleFileUpload` is trigger when user upload excel file from contactbook - const handleFileUpload = (event) => { - const file = event.target?.files?.[0]; - if (file) { - const fileName = file.name; - const fileNameExt = fileName - .substr(fileName.lastIndexOf(".") + 1) - .toLowerCase(); - const isValidExt = ["csv", "xlsx", "xls"].includes(fileNameExt); - if (isValidExt) { - setCurrentImportPage(1); - if (fileNameExt !== "csv") { - processExcelFile(file, event); - } else { - processCSVFile(file, event); - } - } else { - event.target.value = ""; - alert(t("csv-excel-support-only")); - } - } else { - setImportedData([]); - setCurrentImportPage(1); - setInvalidRecords(0); - } - }; - - // Get all unique keys from the data to handle missing fields - const allKeys = importedData?.length - ? [...new Set(importedData.flatMap((item) => Object.keys(item)))] - : []; - - // Pagination logic for import data table in modal - const totalImportPages = Math.ceil(importedData.length / recordsPerPage); - const currentRecords = importedData.slice( - (currentImportPage - 1) * recordsPerPage, - currentImportPage * recordsPerPage - ); - - // `handleNextPage` is used to importdata table in modal - const handleNextPage = (e) => { - e.preventDefault(); - if (currentImportPage < totalImportPages) { - setCurrentImportPage(currentImportPage + 1); - } - }; - - // `handlePreviousPage` is used to importdata table in modal - const handlePreviousPage = (e) => { - e.preventDefault(); - if (currentImportPage > 1) { - setCurrentImportPage(currentImportPage - 1); - } - }; - // `handleImportData` is used to create batch in contact - const handleImportData = async (e) => { - e.preventDefault(); - e.stopPropagation(); - setActLoader({ import: true }); - try { - const filterdata = importedData.map((x) => ({ - Name: x.Name, - Email: x.Email, - Phone: x.Phone, - TenantId: localStorage.getItem("TenantId") - })); - const contacts = JSON.stringify(filterdata); - const res = await Parse.Cloud.run("createbatchcontact", { contacts }); - if (res) { - showAlert( - "info", - t("contact-imported", { - imported: res?.success || 0, - failed: res?.failed || 0 - }) - ); - if (res?.success > 0) { - setTimeout(() => window.location.reload(), 1500); - } - } - } catch (err) { - console.log("err while creating batch contact", err); - showAlert("danger", t("something-went-wrong-mssg")); - } finally { - setActLoader({}); - setIsModal({}); - setImportedData([]); - setInvalidRecords(0); - } - }; - - // `handleCreateDuplicate` is used to create duplicate from current entry using objectId - const handleCreateDuplicate = async (item) => { - setActLoader({ [item.objectId]: true }); - setIsModal({}); - try { - const duplicateRes = await Parse.Cloud.run("createduplicate", { - templateId: item.objectId - }); - if (duplicateRes) { - const newTemplate = JSON.parse(JSON.stringify(duplicateRes)); - props.setList((prevData) => [newTemplate, ...prevData]); - showAlert("success", t("duplicate-template-created")); - } - } catch (err) { - showAlert("danger", t("something-went-wrong-mssg")); - console.log("Err while create duplicate template", err); - } finally { - setActLoader({}); - } - }; - // `handleRenameDoc` is used to update document name - const handleRenameDoc = async (item) => { - setActLoader({ [item.objectId]: true }); - setIsModal({}); - const className = isTemplateReport - ? "contracts_Template" - : "contracts_Document"; - try { - const query = new Parse.Query(className); - const docObj = await query.get(item.objectId); - docObj.set("Name", renameDoc); - await docObj.save(); - //update report list data - const updateList = props.List.map((x) => - x.objectId === item.objectId ? { ...x, Name: renameDoc } : x - ); - props.setList(updateList); - setActLoader({}); - showAlert("success", "Document updated", 2000); - } catch (err) { - showAlert("danger", t("something-went-wrong-mssg"), 2000); - setActLoader({}); - } - }; - const handleBtnVisibility = (act, item) => { - if (!act.restrictBtn) { - return true; - } else if ( - act.restrictBtn === true && - item.ExtUserPtr?.objectId === extClass?.[0]?.objectId - ) { - return true; - } - }; - - // `handleEditContact` is used to update contactas per old contact Id - const handleEditContact = async (updateContact) => { - const updateList = props.List.map((x) => - x.objectId === contact.objectId ? { ...x, ...updateContact } : x - ); - props.setList(updateList); - }; - const handleCloseModal = () => { - setIsModal({}); - }; - const handleSaveAsTemplate = async (doc) => { - try { - const params = { docId: doc?.objectId }; - const templateRes = await Parse.Cloud.run("saveastemplate", params); - setTemplateId(templateRes?.id); - setIsSuccess({ [doc.objectId]: true }); - } catch (err) { - console.log("Err in saveastemplate", err); - } finally { - setActLoader({}); - } - }; - const handleCloseTemplate = () => { - setTemplateId(""); - setIsSuccess({}); - handleCloseModal(); - setActLoader({}); - handleClose(); - }; - - // `handleBulkSend` is used to open modal as well as fetch template - // and show Ui on the basis template response - const handleBulkSendTemplate = async (templateId, docId) => { - setIsBulkSend({ [docId]: true }); - setIsLoader({ [docId]: true }); - try { - const params = { - templateId: templateId, - include: ["Placeholders.signerPtr"] - }; - const axiosRes = await axios.post( - `${localStorage.getItem("baseUrl")}functions/getTemplate`, - params, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - } - } - ); - const templateRes = axiosRes.data && axiosRes.data.result; - const tenantSignTypes = await fetchTenantDetails(); - const docSignTypes = templateRes?.SignatureType || signatureTypes; - const updatedSignatureType = await handleSignatureType( - tenantSignTypes, - docSignTypes - ); - setSignatureType(updatedSignatureType); - setPlaceholders(templateRes?.Placeholders); - setTemplateDetails(templateRes); - setIsLoader({}); - } catch (err) { - console.log("err in fetch template in bulk modal", err); - setIsBulkSend({}); - showAlert("danger", t("something-went-wrong-mssg")); - } - }; - - const handleResendClose = () => { - setIsResendMail({}); - setIsNextStep({}); - setUserDetails({}); - }; - - const handleRecreateDoc = async (item) => { - setActLoader({ [item.objectId]: true }); - try { - const res = await Parse.Cloud.run("recreatedoc", { - docId: item.objectId - }); - if (res) { - openInNewTab(`/placeHolderSign/${res.objectId}`, "_self"); - } - } catch (err) { - handleCloseModal(); - showAlert("danger", err.message); - // showAlert("danger", t("something-went-wrong-mssg")); - console.log("Err while create duplicate template", err); - } finally { - setActLoader({}); - } - }; - - const restrictBtn = (item, act) => { - return item.IsSignyourself && act.action === "recreatedocument" - ? true - : false; - }; - return ( - <div className="relative"> - {Object.keys(actLoader)?.length > 0 && ( - <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> - <Loader /> - </div> - )} - <div className="p-2 w-full bg-base-100 text-base-content op-card shadow-lg"> - {alertMsg.message && ( - <Alert type={alertMsg.type}>{alertMsg.message}</Alert> - )} - {props.tourData && isTemplateReport && ( - <> - <Tour - onRequestClose={closeTour} - steps={props.tourData} - isOpen={isTour} - rounded={5} - closeWithMask={false} - /> - </> - )} - <div - ref={titleRef} - className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]" - > - <div className="font-light"> - {t(`report-name.${props.ReportName}`)}{" "} - {props.report_help && ( - <span className="text-xs md:text-[13px] font-normal"> - <Tooltip - id="report_help" - message={t(`report-help.${props.ReportName}`)} - /> - </span> - )} - </div> - <div className="flex flex-row justify-center items-center gap-3 mb-2"> - {/* Search input for report bigger in width */} - {titleElement?.width > 500 && ( - <div className="flex"> - <input - type="search" - value={props.searchTerm} - onChange={props.handleSearchChange} - placeholder={ - props.ReportName === "Contactbook" - ? t("search-contacts") - : isTemplateReport - ? t("search-templates") - : t("search-documents") - } - onPaste={props.handleSearchPaste} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" - /> - </div> - )} - {/* contact import */} - {props.isImport && ( - <div - className="cursor-pointer flex" - onClick={() => handleImportBtn()} - > - <i className="fa-light fa-upload op-text-secondary text-[23px] md:text-[25px]"></i> - </div> - )} - {/* add contact form */} - {props.form && ( - <div - className="cursor-pointer flex" - onClick={() => handleContactFormModal()} - > - <i className="fa-light fa-square-plus text-accent text-[30px] md:text-[32px]"></i> - </div> - )} - {/* create template form */} - {isTemplateReport && ( - <div - data-tut="reactourFirst" - className="cursor-pointer flex" - onClick={() => navigate("/form/template")} - > - <i className="cursor-pointer fa-light fa-square-plus text-accent text-[30px] md:text-[32px]"></i> - </div> - )} - {/* search icon/magnifer icon */} - {titleElement?.width < 500 && ( - <button - className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" - aria-label="Search" - onClick={() => - props.setMobileSearchOpen(!props.mobileSearchOpen) - } - > - <i - style={{ color: `${iconColor}` }} - className="fa-solid fa-magnifying-glass" - ></i> - </button> - )} - <ModalUi - isOpen={isModal?.export} - title={t("bulk-import")} - handleClose={() => { - setIsModal({}); - setImportedData([]); - setInvalidRecords(0); - }} - > - <div className="relative"> - {Object.keys(actLoader)?.length > 0 && ( - <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> - <Loader /> - </div> - )} - <form onSubmit={handleImportData} className="p-[20px] h-full "> - <div className="text-xs"> - <label className="block ml-2"> - {t("contacts-file")} - <span className="text-red-500 text-[13px]"> *</span> - </label> - <input - type="file" - accept=".csv, .xlsx, .xls" - onChange={handleFileUpload} - required - className="op-file-input op-file-input-bordered op-file-input-sm focus:outline-none hover:border-base-content w-full text-xs" - /> - <p className="mt-1 ml-2 text-[11px] text-gray-600"> - {t("import-guideline")}{" "} - <a - href="/sample_contacts.csv" - target="_blank" - rel="noopener noreferrer" - className="text-primary underline" - > - {t("download-sample")} - </a> - </p> - </div> - <div className="text-md m-2"> - <div className="flex flex-col md:flex-row gap-1"> - <span>Total records found: {importedData.length} </span> - <span>Invalid records found: {invalidRecords}</span> - </div> - <div className="overflow-x-auto p-1"> - {importedData?.length > 0 && ( - <> - <table className="op-table op-table-zebra w-full"> - <thead> - <tr> - {allKeys.map((key, index) => ( - <th key={index}>{key}</th> - ))} - </tr> - </thead> - <tbody> - {currentRecords.map((row, rowIndex) => ( - <tr key={rowIndex}> - {allKeys.map((key, colIndex) => ( - <td key={colIndex}>{row[key] || "-"}</td> - ))} - </tr> - ))} - </tbody> - </table> - <div className="flex justify-between items-center mt-4"> - <button - className="op-btn op-btn-primary op-btn-sm" - disabled={currentImportPage === 1} - onClick={handlePreviousPage} - > - Previous - </button> - <span> - Page {currentImportPage} of {totalImportPages} - </span> - <button - className="op-btn op-btn-primary op-btn-sm" - disabled={currentImportPage === totalImportPages} - onClick={handleNextPage} - > - Next - </button> - </div> - </> - )} - </div> - </div> - <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> - <button type="submit" className="op-btn op-btn-primary"> - Import - </button> - </form> - </div> - </ModalUi> - </div> - </div> - {/* Search input for report smalle in width */} - {titleElement?.width < 500 && props.mobileSearchOpen && ( - <div className="top-full left-0 w-full bg-white px-3 pt-1 pb-3"> - <input - type="search" - value={props.searchTerm} - onChange={props.handleSearchChange} - placeholder={t("search-documents")} - onPaste={props.handleSearchPaste} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - /> - </div> - )} - <div - className={`overflow-auto w-full border-b ${ - props.List?.length > 0 - ? isDashboard - ? "min-h-[317px]" - : currentList?.length === props.docPerPage - ? "h-fit" - : "h-screen" - : "" - }`} - > - <table className="op-table border-collapse w-full mb-4"> - <thead className="text-[14px] text-center"> - <tr className="border-y-[1px]"> - {props.heading?.map((item, index) => ( - <React.Fragment key={index}> - <th className="p-2"> - {t(`report-heading.${item}`)} - {props.ReportName === "Contactbook" && - item === "Name" && ( - <button - type="button" - onClick={toggleSortOrder} - className="ml-1" - > - <i - className={ - sortOrder === "asc" - ? "fa-light fa-arrow-down-a-z" - : "fa-light fa-arrow-up-a-z" - } - ></i> - </button> - )} - </th> - </React.Fragment> - ))} - {props.actions?.length > 0 && ( - <th className="p-2 text-transparent pointer-events-none"> - {t("action")} - </th> - )} - </tr> - </thead> - <tbody className="text-[12px]"> - {props.List?.length > 0 && ( - <> - {currentList.map((item, index) => - props.ReportName === "Contactbook" ? ( - <tr className="border-y-[1px]" key={index}> - {props.heading.includes("Sr.No") && ( - <th className="p-2">{startIndex + index + 1}</th> - )} - <td className="px-4 py-2 font-semibold"> - {item?.Name}{" "} - </td> - <td className="p-2 text-center"> - {item?.Email || "-"} - </td> - <td className="p-2 text-center"> - {item?.Phone || "-"} - </td> - <td className="px-3 py-2"> - <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> - {props.actions?.length > 0 && - props.actions.map((act, index) => ( - <button - key={index} - onClick={() => handleActionBtn(act, item)} - title={t(`btnLabel.${act.hoverLabel}`)} - className={`${ - act?.btnColor ? act.btnColor : "" - } op-btn op-btn-sm`} - > - <i className={act.btnIcon}></i> - </button> - ))} - {isDeleteModal[item.objectId] && ( - <ModalUi - isOpen - title={"Delete Contact"} - handleClose={handleClose} - > - <div className="m-[20px]"> - <div className="text-lg font-normal text-base-content"> - {t("contact-delete-alert")} - </div> - <hr className="bg-[#ccc] mt-4 " /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handleDelete(item)} - className="op-btn op-btn-primary" - > - {t("yes")} - </button> - <button - onClick={handleClose} - className="op-btn op-btn-secondary" - > - {t("no")} - </button> - </div> - </div> - </ModalUi> - )} - </div> - </td> - </tr> - ) : ( - <tr - className={`${ - currentList?.length === props.docPerPage - ? "last:border-none" - : "" - } border-y-[1px] `} - key={index} - > - {props.heading.includes("Sr.No") && ( - <th className="px-2 py-2"> - {startIndex + index + 1} - </th> - )} - <td className="p-2 min-w-56 max-w-56"> - <div className="font-semibold break-words"> - {item?.Name} - </div> - {item?.ExpiryDate?.iso && ( - <div className="text-gray-500"> - Expires {formatDate(item?.ExpiryDate?.iso)} - </div> - )} - </td> - {props?.heading?.includes("Reason") && ( - <td className="p-2 text-center"> - {item?.DeclineReason?.length > 25 - ? item?.DeclineReason?.slice(0, 25) + "..." - : item?.DeclineReason || "-"} - </td> - )} - {props.heading.includes("Note") && ( - <td className="p-2 text-center"> - <p className="truncate w-[100px]"> - {item?.Note || "-"} - </p> - </td> - )} - {props.heading.includes("Folder") && ( - <td className="p-2 text-center"> - {item?.Folder?.Name || - t("sidebar.OpenSign™ Drive", { - appName: drivename - })} - </td> - )} - <td className="p-2 text-center"> - <button - onClick={() => handleDownload(item)} - className="op-link op-link-primary" - title={t("download")} - > - {item?.URL ? t("download") : "-"} - </button> - </td> - {props.heading.includes("Owner") && ( - <td className="p-2 text-center"> - {formatRow(item?.ExtUserPtr)} - </td> - )} - {props.heading.includes("Signers") && - [ - "In-progress documents", - "Need your sign", - "Completed Documents" - ].includes(props.ReportName) ? ( - <td className="px-1 py-2"> - {!item?.IsSignyourself && item?.Placeholders ? ( - <>{formatStatusRow(item)}</> - ) : ( - <>-</> - )} - </td> - ) : ( - <td className="p-2 text-center"> - {!item?.IsSignyourself && item?.Placeholders ? ( - <button - onClick={() => handleViewSigners(item)} - className="op-link op-link-primary" - > - {t("view")} - </button> - ) : ( - "-" - )} - </td> - )} - <td className="px-2 py-2"> - <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> - {props.actions?.length > 0 && - props.actions.map((act, index) => - isTemplateReport ? ( - <React.Fragment key={index}> - {(item.ExtUserPtr?.objectId === - extClass?.[0]?.objectId || - act.btnLabel === "Use") && ( - <div - role="button" - data-tut={act?.selector} - key={index} - onClick={() => - handleActionBtn(act, item) - } - title={t(`btnLabel.${act.hoverLabel}`)} - className={ - act.action !== "option" - ? `${ - act?.btnColor || "" - } op-btn op-btn-sm mr-1` - : "text-base-content focus:outline-none text-lg mr-2 relative" - } - > - <i className={act.btnIcon}></i> - {act.btnLabel && ( - <span className="uppercase font-medium"> - { - `${t(`btnLabel.${act.btnLabel}`)}` - } - </span> - )} - {/* template report */} - {isOption[item.objectId] && - act.action === "option" && ( - <ul className="absolute -right-1 top-auto z-[70] w-52 op-dropdown-content op-menu op-menu-sm shadow-black/20 shadow bg-base-100 text-base-content rounded-box"> - {act.subaction?.map((subact) => ( - <li - key={subact.btnId} - onClick={() => - handleActionBtn( - subact, - item - ) - } - title={t( - `btnLabel.${subact.btnLabel}` - )} - > - <span className="flex items-center justify-between"> - <span className="text-[13px] capitalize font-medium"> - <i - className={`${subact.btnIcon} mr-2`} - ></i> - {subact.btnLabel && - t( - `btnLabel.${subact.btnLabel}` - )} - </span> - {subact.secIcon && ( - <i - className={`${subact.secIcon} ml-1.5`} - ></i> - )} - </span> - </li> - ))} - </ul> - )} - </div> - )} - <ModalUi - title={t("btnLabel.Duplicate")} - isOpen={ - isModal["duplicate_" + item.objectId] - } - handleClose={handleCloseModal} - > - <div className=" flex flex-col px-4 pb-3 pt-2 "> - <p className="text-base"> - {t("duplicate-template-alert")} - </p> - <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> - <button - className="w-[100px] op-btn op-btn-primary op-btn-md" - onClick={() => - handleCreateDuplicate(item) - } - > - {t("yes")} - </button> - <button - className="w-[100px] op-btn op-btn-secondary op-btn-md" - onClick={handleCloseModal} - > - {t("no")} - </button> - </div> - </div> - </ModalUi> - </React.Fragment> - ) : ( - <React.Fragment key={index}> - {handleBtnVisibility(act, item) && ( - <div - role="button" - data-tut={act?.selector} - onClick={() => - handleActionBtn(act, item) - } - title={t(`btnLabel.${act.hoverLabel}`)} - className={ - act.action !== "option" - ? `${act?.btnColor || ""} op-btn op-btn-sm mr-1` - : "text-base-content focus:outline-none text-lg mr-2 relative" - } - > - <i className={act.btnIcon}></i> - {act.btnLabel && ( - <span className="uppercase font-medium"> - {t(`btnLabel.${act.btnLabel}`)} - </span> - )} - {/* doc report */} - {isOption[item.objectId] && - act.action === "option" && ( - <ul className="absolute -right-1 top-auto z-[70] w-max op-dropdown-content op-menu op-menu-sm shadow-black/20 shadow bg-base-100 text-base-content rounded-box"> - {act.subaction?.map( - (subact) => - !restrictBtn( - item, - subact - ) && ( - <li - key={subact.btnId} - onClick={() => - handleActionBtn( - subact, - item - ) - } - title={t( - `btnLabel.${subact.hoverLabel}` - )} - > - <span> - <i - className={`${subact.btnIcon} mr-1.5`} - ></i> - {subact.btnLabel && ( - <span className="text-[13px] capitalize font-medium"> - {t( - `btnLabel.${subact.btnLabel}` - )} - </span> - )} - </span> - </li> - ) - )} - </ul> - )} - </div> - )} - </React.Fragment> - ) - )} - </div> - {isModal["recreatedocument_" + item.objectId] && ( - <ModalUi isOpen handleClose={handleCloseModal}> - {actLoader[item.objectId] && ( - <div className="absolute h-full w-full flex justify-center items-center rounded-box bg-black/30"> - <Loader /> - </div> - )} - <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> - {t("fix-&-resend-document")} - </h3> - <div className="p-[15px] md:p-[20px]"> - <div className="text-lg font-normal text-center"> - <img - src={recreatedoc} - alt="recreate-doc" - className="mx-auto w-[200px] h-auto" - /> - <p className="text-sm md:text-base md:px-2 mt-2"> - {t("do-you-want-recreate-document?")} - </p> - </div> - <hr className="bg-[#ccc] mt-2.5" /> - <div className="flex items-center justify-center mt-[14px] md:mt-[16px] gap-2 text-white"> - <button - onClick={() => handleRecreateDoc(item)} - className="op-btn op-btn-primary focus:outline-none text-sm relative px-4" - > - {t("start-editing")} - </button> - <button - onClick={handleCloseModal} - className="op-btn op-btn-secondary focus:outline-none text-sm relative px-8" - > - {t("cancel")} - </button> - </div> - </div> - </ModalUi> - )} - {isModal["saveastemplate_" + item.objectId] && ( - <ModalUi - isOpen - title={ - isSuccess[item.objectId] - ? t("template-created") - : t("btnLabel.Save as template") - } - handleClose={handleCloseTemplate} - > - {isSuccess[item.objectId] ? ( - <div className="mx-[10px] my-[15px]"> - <p className="text-base text-center"> - {t("how-would-you-like-to-proceed?")} - </p> - <div className="flex flex-wrap gap-1 items-center justify-center mt-2"> - <button - className="op-btn-primary op-btn op-btn-sm focus:outline-none text-sm relative" - onClick={() => - handleUseTemplate( - templateId, - "placeHolderSign" - ) - } - > - <i className="fa-light fa-plus"></i>{" "} - {t("btnLabel.Use")} - </button> - <button - className="op-btn-secondary op-btn op-btn-sm focus:outline-none text-sm relative" - onClick={() => - handleBulkSendTemplate( - templateId, - item.objectId - ) - } - > - <i className="fa-light fa-plus"></i>{" "} - { - `${t(`btnLabel.Quick send`)}` - } - </button> - <button - className="op-btn-secondary op-btn op-btn-sm focus:outline-none text-sm relative" - onClick={() => - navigate(`/template/${templateId}`) - } - > - <i className="fa-light fa-pen"></i>{" "} - {t(`btnLabel.Edit`)} - </button> - </div> - <Link - to="/report/6TeaPr321t" - className="cursor-pointer underline text-sm w-full flex justify-center mt-2" - > - {t("go-to-manage-templates")} - </Link> - </div> - ) : ( - <div className="m-[20px]"> - <div className="text-lg font-normal text-base-content"> - {t("save-as-template-?")} - </div> - <hr className="bg-[#ccc] mt-3" /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handleSaveAsTemplate(item)} - className="op-btn op-btn-primary w-[100px]" - > - {t("yes")} - </button> - <button - onClick={handleCloseTemplate} - className="op-btn op-btn-secondary w-[100px]" - > - {t("no")} - </button> - </div> - </div> - )} - </ModalUi> - )} - {isModal["extendexpiry_" + item.objectId] && ( - <ModalUi - isOpen - title={t("btnLabel.extend-expiry-date")} - reduceWidth={"md:max-w-[450px]"} - handleClose={handleCloseModal} - > - <form - className="px-4 py-2 flex flex-col" - onSubmit={(e) => handleUpdateExpiry(e, item)} - > - <label className="mr-2"> - {t("expiry-date")} {"(dd-mm-yyyy)"} - </label> - <input - type="date" - className="rounded-full mb-2 bg-base-300 w-full px-4 py-2 text-base-content border-2 hover:border-spacing-2" - defaultValue={ - item?.ExpiryDate?.iso?.split("T")?.[0] - } - onChange={(e) => { - setExpiryDate(e.target.value); - }} - /> - <div className="flex justify-start mb-1"> - <button - type="submit" - className="op-btn op-btn-primary" - > - {t("update")} - </button> - </div> - </form> - </ModalUi> - )} - {isShareWith[item.objectId] && ( - <div className="op-modal op-modal-open"> - <div className="max-h-90 bg-base-100 w-[95%] md:max-w-[500px] rounded-box relative"> - <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> - {t("share-with")} - </h3> - <div - className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2 z-40" - onClick={() => setIsShareWith({})} - > - ✕ - </div> - <div className="px-2 mt-3 w-full h-full"> - <div className="op-input op-input-bordered op-input-sm w-full h-full text-[13px] break-all"> - {selectedTeam?.[0]?.label} - </div> - </div> - <button - onClick={(e) => - handleShareWith(e, item) - } - className="op-btn op-btn-primary ml-[10px] my-3" - > - {t("submit")} - </button> - </div> - </div> - )} - {isViewShare[item.objectId] && ( - <ModalUi - isOpen - showHeader={isTemplateReport} - title={t("signers")} - reduceWidth={"md:max-w-[450px]"} - handleClose={() => setIsViewShare({})} - > - {!isTemplateReport && ( - <div - className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-1 z-40" - onClick={() => setIsViewShare({})} - > - ✕ - </div> - )} - <table className="op-table w-full overflow-auto"> - <thead className="h-[38px] sticky top-0 text-base-content text-sm pt-[15px] px-[20px]"> - <tr> - {isTemplateReport && ( - <th className="p-2 pl-3 w-[30%]"> - {t("roles")} - </th> - )} - <th className="pl-3 py-2"> - {isTemplateReport - ? t("email") - : t("signers")} - </th> - </tr> - </thead> - <tbody> - {item.Placeholders.map( - (x, i) => - x.Role !== "prefill" && ( - <tr - key={i} - className="text-sm font-medium" - > - {isTemplateReport && ( - <td className="text-[12px] p-2 pl-3 w-[30%]"> - {x.Role && x.Role} - </td> - )} - <td className="pl-3 text-[12px] py-2 break-all"> - {x.email - ? x.email - : x?.signerPtr?.Email || "-"} - </td> - </tr> - ) - )} - </tbody> - </table> - </ModalUi> - )} - {isDeleteModal[item.objectId] && ( - <ModalUi - isOpen - title={t("delete-document")} - handleClose={handleClose} - > - <div className="m-[20px]"> - <div className="text-lg font-normal text-base-content"> - {t("delete-document-alert")} - </div> - <hr className="bg-[#ccc] mt-4" /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handleDelete(item)} - className="op-btn op-btn-primary" - > - {t("yes")} - </button> - <button - onClick={handleClose} - className="op-btn op-btn-secondary" - > - {t("no")} - </button> - </div> - </div> - </ModalUi> - )} - {isBulkSend[item.objectId] && ( - <ModalUi - isOpen - title={ - t("quick-send") - } - handleClose={() => setIsBulkSend({})} - > - {isLoader[item.objectId] ? ( - <div className="w-full h-[100px] flex justify-center items-center z-30"> - <Loader /> - </div> - ) : ( - <BulkSendUi - Placeholders={placeholders} - item={templateDeatils} - handleClose={handleQuickSendClose} - signatureType={signatureType} - /> - )} - </ModalUi> - )} - {isShare[item.objectId] && ( - <ModalUi - isOpen - title={t("copy-link")} - handleClose={() => { - setIsShare({}); - setActLoader({}); - setCopied(false); - }} - > - <div className="m-[20px]"> - {shareUrls.map((share, i) => ( - <div - key={i} - className="text-sm font-normal text-base-content flex my-2 justify-between items-center" - > - <span className="w-[150px] mr-[5px] md:mr-0 md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis text-sm font-semibold"> - {share.email} - </span> - <div className="flex items-center gap-2"> - <ShareButton - title={t("sign-url")} - text={t("sign-url")} - url={share.url} - className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm " - > - <i className="fa-light fa-share-from-square"></i> - {t("btnLabel.Share")} - </ShareButton> - <button - className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm" - onClick={() => copytoclipboard(share)} - > - <i className="fa-light fa-copy" /> - {copied[share.email] - ? t("copied") - : t("copy")} - </button> - </div> - </div> - ))} - <p - id="copyUrl" - ref={copyUrlRef} - className="hidden" - ></p> - </div> - </ModalUi> - )} - {isRevoke[item.objectId] && ( - <ModalUi - isOpen - title={t("revoke-document")} - handleClose={handleClose} - > - <div className="m-[20px]"> - <div className="text-sm md:text-lg font-normal text-base-content"> - {t("revoke-document-alert")} - </div> - <div className="mt-2"> - <textarea - rows={3} - placeholder="Reason (optional)" - className="px-4 op-textarea op-textarea-bordered text-base-content focus:outline-none hover:border-base-content w-full text-xs" - value={reason} - onChange={(e) => setReason(e.target.value)} - ></textarea> - </div> - <div className="flex items-center mt-3 gap-2"> - <button - onClick={() => handleRevoke(item)} - className="op-btn op-btn-primary px-6" - > - {t("yes")} - </button> - <button - onClick={handleClose} - className="op-btn op-btn-secondary px-6" - > - {t("no")} - </button> - </div> - </div> - </ModalUi> - )} - {isResendMail[item.objectId] && ( - <ModalUi - isOpen - title={ - t("resend-mail") - } - handleClose={handleResendClose} - > - <div className="overflow-y-auto max-h-[340px] md:max-h-[400px]"> - {item?.Placeholders?.map((user) => ( - <React.Fragment key={user.Id}> - {isNextStep[user.Id] && ( - <div className="relative "> - {actLoader[user.Id] && ( - <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> - <Loader /> - </div> - )} - <form - onSubmit={(e) => - handleResendMail(e, item, user) - } - className="w-full flex flex-col gap-2 p-3 text-base-content relative" - > - <div className="absolute right-5 text-xs z-40"> - <Tooltip - id={`${user.Id}_help`} - message={t("resend-mail-help")} - /> - </div> - <div> - <label - className="text-xs ml-1" - htmlFor="mailsubject" - > - {t("subject")}{" "} - </label> - <input - id="mailsubject" - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - value={mail.subject} - onChange={(e) => - handleSubjectChange( - e.target.value, - item - ) - } - onInvalid={(e) => - e.target.setCustomValidity( - t("input-required") - ) - } - onInput={(e) => - e.target.setCustomValidity("") - } - required - /> - </div> - <div> - <label - className="text-xs ml-1" - htmlFor="mailbody" - > - {t("body")}{" "} - </label> - <EditorToolbar containerId="toolbar1" /> - <ReactQuill - id="mailbody" - theme="snow" - value={mail.body || ""} - placeholder="add body of email " - modules={module1} - formats={formats} - onChange={(value) => - handlebodyChange(value, item) - } - /> - </div> - <button - type="submit" - className="op-btn op-btn-primary" - > - {t("resend")} - </button> - </form> - </div> - )} - {Object?.keys(isNextStep) <= 0 && ( - <div className="flex justify-between items-center gap-2 my-2 px-3"> - <div className="text-base-content"> - {user?.signerPtr?.Name || "-"}{" "} - {`<${ - user?.email - ? user.email - : user.signerPtr.Email - }>`} - </div> - <>{fetchUserStatus(user, item)}</> - </div> - )} - </React.Fragment> - ))} - </div> - </ModalUi> - )} - <ModalUi - title={t("btnLabel.Rename")} - isOpen={isModal["rename_" + item.objectId]} - handleClose={handleCloseModal} - > - <div className="flex flex-col px-4 pb-3 pt-2"> - <div className="flex flex-col gap-2"> - <input - maxLength={200} - autoFocus={true} - type="text" - defaultValue={renameDoc || item.Name} - onChange={(e) => setRenameDoc(e.target.value)} - className="op-input op-input-bordered op-input-sm w-full focus:outline-none hover:border-base-content text-[10px]" - /> - </div> - <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> - <button - className="w-[100px] op-btn op-btn-primary op-btn-md" - onClick={() => handleRenameDoc(item)} - > - {t("save")} - </button> - <button - className="w-[100px] op-btn op-btn-secondary op-btn-md" - onClick={handleCloseModal} - > - {t("cancel")} - </button> - </div> - </div> - </ModalUi> - {isDownloadModal[item.objectId] && ( - <DownloadPdfZip - setIsDownloadModal={setIsDownloadModal} - isDownloadModal={isDownloadModal[item.objectId]} - pdfDetails={[item]} - isDocId={false} - /> - )} - </td> - </tr> - ) - )} - </> - )} - </tbody> - </table> - {props.List?.length <= 0 && ( - <div - className={`${ - isDashboard ? "h-[317px]" : "" - } flex flex-col items-center justify-center w-ful bg-base-100 text-base-content rounded-xl py-4`} - > - <div className="w-[60px] h-[60px] overflow-hidden"> - <img - className="w-full h-full object-contain" - src={pad} - alt="img" - /> - </div> - <div className="text-sm font-semibold"> - {t("no-data-avaliable")} - </div> - </div> - )} - </div> - <div className="op-join flex flex-wrap items-center p-2"> - {props.List.length > props.docPerPage && ( - <button - onClick={() => paginateBack()} - className="op-join-item op-btn op-btn-sm" - > - {t("prev")} - </button> - )} - {pageNumbers.map((x, i) => ( - <button - key={i} - onClick={() => setCurrentPage(x)} - disabled={x === "..."} - className={`${ - x === currentPage ? "op-btn-active" : "" - } op-join-item op-btn op-btn-sm`} - > - {x} - </button> - ))} - {props.List.length > props.docPerPage && ( - <button - onClick={() => paginateFront()} - className="op-join-item op-btn op-btn-sm" - > - {t("next")} - </button> - )} - </div> - <ModalUi - title={t("add-contact")} - isOpen={isContactform} - handleClose={handleContactFormModal} - > - <AddSigner - handleUserData={handleUserData} - closePopup={handleContactFormModal} - /> - </ModalUi> - {isModal?.["edit_" + contact.objectId] && ( - <ModalUi - isOpen - title={t("edit-contact")} - handleClose={handleCloseModal} - > - <EditContactForm - contact={contact} - handleClose={handleCloseModal} - handleEditContact={handleEditContact} - /> - </ModalUi> - )} - </div> - </div> - ); -}; - -export default ReportTable; diff --git a/apps/OpenSign/src/primitives/LinkUserModal.jsx b/apps/OpenSign/src/primitives/LinkUserModal.jsx index c5bcd7152a..b2702b636f 100644 --- a/apps/OpenSign/src/primitives/LinkUserModal.jsx +++ b/apps/OpenSign/src/primitives/LinkUserModal.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import SelectSigners from "../components/shared/fields/SelectSigners"; import AddContact from "./AddContact"; import ModalUi from "./ModalUi"; @@ -26,7 +26,6 @@ const LinkUserModal = (props) => { > <SelectSigners {...props} - closePopup={props.closePopup} isContact={isContact} setIsContact={setIsContact} isExistSigner={isExistSigner} @@ -36,10 +35,7 @@ const LinkUserModal = (props) => { <div className="op-divider text-base-content mx-[25%] my-1"> {t("or")} </div> - <AddContact - details={props.handleAddUser} - closePopup={props.closePopup} - /> + <AddContact {...props} details={props.handleAddUser} /> </> )} </ModalUi> diff --git a/apps/OpenSign/src/primitives/LoaderWithMsg.jsx b/apps/OpenSign/src/primitives/LoaderWithMsg.jsx index 37c1010e8f..5b2d3028d2 100644 --- a/apps/OpenSign/src/primitives/LoaderWithMsg.jsx +++ b/apps/OpenSign/src/primitives/LoaderWithMsg.jsx @@ -5,7 +5,7 @@ function LoaderWithMsg({ isLoading }) { return ( <div className="flex flex-col justify-center items-center h-[100vh]"> <Loader /> - <span className="text-[13px] text-base-cotent">{isLoading.message}</span> + <span className="text-[13px] text-base-content">{isLoading.message}</span> </div> ); } diff --git a/apps/OpenSign/src/primitives/Modal.jsx b/apps/OpenSign/src/primitives/Modal.jsx deleted file mode 100644 index 333b15dfc7..0000000000 --- a/apps/OpenSign/src/primitives/Modal.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import React, { useState } from "react"; - -const Modal = ({ children, Title }) => { - const [isOpen, SetIsOpen] = useState(false); - return ( - <> - {children && ( - <div - className={`fixed top-20 left-1/2 transform -translate-x-1/2 border-[1px] text-sm bg-white rounded `} - > - <div className="flex justify-between items-center py-[.75rem] px-[1.25rem] "> - <div className="font-semibold text-xl text-black">{Title}</div> - <div - onClick={() => SetIsOpen()} - className="px-2 py-1 bg-gray-400 rounded cursor-pointer" - > - <i className="fa-light fa-xmark"></i> - </div> - </div> - <hr /> - {isOpen && <div>{children}</div>} - </div> - )} - </> - ); -}; - -export default Modal; diff --git a/apps/OpenSign/src/primitives/ModalUi.jsx b/apps/OpenSign/src/primitives/ModalUi.jsx index 6c70e8ee7e..a34ae1489d 100644 --- a/apps/OpenSign/src/primitives/ModalUi.jsx +++ b/apps/OpenSign/src/primitives/ModalUi.jsx @@ -12,13 +12,17 @@ const ModalUi = ({ position }) => { const width = reduceWidth; - const isBottom = position === "bottom" ? "items-end pb-2" : ""; + const isBottom = position === "bottom" ? "items-end pb-2 !bg-black/10" : ""; return ( <> {isOpen && ( <dialog id="selectSignerModal" className={`${isBottom} op-modal op-modal-open`} + style={{ + overlay: { zIndex: 1000 }, + content: { zIndex: 1001, overflow: "visible" } // Ensure modal doesn’t clip content + }} > <div className={`${ @@ -28,7 +32,7 @@ const ModalUi = ({ {showHeader && ( <> {title && ( - <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> + <h3 className="text-base-content text-left font-bold text-lg pt-[15px] px-[20px]"> {title} </h3> )} diff --git a/apps/OpenSign/src/primitives/PdfDeclineModal.jsx b/apps/OpenSign/src/primitives/PdfDeclineModal.jsx index 1200581dda..fbf0538862 100644 --- a/apps/OpenSign/src/primitives/PdfDeclineModal.jsx +++ b/apps/OpenSign/src/primitives/PdfDeclineModal.jsx @@ -34,7 +34,7 @@ function CustomModal(props) { <dialog className="op-modal op-modal-open absolute z-[448]"> <div className="w-[95%] md:w-[60%] lg:w-[40%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm"> {props?.isLoader && ( - <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"> + <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2]/80"> <Loader /> </div> )} @@ -43,7 +43,9 @@ function CustomModal(props) { </h3> {!isExtendExpiry && ( <div className="p-[10px] px-[20px]"> - <p className="text-[15px] text-base-content">{props.bodyMssg && props.bodyMssg}</p> + <p className="text-[15px] text-base-content"> + {props.bodyMssg && props.bodyMssg} + </p> </div> )} {!isExtendExpiry && ( @@ -68,7 +70,7 @@ function CustomModal(props) { )} {props.footerMessage && ( <> - <div className="mx-3 text-base-content"> + <div className="mx-3 text-base-content"> <textarea rows={3} placeholder="Reason (optional)" @@ -103,12 +105,17 @@ function CustomModal(props) { )} {isExtendExpiry && ( <form className="mx-3 mb-3" onSubmit={handleUpdateExpiry}> - <label className="ml-2 mt-2"> + <label + htmlFor="expiryDate" + className="ml-2 mt-2 text-base-content" + > {t("expiry-date")} {"(dd-mm-yyyy)"} </label> <input + id="expiryDate" type="date" - className="rounded-full bg-base-300 w-full px-4 py-2 text-base-content border-2 hover:border-spacing-2" + onClick={(e) => e?.currentTarget?.showPicker?.()} + className="rounded-full w-full px-4 op-input op-input-bordered op-input-md text-base-content focus:outline-none hover:border-base-content" defaultValue={props?.doc?.ExpiryDate?.iso?.split("T")?.[0]} onChange={(e) => setExpiryDate(e.target.value)} /> diff --git a/apps/OpenSign/src/primitives/RenderReportCell.jsx b/apps/OpenSign/src/primitives/RenderReportCell.jsx new file mode 100644 index 0000000000..d80272c7d1 --- /dev/null +++ b/apps/OpenSign/src/primitives/RenderReportCell.jsx @@ -0,0 +1,165 @@ +import { useTranslation } from "react-i18next"; +import { formatDate } from "../constant/Utils"; +import SignerCell from "./SignerCell"; + +function isValidDateString(str) { + const date = new Date(str); + return !isNaN(date.getTime()); +} +// `formatRow` is used to show data in poper manner like +// if data is of array type then it will join array items with "," +// if data is of object type then it Name values will be show in row +// if no data available it will show hyphen "-" +const formatRow = (row) => { + if (Array.isArray(row)) { + return row.map((x) => x.Name).join(", "); + } else if (typeof row === "object" && row !== null) { + return row?.iso ? formatDate(row?.iso) : row?.Name || "-"; + } else if (typeof row === "boolean" && row !== null) { + return row ? row?.toString() : "false"; + } else if (isValidDateString(row) && row !== null) { + // handle createdAt and updatedAt + return formatDate(row) || "-"; + } else { + return row || "-"; + } +}; +// Renders a report cell based on the report's heading position +export const RenderReportCell = ({ + col, + rowData, + rowIndex, + startIndex, + handleDownload, + handleRemovePrefill, + reportName +}) => { + const { t } = useTranslation(); + const appName = + "OpenSign™"; + const drivename = appName === "OpenSign™" ? "OpenSign™" : ""; + switch (col) { + case "Sr.No": + return ( + <th key={col} className="px-2 py-2"> + {startIndex + rowIndex + 1} + </th> + ); + case "Name": + case "Title": + return ( + <td key={col} className="p-2 min-w-56 max-w-56"> + <div className="font-semibold break-words">{rowData?.Name}</div> + {rowData?.ExpiryDate?.iso && ( + <div className="text-gray-500"> + {t("expires")} {formatDate(rowData?.ExpiryDate?.iso)} + </div> + )} + </td> + ); + case "Reason": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.DeclineReason?.length > 25 + ? rowData?.DeclineReason?.slice(0, 25) + "..." + : rowData?.DeclineReason || "-"} + </td> + ); + case "Note": + return ( + <td key={col} className="p-2 text-center"> + <p className="truncate w-[100px]">{rowData?.Note || "-"}</p> + </td> + ); + case "Folder": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.Folder?.Name || + t("sidebar.OpenSign™ Drive", { appName: drivename })} + </td> + ); + case "File": + return ( + <td key={col} className="p-2 text-center"> + <button + onClick={() => handleDownload(rowData)} + className="op-link op-link-primary" + title={t("download")} + > + {rowData?.URL ? t("download") : "-"} + </button> + </td> + ); + case "Owner": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.ExtUserPtr?.Name || "-"} + </td> + ); + case "Time to complete (Days)": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.TimeToCompleteDays || "-"} + </td> + ); + case "Notify on signatures": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.NotifyOnSignatures?.toString() || "-"} + </td> + ); + case "Enable Tour": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.IsTourEnabled?.toString() || "-"} + </td> + ); + case "Redirect url": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.RedirectUrl?.toString() || "-"} + </td> + ); + case "Created Date": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.createdAt ? formatDate(rowData?.createdAt) : "-"} + </td> + ); + case "Updated Date": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.updatedAt ? formatDate(rowData?.updatedAt) : "-"} + </td> + ); + case "Expiry Date": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.ExpiryDate ? formatDate(rowData?.ExpiryDate?.iso) : "-"} + </td> + ); + case "Signers": + return ( + <SignerCell + key={col} + reportName={reportName} + item={rowData} + handleRemovePrefill={handleRemovePrefill} + /> + ); + default: + return ( + <td key={col} className="p-2 text-center"> + {Array.isArray(rowData[col]) ? ( + <div className="flex flex-row flex-wrap gap-1 justify-center"> + {rowData[col].map((x, i) => ( + <span key={i}>{formatRow(x)}</span> + ))} + </div> + ) : ( + formatRow(rowData[col]) + )} + </td> + ); + } +}; diff --git a/apps/OpenSign/src/primitives/ShareButton.jsx b/apps/OpenSign/src/primitives/ShareButton.jsx index aadb05a1d2..bcc2d9225f 100644 --- a/apps/OpenSign/src/primitives/ShareButton.jsx +++ b/apps/OpenSign/src/primitives/ShareButton.jsx @@ -69,7 +69,7 @@ export default function ShareButton({ title, text, url, className, children }) { isOpen title={ <> - <i class="fa-solid fa-share-from-square"></i> Share + <i className="fa-solid fa-share-from-square"></i> Share </> } handleClose={() => setPopupOpen(false)} diff --git a/apps/OpenSign/src/primitives/SignerCell.jsx b/apps/OpenSign/src/primitives/SignerCell.jsx new file mode 100644 index 0000000000..b1a9da1168 --- /dev/null +++ b/apps/OpenSign/src/primitives/SignerCell.jsx @@ -0,0 +1,184 @@ +import { useTranslation } from "react-i18next"; +import { formatDateTime, getSignerEmail } from "../constant/Utils"; +import { useState } from "react"; +import ModalUi from "./ModalUi"; + +// Signer is used in report to show signer list conditionally +const SignerCell = ({ reportName, item, handleRemovePrefill }) => { + const { t } = useTranslation(); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); + const isTemplateReport = reportName === "Templates"; + const isCompletedReport = reportName === "Completed Documents"; + const [isShowAllSigners, setIsShowAllSigners] = useState({}); + const [isModal, setIsModal] = useState(false); + const shouldShowSigner = [ + "In-progress documents", + "Need your sign", + "Completed Documents" + ].includes(reportName); + const shouldRender = + !item?.IsSignyourself && handleRemovePrefill(item?.Placeholders); + + const handleCloseModal = () => { + setIsModal({}); + }; + const handleViewSigners = (item) => { + setIsModal({ ["view_" + item.objectId]: true }); + }; + // `formatStatusRow` is used to format status row + const formatStatusRow = (item) => { + const timezone = extClass?.[0]?.Timezone || ""; + const DateFormat = extClass?.[0]?.DateFormat || "MM/DD/YYYY"; + const Is12Hr = extClass?.[0]?.Is12HourTime || false; + const removePrefill = item?.Placeholders.filter( + (data) => data?.Role !== "prefill" + ); + const signers = removePrefill?.map((x, i) => { + const audit = item?.AuditTrail?.find( + (audit) => audit?.UserPtr?.objectId === x.signerObjId + ); + const format = (date) => + date + ? formatDateTime(new Date(date), DateFormat, timezone, Is12Hr) + : "-"; + return { + id: i, + Email: getSignerEmail(x, item?.Signers) || x?.email || "-", + Activity: audit?.Activity?.toUpperCase() || "SENT", + SignedOn: format(audit?.SignedOn), + ViewedOn: format(audit?.ViewedOn) + }; + }); + // Decide how many signers to display based on `showAllSignes` state + const displaySigners = isShowAllSigners[item.objectId] + ? signers + : signers.slice(0, 3); + return ( + <> + {displaySigners?.map((x, i) => ( + <div + key={i} + className={`text-sm flex flex-row gap-2 items-center ${ + i !== displaySigners.length - 1 ? "mb-2" : "" + }`} + > + {!isCompletedReport && ( + <button + onClick={() => setIsModal({ [`${item.objectId}_${i}`]: true })} + className={`${ + x.Activity === "SIGNED" + ? "op-border-primary op-text-primary" + : x.Activity === "VIEWED" + ? "border-green-400 text-green-400" + : "border-base-content text-base-content" + } focus:outline-none border-2 w-[60px] h-[30px] text-[11px] rounded-full`} + > + {x?.Activity?.toUpperCase() || "-"} + </button> + )} + <div className="text-[12px]">{x?.Email || "-"}</div> + {!isCompletedReport && isModal[`${item.objectId}_${i}`] && ( + <ModalUi + isOpen + title={t("document-logs")} + handleClose={handleCloseModal} + > + <div className="pl-3 first:mt-2 border-t-[1px] border-gray-600 text-[12px] py-2"> + <p className="font-bold"> {x?.Email}</p> + <p>{t("viewed-on", { ViewedOn: x?.ViewedOn })}</p> + <p>{t("signed-on", { SignedOn: x?.SignedOn })}</p> + </div> + </ModalUi> + )} + </div> + ))} + {/* Show More / Hide button */} + {signers?.length > 3 && ( + <button + onClick={() => + setIsShowAllSigners({ + [item.objectId]: !isShowAllSigners[item.objectId] + }) + } + className="ml-2 mt-1 text-xs font-medium text-blue-500 underline focus:outline-none" + > + {isShowAllSigners[item.objectId] ? t("hide") : t("show-more")} + </button> + )} + </> + ); + }; + + if (shouldShowSigner) { + return ( + <td className="px-1 py-2"> + {shouldRender ? <>{formatStatusRow(item)}</> : <>-</>} + </td> + ); + } + + return ( + <td className="p-2 text-center"> + {shouldRender ? ( + <button + onClick={() => handleViewSigners(item)} + className="op-link op-link-primary" + > + {t("view")} + </button> + ) : ( + "-" + )} + {isModal["view_" + item.objectId] && ( + <ModalUi + isOpen + showHeader={isTemplateReport} + title={t("signers")} + reduceWidth={"md:max-w-[450px]"} + handleClose={() => handleCloseModal()} + > + {!isTemplateReport && ( + <div + className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-1 z-40" + onClick={() => handleCloseModal()} + > + ✕ + </div> + )} + <table className="op-table w-full overflow-auto"> + <thead className="h-[38px] sticky top-0 text-base-content text-sm pt-[15px] px-[20px]"> + <tr> + {isTemplateReport && ( + <th className="p-2 pl-3 w-[30%]">{t("roles")}</th> + )} + <th className="pl-3 py-2"> + {isTemplateReport ? t("email") : t("signers")} + </th> + </tr> + </thead> + <tbody> + {item.Placeholders.map( + (x, i) => + x.Role !== "prefill" && ( + <tr key={i} className="text-sm font-medium"> + {isTemplateReport && ( + <td className="text-[12px] p-2 pl-3 w-[30%]"> + {x.Role && x.Role} + </td> + )} + <td className="pl-3 text-[12px] py-2 break-all"> + {x?.email || getSignerEmail(x, item?.Signers) || "-"} + </td> + </tr> + ) + )} + </tbody> + </table> + </ModalUi> + )} + </td> + ); +}; + +export default SignerCell; diff --git a/apps/OpenSign/src/primitives/Tour.jsx b/apps/OpenSign/src/primitives/Tour.jsx index 0612c10733..aee64201c1 100644 --- a/apps/OpenSign/src/primitives/Tour.jsx +++ b/apps/OpenSign/src/primitives/Tour.jsx @@ -6,7 +6,7 @@ export default function Tour({ rounded, className, showNumber, - closeWithMask, + closeWithMask = false, onRequestClose, showNavigation, showCloseButton, diff --git a/apps/OpenSign/src/primitives/TourContentWithBtn.jsx b/apps/OpenSign/src/primitives/TourContentWithBtn.jsx index ada3768a9d..afa54ba07e 100644 --- a/apps/OpenSign/src/primitives/TourContentWithBtn.jsx +++ b/apps/OpenSign/src/primitives/TourContentWithBtn.jsx @@ -1,8 +1,13 @@ import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -export default function TourContentWithBtn({ message, isChecked, video }) { +export default function TourContentWithBtn({ + message, + isChecked, + video, + isDontShowCheckbox = true +}) { const { t } = useTranslation(); - const [isCheck, setIsCheck] = useState(false); + const [isCheck, setIsCheck] = useState(true); const handleCheck = () => { setIsCheck(!isCheck); @@ -24,15 +29,17 @@ export default function TourContentWithBtn({ message, isChecked, video }) { ></iframe> </div> )} - <label className="flex items-center justify-center mt-3 mb-0"> - <input - type="checkbox" - className="op-checkbox op-checkbox-xs mr-1" - checked={isCheck} - onChange={handleCheck} - /> - <span className="#787878 text-[12px]">{t("tour-content")}</span> - </label> + {isDontShowCheckbox && ( + <label className="flex items-center justify-center mt-3 mb-0"> + <input + type="checkbox" + className="op-checkbox op-checkbox-xs mr-1" + checked={isCheck} + onChange={handleCheck} + /> + <span className="#787878 text-[12px]">{t("tour-content")}</span> + </label> + )} </div> ); } diff --git a/apps/OpenSign/src/primitives/ValidateRoute.jsx b/apps/OpenSign/src/primitives/ValidateRoute.jsx index 5f5fdc4253..6714468deb 100644 --- a/apps/OpenSign/src/primitives/ValidateRoute.jsx +++ b/apps/OpenSign/src/primitives/ValidateRoute.jsx @@ -32,6 +32,7 @@ const ValidateRoute = () => { let PageLanding = localStorage.getItem("PageLanding"); let baseUrl = localStorage.getItem("baseUrl"); let appid = localStorage.getItem("parseAppId"); + let favicon = localStorage.getItem("favicon"); localStorage.clear(); saveLanguageInLocal(i18n); @@ -42,8 +43,9 @@ const ValidateRoute = () => { localStorage.setItem("userSettings", appdata); localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); + localStorage.setItem("favicon", favicon); }; - return <div>{<Outlet />}</div>; + return <>{<Outlet />}</>; }; export default ValidateRoute; diff --git a/apps/OpenSign/src/primitives/ValidateSession.jsx b/apps/OpenSign/src/primitives/ValidateSession.jsx index d1dc59f7c2..2c80b4928c 100644 --- a/apps/OpenSign/src/primitives/ValidateSession.jsx +++ b/apps/OpenSign/src/primitives/ValidateSession.jsx @@ -23,7 +23,7 @@ const ValidateSession = ({ children }) => { ) : ( <ModalUi showHeader={false} isOpen={true} showClose={false}> <div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5"> - <p className="text-xl font-medium">Your session has expired.</p> + <p className="text-xl font-medium">{t("session-expired")}</p> <button onClick={handleLoginBtn} className="op-btn op-btn-neutral"> {t("login")} </button> diff --git a/apps/OpenSign/src/redux/reducers/ShowTenant.js b/apps/OpenSign/src/redux/reducers/ShowTenant.js index 5bb1090d53..5a31e20250 100644 --- a/apps/OpenSign/src/redux/reducers/ShowTenant.js +++ b/apps/OpenSign/src/redux/reducers/ShowTenant.js @@ -6,9 +6,9 @@ const showTenantSlice = createSlice({ reducers: { showTenant: (state, action) => { return action.payload; - }, - }, + } + } }); export const { showTenant } = showTenantSlice.actions; -export default showTenantSlice.reducer; \ No newline at end of file +export default showTenantSlice.reducer; diff --git a/apps/OpenSign/src/redux/reducers/showHeader.js b/apps/OpenSign/src/redux/reducers/showHeader.js deleted file mode 100644 index 9a98203f28..0000000000 --- a/apps/OpenSign/src/redux/reducers/showHeader.js +++ /dev/null @@ -1,14 +0,0 @@ -import { createSlice } from "@reduxjs/toolkit"; - -const showHeaderSlice = createSlice({ - name: "showTenant", - initialState: "", - reducers: { - showHeader: (state, action) => { - return action.payload; - } - } -}); - -export const { showHeader } = showHeaderSlice.actions; -export default showHeaderSlice.reducer; diff --git a/apps/OpenSign/src/redux/reducers/sidebarReducer.js b/apps/OpenSign/src/redux/reducers/sidebarReducer.js new file mode 100644 index 0000000000..4d3f4bfb7a --- /dev/null +++ b/apps/OpenSign/src/redux/reducers/sidebarReducer.js @@ -0,0 +1,20 @@ +import { createSlice } from "@reduxjs/toolkit"; + +const sidebarSlice = createSlice({ + name: "sidebar", + initialState: { isOpen: true }, + reducers: { + toggleSidebar: (state, action) => { + if (typeof action.payload === "undefined") { + // no payload provided → just toggle + state.isOpen = !state.isOpen; + } else { + // payload provided → use it directly + state.isOpen = action.payload; + } + } + } +}); + +export const { toggleSidebar } = sidebarSlice.actions; +export default sidebarSlice.reducer; diff --git a/apps/OpenSign/src/redux/reducers/widgetSlice.js b/apps/OpenSign/src/redux/reducers/widgetSlice.js index 4705aa4398..d005a0cb6f 100644 --- a/apps/OpenSign/src/redux/reducers/widgetSlice.js +++ b/apps/OpenSign/src/redux/reducers/widgetSlice.js @@ -10,7 +10,10 @@ const initialState = { signatureTypes: null, defaultSignImg: null, myInitial: null, - lastIndex: "" + lastIndex: "", + scrollTriggerId: "", + prefillImg: [], + prefillImgLoad: {} }; const widgetSlice = createSlice({ @@ -35,6 +38,27 @@ const widgetSlice = createSlice({ setLastIndex: (state, action) => { state.lastIndex = action.payload; }, + setScrollTriggerId: (state, action) => { + state.scrollTriggerId = action.payload; + }, + setPrefillImg: (state, action) => { + const existingIndex = state.prefillImg.findIndex( + (img) => img.id === action.payload.id + ); + if (existingIndex !== -1) { + // Replace the existing object with updated URL + state.prefillImg[existingIndex] = { + ...state.prefillImg[existingIndex], + ...action.payload + }; + } else { + // Add new object + state.prefillImg.push(action.payload); + } + }, + setPrefillImgLoad: (state, action) => { + state.prefillImgLoad = action.payload; + }, resetWidgetState: () => initialState } }); @@ -46,7 +70,10 @@ export const { setMyInitial, resetWidgetState, setDefaultSignImg, - setLastIndex + setLastIndex, + setScrollTriggerId, + setPrefillImg, + setPrefillImgLoad } = widgetSlice.actions; export default widgetSlice.reducer; diff --git a/apps/OpenSign/src/redux/store.js b/apps/OpenSign/src/redux/store.js index 17b54c229e..0d2f9863d8 100644 --- a/apps/OpenSign/src/redux/store.js +++ b/apps/OpenSign/src/redux/store.js @@ -2,15 +2,15 @@ import { configureStore } from "@reduxjs/toolkit"; import infoReducer from "./reducers/infoReducer"; import ShowTenant from "./reducers/ShowTenant"; import TourStepsReducer from "./reducers/TourStepsReducer"; -import showHeader from "./reducers/showHeader"; import widgetReducer from "./reducers/widgetSlice"; +import sidebarReducer from "./reducers/sidebarReducer"; export const store = configureStore({ reducer: { appInfo: infoReducer, TourSteps: TourStepsReducer, ShowTenant, - showHeader, - widget: widgetReducer + widget: widgetReducer, + sidebar: sidebarReducer } }); diff --git a/apps/OpenSign/src/reports/contact/Contactbook.jsx b/apps/OpenSign/src/reports/contact/Contactbook.jsx new file mode 100644 index 0000000000..8594ee5997 --- /dev/null +++ b/apps/OpenSign/src/reports/contact/Contactbook.jsx @@ -0,0 +1,505 @@ +import React, { useState, useEffect, useRef } from "react"; +import pad from "../../assets/images/pad.svg"; +import axios from "axios"; +import { useTranslation } from "react-i18next"; +import EditContactForm from "./EditContactForm"; +import ModalUi from "../../primitives/ModalUi"; +import Alert from "../../primitives/Alert"; +import Tooltip from "../../primitives/Tooltip"; +import Loader from "../../primitives/Loader"; +import { serverUrl_fn } from "../../constant/appinfo"; +import { useElSize } from "../../hook/useElSize"; +import ImportContact from "./ImportContact"; +import AddContact from "../../primitives/AddContact"; + +const Contactbook = (props) => { + const titleRef = useRef(null); + const titleElement = useElSize(titleRef); + const { t } = useTranslation(); + const [currentPage, setCurrentPage] = useState(1); + const [actLoader, setActLoader] = useState({}); + const [isContactform, setIsContactform] = useState(false); + const [isDeleteModal, setIsDeleteModal] = useState({}); + const [isOption, setIsOption] = useState({}); + const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); + const [isModal, setIsModal] = useState({}); + const [contact, setContact] = useState({ + Name: "", + Email: "", + Phone: "", + JobTitle: "", + Company: "" + }); + const [sortOrder, setSortOrder] = useState("asc"); + const startIndex = (currentPage - 1) * props.docPerPage; + const { isMoreDocs, setIsNextRecord } = props; + + useEffect(() => { + if (props.isSearchResult) { + setCurrentPage(1); + } + }, [props.isSearchResult]); + + const getPaginationRange = () => { + const totalPageNumbers = 7; // Adjust this value to show more/less page numbers + const pages = []; + const totalPages = Math.ceil(props.List.length / props.docPerPage); + if (totalPages <= totalPageNumbers) { + for (let i = 1; i <= totalPages; i++) { + pages.push(i); + } + } else { + const leftSiblingIndex = Math.max(currentPage - 1, 1); + const rightSiblingIndex = Math.min(currentPage + 1, totalPages); + + const showLeftDots = leftSiblingIndex > 2; + const showRightDots = rightSiblingIndex < totalPages - 2; + + const firstPageIndex = 1; + const lastPageIndex = totalPages; + + if (!showLeftDots && showRightDots) { + let leftItemCount = 3; + let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); + + pages.push(...leftRange); + pages.push("..."); + pages.push(totalPages); + } else if (showLeftDots && !showRightDots) { + let rightItemCount = 3; + let rightRange = Array.from( + { length: rightItemCount }, + (_, i) => totalPages - rightItemCount + i + 1 + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...rightRange); + } else if (showLeftDots && showRightDots) { + let middleRange = Array.from( + { length: 3 }, + (_, i) => leftSiblingIndex + i + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...middleRange); + pages.push("..."); + pages.push(lastPageIndex); + } + } + + return pages; + }; + const showAlert = (type, message, time = 1500) => { + setAlertMsg({ type: type, message: message }); + setTimeout(() => setAlertMsg({ type: "", message: "" }), time); + }; + const pageNumbers = getPaginationRange(); + // below useEffect reset currenpage to 1 if user change route + useEffect(() => { + return () => setCurrentPage(1); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // below useEffect is used to render next record if IsMoreDoc is true + // second last value of pageNumber array is same as currentPage + useEffect(() => { + if (isMoreDocs && pageNumbers[pageNumbers.length - 1] === currentPage) { + setIsNextRecord(true); + } + }, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]); + + const handleActionBtn = async (act, item) => { + if (act.action === "delete") { + setIsDeleteModal({ [item.objectId]: true }); + } else if (act.action === "option") { + setIsOption({ [item.objectId]: !isOption[item.objectId] }); + } else if (act.action === "edit") { + setContact(item); + setIsModal({ [`edit_${item.objectId}`]: true }); + } + }; + // Get current list + const indexOfLastDoc = currentPage * props.docPerPage; + const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; + const sortedList = React.useMemo(() => { + const contacts = [...props.List]; + contacts.sort((a, b) => { + const nameA = a?.Name?.toLowerCase() || ""; + const nameB = b?.Name?.toLowerCase() || ""; + if (nameA < nameB) return sortOrder === "asc" ? -1 : 1; + if (nameA > nameB) return sortOrder === "asc" ? 1 : -1; + return 0; + }); + return contacts; + }, [props.List, sortOrder]); + + const currentList = sortedList?.slice(indexOfFirstDoc, indexOfLastDoc); + + // Change page + const paginateFront = () => { + const lastValue = pageNumbers?.[pageNumbers?.length - 1]; + if (currentPage < lastValue) { + setCurrentPage(currentPage + 1); + } + }; + + const paginateBack = () => { + if (startIndex > 0) { + setCurrentPage(currentPage - 1); + } + }; + + const handleContactFormModal = () => { + setIsContactform(!isContactform); + }; + + const toggleSortOrder = () => { + setSortOrder(sortOrder === "asc" ? "desc" : "asc"); + }; + + const handleUserData = (data) => { + props.setList((prevData) => [data, ...prevData]); + }; + + const handleDelete = async (item) => { + setIsDeleteModal({}); + setActLoader({ [`${item.objectId}`]: true }); + try { + const serverUrl = serverUrl_fn(); + const cls = "contracts_Contactbook"; + const url = serverUrl + `/classes/${cls}/`; + const body = { IsDeleted: true }; + const res = await axios.put(url + item.objectId, body, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + if (res.data && res.data.updatedAt) { + setActLoader({}); + showAlert("success", t("record-delete-alert")); + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + const handleClose = () => { + setIsDeleteModal({}); + }; + + // `handleImportBtn` is trigger when user click on upload icon from contactbook + const handleImportBtn = () => { + setIsModal({ export: true }); + }; + + // `handleEditContact` is used to update contactas per old contact Id + const handleEditContact = async (updateContact) => { + const updateList = props.List.map((x) => + x.objectId === contact.objectId ? { ...x, ...updateContact } : x + ); + props.setList(updateList); + }; + const handleCloseModal = () => { + setActLoader({}); + setIsModal({}); + }; + return ( + <div className="relative"> + {Object.keys(actLoader)?.length > 0 && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black/30 rounded-box z-30"> + <Loader /> + </div> + )} + <div className="p-2 w-full bg-base-100 text-base-content op-card shadow-lg"> + {alertMsg.message && ( + <Alert type={alertMsg.type}>{alertMsg.message}</Alert> + )} + <div + ref={titleRef} + className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]" + > + <div className="font-light"> + {t(`report-name.Contactbook`)}{" "} + {props.report_help && ( + <span className="text-xs md:text-[13px] font-normal"> + <Tooltip + id="report_help" + message="t(`report-help.Contactbook`)" + /> + </span> + )} + </div> + <div className="flex flex-row justify-center items-center gap-3 mb-2"> + {/* Search input for report bigger in width */} + {titleElement?.width > 500 && ( + <div className="flex"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-contacts")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" + /> + </div> + )} + {/* import contact icon */} + <div + className="cursor-pointer flex" + onClick={() => handleImportBtn()} + > + <i className="fa-light fa-upload text-[23px] md:text-[25px]"></i> + </div> + {/* add contact icon*/} + <div + className="cursor-pointer flex" + onClick={() => handleContactFormModal()} + > + <i className="fa-light fa-square-plus text-accent text-[30px] md:text-[32px]"></i> + </div> + {/* search icon/magnifer icon */} + {titleElement?.width < 500 && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Search" + onClick={() => + props.setMobileSearchOpen(!props.mobileSearchOpen) + } + > + <i className="fa-light fa-magnifying-glass"></i> + </button> + )} + </div> + </div> + {/* Search input for report smalle in width */} + {titleElement?.width < 500 && props.mobileSearchOpen && ( + <div className="top-full left-0 w-full px-3 pt-1 pb-3"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-documents")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + </div> + )} + <div + className={`overflow-auto w-full border-b ${ + props.List?.length > 0 + ? "min-h-[317px]" + : currentList?.length === props.docPerPage + ? "h-fit" + : "h-screen" + }`} + > + <table className="op-table border-collapse w-full mb-4"> + <thead className="text-[14px] text-center"> + <tr className="border-y-[1px]"> + {props.heading?.map((item, index) => ( + <React.Fragment key={index}> + <th className="text-left p-2"> + {t(`report-heading.${item}`)} + {item === "Name" && ( + <button + type="button" + onClick={toggleSortOrder} + className="ml-1" + > + <i + className={ + sortOrder === "asc" + ? "fa-light fa-arrow-down-a-z" + : "fa-light fa-arrow-up-a-z" + } + ></i> + </button> + )} + </th> + </React.Fragment> + ))} + {props.actions?.length > 0 && ( + <th className="p-2 text-transparent pointer-events-none"> + {t("action")} + </th> + )} + </tr> + </thead> + <tbody className="text-[12px]"> + {props.List?.length > 0 && + currentList.map((item, index) => ( + <tr className="last:border-none border-y-[1px]" key={index}> + {props.heading.includes("Sr.No") && ( + <td className="p-2 text-left font-semibold"> + {startIndex + index + 1} + </td> + )} + {props.heading.includes("Name") && ( + <td className="p-2 text-left font-semibold"> + {item?.Name} + </td> + )} + {props.heading.includes("Email") && ( + <td className="p-2 text-left">{item?.Email ?? "-"}</td> + )} + {props.heading.includes("Phone") && ( + <td className="p-2 text-left">{item?.Phone ?? "-"}</td> + )} + {props.heading.includes("Company") && ( + <td className="p-2 text-left">{item?.Company ?? "-"}</td> + )} + {props.heading.includes("JobTitle") && ( + <td className="p-2 text-left">{item?.JobTitle ?? "-"}</td> + )} + <td className="px-3 py-2"> + <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> + {props.actions?.length > 0 && + props.actions.map((act, index) => ( + <button + key={index} + onClick={() => handleActionBtn(act, item)} + title={t(`btnLabel.${act.hoverLabel}`)} + className={`${ + act?.btnColor ? act.btnColor : "" + } op-btn op-btn-sm`} + > + <i className={act.btnIcon}></i> + </button> + ))} + {isDeleteModal[item.objectId] && ( + <ModalUi + isOpen + title={t("delete-contact")} + handleClose={handleClose} + > + <div className="m-[20px]"> + <div className="text-lg font-normal text-base-content"> + {t("contact-delete-alert")} + </div> + <hr className="bg-[#ccc] mt-3" /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handleDelete(item)} + className="w-[100px] op-btn op-btn-primary" + > + {t("yes")} + </button> + <button + onClick={handleClose} + className="w-[100px] op-btn op-btn-secondary" + > + {t("no")} + </button> + </div> + </div> + </ModalUi> + )} + </div> + </td> + </tr> + ))} + </tbody> + </table> + {props.List?.length <= 0 && ( + <div className="flex flex-col items-center justify-center w-ful bg-base-100 text-base-content rounded-xl py-4"> + <div className="w-[60px] h-[60px] overflow-hidden"> + <img + className="w-full h-full object-contain" + src={pad} + alt={t("no-data-avaliable")} + /> + </div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> + </div> + )} + </div> + <div className="op-join flex flex-wrap items-center p-2"> + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateBack()} + className="op-join-item op-btn op-btn-sm" + > + {t("prev")} + </button> + )} + {pageNumbers.map((x, i) => ( + <button + key={i} + onClick={() => setCurrentPage(x)} + disabled={x === "..."} + className={`${ + x === currentPage ? "op-btn-active" : "" + } op-join-item op-btn op-btn-sm`} + > + {x} + </button> + ))} + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateFront()} + className="op-join-item op-btn op-btn-sm" + > + {t("next")} + </button> + )} + </div> + <ModalUi + title={t("add-contact")} + isOpen={isContactform} + handleClose={handleContactFormModal} + > + <AddContact + isDisableTitle + isAddYourSelfCheckbox + details={handleUserData} + closePopup={handleContactFormModal} + /> + </ModalUi> + {isModal?.["edit_" + contact.objectId] && ( + <ModalUi + isOpen + title={t("edit-contact")} + handleClose={handleCloseModal} + > + <EditContactForm + contact={contact} + handleClose={handleCloseModal} + handleEditContact={handleEditContact} + /> + </ModalUi> + )} + <ModalUi + isOpen={isModal?.export} + title={t("bulk-import")} + handleClose={handleCloseModal} + > + <div className="relative"> + {Object.keys(actLoader)?.length > 0 && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> + <Loader /> + </div> + )} + <ImportContact + setLoader={setActLoader} + onImport={handleCloseModal} + showAlert={showAlert} + /> + </div> + </ModalUi> + </div> + </div> + ); +}; + +export default Contactbook; diff --git a/apps/OpenSign/src/components/EditContactForm.jsx b/apps/OpenSign/src/reports/contact/EditContactForm.jsx similarity index 72% rename from apps/OpenSign/src/components/EditContactForm.jsx rename to apps/OpenSign/src/reports/contact/EditContactForm.jsx index f1e1df4250..f960767af6 100644 --- a/apps/OpenSign/src/components/EditContactForm.jsx +++ b/apps/OpenSign/src/reports/contact/EditContactForm.jsx @@ -1,11 +1,17 @@ -import React, { useEffect, useState } from "react"; -import Loader from "../primitives/Loader"; +import { useEffect, useState } from "react"; +import Loader from "../../primitives/Loader"; import { useTranslation } from "react-i18next"; import Parse from "parse"; const EditContactForm = (props) => { const { t } = useTranslation(); const [isLoader, setIsLoader] = useState(false); - const [formData, setFormData] = useState({ Name: "", Email: "", Phone: "" }); + const [formData, setFormData] = useState({ + Name: "", + Email: "", + Phone: "", + Company: "", + JobTitle: "" + }); useEffect(() => { if (props.contact?.Email) { setFormData((prev) => ({ ...prev, ...props.contact })); @@ -31,7 +37,9 @@ const EditContactForm = (props) => { contactId: props.contact.objectId, name: formData.Name, email: formData.Email, - phone: formData.Phone, + phone: formData?.Phone, + company: formData?.Company, + jobTitle: formData?.JobTitle, tenantId: localStorage.getItem("TenantId") }; const res = await Parse.Cloud.run("editcontact", params); @@ -39,7 +47,9 @@ const EditContactForm = (props) => { ...res, Name: formData.Name, Email: formData.Email, - Phone: formData.Phone + Phone: formData?.Phone, + Company: formData?.Company, + JobTitle: formData?.JobTitle }; props.handleEditContact(updateContact); } catch (err) { @@ -112,6 +122,34 @@ const EditContactForm = (props) => { placeholder={t("phone-optional")} /> </div> + <div className="mb-3"> + <label htmlFor="Company" className="block text-xs font-semibold"> + {t("company")} + </label> + <input + type="text" + id="Company" + name="Company" + value={formData.Company} + onChange={(e) => handleChange(e)} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-3"> + <label htmlFor="JobTitle" className="block text-xs font-semibold"> + {t("job-title")} + </label> + <input + type="text" + id="JobTitle" + name="JobTitle" + value={formData.JobTitle} + onChange={(e) => handleChange(e)} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> <div className="mt-4 flex gap-x-2 justify-start"> <button type="submit" className="op-btn op-btn-primary"> {t("submit")} diff --git a/apps/OpenSign/src/reports/contact/ImportContact.jsx b/apps/OpenSign/src/reports/contact/ImportContact.jsx new file mode 100644 index 0000000000..76c3e8a88c --- /dev/null +++ b/apps/OpenSign/src/reports/contact/ImportContact.jsx @@ -0,0 +1,310 @@ +import { useState, useEffect, useRef } from "react"; +import { useTranslation } from "react-i18next"; +import * as XLSX from "xlsx"; +import Parse from "parse"; +import { emailRegex } from "../../constant/const"; + +const ImportContact = ({ setLoader, onImport, showAlert }) => { + const { t } = useTranslation(); + const [currentImportPage, setCurrentImportPage] = useState(1); + const [importedData, setImportedData] = useState([]); + const [invalidRecords, setInvalidRecords] = useState(0); + const recordsPerPage = 5; + + // `capitalize` is used to make word capitalize + const capitalize = (s) => + s && String(s[0]).toUpperCase() + String(s).slice(1); + + // `checkRequiredHeaders` is used to check required headers present or not in csv/excel file + const checkRequiredHeaders = (headers) => { + const requiredHeaders = ["Name", "Email"]; + // Normalize headers to lowercase once + const headersSet = new Set(headers.map((header) => header.toLowerCase())); + + // Check all required headers + const allPresent = requiredHeaders.every((requiredHeader) => + headersSet.has(requiredHeader.toLowerCase()) + ); + return allPresent; + }; + const processCSVFile = async (file, event) => { + const reader = new FileReader(); + reader.onload = (e) => { + const text = e.target.result; + // Parse CSV data + const rows = text.split("\n").map((row) => row.trim()); + const headers = rows[0].split(",").map((header) => header.trim()); + if (checkRequiredHeaders(headers)) { + const records = rows.slice(1).reduce((acc, row) => { + const values = row?.split(",").map((value) => value.trim()) || []; + if (values.length > 1) { + acc.push( + headers.reduce( + (obj, header, index) => ({ + ...obj, + [capitalize(header)]: values[index] || "" + }), + {} + ) + ); + } + return acc; + }, []); + if (records.length <= 100) { + const validRecords = records.length + ? records.filter((x) => emailRegex.test(x.Email)) + : []; + const invalidItems = records?.length - validRecords?.length; + setInvalidRecords(invalidItems); + setImportedData(validRecords); + } else { + alert(t("100-records-only")); + event.target.value = ""; + setImportedData([]); + } + } else { + alert(t("invalid-data")); + event.target.value = ""; + } + }; + reader.readAsText(file); + }; + + const processExcelFile = (file, event) => { + if (file) { + const reader = new FileReader(); + reader.onload = (e) => { + const arrayBuffer = e.target.result; + const workbook = XLSX.read(new Uint8Array(arrayBuffer), { + type: "array" + }); + + // Get the first sheet + const sheetName = workbook.SheetNames[0]; + const sheet = workbook.Sheets[sheetName]; + + // Convert sheet to JSON + const sheetData = XLSX.utils.sheet_to_json(sheet); + if (sheetData.length <= 100) { + // Get all unique keys from the data to handle missing fields + const headers = [ + ...new Set(sheetData.flatMap((item) => Object.keys(item))) + ]; + + if (checkRequiredHeaders(headers)) { + const updateSheetData = sheetData.map((obj) => { + for (let key in obj) { + const capitalizedKey = capitalize(key); + if (capitalizedKey !== key) { + obj[capitalizedKey] = obj[key]; + delete obj[key]; // delete the old key to avoid duplicates + } + } + return obj; + }); + const validRecords = updateSheetData.length + ? updateSheetData.filter((x) => emailRegex.test(x.Email)) + : []; + const invalidItems = updateSheetData?.length - validRecords?.length; + setInvalidRecords(invalidItems); + setImportedData(validRecords); + } else { + alert(t("invalid-data")); + event.target.value = ""; + } + } else { + alert(t("100-records-only")); + event.target.value = ""; + setImportedData([]); + } + }; + + reader.readAsArrayBuffer(file); + } + }; + + // Get all unique keys from the data to handle missing fields + const allKeys = importedData?.length + ? [...new Set(importedData.flatMap((item) => Object.keys(item)))] + : []; + + // Pagination logic for import data table in modal + const totalImportPages = Math.ceil(importedData.length / recordsPerPage); + const currentRecords = importedData.slice( + (currentImportPage - 1) * recordsPerPage, + currentImportPage * recordsPerPage + ); + + // `handleFileUpload` is trigger when user upload excel file from contactbook + const handleFileUpload = (event) => { + const file = event.target?.files?.[0]; + if (file) { + const fileName = file.name; + const fileNameExt = fileName + .substr(fileName.lastIndexOf(".") + 1) + .toLowerCase(); + const isValidExt = ["csv", "xlsx", "xls"].includes(fileNameExt); + if (isValidExt) { + setCurrentImportPage(1); + if (fileNameExt !== "csv") { + processExcelFile(file, event); + } else { + processCSVFile(file, event); + } + } else { + event.target.value = ""; + alert(t("csv-excel-support-only")); + } + } else { + setImportedData([]); + setCurrentImportPage(1); + setInvalidRecords(0); + } + }; + + // `handleNextPage` is used to importdata table in modal + const handleNextPage = (e) => { + e.preventDefault(); + if (currentImportPage < totalImportPages) { + setCurrentImportPage(currentImportPage + 1); + } + }; + + // `handlePreviousPage` is used to importdata table in modal + const handlePreviousPage = (e) => { + e.preventDefault(); + if (currentImportPage > 1) { + setCurrentImportPage(currentImportPage - 1); + } + }; + // `handleImportData` is used to create batch in contact + const handleImportData = async (e) => { + e.preventDefault(); + e.stopPropagation(); + setLoader(true); + try { + const filterdata = importedData.map((x) => ({ + Name: x.Name, + Email: x.Email, + Phone: x.Phone, + Company: x.Company, + JobTitle: x.JobTitle, + TenantId: localStorage.getItem("TenantId") + })); + const contacts = JSON.stringify(filterdata); + const res = await Parse.Cloud.run("createbatchcontact", { contacts }); + if (res) { + showAlert( + "info", + t("contact-imported", { + imported: res?.success || 0, + failed: res?.failed || 0 + }) + ); + if (res?.success > 0) { + setTimeout(() => window.location.reload(), 1500); + } + } + } catch (err) { + console.log("err while creating batch contact", err); + showAlert("danger", t("something-went-wrong-mssg")); + } finally { + onImport && onImport(); + setImportedData([]); + setInvalidRecords(0); + } + }; + + return ( + <form onSubmit={handleImportData} className="p-[20px] h-full "> + <div className="text-xs"> + <label className="block ml-2"> + {t("contacts-file")} + <span className="text-red-500 text-[13px]"> *</span> + </label> + <input + type="file" + accept=".csv, .xlsx, .xls" + onChange={handleFileUpload} + required + className="op-file-input op-file-input-bordered op-file-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + <p className="mt-1 ml-2 text-[11px] text-gray-600"> + {t("import-guideline")}{" "} + <a + href="/sample_contacts.csv" + target="_blank" + rel="noopener noreferrer" + className="text-primary underline cursor-pointer" + > + {t("download-sample")} + </a> + </p> + </div> + <div className="text-md m-2"> + <div className="flex flex-col md:flex-row gap-1"> + <span> + {t("total-records-found", { + count: importedData.length + })} + </span> + <span> + {t("Invalid-records-found", { + records: invalidRecords + })} + </span> + </div> + {importedData?.length > 0 && ( + <div className="overflow-x-auto p-1"> + <table className="op-table op-table-zebra w-full"> + <thead> + <tr> + {allKeys.map((key, index) => ( + <th key={index}>{key}</th> + ))} + </tr> + </thead> + <tbody> + {currentRecords.map((row, rowIndex) => ( + <tr key={rowIndex}> + {allKeys.map((key, colIndex) => ( + <td key={colIndex}>{row[key] || "-"}</td> + ))} + </tr> + ))} + </tbody> + </table> + <div className="flex justify-between items-center mt-4"> + <button + className="op-btn op-btn-primary op-btn-sm" + disabled={currentImportPage === 1} + onClick={handlePreviousPage} + > + {t("previous")} + </button> + <span> + {t("page-n-of-n", { + currentPage: currentImportPage, + totalPages: totalImportPages + })} + </span> + <button + className="op-btn op-btn-primary op-btn-sm" + disabled={currentImportPage === totalImportPages} + onClick={handleNextPage} + > + {t("next")} + </button> + </div> + </div> + )} + </div> + <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> + <button type="submit" className="op-btn op-btn-primary"> + {t("import")} + </button> + </form> + ); +}; + +export default ImportContact; diff --git a/apps/OpenSign/src/reports/document/DocumentsReport.jsx b/apps/OpenSign/src/reports/document/DocumentsReport.jsx new file mode 100644 index 0000000000..f49bfa717a --- /dev/null +++ b/apps/OpenSign/src/reports/document/DocumentsReport.jsx @@ -0,0 +1,1841 @@ +import React, { useState, useEffect, useRef } from "react"; +import pad from "../../assets/images/pad.svg"; +import recreatedoc from "../../assets/images/recreatedoc.png"; +import { Link, useLocation, useNavigate } from "react-router"; +import axios from "axios"; +import ModalUi from "../../primitives/ModalUi"; +import Alert from "../../primitives/Alert"; +import Tooltip from "../../primitives/Tooltip"; +import ShareButton from "../../primitives/ShareButton"; +import Parse from "parse"; +import { + copytoData, + fetchUrl, + formatDate, + getSignedUrl, + getTenantDetails, + handleSignatureType, + replaceMailVaribles, + signatureTypes, + openInNewTab, + createDocument, + getSignerEmail, + defaultMailBody, + defaultMailSubject +} from "../../constant/Utils"; +import EditorToolbar, { + module1, + formats +} from "../../components/pdf/EditorToolbar"; +import ReactQuill from "react-quill-new"; +import "../../styles/quill.css"; +import BulkSendUi from "../../components/BulkSendUi"; +import Loader from "../../primitives/Loader"; +import { serverUrl_fn } from "../../constant/appinfo"; +import { useTranslation } from "react-i18next"; +import DownloadPdfZip from "../../primitives/DownloadPdfZip"; +import { useElSize } from "../../hook/useElSize"; +import PrefillWidgetModal from "../../components/pdf/PrefillWidgetsModal"; +import LottieWithLoader from "../../primitives/DotLottieReact"; +import * as utils from "../../utils"; +import { RenderReportCell } from "../../primitives/RenderReportCell"; +import CustomizeMail from "../../components/pdf/CustomizeMail"; +import { useSelector } from "react-redux"; + +const DocumentsReport = (props) => { + const copyUrlRef = useRef(null); + const titleRef = useRef(null); + const titleElement = useElSize(titleRef); + const journey = "Use Template"; + const appName = + "OpenSign™"; + const { t } = useTranslation(); + const navigate = useNavigate(); + const location = useLocation(); + const prefillImg = useSelector((state) => state.widget.prefillImg); + const isDashboard = + location?.pathname === "/dashboard/35KBoSgoAK" ? true : false; + const [currentPage, setCurrentPage] = useState(1); + const [actLoader, setActLoader] = useState({}); + const [isDeleteModal, setIsDeleteModal] = useState({}); + const [isRevoke, setIsRevoke] = useState({}); + const [isShare, setIsShare] = useState({}); + const [shareUrls, setShareUrls] = useState([]); + const [copied, setCopied] = useState(false); + const [isOption, setIsOption] = useState({}); + const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); + const [isResendMail, setIsResendMail] = useState({}); + const [mail, setMail] = useState({ subject: "", body: "" }); + const [userDetails, setUserDetails] = useState({}); + const [isNextStep, setIsNextStep] = useState({}); + const [isBulkSend, setIsBulkSend] = useState({}); + const [templateDeatils, setTemplateDetails] = useState({}); + const [placeholders, setPlaceholders] = useState([]); + const [isLoader, setIsLoader] = useState({}); + const [isModal, setIsModal] = useState({}); + const [reason, setReason] = useState(""); + const [isDownloadModal, setIsDownloadModal] = useState(false); + const [signatureType, setSignatureType] = useState([]); + const [expiryDate, setExpiryDate] = useState(""); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); + const [renameDoc, setRenameDoc] = useState(""); + const [isSuccess, setIsSuccess] = useState({}); + const [templateId, setTemplateId] = useState(""); + const [forms, setForms] = useState([]); + const [xyPosition, setXyPosition] = useState([]); + const [signerList, setSignerList] = useState([]); + const [mailStatus, setMailStatus] = useState(""); + const [isSend, setIsSend] = useState(false); + const [documentId, setDocumentId] = useState(""); + const [isNewContact, setIsNewContact] = useState({ status: false, id: "" }); + const [isPrefillModal, setIsPrefillModal] = useState({}); + const [error, setError] = useState(""); + const [isMailModal, setIsMailModal] = useState(false); + const [customizeMail, setCustomizeMail] = useState({ body: "", subject: "" }); + const [defaultMail, setDefaultMail] = useState({ body: "", subject: "" }); + const [currUserId, setCurrUserId] = useState(false); + const [documentDetails, setDocumentDetails] = useState(); + const startIndex = (currentPage - 1) * props.docPerPage; + const { isMoreDocs, setIsNextRecord } = props; + + useEffect(() => { + if (props.isSearchResult) { + setCurrentPage(1); + } + }, [props.isSearchResult]); + + const getPaginationRange = () => { + const totalPageNumbers = 7; // Adjust this value to show more/less page numbers + const pages = []; + const totalPages = Math.ceil(props.List.length / props.docPerPage); + if (totalPages <= totalPageNumbers) { + for (let i = 1; i <= totalPages; i++) { + pages.push(i); + } + } else { + const leftSiblingIndex = Math.max(currentPage - 1, 1); + const rightSiblingIndex = Math.min(currentPage + 1, totalPages); + + const showLeftDots = leftSiblingIndex > 2; + const showRightDots = rightSiblingIndex < totalPages - 2; + + const firstPageIndex = 1; + const lastPageIndex = totalPages; + + if (!showLeftDots && showRightDots) { + let leftItemCount = 3; + let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); + + pages.push(...leftRange); + pages.push("..."); + pages.push(totalPages); + } else if (showLeftDots && !showRightDots) { + let rightItemCount = 3; + let rightRange = Array.from( + { length: rightItemCount }, + (_, i) => totalPages - rightItemCount + i + 1 + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...rightRange); + } else if (showLeftDots && showRightDots) { + let middleRange = Array.from( + { length: 3 }, + (_, i) => leftSiblingIndex + i + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...middleRange); + pages.push("..."); + pages.push(lastPageIndex); + } + } + + return pages; + }; + const showAlert = (type, message, time = 1500) => { + setAlertMsg({ type: type, message: message }); + setTimeout(() => setAlertMsg({ type: "", message: "" }), time); + }; + const pageNumbers = getPaginationRange(); + // below useEffect reset currenpage to 1 if user change route + useEffect(() => { + return () => setCurrentPage(1); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // below useEffect is used to render next record if IsMoreDoc is true + // second last value of pageNumber array is same as currentPage + useEffect(() => { + if (isMoreDocs && pageNumbers[pageNumbers.length - 1] === currentPage) { + setIsNextRecord(true); + } + }, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]); + + //function to fetch tenant Details + const fetchTenantDetails = async () => { + const user = JSON.parse( + localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ); + if (user) { + try { + const tenantDetails = await getTenantDetails(user?.objectId); + if (tenantDetails && tenantDetails === "user does not exist!") { + alert(t("user-not-exist")); + } else if (tenantDetails) { + const signatureType = tenantDetails?.SignatureType || []; + const filterSignTypes = signatureType?.filter( + (x) => x.enabled === true + ); + //condition to check tenant have some already set any email template + if (tenantDetails?.RequestBody) { + //customize mail state is handle to when user want to customize already set tenant email format then use that format + setCustomizeMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + setDefaultMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + } else { + const defaultRequestBody = defaultMailBody; + const defaultSubject = defaultMailSubject; + setCustomizeMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + setDefaultMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + } + return filterSignTypes; + } + } catch (e) { + alert(t("user-not-exist")); + } + } else { + alert(t("user-not-exist")); + } + }; + + // `handleURL` is used to open microapp + const handleURL = async (item, act) => { + navigate(`/${act.redirectUrl}?docId=${item?.objectId}`); + }; + + const fetchTemplate = async (templateId) => { + try { + const params = { + templateId: templateId, + include: ["Placeholders.signerPtr"] + }; + const axiosRes = await axios.post( + `${localStorage.getItem("baseUrl")}functions/getTemplate`, + params, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } + } + ); + if (axiosRes) { + return axiosRes; + } + } catch (e) { + console.log("Error to fetch template in report", e); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + console.log("Error to fetch template in report", e); + } + }; + //function is called when there ther no any prefill role widget exist then create direct document and navigate + const navigatePageToDoc = async (templateRes, placeholder, signer) => { + setIsPrefillModal({}); + const res = await createDocument( + [templateRes || templateDeatils], + placeholder || xyPosition, + signer || signerList, + templateRes?.URL || templateDeatils?.URL + ); + if (res.status === "success") { + navigate(`/placeHolderSign/${res.id}`, { + state: { title: "Use Template" } + }); + } else { + alert(t("something-went-wrong-mssg")); + } + }; + const handleUseTemplate = async (templateId, item) => { + try { + const templateDeatils = await fetchTemplate(templateId); + const templateData = templateDeatils.data && templateDeatils.data.result; + if (!templateData.error) { + setTemplateDetails(templateData); + setXyPosition(templateData?.Placeholders); + const signer = utils.handleSignersList(templateData); + setSignerList(signer); + + //this function is used to open modal to show signers list + await utils?.handleDisplaySignerList( + templateData?.Placeholders, + templateData?.Signers, + setForms + ); + setIsModal({}); + setIsPrefillModal({ [item.objectId]: true }); + } else { + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + const handleActionBtn = async (act, item) => { + if (act.action === "redirect") { + handleURL(item, act); + } else if (act.action === "delete") { + setIsDeleteModal({ [item.objectId]: true }); + } else if (act.action === "share") { + handleShare(item); + } else if (act.action === "revoke") { + setIsRevoke({ [item.objectId]: true }); + } else if (act.action === "option") { + setIsOption({ [item.objectId]: !isOption[item.objectId] }); + } else if (act.action === "resend") { + setIsResendMail({ [item.objectId]: true }); + } else if (act.action === "rename") { + setIsModal({ [`rename_${item.objectId}`]: true }); + } else if (act.action === "edit") { + setIsModal({ [`edit_${item.objectId}`]: true }); + } else if (act.action === "saveastemplate") { + setIsModal({ [`saveastemplate_${item.objectId}`]: true }); + } else if (act.action === "recreatedocument") { + const isPrefill = item?.Placeholders?.some((p) => p.Role === "prefill"); + setError(isPrefill ? t("fix-resend-error") : ""); + setIsModal({ [`recreatedocument_${item.objectId}`]: true }); + } else if (act.action === "extendexpiry") { + setIsModal({ [`extendexpiry_${item.objectId}`]: true }); + } + }; + // Get current list + const indexOfLastDoc = currentPage * props.docPerPage; + const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; + const sortedList = props.List; + const currentList = sortedList?.slice(indexOfFirstDoc, indexOfLastDoc); + + // Change page + const paginateFront = () => { + const lastValue = pageNumbers?.[pageNumbers?.length - 1]; + if (currentPage < lastValue) { + setCurrentPage(currentPage + 1); + } + }; + + const paginateBack = () => { + if (startIndex > 0) { + setCurrentPage(currentPage - 1); + } + }; + + const handleDelete = async (item) => { + setIsDeleteModal({}); + setActLoader({ [`${item.objectId}`]: true }); + try { + const serverUrl = serverUrl_fn(); + const cls = "contracts_Document"; + const url = serverUrl + `/classes/${cls}/`; + const body = { IsArchive: true }; + const res = await axios.put(url + item.objectId, body, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + if (res.data && res.data.updatedAt) { + setActLoader({}); + showAlert("success", t("record-delete-alert")); + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + const handleClose = () => { + setIsRevoke({}); + setIsDeleteModal({}); + setReason(""); + }; + const handleShare = (item) => { + setActLoader({ [item.objectId]: true }); + const host = window.location.origin; + const sendMail = item?.SendMail || false; + const getUrl = (x) => { + //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function + if (x?.signerObjId) { + const encodeBase64 = btoa( + `${item.objectId}/${getSignerEmail(x, item?.Signers)}/${x?.signerObjId}/${sendMail}` + ); + return `${host}/login/${encodeBase64}`; + } else { + const encodeBase64 = btoa(`${item.objectId}/${x.email}`); + return `${host}/login/${encodeBase64}`; + } + }; + const removePrefill = item?.Placeholders.filter( + (data) => data?.Role !== "prefill" + ); + const urls = removePrefill?.map((x) => ({ + email: getSignerEmail(x, item?.Signers) || x.email || "-", + url: getUrl(x) + })); + setShareUrls(urls); + setIsShare({ [item.objectId]: true }); + }; + + const copytoclipboard = (text) => { + copytoData(text); + if (copyUrlRef.current) { + copyUrlRef.current.textContent = text; // Update text safely + } + setCopied(true); + setTimeout(() => setCopied(false), 1500); // Reset copied state after 1.5 seconds + }; + const copybtn = (text, email) => { + copytoData(text); + if (copyUrlRef.current) { + copyUrlRef.current.textContent = text; // Update text safely + } + setCopied({ [email]: true }); + }; + //function to handle revoke/decline docment + const handleRevoke = async (item) => { + const senderUser = localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ); + const jsonSender = JSON.parse(senderUser); + setIsRevoke({}); + setActLoader({ [`${item.objectId}`]: true }); + const data = { + IsDeclined: true, + DeclineReason: reason, + DeclineBy: { + __type: "Pointer", + className: "_User", + objectId: jsonSender?.objectId + } + }; + await axios + .put( + `${localStorage.getItem("baseUrl")}classes/contracts_Document/${ + item.objectId + }`, + data, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ) + .then(async (result) => { + const res = result.data; + if (res) { + setActLoader({}); + showAlert("success", t("record-revoke-alert")); + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + setReason(""); + }) + .catch((err) => { + console.log("err", err); + setReason(""); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + }); + }; + + // `handleDownload` is used to get valid doc url available in completed report + const handleDownload = async (item) => { + setActLoader({ [`${item.objectId}`]: true }); + const url = item?.SignedUrl || item?.URL || ""; + const pdfName = + item?.Name?.length > 100 + ? item?.Name?.slice(0, 100) + : item?.Name || "Document"; + const isCompleted = item?.IsCompleted || false; + const formatId = item?.ExtUserPtr?.DownloadFilenameFormat; + const docName = utils.buildDownloadFilename(formatId, { + docName: pdfName, + email: item?.ExtUserPtr?.Email, + isSigned: isCompleted + }); + const templateId = props?.ReportName === "Templates" && item.objectId; + const docId = props?.ReportName !== "Templates" && item.objectId; + if (url) { + try { + if (isCompleted) { + setIsDownloadModal({ [item.objectId]: true }); + } else { + const signedUrl = await getSignedUrl( + url, + docId, + templateId + ); + await fetchUrl(signedUrl, docName); + } + setActLoader({}); + } catch (err) { + console.log("err in getsignedurl", err); + alert(t("something-went-wrong-mssg")); + setActLoader({}); + } + } + }; + + // `handleSubjectChange` is used to add or change subject of resend mail + const handleSubjectChange = (subject, doc) => { + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email, + receiver_phone: userDetails?.Phone || "", + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: signPdf + }; + const res = replaceMailVaribles(subject, "", variables); + setMail((prev) => ({ ...prev, subject: res.subject })); + }; + + // `handlebodyChange` is used to add or change body of resend mail + const handlebodyChange = (body, doc) => { + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email || "", + receiver_phone: userDetails?.Phone || "", + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: signPdf + }; + const res = replaceMailVaribles("", body, variables); + + if (body) { + setMail((prev) => ({ ...prev, body: res.body })); + } + }; + // `handleNextBtn` is used to open edit mail template screen in resend mail modal + // as well as replace variable with original one + const handleNextBtn = (user, doc) => { + const userdata = { + Name: user?.signerPtr?.Name, + Email: user.email ? user?.email : user.signerPtr?.Email, + Phone: user?.signerPtr?.Phone, + objectId: user?.signerPtr?.objectId + }; + setUserDetails(userdata); + const encodeBase64 = user.email + ? btoa(`${doc.objectId}/${user.email}`) + : btoa( + `${doc.objectId}/${user.signerPtr.Email}/${user.signerPtr.objectId}` + ); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: user?.signerPtr?.Name || "", + receiver_email: user?.email ? user?.email : user?.signerPtr?.Email, + receiver_phone: user?.signerPtr?.Phone || "", + expiry_date: localExpireDate, + company_name: doc?.ExtUserPtr?.Company || "", + signing_url: signPdf + }; + const subject = + doc?.RequestSubject || + doc?.ExtUserPtr?.TenantId?.RequestSubject || + `{{sender_name}} has requested you to sign "{{document_title}}"`; + const body = + doc?.RequestBody || + doc?.ExtUserPtr?.TenantId?.RequestBody || + `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p><a href='{{signing_url}}' rel='noopener noreferrer' target='_blank'>Sign here</a></p><br><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br></body> </html>`; + const res = replaceMailVaribles(subject, body, variables); + setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); + setIsNextStep({ [user.Id]: true }); + }; + const handleResendMail = async (e, doc, user) => { + e.preventDefault(); + setActLoader({ [user?.Id]: true }); + const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + let params = { + replyto: + doc?.ExtUserPtr?.Email || + "", + extUserId: doc?.ExtUserPtr?.objectId, + recipient: userDetails?.Email, + subject: mail.subject, + from: + doc?.ExtUserPtr?.Email, + html: mail.body + }; + try { + const res = await axios.post(url, params, { headers: headers }); + if (res?.data?.result?.status === "success") { + showAlert("success", t("mail-sent-alert")); + setIsResendMail({}); + } + else { + showAlert("danger", t("something-went-wrong-mssg")); + } + } catch (err) { + console.log("err in sendmail", err); + showAlert("danger", t("something-went-wrong-mssg")); + } finally { + setIsNextStep({}); + setUserDetails({}); + setActLoader({}); + } + }; + const fetchUserStatus = (user, doc) => { + const email = user.email ? user.email : user.signerPtr.Email; + const audit = doc?.AuditTrail?.find((x) => x.UserPtr.Email === email); + + return ( + <div className="flex flex-row gap-2 justify-center items-center"> + <div className="flex justify-center items-center bg-base-300 text-base-content shadow-md op-card w-[65px] h-[32px] cursor-default"> + {audit?.Activity ? audit?.Activity : "Awaited"} + </div> + + <button + onClick={() => handleNextBtn(user, doc)} + className={ + audit?.Activity !== "Signed" + ? "op-btn op-btn-primary op-btn-sm" + : " text-transparent cursor-default pointer-events-none" + } + disabled={audit?.Activity === "Signed"} + > + {audit?.Activity !== "Signed" && "Resend"} + </button> + </div> + ); + }; + // `handleQuickSendClose` is trigger when bulk send component trigger close event + const handleQuickSendClose = (status, count) => { + setIsBulkSend({}); + if (status === "success") { + showAlert("success", count + " " + t("document-sent-alert")); + } else { + showAlert("danger", t("something-went-wrong-mssg")); + } + }; + + const handleUpdateExpiry = async (e, item) => { + e.preventDefault(); + e.stopPropagation(); + if (expiryDate) { + const oldExpiryDate = new Date(item?.ExpiryDate?.iso); + const newExpiryDate = new Date(expiryDate); + if (newExpiryDate > oldExpiryDate) { + setActLoader({ [`${item.objectId}`]: true }); + const updateExpiryDate = new Date(expiryDate).toISOString(); + const expiryIsoFormat = { iso: updateExpiryDate, __type: "Date" }; + try { + const serverUrl = serverUrl_fn(); + const cls = "contracts_Document"; + const url = serverUrl + `/classes/${cls}/`; + const body = { ExpiryDate: expiryIsoFormat }; + const res = await axios.put(url + item.objectId, body, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + if (res.data && res.data.updatedAt) { + showAlert( + "success", + t("expiry-date-updated", { + newexpirydate: new Date(expiryDate)?.toLocaleDateString() + }), + 2000 + ); + if (props.ReportName === "Expired Documents") { + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg"), 2000); + } finally { + setActLoader({}); + setExpiryDate(); + setIsModal({}); + } + } else { + showAlert("danger", t("expiry-date-error"), 2000); + } + } else { + showAlert("danger", t("expiry-date-error"), 2000); + } + }; + + // `handleRenameDoc` is used to update document name + const handleRenameDoc = async (item) => { + setActLoader({ [item.objectId]: true }); + setIsModal({}); + const className = "contracts_Document"; + try { + const query = new Parse.Query(className); + const docObj = await query.get(item.objectId); + docObj.set("Name", renameDoc); + await docObj.save(); + //update report list data + const updateList = props.List.map((x) => + x.objectId === item.objectId ? { ...x, Name: renameDoc } : x + ); + props.setList(updateList); + setActLoader({}); + showAlert("success", "Document updated", 2000); + } catch (err) { + showAlert("danger", t("something-went-wrong-mssg"), 2000); + setActLoader({}); + } + }; + const handleBtnVisibility = (act, item) => { + if (!act.restrictBtn) { + return true; + } else if ( + act.restrictBtn === true && + item.ExtUserPtr?.objectId === extClass?.[0]?.objectId + ) { + return true; + } + }; + + const handleCloseModal = () => { + setIsModal({}); + }; + const handleSaveAsTemplate = async (doc) => { + try { + const params = { docId: doc?.objectId }; + const templateRes = await Parse.Cloud.run("saveastemplate", params); + setTemplateId(templateRes?.id); + setIsSuccess({ [doc.objectId]: true }); + } catch (err) { + console.log("Err in saveastemplate", err); + } finally { + setActLoader({}); + } + }; + const handleCloseTemplate = () => { + setTemplateId(""); + setIsSuccess({}); + handleCloseModal(); + setActLoader({}); + handleClose(); + }; + + // `handleBulkSendTemplate` is used to open modal as well as fetch template + // and show Ui on the basis template response + const handleBulkSendTemplate = async (templateId, docId) => { + setIsBulkSend({ [docId]: true }); + setIsLoader({ [docId]: true }); + try { + const axiosRes = await fetchTemplate(templateId); + const templateRes = axiosRes.data && axiosRes.data.result; + const isPrefillExist = templateRes?.Placeholders.some( + (x) => x.Role === "prefill" + ); + if (isPrefillExist) { + setIsBulkSend({}); + setIsLoader({}); + showAlert("danger", t("prefill-bulk-error")); + } else { + const tenantSignTypes = await fetchTenantDetails(); + const docSignTypes = templateRes?.SignatureType || signatureTypes; + const updatedSignatureType = await handleSignatureType( + tenantSignTypes, + docSignTypes + ); + setSignatureType(updatedSignatureType); + setPlaceholders(templateRes?.Placeholders); + setTemplateDetails(templateRes); + setIsLoader({}); + } + } catch (err) { + console.log("err in fetch template in bulk modal", err); + setIsBulkSend({}); + showAlert("danger", t("something-went-wrong-mssg")); + } + }; + + const handleResendClose = () => { + setIsResendMail({}); + setIsNextStep({}); + setUserDetails({}); + }; + + const handleRecreateDoc = async (item) => { + setActLoader({ [item.objectId]: true }); + try { + const res = await Parse.Cloud.run("recreatedoc", { + docId: item.objectId + }); + if (res) { + openInNewTab(`/placeHolderSign/${res.objectId}`, "_self"); + } + } catch (err) { + handleCloseModal(); + showAlert("danger", err.message); + // showAlert("danger", t("something-went-wrong-mssg")); + console.log("Err while create duplicate template", err); + } finally { + setActLoader({}); + } + }; + + const restrictBtn = (item, act) => { + return item.IsSignyourself && act.action === "recreatedocument" + ? true + : false; + }; + // `handleAddUser` is used to adduserAdd commentMore actions + const handleAddUser = (data, id) => { + const signerPtr = { + __type: "Pointer", + className: "contracts_Contactbook", + objectId: data.objectId + }; + const updatePlaceHolder = xyPosition.map((x) => { + if (x.signerObjId === id || x.Id === id) { + return { ...x, signerPtr: signerPtr, signerObjId: data.objectId }; + } + return { ...x }; + }); + setXyPosition(updatePlaceHolder); + const updateSigner = signerList.map((y) => { + //condition is used to updated signer's email + if (y.objectId === id) { + return data; + } + //condition is used to add new signer's mail to role + else if (y.Id === id) { + return { ...y, ...data, className: "contracts_Contactbook" }; + } + return { ...y }; + }); + setSignerList(updateSigner); + + //condition when there are any new signer add then save that signer in dropdown option + if (isNewContact.status) { + let newForm = [...forms]; + const label = `${data.Name}<${data.Email}>`; + const index = newForm.findIndex((x) => x.value === id); + newForm[index].label = label; + newForm[index].value = id; + setForms(newForm); + } + }; + const handleClosePrefillModal = () => { + setIsPrefillModal(false); + setActLoader({}); + setForms([]); + setXyPosition([]); + }; + //`handlePrefillWidgetCreateDoc` is used to embed prefill all widgets on document, create document, and send document + const handlePrefillWidgetCreateDoc = async () => { + const scale = 1; + const key = Object.keys(isPrefillModal)[0]; + setActLoader({ [key]: true }); + const res = await utils?.handleCheckPrefillCreateDoc( + xyPosition, + signerList, + setIsPrefillModal, + scale, + templateDeatils?.URL, + [templateDeatils], + prefillImg, + extClass?.[0]?.UserId?.objectId, + ); + if (res?.status === "unfilled") { + const emptyWidget = res?.emptyResponseObjects + .map((item) => `[ ${item.options.name}]`) + .join(", "); + const timeInMiliSec = 6000; + showAlert( + "danger", + t("prefill-unfilled-widget", { emptyWidget: emptyWidget }), + timeInMiliSec + ); + } else if (res?.status === "unattach signer") { + showAlert("danger", "please attach all role to signer"); + } else if (res?.status === "success") { + setDocumentId(res.id); + setActLoader({}); + setIsMailModal(true); + + try { + await fetchTenantDetails(); + } catch (e) { + console.log("error in fetchTenantDetails", e); + alert(t("user-not-exist")); + } + } + setActLoader({}); + }; + const handleRecipientSign = (documentId, currentId) => { + if (currentId) { + navigate(`/recipientSignPdf/${documentId}/${currentId}`); + } else { + navigate(`/recipientSignPdf/${documentId}`); + } + }; + //function show signer list and share link to share signUrl + const handleShareList = () => { + const shareLinkList = []; + let signerMail = signerList; + for (let i = 0; i < signerMail.length; i++) { + const objectId = signerMail[i].objectId; + const hostUrl = window.location.origin; + const sendMail = false; + //encode this url value `${documentId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function + const encodeBase64 = btoa( + `${documentId}/${signerMail[i].Email}/${objectId}/${sendMail}` + ); + let signPdf = `${hostUrl}/login/${encodeBase64}`; + shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); + } + return shareLinkList.map((data, ind) => { + return ( + <div + className="flex flex-row justify-between items-center mb-1" + key={ind} + > + {copied && <Alert type="success">{t("copied")}</Alert>} + <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> + {data.signerEmail} + </span> + <div className="flex flex-row items-center gap-3 "> + <button + onClick={() => copytoclipboard(data.url)} + type="button" + className="flex flex-row items-center op-link op-link-primary" + > + <i className="fa-light fa-copy" /> + <span className=" hidden md:block ml-1 ">{t("copy-link")}</span> + </button> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={data.url} + > + <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> + </ShareButton> + </div> + </div> + ); + }); + }; + const handleRemovePrefill = (placeholders) => { + const removePrefill = placeholders?.filter( + (data) => data?.Role !== "prefill" + ); + return removePrefill; + }; + const handleCloseMail = () => { + handleRecipientSign(documentId); + }; + //function is used to show warning message when use save as template + const handleWarning = (item) => { + const isPrefill = item?.Placeholders?.some((x) => x?.Role === "prefill"); + if (isPrefill) { + return ( + <span className="flex text-sm mt-3 text-red-500"> + {t("save-as-temp-warn")} + </span> + ); + } + }; + return ( + <div className="relative"> + {Object.keys(actLoader)?.length > 0 && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black/30 rounded-box z-30"> + <Loader /> + </div> + )} + <div className="p-2 w-full bg-base-100 text-base-content op-card shadow-lg"> + {alertMsg.message && ( + <Alert type={alertMsg.type}>{alertMsg.message}</Alert> + )} + <div + ref={titleRef} + className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]" + > + <div className="font-light"> + {t(`report-name.${props.ReportName}`)}{" "} + {props.report_help && ( + <span className="text-xs md:text-[13px] font-normal"> + <Tooltip + id="report_help" + message={t(`report-help.${props.ReportName}`)} + /> + </span> + )} + </div> + <div className="flex flex-row justify-center items-center gap-3 mb-2"> + {/* Search input for report bigger in width */} + {titleElement?.width > 500 && ( + <div className="flex"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-documents")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" + /> + </div> + )} + {/* search icon/magnifer icon */} + {titleElement?.width < 500 && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Search" + onClick={() => + props.setMobileSearchOpen(!props.mobileSearchOpen) + } + > + <i className="fa-light fa-magnifying-glass"></i> + </button> + )} + {props.openColumnModal && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Columns" + onClick={props.openColumnModal} + > + <i className="fa-light fa-table-columns"></i> + </button> + )} + </div> + </div> + {/* Search input for report smalle in width */} + {titleElement?.width < 500 && props.mobileSearchOpen && ( + <div className="top-full left-0 w-full px-3 pt-1 pb-3"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-documents")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + </div> + )} + <div + className={`overflow-auto w-full border-b ${ + props.List?.length > 0 + ? isDashboard + ? "min-h-[317px]" + : currentList?.length === props.docPerPage + ? "h-fit" + : "h-screen" + : "" + }`} + > + <table className="op-table border-collapse w-full mb-4"> + <thead className="text-[14px] text-center"> + <tr className="border-y-[1px]"> + {props.heading?.map((item, i) => ( + <th key={i} className="p-2"> + {props.columnLabels?.[item] || + t(`report-heading.${item}`, { defaultValue: item })} + </th> + ))} + {props.actions?.length > 0 && ( + <th className="p-2 text-transparent pointer-events-none"> + {t("action")} + </th> + )} + </tr> + </thead> + <tbody className="text-[12px]"> + {props.List?.length > 0 && + currentList.map((item, index) => ( + <tr + className={`${ + currentList?.length === props.docPerPage + ? "last:border-none" + : "" + } border-y-[1px] `} + key={index} + > + {props?.heading?.map((col) => ( + <RenderReportCell + key={col} + col={col} + rowData={item} + rowIndex={index} + startIndex={startIndex} + handleDownload={handleDownload} + handleRemovePrefill={handleRemovePrefill} + reportName={props.ReportName} + /> + ))} + {/* actions */} + <td className="px-2 py-2"> + <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> + {props.actions?.length > 0 && + props.actions.map((act, index) => ( + <React.Fragment key={index}> + {handleBtnVisibility(act, item) && ( + <div + role="button" + data-tut={act?.selector} + onClick={() => handleActionBtn(act, item)} + title={t(`btnLabel.${act.hoverLabel}`)} + className={ + act.action !== "option" + ? `${act?.btnColor || ""} op-btn op-btn-sm mr-1` + : "text-base-content focus:outline-none text-lg mr-2 relative" + } + > + <i className={act.btnIcon}></i> + {act.btnLabel && ( + <span className="uppercase font-medium"> + {t(`btnLabel.${act.btnLabel}`)} + </span> + )} + {/* doc report */} + {isOption[item.objectId] && + act.action === "option" && ( + <ul className="absolute -right-1 top-auto z-[70] w-max op-dropdown-content op-menu op-menu-sm shadow-black/20 shadow bg-base-100 text-base-content rounded-box"> + {act.subaction?.map( + (subact) => + !restrictBtn(item, subact) && ( + <li + key={subact.btnId} + onClick={() => + handleActionBtn(subact, item) + } + title={t( + `btnLabel.${subact.hoverLabel}` + )} + > + <span> + <i + className={`${subact.btnIcon} mr-1.5`} + ></i> + {subact.btnLabel && ( + <span className="text-[13px] capitalize font-medium"> + {t( + `btnLabel.${subact.btnLabel}` + )} + </span> + )} + </span> + </li> + ) + )} + </ul> + )} + </div> + )} + </React.Fragment> + ))} + </div> + {isModal["recreatedocument_" + item.objectId] && ( + <ModalUi isOpen handleClose={handleCloseModal}> + {actLoader[item.objectId] && ( + <div className="absolute h-full w-full flex justify-center items-center rounded-box bg-black/30"> + <Loader /> + </div> + )} + <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> + {t("fix-&-resend-document")} + </h3> + {error ? ( + <div className="p-[15px] md:p-[20px]">{error}</div> + ) : ( + <div className="p-[15px] md:p-[20px]"> + <div className="text-lg font-normal text-center"> + <img + src={recreatedoc} + alt="recreate-doc" + className="mx-auto w-[200px] h-auto" + /> + <p className="text-sm md:text-base md:px-2 mt-2"> + {t("do-you-want-recreate-document?")} + </p> + </div> + <hr className="bg-[#ccc] mt-2.5" /> + <div className="flex items-center justify-center mt-[14px] md:mt-[16px] gap-2 text-white"> + <button + onClick={() => handleRecreateDoc(item)} + className="op-btn op-btn-primary focus:outline-none text-sm relative px-4" + > + {t("start-editing")} + </button> + <button + onClick={handleCloseModal} + className="op-btn op-btn-secondary focus:outline-none text-sm relative px-8" + > + {t("cancel")} + </button> + </div> + </div> + )} + </ModalUi> + )} + {isModal["saveastemplate_" + item.objectId] && ( + <ModalUi + isOpen + title={ + isSuccess[item.objectId] + ? t("template-created") + : t("btnLabel.Save as template") + } + handleClose={handleCloseTemplate} + > + {isSuccess[item.objectId] ? ( + <div className="mx-[10px] my-[15px]"> + <p className="text-base text-center"> + {t("how-would-you-like-to-proceed?")} + </p> + <div className="flex flex-wrap gap-1 items-center justify-center mt-2"> + <button + className="op-btn-primary op-btn op-btn-sm focus:outline-none text-sm relative" + onClick={() => + handleUseTemplate(templateId, item) + } + > + <i className="fa-light fa-plus"></i>{" "} + {t("btnLabel.Use")} + </button> + <button + className="op-btn-secondary op-btn op-btn-sm focus:outline-none text-sm relative" + onClick={() => + handleBulkSendTemplate( + templateId, + item.objectId + ) + } + > + <i className="fa-light fa-plus"></i>{" "} + { + `${t(`btnLabel.Quick send`)}` + } + </button> + <button + className="op-btn-secondary op-btn op-btn-sm focus:outline-none text-sm relative" + onClick={() => + navigate(`/template/${templateId}`) + } + > + <i className="fa-light fa-pen"></i>{" "} + {t(`btnLabel.Edit`)} + </button> + </div> + <Link + to="/report/6TeaPr321t" + className="cursor-pointer underline text-sm w-full flex justify-center mt-2" + > + {t("go-to-manage-templates")} + </Link> + </div> + ) : ( + <div className="m-[20px]"> + {error ? ( + <>{error}</> + ) : ( + <> + <div className="text-lg font-normal text-base-content"> + {t("save-as-template-?")} + {handleWarning(item)} + </div> + <hr className="bg-[#ccc] mt-3" /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handleSaveAsTemplate(item)} + className="op-btn op-btn-primary w-[100px]" + > + {t("yes")} + </button> + <button + onClick={handleCloseTemplate} + className="op-btn op-btn-secondary w-[100px]" + > + {t("no")} + </button> + </div> + </> + )} + </div> + )} + </ModalUi> + )} + {isPrefillModal[item.objectId] && ( + <PrefillWidgetModal + isPrefillModal={isPrefillModal[item.objectId]} + prefillData={xyPosition.find( + (x) => x.Role === "prefill" + )} + forms={forms} + setForms={setForms} + xyPosition={xyPosition} + setXyPosition={setXyPosition} + handleCreateDocument={handlePrefillWidgetCreateDoc} + handleClosePrefillModal={handleClosePrefillModal} + handleAddUser={handleAddUser} + navigatePageToDoc={navigatePageToDoc} + setIsNewContact={setIsNewContact} + isNewContact={isNewContact} + docId={item.objectId} + /> + )} + {isModal["extendexpiry_" + item.objectId] && ( + <ModalUi + isOpen + title={t("btnLabel.extend-expiry-date")} + reduceWidth={"md:max-w-[450px]"} + handleClose={handleCloseModal} + > + <form + className="px-4 py-2 flex flex-col" + onSubmit={(e) => handleUpdateExpiry(e, item)} + > + <label className="mr-2"> + {t("expiry-date")} {"(dd-mm-yyyy)"} + </label> + <input + type="date" + className="rounded-full mb-2 bg-base-300 w-full px-4 py-2 text-base-content border-2 hover:border-spacing-2" + defaultValue={ + item?.ExpiryDate?.iso?.split("T")?.[0] + } + onChange={(e) => { + setExpiryDate(e.target.value); + }} + /> + <div className="flex justify-start mb-1"> + <button + type="submit" + className="op-btn op-btn-primary" + > + {t("update")} + </button> + </div> + </form> + </ModalUi> + )} + {isDeleteModal[item.objectId] && ( + <ModalUi + isOpen + title={t("delete-document")} + handleClose={handleClose} + > + <div className="m-[20px]"> + <div className="text-lg font-normal text-base-content"> + {t("delete-document-alert")} + </div> + <hr className="bg-[#ccc] mt-4" /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handleDelete(item)} + className="op-btn op-btn-primary" + > + {t("yes")} + </button> + <button + onClick={handleClose} + className="op-btn op-btn-secondary" + > + {t("no")} + </button> + </div> + </div> + </ModalUi> + )} + {isBulkSend[item.objectId] && ( + <ModalUi + isOpen + title={ + t("quick-send") + } + handleClose={() => setIsBulkSend({})} + > + {isLoader[item.objectId] ? ( + <div className="w-full h-[100px] flex justify-center items-center z-30"> + <Loader /> + </div> + ) : ( + <BulkSendUi + Placeholders={placeholders} + item={templateDeatils} + handleClose={handleQuickSendClose} + signatureType={signatureType} + /> + )} + </ModalUi> + )} + {isShare[item.objectId] && ( + <ModalUi + isOpen + title={t("copy-link")} + handleClose={() => { + setIsShare({}); + setActLoader({}); + setCopied(false); + }} + > + <div className="m-[20px]"> + {shareUrls.map((share, i) => ( + <div + key={i} + className="text-sm font-normal text-base-content flex my-2 justify-between items-center" + > + <span className="w-[150px] mr-[5px] md:mr-0 md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis text-sm font-semibold"> + {share.email} + </span> + <div className="flex items-center gap-2"> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={share.url} + className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm " + > + <i className="fa-light fa-share-from-square"></i> + {t("btnLabel.Share")} + </ShareButton> + <button + className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm" + onClick={() => + copybtn(share.url, share.email) + } + > + <i className="fa-light fa-copy" /> + {copied[share.email] + ? t("copied") + : t("copy")} + </button> + </div> + </div> + ))} + <p ref={copyUrlRef} className="hidden"></p> + </div> + </ModalUi> + )} + {isRevoke[item.objectId] && ( + <ModalUi + isOpen + title={t("revoke-document")} + handleClose={handleClose} + > + <div className="m-[20px]"> + <div className="text-sm md:text-lg font-normal text-base-content"> + {t("revoke-document-alert")} + </div> + <div className="mt-2"> + <textarea + rows={3} + placeholder="Reason (optional)" + className="px-4 op-textarea op-textarea-bordered text-base-content focus:outline-none hover:border-base-content w-full text-xs" + value={reason} + onChange={(e) => setReason(e.target.value)} + ></textarea> + </div> + <div className="flex items-center mt-3 gap-2"> + <button + onClick={() => handleRevoke(item)} + className="op-btn op-btn-primary px-6" + > + {t("yes")} + </button> + <button + onClick={handleClose} + className="op-btn op-btn-secondary px-6" + > + {t("no")} + </button> + </div> + </div> + </ModalUi> + )} + {isResendMail[item.objectId] && ( + <ModalUi + isOpen + title={ + t("resend-mail") + } + handleClose={handleResendClose} + > + <div className="overflow-y-auto max-h-[340px] md:max-h-[400px]"> + {item?.Placeholders?.filter( + (user) => user?.Role !== "prefill" + )?.map((user) => ( + <React.Fragment key={user.Id}> + {isNextStep[user.Id] && ( + <div className="relative "> + {actLoader[user.Id] && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> + <Loader /> + </div> + )} + <form + onSubmit={(e) => + handleResendMail(e, item, user) + } + className="w-full flex flex-col gap-2 p-3 text-base-content relative" + > + <div className="absolute right-5 text-xs z-40"> + <Tooltip + id={`${user.Id}_help`} + message={t("resend-mail-help")} + /> + </div> + <div> + <label + className="text-xs ml-1" + htmlFor="mailsubject" + > + {t("subject")}{" "} + </label> + <input + id="mailsubject" + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + value={mail.subject} + onChange={(e) => + handleSubjectChange( + e.target.value, + item + ) + } + onInvalid={(e) => + e.target.setCustomValidity( + t("input-required") + ) + } + onInput={(e) => + e.target.setCustomValidity("") + } + required + /> + </div> + <div> + <label + className="text-xs ml-1" + htmlFor="mailbody" + > + {t("body")}{" "} + </label> + <EditorToolbar containerId="toolbar1" /> + <ReactQuill + id="mailbody" + theme="snow" + value={mail.body || ""} + placeholder="add body of email " + modules={module1} + formats={formats} + onChange={(value) => + handlebodyChange(value, item) + } + /> + </div> + <button + type="submit" + className="op-btn op-btn-primary" + > + {t("resend")} + </button> + </form> + </div> + )} + {Object?.keys(isNextStep) <= 0 && ( + <div className="flex justify-between items-center gap-2 my-2 px-3"> + <div className="text-base-content"> + {user?.signerPtr?.Name || "-"}{" "} + {`<${ + user?.email + ? user.email + : user.signerPtr.Email + }>`} + </div> + <>{fetchUserStatus(user, item)}</> + </div> + )} + </React.Fragment> + ))} + </div> + </ModalUi> + )} + <ModalUi + title={t("btnLabel.Rename")} + isOpen={isModal["rename_" + item.objectId]} + handleClose={handleCloseModal} + > + <div className="flex flex-col px-4 pb-3 pt-2"> + <div className="flex flex-col gap-2"> + <input + maxLength={200} + autoFocus={true} + type="text" + defaultValue={renameDoc || item.Name} + onChange={(e) => setRenameDoc(e.target.value)} + className="op-input op-input-bordered op-input-sm w-full focus:outline-none hover:border-base-content text-[10px]" + /> + </div> + <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> + <button + className="w-[100px] op-btn op-btn-primary op-btn-md" + onClick={() => handleRenameDoc(item)} + > + {t("save")} + </button> + <button + className="w-[100px] op-btn op-btn-secondary op-btn-md" + onClick={handleCloseModal} + > + {t("cancel")} + </button> + </div> + </div> + </ModalUi> + {isDownloadModal[item.objectId] && ( + <DownloadPdfZip + setIsDownloadModal={setIsDownloadModal} + isDownloadModal={isDownloadModal[item.objectId]} + pdfDetails={[item]} + isDocId={false} + /> + )} + </td> + </tr> + ))} + </tbody> + </table> + {props.List?.length <= 0 && ( + <div + className={`${ + isDashboard ? "h-[317px]" : "" + } flex flex-col items-center justify-center w-ful bg-base-100 text-base-content rounded-xl py-4`} + > + <div className="w-[60px] h-[60px] overflow-hidden"> + <img + className="w-full h-full object-contain" + src={pad} + alt="img" + /> + </div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> + </div> + )} + </div> + <div className="op-join flex flex-wrap items-center p-2"> + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateBack()} + className="op-join-item op-btn op-btn-sm" + > + {t("prev")} + </button> + )} + {pageNumbers.map((x, i) => ( + <button + key={i} + onClick={() => setCurrentPage(x)} + disabled={x === "..."} + className={`${ + x === currentPage ? "op-btn-active" : "" + } op-join-item op-btn op-btn-sm`} + > + {x} + </button> + ))} + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateFront()} + className="op-join-item op-btn op-btn-sm" + > + {t("next")} + </button> + )} + </div> + <CustomizeMail + setIsMailModal={setIsMailModal} + setCustomizeMail={setCustomizeMail} + documentId={documentId} + signerList={signerList} + setIsSend={setIsSend} + setMailStatus={setMailStatus} + customizeMail={customizeMail} + defaultMail={defaultMail} + isMailModal={isMailModal} + setCurrUserId={setCurrUserId} + handleShareList={handleShareList} + setDocumentDetails={setDocumentDetails} + handleClose={handleCloseMail} + /> + <ModalUi + isOpen={isSend} + title={ + mailStatus === "success" + ? t("mails-sent") + : mailStatus === "quotareached" + ? t("quota-mail-head") + : t("mail-not-delivered") + } + handleClose={() => { + setIsSend(false); + navigate("/report/1MwEuxLEkF"); + }} + > + <div className="h-[100%] p-[20px] text-base-content"> + {mailStatus === "success" ? ( + <div className="text-center mb-[10px]"> + <LottieWithLoader /> + {documentDetails?.SendinOrder ? ( + <p> + {currUserId + ? t("placeholder-mail-alert-you") + : t("placeholder-mail-alert", { + name: signerList[0]?.Name + })} + </p> + ) : ( + <p>{t("placeholder-alert-4")}</p> + )} + {currUserId && <p>{t("placeholder-alert-5")}</p>} + </div> + ) : mailStatus === "quotareached" ? ( + <div className="flex flex-col gap-y-3"> + <div className="my-3">{handleShareList()}</div> + </div> + ) : ( + <div className="mb-[10px]"> + {mailStatus === "dailyquotareached" ? ( + <p>{t("daily-quota-reached")}</p> + ) : ( + <p>{t("placeholder-alert-6")}</p> + )} + {currUserId && ( + <p className="mt-1">{t("placeholder-alert-5")}</p> + )} + </div> + )} + {!mailStatus && ( + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + )} + {mailStatus !== "quotareached" && ( + <div + className={ + mailStatus === "success" ? "flex justify-center mt-1" : "" + } + > + {currUserId && ( + <button + onClick={() => + handleRecipientSign(documentDetails?.objectId, currUserId) + } + type="button" + className="op-btn op-btn-primary mr-1" + > + {t("yes")} + </button> + )} + <button + onClick={() => { + handleRecipientSign(documentDetails?.objectId, currUserId); + }} + type="button" + className="op-btn op-btn-ghost text-base-content" + > + {currUserId ? t("no") : t("close")} + </button> + </div> + )} + </div> + </ModalUi> + </div> + </div> + ); +}; + +export default DocumentsReport; diff --git a/apps/OpenSign/src/reports/template/TemplatesReport.jsx b/apps/OpenSign/src/reports/template/TemplatesReport.jsx new file mode 100644 index 0000000000..76c233bde7 --- /dev/null +++ b/apps/OpenSign/src/reports/template/TemplatesReport.jsx @@ -0,0 +1,1677 @@ +import React, { useState, useEffect, useRef } from "react"; +import pad from "../../assets/images/pad.svg"; +import { useLocation, useNavigate } from "react-router"; +import axios from "axios"; +import ModalUi from "../../primitives/ModalUi"; +import Alert from "../../primitives/Alert"; +import Tooltip from "../../primitives/Tooltip"; +import ShareButton from "../../primitives/ShareButton"; +import Tour from "../../primitives/Tour"; +import Parse from "parse"; +import { + copytoData, + fetchUrl, + getSignedUrl, + getTenantDetails, + handleSignatureType, + replaceMailVaribles, + signatureTypes, + openInNewTab, + createDocument, + defaultMailBody, + defaultMailSubject +} from "../../constant/Utils"; +import EditorToolbar, { + module1, + formats +} from "../../components/pdf/EditorToolbar"; +import ReactQuill from "react-quill-new"; +import "../../styles/quill.css"; +import BulkSendUi from "../../components/BulkSendUi"; +import Loader from "../../primitives/Loader"; +import { serverUrl_fn } from "../../constant/appinfo"; +import { useTranslation } from "react-i18next"; +import { useElSize } from "../../hook/useElSize"; +import LottieWithLoader from "../../primitives/DotLottieReact"; +import PrefillWidgetModal from "../../components/pdf/PrefillWidgetsModal"; +import * as utils from "../../utils"; +import { useSelector } from "react-redux"; +import { RenderReportCell } from "../../primitives/RenderReportCell"; +import CustomizeMail from "../../components/pdf/CustomizeMail"; + +const TemplatesReport = (props) => { + const copyUrlRef = useRef(null); + const titleRef = useRef(null); + const journey = "Use Template"; + const titleElement = useElSize(titleRef); + const prefillImg = useSelector((state) => state.widget.prefillImg); + const appName = + "OpenSign™"; + const { t } = useTranslation(); + const navigate = useNavigate(); + const location = useLocation(); + const isDashboard = + location?.pathname === "/dashboard/35KBoSgoAK" ? true : false; + const [currentPage, setCurrentPage] = useState(1); + const [actLoader, setActLoader] = useState({}); + const [isDeleteModal, setIsDeleteModal] = useState({}); + const [isShare, setIsShare] = useState({}); + const [shareUrls, setShareUrls] = useState([]); + const [copied, setCopied] = useState(false); + const [isOption, setIsOption] = useState({}); + const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); + const [isTour, setIsTour] = useState(false); + const [tourStatusArr, setTourStatusArr] = useState([]); + const [isResendMail, setIsResendMail] = useState({}); + const [mail, setMail] = useState({ subject: "", body: "" }); + const [userDetails, setUserDetails] = useState({}); + const [isNextStep, setIsNextStep] = useState({}); + const [isBulkSend, setIsBulkSend] = useState({}); + const [templateDeatils, setTemplateDetails] = useState({}); + const [placeholders, setPlaceholders] = useState([]); + const [isLoader, setIsLoader] = useState({}); + const [isShareWith, setIsShareWith] = useState({}); + const [selectedTeam, setSelectedTeam] = useState([]); + const [isModal, setIsModal] = useState({}); + const [signatureType, setSignatureType] = useState([]); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); + const [renameDoc, setRenameDoc] = useState(""); + const [forms, setForms] = useState([]); + const [xyPosition, setXyPosition] = useState([]); + const [signerList, setSignerList] = useState([]); + const [mailStatus, setMailStatus] = useState(""); + const [isSend, setIsSend] = useState(false); + const [documentId, setDocumentId] = useState(""); + const [isNewContact, setIsNewContact] = useState({ status: false, id: "" }); + const [isPrefillModal, setIsPrefillModal] = useState({}); + const startIndex = (currentPage - 1) * props.docPerPage; + const { isMoreDocs, setIsNextRecord } = props; + const [isMailModal, setIsMailModal] = useState(false); + const [customizeMail, setCustomizeMail] = useState({ body: "", subject: "" }); + const [defaultMail, setDefaultMail] = useState({ body: "", subject: "" }); + const [currUserId, setCurrUserId] = useState(false); + const [documentDetails, setDocumentDetails] = useState(); + const [error, setError] = useState(""); + + useEffect(() => { + if (props.isSearchResult) { + setCurrentPage(1); + } + }, [props.isSearchResult]); + + const getPaginationRange = () => { + const totalPageNumbers = 7; // Adjust this value to show more/less page numbers + const pages = []; + const totalPages = Math.ceil(props.List.length / props.docPerPage); + if (totalPages <= totalPageNumbers) { + for (let i = 1; i <= totalPages; i++) { + pages.push(i); + } + } else { + const leftSiblingIndex = Math.max(currentPage - 1, 1); + const rightSiblingIndex = Math.min(currentPage + 1, totalPages); + + const showLeftDots = leftSiblingIndex > 2; + const showRightDots = rightSiblingIndex < totalPages - 2; + + const firstPageIndex = 1; + const lastPageIndex = totalPages; + + if (!showLeftDots && showRightDots) { + let leftItemCount = 3; + let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); + + pages.push(...leftRange); + pages.push("..."); + pages.push(totalPages); + } else if (showLeftDots && !showRightDots) { + let rightItemCount = 3; + let rightRange = Array.from( + { length: rightItemCount }, + (_, i) => totalPages - rightItemCount + i + 1 + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...rightRange); + } else if (showLeftDots && showRightDots) { + let middleRange = Array.from( + { length: 3 }, + (_, i) => leftSiblingIndex + i + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...middleRange); + pages.push("..."); + pages.push(lastPageIndex); + } + } + + return pages; + }; + const showAlert = (type, message, time = 1500) => { + setAlertMsg({ type: type, message: message }); + setTimeout(() => setAlertMsg({ type: "", message: "" }), time); + }; + const pageNumbers = getPaginationRange(); + // below useEffect reset currenpage to 1 if user change route + useEffect(() => { + checkTourStatus(); + fetchTeamList(); + return () => setCurrentPage(1); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // `fetchTeamList` is used to fetch team list for share with functionality + const fetchTeamList = async () => { + try { + const extUser = JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; + if (extUser?.OrganizationId?.objectId) { + const teamtRes = await Parse.Cloud.run("getteams", { active: true }); + if (teamtRes.length > 0) { + const _teamRes = JSON.parse(JSON.stringify(teamtRes)); + const selected = _teamRes.map( + (x) => + x.Name === "All Users" && { + label: x.Name, + value: x.objectId + } + ); + setSelectedTeam(selected); + } + } + } catch (err) { + console.log("Err in fetch top level teamlist", err); + } + }; + // below useEffect is used to render next record if IsMoreDoc is true + // second last value of pageNumber array is same as currentPage + useEffect(() => { + if (isMoreDocs && pageNumbers[pageNumbers.length - 1] === currentPage) { + setIsNextRecord(true); + } + }, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]); + + //function to fetch tenant Details + const fetchTenantDetails = async () => { + const user = JSON.parse( + localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ); + if (user) { + try { + const tenantDetails = await getTenantDetails(user?.objectId); + if (tenantDetails && tenantDetails === "user does not exist!") { + alert(t("user-not-exist")); + } else if (tenantDetails) { + const signatureType = tenantDetails?.SignatureType || []; + const filterSignTypes = signatureType?.filter( + (x) => x.enabled === true + ); + return filterSignTypes; + } + } catch (e) { + alert(t("user-not-exist")); + } + } else { + alert(t("user-not-exist")); + } + }; + + // `handleURL` is used to open microapp + const handleURL = async (item, act) => { + if (act.hoverLabel === "Edit") { + navigate(`/${act.redirectUrl}/${item.objectId}`); + } else { + // handle Use template + const placeholder = item?.Placeholders; + const isRoleExist = placeholder.filter((x) => x.Role !== "prefill"); + //condition to check atleast one role is present for use template + if (isRoleExist && isRoleExist?.length > 0) { + const checkIsSignatureExist = isRoleExist?.every((placeholderObj) => + placeholderObj?.placeHolder?.some((holder) => + holder?.pos?.some((posItem) => posItem?.type === "signature") + ) + ); + if (checkIsSignatureExist) { + setActLoader({ [`${item.objectId}_${act.btnId}`]: true }); + const templateDeatils = await fetchTemplate(item.objectId); + const templateData = + templateDeatils.data && templateDeatils.data.result; + if (!templateData.error) { + setXyPosition(templateData?.Placeholders); + const signer = utils.handleSignersList(templateData); + setSignerList(signer); + setTemplateDetails(templateData); + //this function is used to open modal to show signers list + await utils?.handleDisplaySignerList( + item?.Placeholders, + item?.Signers, + setForms + ); + setIsPrefillModal({ [item.objectId]: true }); + } else { + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + } else { + showAlert("danger", t("quick-send-alert-2")); + } + } else { + showAlert("danger", t("add-role-alert")); + } + } + }; + + const fetchTemplate = async (templateId) => { + try { + const params = { + templateId: templateId, + include: ["Placeholders.signerPtr"] + }; + const axiosRes = await axios.post( + `${localStorage.getItem("baseUrl")}functions/getTemplate`, + params, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } + } + ); + if (axiosRes) { + return axiosRes; + } + } catch (e) { + console.log("Error to fetch template in report", e); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + //function is called when there ther no any prefill role widget exist then create direct document and navigate + const navigatePageToDoc = async (templateRes, placeholder, signer) => { + setIsPrefillModal({}); + const res = await createDocument( + [templateRes || templateDeatils], + placeholder || xyPosition, + signer || signerList, + templateRes?.URL || templateDeatils?.URL + ); + if (res.status === "success") { + navigate(`/placeHolderSign/${res.id}`, { + state: { title: "Use Template" } + }); + } else { + alert(t("something-went-wrong-mssg")); + } + }; + + const handleActionBtn = async (act, item) => { + setIsTour(false); + if (act.action === "redirect") { + handleURL(item, act); + } else if (act.action === "delete") { + setIsDeleteModal({ [item.objectId]: true }); + } else if (act.action === "share") { + handleShare(item); + } else if (act.action === "option") { + setIsOption({ [item.objectId]: !isOption[item.objectId] }); + } else if (act.action === "resend") { + setIsResendMail({ [item.objectId]: true }); + } else if (act.action === "bulksend") { + handleBulkSend(item); + } else if (act.action === "sharewithteam") { + if (item?.SharedWith && item?.SharedWith.length > 0) { + // below code is used to get existing sharewith teams and formated them as per react-select + const formatedList = item?.SharedWith.map((x) => ({ + label: x.Name, + value: x.objectId + })); + setSelectedTeam(formatedList); + } + setIsShareWith({ [item.objectId]: true }); + } + else if (act.action === "duplicate") { + const isPrefill = item?.Placeholders?.some((p) => p?.Role === "prefill"); + setError(isPrefill ? t("duplicate-template-error") : ""); + setIsModal({ [`duplicate_${item.objectId}`]: true }); + } else if (act.action === "rename") { + setIsModal({ [`rename_${item.objectId}`]: true }); + } else if (act.action === "edit") { + setIsModal({ [`edit_${item.objectId}`]: true }); + } else if (act.action === "saveastemplate") { + setIsModal({ [`saveastemplate_${item.objectId}`]: true }); + } else if (act.action === "extendexpiry") { + setIsModal({ [`extendexpiry_${item.objectId}`]: true }); + } + }; + // Get current list + const indexOfLastDoc = currentPage * props.docPerPage; + const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; + const sortedList = props.List; + const currentList = sortedList?.slice(indexOfFirstDoc, indexOfLastDoc); + + // Change page + const paginateFront = () => { + const lastValue = pageNumbers?.[pageNumbers?.length - 1]; + if (currentPage < lastValue) { + setCurrentPage(currentPage + 1); + } + }; + + const paginateBack = () => { + if (startIndex > 0) { + setCurrentPage(currentPage - 1); + } + }; + + const handleDelete = async (item) => { + setIsDeleteModal({}); + setActLoader({ [`${item.objectId}`]: true }); + try { + const serverUrl = serverUrl_fn(); + const cls = "contracts_Template"; + const url = serverUrl + `/classes/${cls}/`; + const body = { IsArchive: true }; + const res = await axios.put(url + item.objectId, body, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + if (res.data && res.data.updatedAt) { + setActLoader({}); + showAlert("success", t("record-delete-alert")); + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + const handleClose = ( + ) => { + setIsDeleteModal({}); + }; + const handleShare = (item) => { + setActLoader({ [item.objectId]: true }); + const host = window.location.origin; + const sendMail = item?.SendMail || false; + const getUrl = (x) => { + //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function + if (x?.signerObjId) { + const encodeBase64 = btoa( + `${item.objectId}/${x.signerPtr.Email}/${x.signerPtr.objectId}/${sendMail}` + ); + return `${host}/login/${encodeBase64}`; + } else { + const encodeBase64 = btoa(`${item.objectId}/${x.email}`); + return `${host}/login/${encodeBase64}`; + } + }; + const removePrefill = item?.Placeholders.filter( + (data) => data?.Role !== "prefill" + ); + const urls = removePrefill?.map((x) => ({ + email: x.email ? x.email : x.signerPtr.Email, + url: getUrl(x) + })); + setShareUrls(urls); + setIsShare({ [item.objectId]: true }); + }; + + const copytoclipboard = (text) => { + copytoData(text); + if (copyUrlRef.current) { + copyUrlRef.current.textContent = text; // Update text safely + } + setCopied(true); + setTimeout(() => setCopied(false), 1500); // Reset copied state after 1.5 seconds + }; + const copybtn = (text, email) => { + copytoData(text); + if (copyUrlRef.current) { + copyUrlRef.current.textContent = text; // Update text safely + } + setCopied({ [email]: true }); + }; + + async function checkTourStatus() { + const cloudRes = await Parse.Cloud.run("getUserDetails"); + if (cloudRes) { + const extUser = JSON.parse(JSON.stringify(cloudRes)); + localStorage.setItem("Extand_Class", JSON.stringify([extUser])); + const tourStatus = extUser?.TourStatus || []; + setTourStatusArr(tourStatus); + const tour = + tourStatus?.find((obj) => obj.templateReport)?.templateReport || false; + setIsTour(!tour); + } else { + setIsTour(true); + } + } + + const closeTour = async () => { + setIsTour(false); + const isTourSaved = + tourStatusArr?.some((obj) => obj.templateReport) || false; + if (!isTourSaved) { + const serverUrl = localStorage.getItem("baseUrl"); + const appId = localStorage.getItem("parseAppId"); + const json = JSON.parse(localStorage.getItem("Extand_Class")); + const extUserId = json && json.length > 0 && json[0].objectId; + let updatedTourStatus = []; + if (tourStatusArr.length > 0) { + updatedTourStatus = [...tourStatusArr]; + const templateReportIndex = tourStatusArr.findIndex( + (obj) => + obj["templateReport"] === false || obj["templateReport"] === true + ); + if (templateReportIndex !== -1) { + updatedTourStatus[templateReportIndex] = { templateReport: true }; + } else { + updatedTourStatus.push({ templateReport: true }); + } + } else { + updatedTourStatus = [{ templateReport: true }]; + } + + await axios.put( + serverUrl + "classes/contracts_Users/" + extUserId, + { TourStatus: updatedTourStatus }, + { headers: { "X-Parse-Application-Id": appId } } + ); + } + }; + + // `handleDownload` is used to get valid doc url available in completed report + const handleDownload = async (item) => { + setActLoader({ [`${item.objectId}`]: true }); + const url = item?.SignedUrl || item?.URL || ""; + const pdfName = + item?.Name?.length > 100 + ? item?.Name?.slice(0, 100) + : item?.Name || "template"; + const templateId = item.objectId; + const isCompleted = item?.IsCompleted || false; + const formatId = item?.ExtUserPtr?.DownloadFilenameFormat; + const docName = utils?.buildDownloadFilename(formatId, { + docName: pdfName, + email: item?.ExtUserPtr?.Email, + isSigned: isCompleted + }); + if (url) { + try { + const signedUrl = await getSignedUrl( + url, + "", //docId + templateId + ); + await fetchUrl(signedUrl, docName); + + setActLoader({}); + } catch (err) { + console.log("err in getsignedurl", err); + alert(t("something-went-wrong-mssg")); + setActLoader({}); + } + } + }; + + // `handleSubjectChange` is used to add or change subject of resend mail + const handleSubjectChange = (subject, doc) => { + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email, + receiver_phone: userDetails?.Phone || "", + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: signPdf + }; + const res = replaceMailVaribles(subject, "", variables); + setMail((prev) => ({ ...prev, subject: res.subject })); + }; + // `handlebodyChange` is used to add or change body of resend mail + const handlebodyChange = (body, doc) => { + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email || "", + receiver_phone: userDetails?.Phone || "", + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: signPdf + }; + const res = replaceMailVaribles("", body, variables); + + if (body) { + setMail((prev) => ({ ...prev, body: res.body })); + } + }; + // `handleNextBtn` is used to open edit mail template screen in resend mail modal + // as well as replace variable with original one + const handleNextBtn = (user, doc) => { + const userdata = { + Name: user?.signerPtr?.Name, + Email: user.email ? user?.email : user.signerPtr?.Email, + Phone: user?.signerPtr?.Phone, + objectId: user?.signerPtr?.objectId + }; + setUserDetails(userdata); + const encodeBase64 = user.email + ? btoa(`${doc.objectId}/${user.email}`) + : btoa( + `${doc.objectId}/${user.signerPtr.Email}/${user.signerPtr.objectId}` + ); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: user?.signerPtr?.Name || "", + receiver_email: user?.email ? user?.email : user?.signerPtr?.Email, + receiver_phone: user?.signerPtr?.Phone || "", + expiry_date: localExpireDate, + company_name: doc?.ExtUserPtr?.Company || "", + signing_url: signPdf + }; + const subject = + doc?.RequestSubject || + doc?.ExtUserPtr?.TenantId?.RequestSubject || + `{{sender_name}} has requested you to sign "{{document_title}}"`; + const body = + doc?.RequestBody || + doc?.ExtUserPtr?.TenantId?.RequestBody || + `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p><a href='{{signing_url}}' rel='noopener noreferrer' target='_blank'>Sign here</a></p><br><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br></body> </html>`; + const res = replaceMailVaribles(subject, body, variables); + setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); + setIsNextStep({ [user.Id]: true }); + }; + const handleResendMail = async (e, doc, user) => { + e.preventDefault(); + setActLoader({ [user?.Id]: true }); + const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + let params = { + replyto: + doc?.ExtUserPtr?.Email || + "", + extUserId: doc?.ExtUserPtr?.objectId, + recipient: userDetails?.Email, + subject: mail.subject, + from: + doc?.ExtUserPtr?.Email, + html: mail.body + }; + try { + const res = await axios.post(url, params, { headers: headers }); + if (res?.data?.result?.status === "success") { + showAlert("success", t("mail-sent-alert")); + setIsResendMail({}); + } + else { + showAlert("danger", t("something-went-wrong-mssg")); + } + } catch (err) { + console.log("err in sendmail", err); + showAlert("danger", t("something-went-wrong-mssg")); + } finally { + setIsNextStep({}); + setUserDetails({}); + setActLoader({}); + } + }; + const fetchUserStatus = (user, doc) => { + const email = user.email ? user.email : user.signerPtr.Email; + const audit = doc?.AuditTrail?.find((x) => x.UserPtr.Email === email); + + return ( + <div className="flex flex-row gap-2 justify-center items-center"> + <div className="flex justify-center items-center bg-base-300 text-base-content shadow-md op-card w-[65px] h-[32px] cursor-default"> + {audit?.Activity ? audit?.Activity : "Awaited"} + </div> + + <button + onClick={() => handleNextBtn(user, doc)} + className={ + audit?.Activity !== "Signed" + ? "op-btn op-btn-primary op-btn-sm" + : " text-transparent cursor-default pointer-events-none" + } + disabled={audit?.Activity === "Signed"} + > + {audit?.Activity !== "Signed" && "Resend"} + </button> + </div> + ); + }; + // `handleQuickSendClose` is trigger when bulk send component trigger close event + const handleQuickSendClose = (status, count) => { + setIsBulkSend({}); + if (status === "success") { + showAlert("success", count + " " + t("document-sent-alert")); + } else { + showAlert("danger", t("something-went-wrong-mssg")); + } + }; + + // `handleBulkSend` is used to open modal as well as fetch template + // and show Ui on the basis template response handleBulkSendTemplate + const handleBulkSend = async (template) => { + const isPrefillExist = template?.Placeholders.some( + (x) => x.Role === "prefill" + ); + if (isPrefillExist) { + showAlert("danger", t("prefill-bulk-error")); + } else { + setIsBulkSend({ [template.objectId]: true }); + setIsLoader({ [template.objectId]: true }); + try { + const axiosRes = await fetchTemplate(template.objectId); + const templateRes = axiosRes.data && axiosRes.data.result; + const tenantSignTypes = await fetchTenantDetails(); + const docSignTypes = templateRes?.SignatureType || signatureTypes; + const updatedSignatureType = await handleSignatureType( + tenantSignTypes, + docSignTypes + ); + setSignatureType(updatedSignatureType); + setPlaceholders(templateRes?.Placeholders); + setTemplateDetails(templateRes); + setIsLoader({}); + } catch (err) { + console.log("err in fetch template in bulk modal", err); + setIsBulkSend({}); + showAlert("danger", t("something-went-wrong-mssg")); + } + } + }; + + // `handleShareWith` is used to save teams in sharedWith field + const handleShareWith = async (e, template) => { + e.preventDefault(); + e.stopPropagation(); + setIsShareWith({}); + setActLoader({ [template.objectId]: true }); + try { + const templateCls = new Parse.Object("contracts_Template"); + templateCls.id = template.objectId; + const teamArr = selectedTeam.map((x) => ({ + __type: "Pointer", + className: "contracts_Teams", + objectId: x.value + })); + templateCls.set("SharedWith", teamArr); + const res = await templateCls.save(); + if (res) { + showAlert("success", t("template-share-alert")); + } + } catch (err) { + showAlert("danger", t("something-went-wrong-mssg")); + } finally { + setActLoader({}); + } + }; + + // `handleCreateDuplicate` is used to create duplicate from current entry using objectId + const handleCreateDuplicate = async (item) => { + setActLoader({ [item.objectId]: true }); + setIsModal({}); + try { + const duplicateRes = await Parse.Cloud.run("createduplicate", { + templateId: item.objectId + }); + if (duplicateRes) { + const newTemplate = JSON.parse(JSON.stringify(duplicateRes)); + props.setList((prevData) => [newTemplate, ...prevData]); + showAlert("success", t("duplicate-template-created")); + } + } catch (err) { + showAlert("danger", t("something-went-wrong-mssg")); + console.log("Err while create duplicate template", err); + } finally { + setActLoader({}); + } + }; + // `handleRenameDoc` is used to update document name + const handleRenameDoc = async (item) => { + setActLoader({ [item.objectId]: true }); + setIsModal({}); + const className = "contracts_Template"; + + try { + const query = new Parse.Query(className); + const docObj = await query.get(item.objectId); + docObj.set("Name", renameDoc); + await docObj.save(); + //update report list data + const updateList = props.List.map((x) => + x.objectId === item.objectId ? { ...x, Name: renameDoc } : x + ); + props.setList(updateList); + setActLoader({}); + showAlert("success", "Document updated", 2000); + } catch (err) { + showAlert("danger", t("something-went-wrong-mssg"), 2000); + setActLoader({}); + } + }; + + const handleCloseModal = () => { + setIsModal({}); + }; + + const handleResendClose = () => { + setIsResendMail({}); + setIsNextStep({}); + setUserDetails({}); + }; + + // `handleAddUser` is used to adduserAdd commentMore actions + const handleAddUser = (data, id) => { + const signerPtr = { + __type: "Pointer", + className: "contracts_Contactbook", + objectId: data.objectId + }; + const updatePlaceHolder = xyPosition.map((x) => { + if (x.signerObjId === id || x.Id === id) { + return { ...x, signerPtr: signerPtr, signerObjId: data.objectId }; + } + return { ...x }; + }); + setXyPosition(updatePlaceHolder); + const updateSigner = signerList.map((y) => { + //condition is used to updated signer's email + if (y.objectId === id) { + return data; + } + //condition is used to add new signer's mail to role + else if (y.Id === id) { + return { ...y, ...data, className: "contracts_Contactbook" }; + } + return { ...y }; + }); + setSignerList(updateSigner); + + //condition when there are any new signer add then save that signer in dropdown option + if (isNewContact.status) { + let newForm = [...forms]; + const label = `${data.Name}<${data.Email}>`; + const index = newForm.findIndex((x) => x.value === id); + newForm[index].label = label; + newForm[index].value = id; + setForms(newForm); + } + }; + const handleClosePrefillModal = () => { + setIsPrefillModal(false); + setActLoader({}); + setForms([]); + setXyPosition([]); + }; + //`handlePrefillWidgetCreateDoc` is used to embed prefill all widgets on document, create document, and send document + const handlePrefillWidgetCreateDoc = async () => { + const scale = 1; + const res = await utils?.handleCheckPrefillCreateDoc( + xyPosition, + signerList, + setIsPrefillModal, + scale, + templateDeatils?.URL, + [templateDeatils], + prefillImg, + extClass?.[0]?.UserId?.objectId, + ); + if (res?.status === "unfilled") { + const emptyWidget = res?.emptyResponseObjects + .map((item) => `[ ${item.options.name}]`) + .join(", "); + const timeInMiliSec = 6000; + showAlert( + "danger", + t("prefill-unfilled-widget", { emptyWidget: emptyWidget }), + timeInMiliSec + ); + } else if (res?.status === "unattach signer") { + showAlert("danger", "please attach all role to signer"); + } else if (res?.status === "success") { + setDocumentId(res.id); + setActLoader({}); + setIsMailModal(true); + const user = JSON.parse( + localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ); + if (user) { + try { + const tenantDetails = await getTenantDetails(user?.objectId); + if (tenantDetails && tenantDetails === "user does not exist!") { + alert(t("user-not-exist")); + } else if (tenantDetails) { + //condition to check tenant have some already set any email template + if (tenantDetails?.RequestBody) { + //customize mail state is handle to when user want to customize already set tenant email format then use that format + setCustomizeMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + setDefaultMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + } else { + const defaultRequestBody = defaultMailBody; + const defaultSubject = defaultMailSubject; + setCustomizeMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + setDefaultMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + } + } + } catch (e) { + alert(t("user-not-exist")); + } + } else { + alert(t("user-not-exist")); + } + } + }; + //function show signer list and share link to share signUrl + const handleShareList = () => { + const shareLinkList = []; + let signerMail = signerList; + for (let i = 0; i < signerMail.length; i++) { + const objectId = signerMail[i].objectId; + const hostUrl = window.location.origin; + const sendMail = false; + //encode this url value `${documentId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function + const encodeBase64 = btoa( + `${documentId}/${signerMail[i].Email}/${objectId}/${sendMail}` + ); + let signPdf = `${hostUrl}/login/${encodeBase64}`; + shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); + } + return shareLinkList.map((data, ind) => { + return ( + <div + className="flex flex-row justify-between items-center mb-1" + key={ind} + > + {copied && <Alert type="success">{t("copied")}</Alert>} + <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> + {data.signerEmail} + </span> + <div className="flex flex-row items-center gap-3 "> + <button + onClick={() => copytoclipboard(data.url)} + type="button" + className="flex flex-row items-center op-link op-link-primary" + > + <i className="fa-light fa-copy" /> + <span className=" hidden md:block ml-1 ">{t("copy-link")}</span> + </button> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={data.url} + > + <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> + </ShareButton> + </div> + </div> + ); + }); + }; + const handleRemovePrefill = (placeholders) => { + const removePrefill = placeholders?.filter( + (data) => data?.Role !== "prefill" + ); + return removePrefill; + }; + const handleRecipientSign = (docId, currUserId) => { + if (currUserId) { + navigate(`/recipientSignPdf/${docId}/${currUserId}`); + } else { + navigate(`/recipientSignPdf/${docId}`); + } + }; + return ( + <div className="relative"> + {Object.keys(actLoader)?.length > 0 && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black/30 rounded-box z-30"> + <Loader /> + </div> + )} + <div className="p-2 w-full bg-base-100 text-base-content op-card shadow-lg"> + {alertMsg.message && ( + <Alert type={alertMsg.type}>{alertMsg.message}</Alert> + )} + {props.tourData && ( + <> + <Tour + onRequestClose={closeTour} + steps={props.tourData} + isOpen={isTour} + /> + </> + )} + <div + ref={titleRef} + className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]" + > + <div className="font-light"> + {t(`report-name.${props.ReportName}`)}{" "} + <sup className="cursor-pointer" onClick={() => setIsTour(true)}> + <i className="border-[#33bbff] text-[#33bbff] fa-light fa-question rounded-full border-[1px] py-[1.5px] px-[4px] text-[13px]"></i> + </sup> + </div> + <div className="flex flex-row justify-center items-center gap-3 mb-2"> + {/* Search input for report bigger in width */} + {titleElement?.width > 500 && ( + <div className="flex"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-templates")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" + /> + </div> + )} + {/* create template form */} + <div + data-tut="reactourFirst" + className="cursor-pointer flex" + onClick={() => navigate("/form/template")} + > + <i className="cursor-pointer fa-light fa-square-plus text-accent text-[30px] md:text-[32px]"></i> + </div> + {/* search icon/magnifer icon */} + {titleElement?.width < 500 && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Search" + onClick={() => + props.setMobileSearchOpen(!props.mobileSearchOpen) + } + > + <i className="fa-light fa-magnifying-glass"></i> + </button> + )} + {props.openColumnModal && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Columns" + onClick={props.openColumnModal} + > + <i className="fa-light fa-table-columns"></i> + </button> + )} + </div> + </div> + {/* Search input for report smalle in width */} + {titleElement?.width < 500 && props.mobileSearchOpen && ( + <div className="top-full left-0 w-full px-3 pt-1 pb-3"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-documents")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + </div> + )} + <div + className={`overflow-auto w-full border-b ${ + props.List?.length > 0 + ? isDashboard + ? "min-h-[317px]" + : currentList?.length === props.docPerPage + ? "h-fit" + : "h-screen" + : "" + }`} + > + <table className="op-table border-collapse w-full mb-4"> + <thead className="text-[14px] text-center"> + <tr className="border-y-[1px]"> + {props.heading?.map((item, i) => ( + <th key={i} className="p-2"> + {props.columnLabels?.[item] || + t(`report-heading.${item}`, { defaultValue: item })} + </th> + ))} + {props.actions?.length > 0 && ( + <th className="p-2 text-transparent pointer-events-none"> + {t("action")} + </th> + )} + </tr> + </thead> + <tbody className="text-[12px]"> + {props.List?.length > 0 && + currentList.map((item, index) => ( + <tr + className={`${ + currentList?.length === props.docPerPage + ? "last:border-none" + : "" + } border-y-[1px] `} + key={index} + > + {props?.heading?.map((col) => ( + <RenderReportCell + key={col} + col={col} + rowData={item} + rowIndex={index} + startIndex={startIndex} + handleDownload={handleDownload} + handleRemovePrefill={handleRemovePrefill} + reportName={props.ReportName} + /> + ))} + <td className="px-2 py-2"> + <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> + {props.actions?.length > 0 && + props.actions.map((act, index) => ( + <React.Fragment key={index}> + {(item.ExtUserPtr?.objectId === + extClass?.[0]?.objectId || + act.btnLabel === "Use") && ( + <div + role="button" + data-tut={act?.selector} + key={index} + onClick={() => handleActionBtn(act, item)} + title={t(`btnLabel.${act.hoverLabel}`)} + className={ + act.action !== "option" + ? `${ + act?.btnColor || "" + } op-btn op-btn-sm mr-1` + : "text-base-content focus:outline-none text-lg mr-2 relative" + } + > + <i className={act.btnIcon}></i> + {act.btnLabel && ( + <span className="uppercase font-medium"> + { + `${t(`btnLabel.${act.btnLabel}`)}` + } + </span> + )} + {/* template report */} + {isOption[item.objectId] && + act.action === "option" && ( + <ul className="absolute -right-1 top-auto z-[70] w-52 op-dropdown-content op-menu op-menu-sm shadow-black/20 shadow bg-base-100 text-base-content rounded-box"> + {act.subaction?.map((subact) => ( + <li + key={subact.btnId} + onClick={() => + handleActionBtn(subact, item) + } + title={t( + `btnLabel.${subact.btnLabel}` + )} + > + <span className="flex items-center justify-between"> + <span className="text-[13px] capitalize font-medium"> + <i + className={`${subact.btnIcon} mr-2`} + ></i> + {subact.btnLabel && + t( + `btnLabel.${subact.btnLabel}` + )} + </span> + {subact.secIcon && ( + <i + className={`${subact.secIcon} ml-1.5`} + ></i> + )} + </span> + </li> + ))} + </ul> + )} + </div> + )} + <ModalUi + title={t("btnLabel.Duplicate")} + isOpen={isModal["duplicate_" + item.objectId]} + handleClose={handleCloseModal} + > + <div className="flex flex-col px-4 pb-3 pt-2"> + {error ? ( + <>{error}</> + ) : ( + <> + <p className="text-base"> + {t("duplicate-template-alert")} + </p> + <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> + <button + className="w-[100px] op-btn op-btn-primary op-btn-md" + onClick={() => + handleCreateDuplicate(item) + } + > + {t("yes")} + </button> + <button + className="w-[100px] op-btn op-btn-secondary op-btn-md" + onClick={handleCloseModal} + > + {t("no")} + </button> + </div> + </> + )} + </div> + </ModalUi> + </React.Fragment> + ))} + </div> + {isPrefillModal[item.objectId] && ( + <PrefillWidgetModal + isPrefillModal={isPrefillModal[item.objectId]} + prefillData={xyPosition.find( + (x) => x.Role === "prefill" + )} + forms={forms} + setForms={setForms} + xyPosition={xyPosition} + setXyPosition={setXyPosition} + handleCreateDocument={handlePrefillWidgetCreateDoc} + handleClosePrefillModal={handleClosePrefillModal} + handleAddUser={handleAddUser} + navigatePageToDoc={navigatePageToDoc} + setIsNewContact={setIsNewContact} + isNewContact={isNewContact} + docId={item.objectId} + /> + )} + {isShareWith[item.objectId] && ( + <div className="op-modal op-modal-open"> + <div className="max-h-90 bg-base-100 w-[95%] md:max-w-[500px] rounded-box relative"> + <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> + {t("share-with")} + </h3> + <div + className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2 z-40" + onClick={() => setIsShareWith({})} + > + ✕ + </div> + <div className="px-2 mt-3 w-full h-full"> + <div className="op-input op-input-bordered op-input-sm w-full h-full text-[13px] break-all"> + {selectedTeam?.[0]?.label} + </div> + </div> + <button + onClick={(e) => handleShareWith(e, item)} + className="op-btn op-btn-primary ml-[10px] my-3" + > + {t("submit")} + </button> + </div> + </div> + )} + {isDeleteModal[item.objectId] && ( + <ModalUi + isOpen + title={t("delete-document")} + handleClose={handleClose} + > + <div className="m-[20px]"> + <div className="text-lg font-normal text-base-content"> + {t("delete-document-alert")} + </div> + <hr className="bg-[#ccc] mt-4" /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handleDelete(item)} + className="op-btn op-btn-primary" + > + {t("yes")} + </button> + <button + onClick={handleClose} + className="op-btn op-btn-secondary" + > + {t("no")} + </button> + </div> + </div> + </ModalUi> + )} + {isBulkSend[item.objectId] && ( + <ModalUi + isOpen + title={ + t("quick-send") + } + handleClose={() => setIsBulkSend({})} + > + {isLoader[item.objectId] ? ( + <div className="w-full h-[100px] flex justify-center items-center z-30"> + <Loader /> + </div> + ) : ( + <BulkSendUi + Placeholders={placeholders} + item={templateDeatils} + handleClose={handleQuickSendClose} + signatureType={signatureType} + /> + )} + </ModalUi> + )} + {isShare[item.objectId] && ( + <ModalUi + isOpen + title={t("copy-link")} + handleClose={() => { + setIsShare({}); + setActLoader({}); + setCopied(false); + }} + > + <div className="m-[20px]"> + {shareUrls.map((share, i) => ( + <div + key={i} + className="text-sm font-normal text-base-content flex my-2 justify-between items-center" + > + <span className="w-[150px] mr-[5px] md:mr-0 md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis text-sm font-semibold"> + {share.email} + </span> + <div className="flex items-center gap-2"> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={share.url} + className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm " + > + <i className="fa-light fa-share-from-square"></i> + {t("btnLabel.Share")} + </ShareButton> + <button + className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm" + onClick={() => + copybtn(share.url, share.email) + } + > + <i className="fa-light fa-copy" /> + {copied[share.email] + ? t("copied") + : t("copy")} + </button> + </div> + </div> + ))} + <p ref={copyUrlRef} className="hidden"></p> + </div> + </ModalUi> + )} + {isResendMail[item.objectId] && ( + <ModalUi + isOpen + title={ + t("resend-mail") + } + handleClose={handleResendClose} + > + <div className="overflow-y-auto max-h-[340px] md:max-h-[400px]"> + {item?.Placeholders?.filter( + (user) => user?.Role !== "prefill" + )?.map((user) => ( + <React.Fragment key={user.Id}> + {isNextStep[user.Id] && ( + <div className="relative "> + {actLoader[user.Id] && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> + <Loader /> + </div> + )} + <form + onSubmit={(e) => + handleResendMail(e, item, user) + } + className="w-full flex flex-col gap-2 p-3 text-base-content relative" + > + <div className="absolute right-5 text-xs z-40"> + <Tooltip + id={`${user.Id}_help`} + message={t("resend-mail-help")} + /> + </div> + <div> + <label + className="text-xs ml-1" + htmlFor="mailsubject" + > + {t("subject")}{" "} + </label> + <input + id="mailsubject" + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + value={mail.subject} + onChange={(e) => + handleSubjectChange( + e.target.value, + item + ) + } + onInvalid={(e) => + e.target.setCustomValidity( + t("input-required") + ) + } + onInput={(e) => + e.target.setCustomValidity("") + } + required + /> + </div> + <div> + <label + className="text-xs ml-1" + htmlFor="mailbody" + > + {t("body")}{" "} + </label> + <EditorToolbar containerId="toolbar1" /> + <ReactQuill + id="mailbody" + theme="snow" + value={mail.body || ""} + placeholder="add body of email " + modules={module1} + formats={formats} + onChange={(value) => + handlebodyChange(value, item) + } + /> + </div> + <button + type="submit" + className="op-btn op-btn-primary" + > + {t("resend")} + </button> + </form> + </div> + )} + {Object?.keys(isNextStep) <= 0 && ( + <div className="flex justify-between items-center gap-2 my-2 px-3"> + <div className="text-base-content"> + {user?.signerPtr?.Name || "-"}{" "} + {`<${ + user?.email + ? user.email + : user.signerPtr.Email + }>`} + </div> + <>{fetchUserStatus(user, item)}</> + </div> + )} + </React.Fragment> + ))} + </div> + </ModalUi> + )} + <ModalUi + title={t("btnLabel.Rename")} + isOpen={isModal["rename_" + item.objectId]} + handleClose={handleCloseModal} + > + <div className="flex flex-col px-4 pb-3 pt-2"> + <div className="flex flex-col gap-2"> + <input + maxLength={200} + autoFocus={true} + type="text" + defaultValue={renameDoc || item.Name} + onChange={(e) => setRenameDoc(e.target.value)} + className="op-input op-input-bordered op-input-sm w-full focus:outline-none hover:border-base-content text-[10px]" + /> + </div> + <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> + <button + className="w-[100px] op-btn op-btn-primary op-btn-md" + onClick={() => handleRenameDoc(item)} + > + {t("save")} + </button> + <button + className="w-[100px] op-btn op-btn-secondary op-btn-md" + onClick={handleCloseModal} + > + {t("cancel")} + </button> + </div> + </div> + </ModalUi> + </td> + </tr> + ))} + </tbody> + </table> + {props.List?.length <= 0 && ( + <div + className={`${ + isDashboard ? "h-[317px]" : "" + } flex flex-col items-center justify-center w-ful bg-base-100 text-base-content rounded-xl py-4`} + > + <div className="w-[60px] h-[60px] overflow-hidden"> + <img + className="w-full h-full object-contain" + src={pad} + alt="img" + /> + </div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> + </div> + )} + </div> + <div className="op-join flex flex-wrap items-center p-2"> + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateBack()} + className="op-join-item op-btn op-btn-sm" + > + {t("prev")} + </button> + )} + {pageNumbers.map((x, i) => ( + <button + key={i} + onClick={() => setCurrentPage(x)} + disabled={x === "..."} + className={`${ + x === currentPage ? "op-btn-active" : "" + } op-join-item op-btn op-btn-sm`} + > + {x} + </button> + ))} + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateFront()} + className="op-join-item op-btn op-btn-sm" + > + {t("next")} + </button> + )} + </div> + <CustomizeMail + setIsMailModal={setIsMailModal} + setCustomizeMail={setCustomizeMail} + documentId={documentId} + signerList={signerList} + setIsSend={setIsSend} + setMailStatus={setMailStatus} + customizeMail={customizeMail} + defaultMail={defaultMail} + isMailModal={isMailModal} + setCurrUserId={setCurrUserId} + handleShareList={handleShareList} + setDocumentDetails={setDocumentDetails} + /> + <ModalUi + isOpen={isSend} + title={ + mailStatus === "success" + ? t("mails-sent") + : mailStatus === "quotareached" + ? t("quota-mail-head") + : t("mail-not-delivered") + } + handleClose={() => { + setIsSend(false); + navigate("/report/1MwEuxLEkF"); + }} + > + <div className="h-[100%] p-[20px] text-base-content"> + {mailStatus === "success" ? ( + <div className="text-center mb-[10px]"> + <LottieWithLoader /> + {documentDetails.SendinOrder ? ( + <p> + {currUserId + ? t("placeholder-mail-alert-you") + : t("placeholder-mail-alert", { + name: signerList[0]?.Name + })} + </p> + ) : ( + <p>{t("placeholder-alert-4")}</p> + )} + {currUserId && <p>{t("placeholder-alert-5")}</p>} + </div> + ) : mailStatus === "quotareached" ? ( + <div className="flex flex-col gap-y-3"> + <div className="my-3">{handleShareList()}</div> + </div> + ) : ( + <div className="mb-[10px]"> + {mailStatus === "dailyquotareached" ? ( + <p>{t("daily-quota-reached")}</p> + ) : ( + <p>{t("placeholder-alert-6")}</p> + )} + {currUserId && ( + <p className="mt-1">{t("placeholder-alert-5")}</p> + )} + </div> + )} + {!mailStatus && ( + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + )} + {mailStatus !== "quotareached" && ( + <div + className={ + mailStatus === "success" ? "flex justify-center mt-1" : "" + } + > + {currUserId && ( + <button + onClick={() => + handleRecipientSign(documentDetails?.objectId, currUserId) + } + type="button" + className="op-btn op-btn-primary mr-1" + > + {t("yes")} + </button> + )} + <button + onClick={() => { + navigate("/report/1MwEuxLEkF"); + }} + type="button" + className="op-btn op-btn-ghost text-base-content" + > + {currUserId ? t("no") : t("close")} + </button> + </div> + )} + </div> + </ModalUi> + </div> + </div> + ); +}; + +export default TemplatesReport; diff --git a/apps/OpenSign/src/utils/fileUtils.js b/apps/OpenSign/src/utils/fileUtils.js new file mode 100644 index 0000000000..93b359db3a --- /dev/null +++ b/apps/OpenSign/src/utils/fileUtils.js @@ -0,0 +1,125 @@ +import { SaveFileSize } from "../constant/saveFileSize"; +import { getSecureUrl } from "../constant/Utils"; +import Parse from "parse"; +import i18n from "../i18n"; + +export const uploadFile = async (file, userId) => { + try { + const parseFile = new Parse.File(file.name, file); + const response = await parseFile.save(); + if (response?.url()) { + const fileRes = await getSecureUrl(response.url()); + if (fileRes.url) { + const tenantId = localStorage.getItem("TenantId"); + SaveFileSize(file.size, fileRes.url, tenantId, userId); + return fileRes?.url; + } else { + alert(i18n.t("something-went-wrong-mssg")); + return false; + } + } else { + alert(i18n.t("something-went-wrong-mssg")); + return false; + } + } catch (err) { + console.log("sign upload err", err); + alert(`${err.message}`); + return false; + } +}; + +export function base64StringtoFile(base64String, filename) { + let arr = base64String.split(","), + // type of uploaded image + mime = arr[0].match(/:(.*?);/)[1], + // decode base64 + bstr = atob(arr[1]), + n = bstr.length, + u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + const ext = mime.split("/").pop(); + const name = `${filename}.${ext}`; + return new File([u8arr], name, { type: mime }); +} + +function formatFixedDate(date = new Date()) { + const dd = String(date.getDate()).padStart(2, "0"); + const months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + const mmm = months[date.getMonth()]; + const yyyy = String(date.getFullYear()); + let h = date.getHours(); + const ampm = h >= 12 ? "PM" : "AM"; + h = h % 12; + if (h === 0) h = 12; + const HH12 = String(h).padStart(2, "0"); + const MM = String(date.getMinutes()).padStart(2, "0"); + return `${dd}-${mmm}-${yyyy} ${HH12}:${MM} ${ampm}`; +} + +/** + * Remove characters not allowed in file names for major OSes. + */ +function sanitizeDownloadFilename(name) { + return name + .replace(/[\\/:*?"<>|\u0000-\u001F]/g, " ") // reserved + control + .replace(/\s+/g, " ") // collapse spaces + .trim(); +} + +/** + * Build filename using the selected format ID and runtime values. + * @param {string} formatId - One of FILENAME_FORMATS ids + * @param {object} ctx - { docName, email, date, ext, isSigned, datePattern } + * @returns {string} + */ +export function buildDownloadFilename(formatId, ctx) { + const { + docName = "Document", + email = "user@example.com", + date = new Date(), + ext = "pdf", + isSigned = false + } = ctx || {}; + + const base = sanitizeDownloadFilename(String(docName) || "Document"); + const safeEmail = sanitizeDownloadFilename( + String(email) || "user@example.com" + ); + const dateStr = formatFixedDate(date); + + let stem; + switch (formatId) { + case "DOCNAME": + stem = base; + break; + case "DOCNAME_SIGNED": + stem = isSigned ? `${base} - Signed` : base; // if not signed, fallback to base + break; + case "DOCNAME_EMAIL": + stem = `${base} - ${safeEmail}`; + break; + case "DOCNAME_EMAIL_DATE": + stem = `${base} - ${safeEmail} - ${dateStr}`; + break; + default: + stem = base; // safe default + } + + const safeExt = ext.replace(/\.+/g, "").toLowerCase() || "pdf"; + return `${stem}.${safeExt}`; +} diff --git a/apps/OpenSign/src/utils/index.js b/apps/OpenSign/src/utils/index.js new file mode 100644 index 0000000000..94b4682886 --- /dev/null +++ b/apps/OpenSign/src/utils/index.js @@ -0,0 +1,6 @@ +export * from "./fileUtils"; +export * from "./prefillUtils"; +export * from "./sanitizeFileName"; +export * from "./lazyWithRetry"; +export * from "./upgradeProgress"; +export * from "./widgetUtils"; diff --git a/apps/OpenSign/src/utils/lazyWithRetry.js b/apps/OpenSign/src/utils/lazyWithRetry.js new file mode 100644 index 0000000000..9f9116248b --- /dev/null +++ b/apps/OpenSign/src/utils/lazyWithRetry.js @@ -0,0 +1,19 @@ +import React from "react"; +import { showUpgradeProgress } from "./upgradeProgress"; + +export function lazyWithRetry(factory) { + return React.lazy(() => + factory().catch((error) => { + if ( + error && + error.message && + /Failed to fetch dynamically imported module/.test(error.message) + ) { + localStorage.setItem("showUpgradeProgress", "1"); + showUpgradeProgress(); + setTimeout(() => window.location.reload(), 100); + } + throw error; + }) + ); +} diff --git a/apps/OpenSign/src/utils/prefillUtils.js b/apps/OpenSign/src/utils/prefillUtils.js new file mode 100644 index 0000000000..f788513ec3 --- /dev/null +++ b/apps/OpenSign/src/utils/prefillUtils.js @@ -0,0 +1,223 @@ +import { SaveFileSize } from "../constant/saveFileSize"; +import { + convertBase64ToFile, + convertPdfArrayBuffer, + createDocument, + generatePdfName, + embedWidgetsToDoc, + randomId, + getBase64FromUrl +} from "../constant/Utils"; +import { PDFDocument } from "pdf-lib"; + +export const prefillBlockColor = "transparent"; +export const prefillObj = (id) => { + const obj = { + Id: id || randomId(), + Role: "prefill", + Name: "Prefill by owner", + blockColor: prefillBlockColor + }; + + return obj; +}; +//funtion to use embed prefill details in documentAdd commentMore actions +export const handleEmbedPrefillToDoc = async ( + prefillDetails, + scale, + pdfArrayBuffer, + prefillImg, + userId +) => { + try { + const placeholder = prefillDetails?.placeHolder; + const existingPdfBytes = pdfArrayBuffer; + const pdfDoc = await PDFDocument.load(existingPdfBytes, { + ignoreEncryption: true + }); + const isSignYourSelfFlow = false; + try { + const pdfBase64 = await embedWidgetsToDoc( + placeholder, + pdfDoc, + isSignYourSelfFlow, + scale, + prefillImg + ); + const pdfName = generatePdfName(16); + const pdfUrl = await convertBase64ToFile(pdfName, pdfBase64); + const tenantId = localStorage.getItem("TenantId"); + const buffer = atob(pdfBase64); + SaveFileSize(buffer.length, pdfUrl, tenantId, userId); + return pdfUrl; + } catch (err) { + console.log("error to convertBase64ToFile in placeholder flow", err); + alert(err?.message); + } + } catch (err) { + console.log("error in handleEmbedPrefillToDoc function", err); + } +}; +//this function is used to open modal to show signers list +export const handleDisplaySignerList = async ( + xyPosition, + signers, + setForms, + isHideSigner +) => { + //'isHideSigner' is used to check should signer attach dropdown display or not + if (!isHideSigner) { + // if any role does not attach signer then show signers list attach to role in modal + const filterPrefill = xyPosition?.filter((x) => x.Role !== "prefill"); + let users = []; + filterPrefill?.forEach((element) => { + let label = ""; + const signerData = signers?.find( + (x) => element.signerObjId && element.signerObjId === x.objectId + ); + if (signerData) { + label = `${signerData.Name}<${signerData.Email}>`; + } + users = [ + ...users, + { + value: element?.signerObjId || element?.Id, + label: label || "", + role: element.Role + } + ]; + }); + setForms(users); + } +}; + +export const isValidPrefill = (prefillData) => { + const getPlaceholder = prefillData?.placeHolder; + if (getPlaceholder) { + // Find objects with empty response of prefill widgets + const emptyResponseObjects = getPlaceholder.flatMap((page) => + page.pos.filter( + (item) => + item?.type !== "checkbox" && + !item?.options?.defaultValue && + !item?.options?.response + ) + ); + if (emptyResponseObjects.length > 0) { + const res = { + status: "unfilled", + emptyResponseObjects: emptyResponseObjects + }; + return res; + } + } +}; +//function to use create document from templateAdd commentMore actions +export const handleCheckPrefillCreateDoc = async ( + xyPosition, + signers, + setIsPrefillModal, + scale, + updatedPdfUrl, + pdfDetails, + prefillImg, + userId +) => { + const pdfArrayBuffer = await convertPdfArrayBuffer(updatedPdfUrl); + const prefillData = xyPosition.find((x) => x.Role === "prefill"); + if (prefillData) { + const res = isValidPrefill(prefillData); + if (res) { + return res; + } + } + const removePrefill = xyPosition.filter((data) => data.Role !== "prefill"); + const isAllAttachSigner = + removePrefill.length > 0 && removePrefill.every((x) => x?.signerObjId); + if (isAllAttachSigner) { + setIsPrefillModal(false); + const prefillDetails = xyPosition.find((data) => data.Role === "prefill"); + let signedUrl; + //condition to check prefill widgets exit or not if exist then embed prefill widgets value in template + //and then create document + if (prefillDetails) { + signedUrl = await handleEmbedPrefillToDoc( + prefillDetails, + scale, + pdfArrayBuffer, + prefillImg, + userId + ); + } else { + signedUrl = pdfDetails[0]?.URL; + } + const isSendDoc = true; + const res = await createDocument( + pdfDetails, + xyPosition, + signers, + signedUrl || updatedPdfUrl, + isSendDoc + ); + if (res.status === "success") { + return res; + } + } else { + const res = { status: "unattach signer" }; + return res; + } +}; + +//function is used to save prefill image base64 in local to display on document/template +export const savePrefillImg = async (Placeholders) => { + const prefillData = Placeholders?.find((x) => x.Role === "prefill"); + if (prefillData) { + const allImageFields = prefillData?.placeHolder.flatMap((p) => + p.pos.filter((item) => item.type === "image") + ); + const hasImageType = allImageFields.some((p) => p.type === "image"); + if (hasImageType) { + const imgArr = []; + for (const ph of prefillData?.placeHolder || []) { + for (const pos of ph?.pos || []) { + if (pos?.type === "image" && pos?.SignUrl) { + const addSuffix = true; + const base64 = await getBase64FromUrl(pos?.SignUrl, addSuffix); + imgArr.push({ + id: pos?.key, + base64: base64 + }); + } else if (pos?.type === "image") { + imgArr.push({ + id: pos?.key, + base64: "" + }); + } + } + } + + return imgArr; + } + } +}; + +//function is used to get signers list for showing in modal +export const handleSignersList = (item) => { + const removePrefill = item?.Placeholders?.filter((x) => x.Role !== "prefill"); + let updatedSigners = removePrefill.map((x) => { + let matchingSigner = item?.Signers?.find( + (y) => x.signerObjId && x.signerObjId === y.objectId + ); + if (matchingSigner) { + return { + ...matchingSigner, + Role: x.Role ? x.Role : matchingSigner.Role, + Id: x.Id, + blockColor: x.blockColor + }; + } else { + return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; + } + }); + return updatedSigners; +}; diff --git a/apps/OpenSign/src/primitives/sanitizeFileName.js b/apps/OpenSign/src/utils/sanitizeFileName.js similarity index 74% rename from apps/OpenSign/src/primitives/sanitizeFileName.js rename to apps/OpenSign/src/utils/sanitizeFileName.js index bf796913fb..e7faeaf737 100644 --- a/apps/OpenSign/src/primitives/sanitizeFileName.js +++ b/apps/OpenSign/src/utils/sanitizeFileName.js @@ -1,7 +1,6 @@ -function sanitizeFileName(fileName) { +export function sanitizeFileName(fileName) { // Remove spaces and invalid characters const file = fileName?.replace(/[^a-zA-Z0-9._-]/g, ""); const removedot = file?.replace(/\.(?=.*\.)/g, ""); return removedot?.replace(/[^a-zA-Z0-9._-]/g, ""); } -export default sanitizeFileName; diff --git a/apps/OpenSign/src/utils/upgradeProgress.js b/apps/OpenSign/src/utils/upgradeProgress.js new file mode 100644 index 0000000000..5974184bd6 --- /dev/null +++ b/apps/OpenSign/src/utils/upgradeProgress.js @@ -0,0 +1,49 @@ +let intervalId; + +export function showUpgradeProgress() { + if (document.getElementById("upgrade-progress")) return; + + const overlay = document.createElement("div"); + overlay.id = "upgrade-progress"; + Object.assign(overlay.style, { + position: "fixed", + top: 0, + left: 0, + width: "100%", + height: "100%", + background: "rgba(255,255,255,0.9)", + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + zIndex: 9999 + }); + + const text = document.createElement("div"); + text.textContent = "Applying update..."; + text.style.marginBottom = "0.5rem"; + + const progress = document.createElement("progress"); + progress.max = 100; + progress.value = 0; + progress.style.width = "60%"; + + overlay.appendChild(text); + overlay.appendChild(progress); + document.body.appendChild(overlay); + + intervalId = setInterval(() => { + progress.value = (progress.value + 5) % 100; + }, 100); +} + +export function hideUpgradeProgress() { + if (intervalId) { + clearInterval(intervalId); + intervalId = null; + } + const overlay = document.getElementById("upgrade-progress"); + if (overlay) { + overlay.remove(); + } +} diff --git a/apps/OpenSign/src/utils/widgetUtils.js b/apps/OpenSign/src/utils/widgetUtils.js new file mode 100644 index 0000000000..e90d7dc7bb --- /dev/null +++ b/apps/OpenSign/src/utils/widgetUtils.js @@ -0,0 +1,43 @@ +import { generateTitleFromFilename, getBase64FromUrl } from "../constant/Utils"; +import { base64StringtoFile, uploadFile } from "./fileUtils"; +import { sanitizeFileName } from "./sanitizeFileName"; +import Parse from "parse"; +// `handlesavesign` is used to save signature, initials, stamp as a default +export const saveToMySign = async (widget) => { + const base64 = widget?.base64; + if (base64) { + try { + const User = Parse?.User?.current(); + const sanitizename = generateTitleFromFilename(User?.get("name")); + const replaceSpace = sanitizeFileName(sanitizename); + const fileName = + widget?.type === "signature" + ? `${replaceSpace}__sign` + : `${replaceSpace}__initials`; + const file = base64StringtoFile(base64, fileName); + const fileUrl = await uploadFile(file, User?.id); + // below code is used to save or update default signature, initials, stamp + const signCls = new Parse.Object("contracts_Signature"); + if (widget?.defaultSignId) { + signCls.id = widget.defaultSignId; + } + if (widget?.type === "initials") { + signCls.set("Initials", fileUrl); + } else if (widget?.type === "signature") { + signCls.set("ImageURL", fileUrl); + } + signCls.set("UserId", Parse.User.createWithoutData(User.id)); + const signRes = await signCls.save(); + return { base64File: base64, id: signRes?.id }; + } catch (err) { + console.log("Err while saving signature", err); + return url; + } + } +}; + +// helper: does this signer already have any signature widget? +export const hasSignatureWidget = (s) => + (s.placeHolder ?? []).some((ph) => + (ph?.pos ?? []).some((p) => p?.type === "signature") + ); diff --git a/apps/OpenSign/vite.config.js b/apps/OpenSign/vite.config.js index 73567adeb2..bd1a837834 100644 --- a/apps/OpenSign/vite.config.js +++ b/apps/OpenSign/vite.config.js @@ -1,35 +1,27 @@ -import { defineConfig, splitVendorChunkPlugin } from "vite"; +import { defineConfig, loadEnv } from "vite"; import react from "@vitejs/plugin-react"; import svgr from "vite-plugin-svgr"; import { resolve } from "path"; -import dotenv from "dotenv"; - -// Load env file based on mode -dotenv.config(); // https://vitejs.dev/config/ -export default defineConfig(({ command, mode }) => { +export default defineConfig(({ mode }) => { + // Load ALL env vars (no prefix filter) + const env = loadEnv(mode, process.cwd(), ""); + return { plugins: [ react(), - svgr(), // Transform SVGs into React components - splitVendorChunkPlugin() + svgr() // Transform SVGs into React components ], - resolve: { - alias: { - // Add any path aliases here if needed - } - }, + resolve: { alias: {} }, // Add any necessary aliases here define: { // Replace process.env.REACT_APP_* with import.meta.env.VITE_* - "process.env": { - ...Object.keys(process.env).reduce((env, key) => { - if (key.startsWith("REACT_APP_")) { - env[key] = process.env[key]; - } - return env; - }, {}) - } + "process.env": Object.entries(env).reduce((acc, [key, value]) => { + if (key.startsWith("REACT_APP_")) { + acc[key] = value; + } + return acc; + }, {}) }, build: { outDir: "build", // Keep the same output directory as CRA for compatibility @@ -41,7 +33,7 @@ export default defineConfig(({ command, mode }) => { } }, server: { - port: process.env.PORT || 3000, // Same port as CRA + port: env.PORT || 3000, // Same port as CRA open: true }, test: { diff --git a/apps/OpenSignServer/Utils.js b/apps/OpenSignServer/Utils.js index 1da57a1936..9e2d015a2e 100644 --- a/apps/OpenSignServer/Utils.js +++ b/apps/OpenSignServer/Utils.js @@ -1,15 +1,23 @@ import dotenv from 'dotenv'; import { format, toZonedTime } from 'date-fns-tz'; -import { getSignedLocalUrl } from './cloud/parsefunction/getSignedUrl.js'; -import { PDFDocument } from 'pdf-lib'; +import getPresignedUrl, { getSignedLocalUrl } from './cloud/parsefunction/getSignedUrl.js'; import crypto from 'node:crypto'; -import axios from 'axios'; -dotenv.config(); +import { PDFDocument, rgb } from 'pdf-lib'; + +dotenv.config({ quiet: true }); export const cloudServerUrl = 'http://localhost:8080/app'; export const serverAppId = process.env.APP_ID || 'opensign'; export const appName = 'OpenSign™'; - +export const prefillDraftDocWidget = ['date', 'textbox', 'checkbox', 'radio button', 'image']; +export const prefillDraftTemWidget = [ + 'date', + 'textbox', + 'checkbox', + 'radio button', + 'image', + 'dropdown', +]; export const MAX_NAME_LENGTH = 250; export const MAX_NOTE_LENGTH = 200; export const MAX_DESCRIPTION_LENGTH = 500; @@ -28,6 +36,7 @@ export const color = [ '#ffffcc', ]; +export const prefillBlockColor = 'transparent'; export function replaceMailVaribles(subject, body, variables) { let replacedSubject = subject; let replacedBody = body; @@ -49,12 +58,9 @@ export const saveFileUsage = async (size, fileUrl, userId) => { //checking server url and save file's size try { if (userId) { + const userPtr = { __type: 'Pointer', className: '_User', objectId: userId }; const tenantQuery = new Parse.Query('partners_Tenant'); - tenantQuery.equalTo('UserId', { - __type: 'Pointer', - className: '_User', - objectId: userId, - }); + tenantQuery.equalTo('UserId', userPtr); const tenant = await tenantQuery.first({ useMasterKey: true }); if (tenant) { const tenantPtr = { __type: 'Pointer', className: 'partners_Tenant', objectId: tenant.id }; @@ -78,7 +84,7 @@ export const saveFileUsage = async (size, fileUrl, userId) => { } catch (err) { console.log('err in save usage', err); } - saveDataFile(size, fileUrl, tenantPtr); + saveDataFile(size, fileUrl, tenantPtr, userPtr); } } } catch (err) { @@ -87,12 +93,13 @@ export const saveFileUsage = async (size, fileUrl, userId) => { }; //function for save fileUrl and file size in particular client db class partners_DataFiles -const saveDataFile = async (size, fileUrl, tenantPtr) => { +const saveDataFile = async (size, fileUrl, tenantPtr, UserId) => { try { const newDataFiles = new Parse.Object('partners_DataFiles'); newDataFiles.set('FileUrl', fileUrl); newDataFiles.set('FileSize', size); newDataFiles.set('TenantPtr', tenantPtr); + newDataFiles.set('UserId', UserId); await newDataFiles.save(null, { useMasterKey: true }); } catch (err) { console.log('error in save usage ', err); @@ -225,6 +232,7 @@ export const flattenPdf = async pdfFile => { const flatPdf = await pdfDoc.save({ useObjectStreams: false }); return flatPdf; } catch (err) { + console.log('err ', err); throw new Error('error in pdf'); } }; @@ -303,39 +311,81 @@ export function formatDateTime(date, dateFormat, timeZone, is12Hour) { ? format(zonedDate, `${selectFormat(dateFormat)}, ${timeFormat} 'GMT' XXX`, { timeZone }) : formatTimeInTimezone(date, timeZone); } +export const randomId = () => { + const randomBytes = crypto.getRandomValues(new Uint16Array(1)); + const randomValue = randomBytes[0]; + const randomDigit = 1000 + (randomValue % 9000); + return randomDigit; +}; -// Utility: Convert base64 to buffer -export const base64ToBuffer = base64 => Buffer.from(base64, 'base64'); - -// Utility: Generate SHA-256 hash from PDF page metadata -const getPdfMetadataHash = async pdfBytes => { - const pdfDoc = await PDFDocument.load(pdfBytes); - const metaString = pdfDoc - .getPages() - .map((page, index) => { - const { width, height } = page.getSize(); - return `${index + 1}:${Math.round(width)}x${Math.round(height)}`; - }) - .join('|'); +export const handleValidImage = async Placeholder => { + const updatedPlaceholders = []; - return crypto.createHash('sha256').update(metaString).digest('hex'); -}; -// Utility: Validate if uploaded file matches original template PDF -export const handleReplaceFileValidation = async (baseFileUrl, newFileBase64) => { - try { - const { data } = await axios.get(baseFileUrl, { responseType: 'arraybuffer' }); - const basePdfBytes = Buffer.from(data); - const uploadedPdfBytes = base64ToBuffer(newFileBase64); + for (const placeholder of Placeholder || []) { + //Clean and format signerPtr + let signerPtr = placeholder.signerPtr; + // Check if signerPtr exists and has an id + if (signerPtr?.id) { + // Case 1: If signerPtr is a Parse Object instance + if (signerPtr instanceof Parse.Object) { + // If signerPtr has no attributes, it’s a plain pointer already + if (!signerPtr.attributes || Object.keys(signerPtr.attributes).length === 0) { + // Convert to a clean pointer using Parse’s built-in method + signerPtr = signerPtr.toPointer(); + } else { + // If it has attributes, manually construct the pointer object + signerPtr = { + __type: 'Pointer', + className: signerPtr.className, + objectId: signerPtr.id, + }; + } + // Case 2: If signerPtr is already a plain JS object resembling a pointer + } else if (typeof signerPtr === 'object' && signerPtr.className && signerPtr.objectId) { + // Normalize it to a valid Parse pointer object + signerPtr = { + __type: 'Pointer', + className: signerPtr.className, + objectId: signerPtr.objectId, + }; + } + } - const baseHash = await getPdfMetadataHash(basePdfBytes); - const uploadedHash = await getPdfMetadataHash(uploadedPdfBytes); + //Process placeHolder if Role is 'prefill' + if (placeholder?.Role === 'prefill') { + const updatedRole = []; + for (const item of placeholder.placeHolder || []) { + const updatedPos = []; + for (const posItem of item.pos || []) { + if (posItem?.type === 'image' && posItem?.SignUrl) { + const validUrl = await getPresignedUrl(posItem?.SignUrl); + updatedPos.push({ + ...posItem, + SignUrl: validUrl, + options: { ...posItem.options, response: validUrl }, + }); + } else { + updatedPos.push(posItem); + } + } + updatedRole.push({ + ...item, + pos: updatedPos, + }); + } - if (baseHash === uploadedHash) { - return { base64: newFileBase64 }; + updatedPlaceholders.push({ + ...placeholder, + signerPtr, + placeHolder: updatedRole, + }); + } else { + // Not prefill role, just push as-is + updatedPlaceholders.push({ + ...placeholder, + signerPtr, + }); } - return { error: 'PDFs do NOT match based on page number, width, and height' }; - } catch (err) { - console.error('Validation Error:', err.message); - return { error: err.message }; } + return updatedPlaceholders; }; diff --git a/apps/OpenSignServer/auth/authadapter.js b/apps/OpenSignServer/auth/authadapter.js index f47a2097df..a55af81e5e 100644 --- a/apps/OpenSignServer/auth/authadapter.js +++ b/apps/OpenSignServer/auth/authadapter.js @@ -1,6 +1,6 @@ import axios from 'axios'; import dotenv from 'dotenv'; -dotenv.config(); +dotenv.config({ quiet: true }); const ssoApiUrl = process.env.SSO_API_URL || 'https://sso.opensignlabs.com/api'; //'https://osl-jacksonv2.vercel.app/api'; export const SSOAuth = { // Returns a promise that fulfills if this user mail is valid. diff --git a/apps/OpenSignServer/cloud/customRoute/customApp.js b/apps/OpenSignServer/cloud/customRoute/customApp.js index 2fdb0a21e9..8c0b8c15ad 100644 --- a/apps/OpenSignServer/cloud/customRoute/customApp.js +++ b/apps/OpenSignServer/cloud/customRoute/customApp.js @@ -4,10 +4,11 @@ import dotenv from 'dotenv'; import uploadFile from './uploadFile.js'; import docxtopdf, { upload as docxUpload } from './docxtopdf.js'; import decryptpdf, { upload as decryptUpload } from './decryptpdf.js'; +import { deleteUserByAdmin, deleteUserGet, deleteUserPost } from './deleteUser.js'; export const app = express(); -dotenv.config(); +dotenv.config({ quiet: true }); app.use(cors()); app.use(express.json({ limit: '50mb' })); app.use(express.urlencoded({ limit: '50mb', extended: true })); @@ -15,3 +16,6 @@ app.use(express.urlencoded({ limit: '50mb', extended: true })); app.post('/file_upload', uploadFile); app.post('/docxtopdf', docxUpload.single('file'), docxtopdf); app.post('/decryptpdf', decryptUpload.single('file'), decryptpdf); +app.get('/delete-account/:userId', deleteUserGet); +app.post('/delete-account/:userId', deleteUserPost); +app.post('/deleteuser/:userId', deleteUserByAdmin); diff --git a/apps/OpenSignServer/cloud/customRoute/deleteFileUrl.js b/apps/OpenSignServer/cloud/customRoute/deleteFileUrl.js new file mode 100644 index 0000000000..eb2cf0fe0b --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/deleteFileUrl.js @@ -0,0 +1,192 @@ +import { S3Client, DeleteObjectCommand } from '@aws-sdk/client-s3'; +import fs from 'node:fs/promises'; +import pLimit from 'p-limit'; +import { serverAppId } from '../../Utils.js'; + +// === Configuration === +const serverHost = new URL(process.env.SERVER_URL).hostname; +const LOCAL_HOSTS = ['localhost', '127.0.0.1', serverHost]; +const CONCURRENCY_LIMIT = 5; + +// === S3 Client Setup === +function createS3Client({ region, accessKeyId, secretAccessKey, endpoint = null }) { + const config = { + region, + credentials: { + accessKeyId, + secretAccessKey, + }, + }; + + // Only set custom endpoint if not using AWS + if (endpoint && !endpoint.includes('amazonaws.com')) { + config.endpoint = `https://${endpoint}`; + } + + return new S3Client(config); +} + +const s3 = createS3Client({ + region: process.env.DO_REGION, + endpoint: process.env.DO_ENDPOINT, + accessKeyId: process.env.DO_ACCESS_KEY_ID, + secretAccessKey: process.env.DO_SECRET_ACCESS_KEY, +}); + +// === Helpers === +function getS3ParamsFromUrl(fileUrl) { + try { + const url = new URL(fileUrl); + const Bucket = url.hostname.split('.')[0]; + const Key = decodeURIComponent(url.pathname.slice(1)); + return { Bucket, Key }; + } catch { + return null; + } +} + +async function deleteS3File(fileUrl) { + const params = getS3ParamsFromUrl(fileUrl); + if (!params) return; + + try { + await s3.send(new DeleteObjectCommand(params)); + // console.log(`✅ Deleted from S3: ${params.Key}`); + } catch (err) { + console.error(`❌ S3 delete failed: ${params.Key}:`, err.message); + } +} + +async function deleteLocalFile(fileUrl) { + try { + const url = new URL(fileUrl); + const filePath = decodeURIComponent(url.pathname); + if (!filePath.includes('files')) return; + + const localPath = url?.pathname?.split(`/files/${serverAppId}/`)?.pop(); + + if (localPath) { + await fs.unlink(`./files/files/${localPath}`); + } + // console.log(`🗑️ Deleted local file: ${localPath}`); + } catch (err) { + if (err.code === 'ENOENT') { + console.warn('⚠️ Local file not found:', fileUrl); + } else { + console.error('❌ Local delete failed:', err.message); + } + } +} + +async function deleteFileByUrl(fileUrl) { + if (!fileUrl) return; + try { + const url = new URL(fileUrl); + if (LOCAL_HOSTS.includes(url.hostname)) { + return deleteLocalFile(fileUrl); + } else { + return deleteS3File(fileUrl); + } + } catch { + console.warn('⚠️ Invalid URL, skipping:', fileUrl); + } +} + +// === Main Batch Deletion Function === +export async function deleteInBatches(className, userPointer) { + let hasMore = true; + const limit = 1000; + const limiter = pLimit(CONCURRENCY_LIMIT); + + while (hasMore) { + const query = new Parse.Query(className); + query.equalTo('CreatedBy', userPointer); + query.limit(limit); + query.ascending('objectId'); + + const results = await query.find({ useMasterKey: true }); + + // Step 1: Concurrent file deletions with controlled concurrency + const fileDeletePromises = []; + + for (const obj of results) { + const urls = ['URL', 'SignedUrl', 'certificateUrl'] + .map(field => obj.get(field)) + .filter(Boolean); + + for (const fileUrl of urls) { + fileDeletePromises.push(limiter(() => deleteFileByUrl(fileUrl))); + } + } + + await Promise.all(fileDeletePromises); + + // Step 2: Delete Parse objects + if (results.length > 0) { + await Parse.Object.destroyAll(results, { useMasterKey: true }); + console.log(`🧹 Deleted ${results.length} Parse objects from ${className}`); + } + + hasMore = results.length === limit; + } + + console.log(`✅ Finished deletion from ${className} for user: ${userPointer.objectId}`); +} + +export async function deleteDataFiles(className, userPointer) { + let hasMore = true; + const limit = 1000; + const limiter = pLimit(CONCURRENCY_LIMIT); + + while (hasMore) { + const query = new Parse.Query(className); + query.equalTo('UserId', userPointer); + query.limit(limit); + query.ascending('objectId'); + + const results = await query.find({ useMasterKey: true }); + + // Step 1: Concurrent file deletions with controlled concurrency + const fileDeletePromises = []; + + for (const obj of results) { + const urls = ['FileUrl'].map(field => obj.get(field)).filter(Boolean); + for (const fileUrl of urls) { + fileDeletePromises.push(limiter(() => deleteFileByUrl(fileUrl))); + } + } + + await Promise.all(fileDeletePromises); + + // Step 2: Delete Parse objects + if (results.length > 0) { + await Parse.Object.destroyAll(results, { useMasterKey: true }); + console.log(`🧹 Deleted ${results.length} Parse objects from ${className}`); + } + + hasMore = results.length === limit; + } + + console.log(`✅ Finished deletion from ${className} for user: ${userPointer.objectId}`); +} + +export async function deleteContactsInBatch(className, userPointer) { + let hasMore = true; + const limit = 1000; + + while (hasMore) { + const query = new Parse.Query(className); + query.equalTo('CreatedBy', userPointer); + query.limit(limit); + query.ascending('objectId'); + const results = await query.find({ useMasterKey: true }); + if (results?.length > 0) { + await Parse.Object.destroyAll(results, { useMasterKey: true }); + console.log(`🧹 Deleted ${results.length} Parse objects from ${className}`); + } + + hasMore = results.length === limit; + } + + console.log(`✅ Finished deletion from ${className} for user: ${userPointer.objectId}`); +} diff --git a/apps/OpenSignServer/cloud/customRoute/deleteUser.js b/apps/OpenSignServer/cloud/customRoute/deleteUser.js new file mode 100644 index 0000000000..f40417cf3f --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/deleteUser.js @@ -0,0 +1,464 @@ +import axios from 'axios'; +import { cloudServerUrl, generateId, serverAppId } from '../../Utils.js'; +import sendmailtoSupport from './sendMailToSupport.js'; +import { deleteContactsInBatch, deleteDataFiles, deleteInBatches } from './deleteFileUrl.js'; +const serverUrl = cloudServerUrl; +const appId = serverAppId; + +const deleteSessionsAndUser = async (userPointer, userId) => { + const Session = Parse.Object.extend('_Session'); + const sessionQuery = new Parse.Query(Session); + sessionQuery.equalTo('user', userPointer); + const sessions = await sessionQuery.find({ useMasterKey: true }); + if (sessions?.length > 0) await Parse.Object.destroyAll(sessions, { useMasterKey: true }); + + const userObj = await new Parse.Query(Parse.User).get(userId, { useMasterKey: true }); + if (userObj) await userObj.destroy({ useMasterKey: true }); +}; + +const resetPasswordAndDeleteSession = async userId => { + const password = generateId(16); + const user = await new Parse.Query(Parse.User).get(userId, { useMasterKey: true }); + user.set('password', password); + user.set('emailVerified', false); + user.unset('ProfilePic'); + await user.save(null, { useMasterKey: true }); + + // Optional: revoke all existing sessions (forces logout everywhere) + const sessionQuery = new Parse.Query('_Session'); + sessionQuery.equalTo('user', user); + const sessions = await sessionQuery.find({ useMasterKey: true }); + if (sessions.length) { + await Parse.Object.destroyAll(sessions, { useMasterKey: true }); + } +}; +export async function deleteUser(userId, adminId) { + const userPointer = { __type: 'Pointer', className: '_User', objectId: userId }; + let userDetails = { + UserRole: 'not found', + Name: 'not found', + Email: 'not found', + UserId: userId || 'not found', + objectId: 'not found', + TenantId: 'not found', + }; + try { + // STEP 1: contracts_Users lookup + const Users = Parse.Object.extend('contracts_Users'); + const userQuery = new Parse.Query(Users); + userQuery.equalTo('UserId', userPointer); + if (adminId) { + userQuery.equalTo('CreatedBy', { __type: 'Pointer', className: '_User', objectId: adminId }); + } + const userResult = await userQuery.first({ useMasterKey: true }); + userDetails = { ...userDetails, UserId: userId }; + if (!userResult) { + const errorMessage = 'User not found.'; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + const contractsUserId = userResult.id; + const tenantId = userResult.get('TenantId')?.id; + const teamIds = userResult.get('TeamIds') || []; + const organizationId = userResult.get('OrganizationId')?.id; + const isAdmin = userResult?.get('UserRole') === 'contracts_Admin' ? true : false; + userDetails = { + ...userDetails, + UserRole: userResult?.get('UserRole'), + Name: userResult?.get('Name'), + Email: userResult?.get('Email'), + UserId: userResult?.get('UserId')?.id, + objectId: userResult?.id, + TenantId: userResult?.get('TenantId')?.id, + }; + if (adminId && isAdmin) { + const errorMessage = 'An error occurred while deleting your account.'; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 2: contracts_Document & contracts_Template + try { + for (const className of ['contracts_Document', 'contracts_Template']) { + await deleteInBatches(className, userPointer); + } + } catch (err) { + console.error('Failed during contracts_Template cleanup:', err); + const errorMessage = 'Failed during contracts_Template cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 3: delete Contacts created by user from contactbook class + try { + await deleteContactsInBatch('contracts_Contactbook', userPointer); + } catch (err) { + console.error('Failed during contactbook cleanup:', err); + const errorMessage = 'Failed during contactbook cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + try { + // Check if any rows remain for this UserId + const Contactbook = Parse.Object.extend('contracts_Contactbook'); + const remainingCount = await new Parse.Query(Contactbook) + .equalTo('UserId', userPointer) + .count({ useMasterKey: true }); + + // If no record remains delete from _User class + if (remainingCount === 0) { + await deleteSessionsAndUser(userPointer, userId); + } else { + await resetPasswordAndDeleteSession(userId); + } + } catch (err) { + console.error('Failed during contactbook current user cleanup:', err); + const errorMessage = + 'Failed during contactbook current user cleanup: ' + (err?.message || err); + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 4: appToken + try { + const AppToken = Parse.Object.extend('appToken'); + const query = new Parse.Query(AppToken); + query.equalTo('UserId', userPointer); + const tokens = await query.find({ useMasterKey: true }); + if (tokens?.length) await Parse.Object.destroyAll(tokens, { useMasterKey: true }); + } catch (err) { + console.error('Failed to delete appToken entries:', err); + const errorMessage = 'Failed to delete appToken entries:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 5: partner_DataFiles + try { + await deleteDataFiles('partners_DataFiles', userPointer); + } catch (err) { + console.error('Failed during partners_DataFiles cleanup:', err); + const errorMessage = 'Failed during partners_DataFiles cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + if (isAdmin) { + // STEP 6: contracts_Organizations + try { + if (organizationId) { + const Org = Parse.Object.extend('contracts_Organizations'); + const query = new Parse.Query(Org); + const object = await query.get(organizationId, { useMasterKey: true }); + await object.destroy({ useMasterKey: true }); + } + } catch (err) { + console.error('Failed to delete contracts_Organizations entry:', err); + const errorMessage = 'Failed to delete contracts_Organizations entry:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + // STEP 7: Delete each entry in contracts_Teams by objectId from teamIds + try { + if (teamIds.length > 0) { + const Teams = Parse.Object.extend('contracts_Teams'); + for (const team of teamIds) { + try { + const teamObj = await new Parse.Query(Teams).get(team.id, { useMasterKey: true }); + if (teamObj) await teamObj.destroy({ useMasterKey: true }); + } catch (teamErr) { + console.error(`Failed to delete team with ID ${team.id}:`, teamErr); + const errorMessage = `Failed to delete team with ID ${team.id}` + teamErr?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + } + } + } catch (err) { + console.error('Failed during contracts_Teams deletion loop:', err); + const errorMessage = 'Failed during contracts_Teams deletion loop:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 8 : partners_Tenant cleanup + try { + if (tenantId) { + const Tenant = Parse.Object.extend('partners_Tenant'); + const query = new Parse.Query(Tenant); + const tenantObj = await query.get(tenantId, { useMasterKey: true }); + await tenantObj.destroy({ useMasterKey: true }); + } + } catch (err) { + const msg = `Failed during partners_Tenant ${'cleanup:'} `; + console.error(msg, err); + const errorMessage = msg + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 9: partners_TenantCredits cleanup + try { + if (tenantId) { + const tenantCredits = Parse.Object.extend('partners_TenantCredits'); + const subsByTenant = new Parse.Query(tenantCredits); + subsByTenant.equalTo('PartnersTenant', { + __type: 'Pointer', + className: 'partners_Tenant', + objectId: tenantId, + }); + const subs = await subsByTenant.find({ useMasterKey: true }); + await Parse.Object.destroyAll(subs, { useMasterKey: true }); + } + } catch (err) { + console.error('Failed during partners_TenantCredits cleanup:', err); + const errorMessage = 'Failed during partners_TenantCredits cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + } + // STEP 10: contracts_Signature + try { + const Signature = Parse.Object.extend('contracts_Signature'); + const sigQuery = new Parse.Query(Signature); + sigQuery.equalTo('UserId', userPointer); + const sigResults = await sigQuery.find({ useMasterKey: true }); + if (sigResults?.length > 0) await Parse.Object.destroyAll(sigResults, { useMasterKey: true }); + } catch (err) { + console.error('Failed during contracts_Signature cleanup:', err); + const errorMessage = 'Failed during contracts_Signature cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 11: contracts_Users + try { + await userResult.destroy({ useMasterKey: true }); + } catch (err) { + console.error('Failed to delete contracts_Users entry:', err); + const errorMessage = 'Failed to delete contracts_Users entry:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + return { code: 200, message: 'User and all associated data deleted successfully.' }; + } catch (error) { + console.error('User deletion process failed:', error); + const errorMessage = `User deletion failed: ${error.message || error}`; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } +} + +// 1. HTML Password Prompt Page +export const deleteUserGet = async (req, res) => { + const { userId } = req.params; + + const extUserQuery = new Parse.Query('Contracts_Users'); + extUserQuery.equalTo('userId', { __type: 'Pointer', className: '_User', objectId: userId }); + const extUser = await extUserQuery.first({ useMasterKey: true }); + if (!extUser) { + const errorMessage = 'User not found.'; + return res.send(errorMessage); + } + const routePath = process?.env?.SERVER_URL?.includes?.('api') ? '/api' : ''; + const htmlForm = ` +<html> +<head> + <title>Delete Account + + + +
+

Confirm Account Deletion

+

This action is irreversible. Please confirm by entering your password.

+ + + + + +
+ + + `; + res.send(htmlForm); +}; + +// 2. Handle Password Verification and Deletion +export const deleteUserPost = async (req, res) => { + const { userId } = req.params; + const routePath = process?.env?.SERVER_URL?.includes?.('api') ? '/api' : ''; + const { password } = req.body; + let userDetails = { + UserRole: 'not found', + Name: 'not found', + Email: 'not found', + UserId: userId || 'not found', + objectId: 'not found', + TenantId: 'not found', + }; + if (!userId) return res.status(404).send('Missing userId parameter.'); + + try { + // 1. Get the user + const userQuery = new Parse.Query(Parse.User); + userQuery.equalTo('objectId', userId); + const user = await userQuery.first({ useMasterKey: true }); + if (!user) { + const errorMessage = 'User not found.'; + // sendmailtoSupport(userDetails, errorMessage); + // return res.status(404).send(errorMessage); + return res.send(errorMessage); + } + const extUserQuery = new Parse.Query('Contracts_Users'); + extUserQuery.equalTo('userId', { __type: 'Pointer', className: '_User', objectId: userId }); + const extUser = await extUserQuery.first({ useMasterKey: true }); + if (!extUser) { + const errorMessage = 'User not found.'; + return res.send(errorMessage); + } + // 2. Attempt login to verify password + const username = user.get('username'); // assuming 'username' is used for login + try { + // await Parse.User.logIn(username, password); // Will throw if password invalid + // Use REST login to avoid mutating the global Parse current user + // Will throw if password invalid + const res = await axios.get(serverUrl + '/login', { + params: { username, password }, + headers: { 'X-Parse-Application-Id': appId }, + }); + console.log('Res ', res?.data); + } catch (err) { + console.log('err while validating password: ', err?.response?.data || err); + const errorMessage = `Invalid password. Try again`; + sendmailtoSupport(userDetails, errorMessage); + return res.status(401).send(errorMessage); + } + + const response = await deleteUser(userId); + const code = response?.code || 500; + const message = response?.message || 'An error occurred while deleting your account.'; + return res.status(code).send(message); + } catch (error) { + console.error('Account deletion error:', error); + const errorMessage = error?.message || 'An error occurred while deleting your account.'; + sendmailtoSupport(userDetails, errorMessage); + return res.status(500).send(errorMessage); + } +}; + +// 2. Handle Password Verification and Deletion +export const deleteUserByAdmin = async (req, res) => { + const sessiontoken = req.headers.sessiontoken; + const userId = req.params.userId; + let userDetails = { + UserRole: 'not found', + Name: 'not found', + Email: 'not found', + UserId: userId || 'not found', + objectId: 'not found', + TenantId: 'not found', + }; + if (!sessiontoken) return res.status(400).json({ message: 'unauthorized.' }); + if (!userId || userId === ':userId') { + return res.status(400).json({ message: 'Missing userId parameter.' }); + } + try { + const axiosRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Session-Token': sessiontoken, + }, + }); + const adminId = axiosRes?.data && axiosRes.data?.objectId; + + if (!adminId) { + return res.status(400).json({ message: 'Unauthorized.' }); + } + // 1. Get the user + const userQuery = new Parse.Query(Parse.User); + userQuery.equalTo('objectId', userId); + const user = await userQuery.first({ useMasterKey: true }); + if (!user) { + const errorMessage = 'User not found.'; + sendmailtoSupport(userDetails, errorMessage); + return res.status(400).json({ message: errorMessage }); + } + const response = await deleteUser(userId, adminId); + const code = response?.code || 400; + const message = response?.message || 'An error occurred while deleting your account.'; + return res.status(code).json({ message: message }); + } catch (error) { + const code = error?.response?.data?.code || 400; + const errorMessage = + error?.response?.data?.error || + error?.message || + 'An error occurred while deleting your account.'; + console.error(`Account deletion error:`, errorMessage); + sendmailtoSupport(userDetails, errorMessage); + return res.status(code).json({ message: errorMessage }); + } +}; diff --git a/apps/OpenSignServer/cloud/customRoute/docxtopdf.js b/apps/OpenSignServer/cloud/customRoute/docxtopdf.js index 0476d83d3d..49ea400f10 100644 --- a/apps/OpenSignServer/cloud/customRoute/docxtopdf.js +++ b/apps/OpenSignServer/cloud/customRoute/docxtopdf.js @@ -141,6 +141,11 @@ export default async function docxtopdf(req, res) { className: 'partners_Tenant', objectId: tenantId, }, + UserId: { + __type: 'Pointer', + className: '_User', + objectId: userRes.data.objectId, + }, }, { headers: { diff --git a/apps/OpenSignServer/cloud/customRoute/sendMailToSupport.js b/apps/OpenSignServer/cloud/customRoute/sendMailToSupport.js new file mode 100644 index 0000000000..b80941c4d5 --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/sendMailToSupport.js @@ -0,0 +1,83 @@ +import { appName, smtpenable } from '../../Utils.js'; + +export default async function sendmailtoSupport(userDetails, errorMessage) { + const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER; + // Render a simple HTML form. In production, consider using a templating engine. + try { + await Parse.Cloud.sendEmail({ + sender: appName + ' <' + mailsender + '>', + recipient: 'support@opensignlabs.com', + subject: `Error while deleting account – ${appName}`, + text: `Error while deleting account – ${appName}`, + html: ` + + + + +
+

Error: ${errorMessage}

+ +

User Details

+
+

UserRole: ${userDetails?.UserRole}

+

Name: ${userDetails?.Name}

+

Email: ${userDetails?.Email}

+

UserId: ${userDetails?.UserId}

+

ExtUserId: ${userDetails?.objectId}

+

TenantId: ${userDetails?.TenantId}

+
+
+ +`, + }); + } catch (err) { + console.log('err while sending mail to support', err); + } +} diff --git a/apps/OpenSignServer/cloud/customRoute/uploadFile.js b/apps/OpenSignServer/cloud/customRoute/uploadFile.js index 5eee3a4b67..100ee3c493 100644 --- a/apps/OpenSignServer/cloud/customRoute/uploadFile.js +++ b/apps/OpenSignServer/cloud/customRoute/uploadFile.js @@ -4,7 +4,7 @@ import multerS3 from 'multer-s3'; import aws from 'aws-sdk'; import dotenv from 'dotenv'; import { cloudServerUrl, serverAppId, useLocal } from '../../Utils.js'; -dotenv.config(); +dotenv.config({ quiet: true }); function sanitizeFileName(fileName) { // Remove spaces and invalid characters diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 6dc8b976b1..0d5244a591 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -55,6 +55,7 @@ import recreateDocument from './parsefunction/recreateDocument.js'; import loginUser from './parsefunction/loginUser.js'; import addUser from './parsefunction/addUser.js'; import filterDocs from './parsefunction/filterDocs.js'; +import sendDeleteUserMail from './parsefunction/sendDeleteUserMail.js'; // This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); @@ -120,3 +121,4 @@ Parse.Cloud.define('recreatedoc', recreateDocument); Parse.Cloud.define('loginuser', loginUser); Parse.Cloud.define('adduser', addUser); Parse.Cloud.define('filterdocs', filterDocs); +Parse.Cloud.define('senddeleterequest', sendDeleteUserMail); diff --git a/apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js b/apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js index 16f7bf2af8..e39adf3115 100644 --- a/apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js +++ b/apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js @@ -1,45 +1,35 @@ -import { useLocal } from '../../Utils.js'; +import { handleValidImage, useLocal } from '../../Utils.js'; import getPresignedUrl, { presignedlocalUrl } from './getSignedUrl.js'; async function DocumentAfterFind(request) { if (request.objects.length === 1) { if (request.objects) { const obj = request.objects[0]; - if ( - useLocal !== 'true' - ) { - const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); - const Url = obj?.get('URL') && obj?.get('URL'); - const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); + const Url = obj?.get('URL') && obj?.get('URL'); + const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + const isPrefillExist = obj?.get('Placeholders')?.some(x => x.Role === 'prefill'); + const Placeholder = obj?.get('Placeholders') || []; + if (useLocal !== 'true') { + if (isPrefillExist) { + const updatedPlaceHolder = await handleValidImage(Placeholder); + obj.set('Placeholders', updatedPlaceHolder); + } if (SignedUrl) { - obj.set( - 'SignedUrl', - getPresignedUrl( - SignedUrl, - ) - ); + obj.set('SignedUrl', getPresignedUrl(SignedUrl)); } if (Url) { - obj.set( - 'URL', - getPresignedUrl( - Url, - ) - ); + obj.set('URL', getPresignedUrl(Url)); } if (certificateUrl) { - obj.set( - 'CertificateUrl', - getPresignedUrl( - certificateUrl, - ) - ); + obj.set('CertificateUrl', getPresignedUrl(certificateUrl)); } return [obj]; } else if (useLocal == 'true') { - const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); - const Url = obj?.get('URL') && obj?.get('URL'); - const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + if (isPrefillExist) { + const updatedPlaceHolder = await handleValidImage(Placeholder); + obj.set('Placeholders', updatedPlaceHolder); + } if (SignedUrl) { obj.set('SignedUrl', presignedlocalUrl(SignedUrl)); } diff --git a/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js b/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js index 24d95a39f6..17378de497 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js +++ b/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js @@ -26,7 +26,6 @@ export default async function forwardDoc(request) { } const _docRes = docRes?.toJSON(); const docName = _docRes.Name; - const fileAdapterId = _docRes?.FileAdapterId || ''; const extUserId = _docRes?.ExtUserPtr?.objectId; const TenantAppName = appName; const from = _docRes?.ExtUserPtr?.Email; diff --git a/apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js b/apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js index 32c8084c96..9953685b6b 100644 --- a/apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js +++ b/apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js @@ -1,45 +1,35 @@ -import { useLocal } from '../../Utils.js'; +import { handleValidImage, useLocal } from '../../Utils.js'; import getPresignedUrl, { presignedlocalUrl } from './getSignedUrl.js'; async function TemplateAfterFind(request) { if (request.objects.length === 1) { if (request.objects) { const obj = request.objects[0]; - if ( - useLocal !== 'true' - ) { - const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); - const Url = obj?.get('URL') && obj?.get('URL'); - const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); + const Url = obj?.get('URL') && obj?.get('URL'); + const certificateUrl = obj.get('CertificateUrl') && obj?.get('CertificateUrl'); + const isPrefillExist = obj?.get('Placeholders')?.some(x => x.Role === 'prefill'); + const Placeholder = obj?.get('Placeholders') || []; + if (useLocal !== 'true') { + if (isPrefillExist) { + const updatedPlaceHolder = await handleValidImage(Placeholder); + obj.set('Placeholders', updatedPlaceHolder); + } if (SignedUrl) { - obj.set( - 'SignedUrl', - getPresignedUrl( - SignedUrl, - ) - ); + obj.set('SignedUrl', getPresignedUrl(SignedUrl)); } if (Url) { - obj.set( - 'URL', - getPresignedUrl( - Url, - ) - ); + obj.set('URL', getPresignedUrl(Url)); } if (certificateUrl) { - obj.set( - 'CertificateUrl', - getPresignedUrl( - certificateUrl, - ) - ); + obj.set('CertificateUrl', getPresignedUrl(certificateUrl)); } return [obj]; } else if (useLocal == 'true') { - const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); - const Url = obj?.get('URL') && obj?.get('URL'); - const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + if (isPrefillExist) { + const updatedPlaceHolder = await handleValidImage(Placeholder); + obj.set('Placeholders', updatedPlaceHolder); + } if (SignedUrl) { obj.set('SignedUrl', presignedlocalUrl(SignedUrl)); } diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js b/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js index fa4e14536a..0ccdbd1519 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js @@ -20,8 +20,10 @@ export default async function createBatchContact(req) { UserRole: 'contracts_Guest', TenantId: { __type: 'Pointer', className: 'partners_Tenant', objectId: x.TenantId }, CreatedBy: { __type: 'Pointer', className: '_User', objectId: req.user.id }, - Name: x.Name, + Name: x.Name?.trim(), Email: x.Email?.toLowerCase()?.replace(/\s/g, ''), + Company: x?.Company?.trim(), + JobTitle: x?.JobTitle?.trim(), IsDeleted: false, IsImported: true, ...(x?.Phone ? { Phone: `${x?.Phone}` } : {}), diff --git a/apps/OpenSignServer/cloud/parsefunction/editContact.js b/apps/OpenSignServer/cloud/parsefunction/editContact.js index 2bd396d0d9..a57d1059e2 100644 --- a/apps/OpenSignServer/cloud/parsefunction/editContact.js +++ b/apps/OpenSignServer/cloud/parsefunction/editContact.js @@ -1,5 +1,7 @@ export default async function editContact(request) { const { contactId, name, email, phone, tenantId } = request.params; + const company = request.params?.company; + const jobTitle = request.params?.jobTitle; if (!request?.user) { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } @@ -25,6 +27,12 @@ export default async function editContact(request) { if (phone) { contactQuery.set('Phone', phone); } + if (company) { + contactQuery.set('Company', company); + } + if (jobTitle) { + contactQuery.set('JobTitle', jobTitle); + } contactQuery.set('Email', email?.toLowerCase()?.replace(/\s/g, '')); contactQuery.set('UserRole', 'contracts_Guest'); contactQuery.set('IsDeleted', false); @@ -55,7 +63,7 @@ export default async function editContact(request) { acl.setWriteAccess(createdBy.objectId, true); contactQuery.setACL(acl); - const res = await contactQuery.save(); + const res = await contactQuery.save(null, { useMasterKey: true }); const parseData = JSON.parse(JSON.stringify(res)); return parseData; } @@ -76,7 +84,7 @@ export default async function editContact(request) { acl.setReadAccess(createdBy.objectId, true); acl.setWriteAccess(createdBy.objectId, true); contactQuery.setACL(acl); - const res = await contactQuery.save(); + const res = await contactQuery.save(null, { useMasterKey: true }); const parseData = JSON.parse(JSON.stringify(res)); return parseData; } diff --git a/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js b/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js index 5c322ae460..d502a4c5d4 100644 --- a/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js +++ b/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js @@ -7,7 +7,7 @@ import fs from 'node:fs'; import dotenv from 'dotenv'; import GenerateCertificate from './pdf/GenerateCertificate.js'; import { getSecureUrl } from '../../Utils.js'; -dotenv.config(); +dotenv.config({ quiet: true }); const eSignName = 'OpenSign'; const eSigncontact = 'hello@opensignlabs.com'; diff --git a/apps/OpenSignServer/cloud/parsefunction/getDocument.js b/apps/OpenSignServer/cloud/parsefunction/getDocument.js index d64ffbecca..0bd3c7c94e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDocument.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDocument.js @@ -3,6 +3,7 @@ import { cloudServerUrl, serverAppId } from '../../Utils.js'; export default async function getDocument(request) { const serverUrl = cloudServerUrl; //process.env.SERVER_URL; const docId = request.params.docId; + const include = request?.params?.include || ''; const sessiontoken = request?.headers?.sessiontoken || ''; try { if (docId) { @@ -17,6 +18,9 @@ export default async function getDocument(request) { query.include('Placeholders'); query.include('DeclineBy'); query.notEqualTo('IsArchive', true); + if (include) { + query?.include(include); + } const res = await query.first({ useMasterKey: true }); if (res) { const IsEnableOTP = res?.get('IsEnableOTP') || false; diff --git a/apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js b/apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js index 1a595f2d13..a2d3f14470 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js +++ b/apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js @@ -2,27 +2,21 @@ import AWS from 'aws-sdk'; import { useLocal } from '../../Utils.js'; import jwt from 'jsonwebtoken'; import dotenv from 'dotenv'; -dotenv.config(); +dotenv.config({ quiet: true }); -export default function getPresignedUrl( - url, -) { +export default function getPresignedUrl(url) { if (url?.includes('files')) { return presignedlocalUrl(url); } else { const credentials = { - accessKeyId: - process.env.DO_ACCESS_KEY_ID, - secretAccessKey: - process.env.DO_SECRET_ACCESS_KEY, + accessKeyId: process.env.DO_ACCESS_KEY_ID, + secretAccessKey: process.env.DO_SECRET_ACCESS_KEY, }; AWS.config.update({ credentials: credentials, - region: - process.env.DO_REGION, + region: process.env.DO_REGION, }); - const spacesEndpoint = - new AWS.Endpoint(process.env.DO_ENDPOINT); + const spacesEndpoint = new AWS.Endpoint(process.env.DO_ENDPOINT); const s3 = new AWS.S3({ endpoint: spacesEndpoint, signatureVersion: 'v4' }); @@ -35,8 +29,7 @@ export default function getPresignedUrl( // presignedGETURL return presignedUrl with expires time const presignedGETURL = s3.getSignedUrl('getObject', { - Bucket: - process.env.DO_SPACE, + Bucket: process.env.DO_SPACE, Key: filename, //filename Expires: 160, //time to expire in seconds }); @@ -53,35 +46,22 @@ export async function getSignedUrl(request) { try { if (url?.includes('files')) { return presignedlocalUrl(url); - } else if ( - useLocal !== 'true' - ) { + } else if (useLocal !== 'true') { const query = new Parse.Query(docId ? 'contracts_Document' : 'contracts_Template'); query.equalTo('objectId', docId ? docId : templateId); query.include('ExtUserPtr.TenantId'); query.notEqualTo('IsArchive', true); const res = await query.first({ useMasterKey: true }); - if (res) { - const _resDoc = JSON.parse(JSON.stringify(res)); - if (_resDoc?.IsEnableOTP) { - if (!request?.user) { - throw new Parse.Error( - Parse.Error.INVALID_SESSION_TOKEN, - 'User is not authenticated.' - ); - } else { - const presignedUrl = getPresignedUrl( - url, - ); - return presignedUrl; - } - } else { - const presignedUrl = getPresignedUrl( - url, - ); - return presignedUrl; - } + if (!res) return url; + + const _resDoc = res?.toJSON(); + // Ensure user is authenticated if OTP is required + if (_resDoc?.IsEnableOTP && !request?.user) { + throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } + + const presignedUrl = getPresignedUrl(url); + return presignedUrl; } else { return url; } diff --git a/apps/OpenSignServer/cloud/parsefunction/getSigners.js b/apps/OpenSignServer/cloud/parsefunction/getSigners.js index 7d41726e0a..48bde122ad 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getSigners.js +++ b/apps/OpenSignServer/cloud/parsefunction/getSigners.js @@ -35,8 +35,7 @@ export default async function getSigners(request) { searchObj.CreatedBy = { __type: 'Pointer', className: '_User', objectId: request?.user?.id }; searchObj.sessionToken = request.user.getSessionToken(); return await getContacts(searchObj); - } - else { + } else { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token'); } } catch (err) { diff --git a/apps/OpenSignServer/cloud/parsefunction/getTenant.js b/apps/OpenSignServer/cloud/parsefunction/getTenant.js index 1c98aa7e10..4dd17711b7 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getTenant.js +++ b/apps/OpenSignServer/cloud/parsefunction/getTenant.js @@ -1,4 +1,3 @@ - async function getTenantByUserId(userId, contactId) { try { if (contactId) { @@ -53,8 +52,7 @@ export default async function getTenant(request) { if (userId || contactId) { return await getTenantByUserId(userId, contactId); - } - else { + } else { return {}; } } diff --git a/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js index 6e1127e7e9..5feb7e16c0 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js +++ b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js @@ -36,8 +36,7 @@ async function getUserDetails(request) { const msg = err?.message || 'Something went wrong.'; throw new Parse.Error(code, msg); } - } - else { + } else { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } } diff --git a/apps/OpenSignServer/cloud/parsefunction/isUserInContactBook.js b/apps/OpenSignServer/cloud/parsefunction/isUserInContactBook.js index 7e452dedf0..f34654e127 100644 --- a/apps/OpenSignServer/cloud/parsefunction/isUserInContactBook.js +++ b/apps/OpenSignServer/cloud/parsefunction/isUserInContactBook.js @@ -1,4 +1,3 @@ - export default async function isUserInContactBook(request) { try { if (request.user) { diff --git a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js index 4e4d10cbec..592c3511e5 100644 --- a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js +++ b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js @@ -6,6 +6,12 @@ const saveRoleContact = async contact => { if (contact?.Phone) { contactQuery.set('Phone', contact.Phone); } + if (contact?.JobTitle) { + contactQuery.set('JobTitle', contact.JobTitle); + } + if (contact?.Company) { + contactQuery.set('Company', contact.Company); + } contactQuery.set('CreatedBy', contact.CreatedBy); contactQuery.set('UserId', contact.UserId); contactQuery.set('UserRole', 'contracts_Guest'); @@ -23,7 +29,7 @@ const saveRoleContact = async contact => { acl.setReadAccess(contact.UserId.objectId, true); acl.setWriteAccess(contact.UserId.objectId, true); contactQuery.setACL(acl); - const contactRes = await contactQuery.save(); + const contactRes = await contactQuery.save(null, { useMasterKey: true }); if (contactRes) { return contactRes; } @@ -37,6 +43,8 @@ export default async function linkContactToDoc(req) { const docId = req.params.docId; const name = req.params.name; const phone = req.params.phone; + const jobTitle = req.params.jobTitle; + const company = req.params.company; try { if (docId) { // Execute the query to get the document with the specified 'docId' @@ -110,6 +118,8 @@ export default async function linkContactToDoc(req) { UserId: _extUser.UserId, Name: _extUser.Name, Email: email, + JobTitle: _extUser?.JobTitle || '', + Company: _extUser?.Company || '', Phone: _extUser?.Phone ? _extUser.Phone : '', CreatedBy: _docRes.CreatedBy, TenantId: _docRes.ExtUserPtr?.TenantId?.objectId, @@ -163,6 +173,8 @@ export default async function linkContactToDoc(req) { Name: name, Email: email, Phone: phone, + JobTitle: jobTitle, + Company: company, CreatedBy: _docRes.CreatedBy, TenantId: _docRes.ExtUserPtr?.TenantId?.objectId, }; @@ -220,6 +232,8 @@ export default async function linkContactToDoc(req) { Name: name, Email: email, Phone: phone, + JobTitle: jobTitle, + Company: company, CreatedBy: _docRes.CreatedBy, TenantId: _docRes.ExtUserPtr?.TenantId?.objectId, }; diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js index c8f5436caf..bee391f58e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js @@ -14,6 +14,7 @@ import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib'; import { Placeholder } from './Placeholder.js'; import { SignPdf } from '@signpdf/signpdf'; import { P12Signer } from '@signpdf/signer-p12'; +import { buildDownloadFilename } from '../../../utils/fileUtils.js'; const serverUrl = cloudServerUrl; // process.env.SERVER_URL; const APPID = serverAppId; @@ -79,7 +80,10 @@ async function updateDoc(docId, url, userId, ipAddress, data, className, sign) { const auditTrail = updateAuditTrail.filter(x => x.Activity === 'Signed'); let isCompleted = false; if (data.Signers && data.Signers.length > 0) { - if (auditTrail.length === data.Placeholders.length) { + //'removePrefill' is used to remove prefill role from placeholders filed then compare length to change status of document + const removePrefill = + data.Placeholders.length > 0 && data.Placeholders.filter(x => x.Role !== 'prefill'); + if (auditTrail.length === removePrefill?.length) { isCompleted = true; } } else { @@ -108,9 +112,11 @@ async function sendNotifyMail(doc, signUser, mailProvider, publicUrl) { ""; const opurl = ` here`; const auditTrailCount = doc?.AuditTrail?.filter(x => x.Activity === 'Signed')?.length || 0; - const signersCount = doc?.Placeholders?.length; - const remaingsign = signersCount - auditTrailCount; - if (remaingsign > 1 && doc?.NotifyOnSignatures) { + const removePrefill = + doc?.Placeholders?.length > 0 && doc?.Placeholders?.filter(x => x?.Role !== 'prefill'); + const signersCount = removePrefill?.length; + const remainingSign = signersCount - auditTrailCount; + if (remainingSign > 1 && doc?.NotifyOnSignatures) { const sender = doc.ExtUserPtr; const pdfName = doc.Name; const creatorName = doc.ExtUserPtr.Name; @@ -227,6 +233,13 @@ async function sendCompletedMail(obj) { } const Bcc = doc?.Bcc?.length > 0 ? doc.Bcc.map(x => x.Email) : []; const updatedBcc = doc?.SenderMail ? [...Bcc, doc?.SenderMail] : Bcc; + const formatId = doc?.ExtUserPtr?.DownloadFilenameFormat; + const filename = pdfName?.length > 100 ? pdfName?.slice(0, 100) : pdfName; + const docName = buildDownloadFilename(formatId, { + docName: filename, + email: doc?.ExtUserPtr?.Email, + isSigned: true, + }); const params = { extUserId: sender.objectId, url: url, @@ -239,7 +252,7 @@ async function sendCompletedMail(obj) { mailProvider: obj.mailProvider, bcc: updatedBcc?.length > 0 ? updatedBcc : '', certificatePath: `./exports/signed_certificate_${doc.objectId}.pdf`, - filename: obj?.filename, + filename: docName, }; try { const res = await axios.post(serverUrl + '/functions/sendmailv3', params, { diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index 2a2e796510..110347b6b5 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -1,15 +1,41 @@ -export default function reportJson(id, userId) { - const currentUserId = userId; +export default function reportJson(id, currentUserId) { const commanKeys = [ + 'IsSignyourself', 'URL', 'Name', + 'Note', + 'SignedUrl', + 'AuditTrail', + 'Folder.Name', 'ExtUserPtr.Name', + 'ExtUserPtr.Email', + 'ExtUserPtr.DownloadFilenameFormat', 'Signers.Name', 'Signers.Email', 'Signers.Phone', 'Placeholders', 'TemplateId', + 'ExpiryDate', ]; + const inProgressKeys = [ + ...commanKeys, + 'AuditTrail.UserPtr', + 'SendMail', + 'RequestBody', + 'RequestSubject', + 'ExtUserPtr.TenantId.RequestBody', + 'ExtUserPtr.TenantId.RequestSubject', + ]; + const filterKeys = [ + 'TimeToCompleteDays', + 'AllowModifications', + 'IsEnableOTP', + 'IsTourEnabled', + 'NotifyOnSignatures', + 'RedirectUrl', + 'SendinOrder', + ]; + const needYourSignKeys = [...commanKeys, 'Signers.UserId']; switch (id) { // draft documents report case 'ByHuevtCFY': @@ -23,7 +49,7 @@ export default function reportJson(id, userId) { SignedUrl: { $exists: false }, CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, }, - keys: [...commanKeys, 'Note', 'Folder.Name', 'IsSignyourself'], + keys: [...commanKeys, ...filterKeys], }; // Need your sign report case '4Hhwbp482K': @@ -44,16 +70,7 @@ export default function reportJson(id, userId) { }, }, }, - keys: [ - ...commanKeys, - 'Note', - 'Folder.Name', - 'ExtUserPtr.Email', - 'Signers.UserId', - 'AuditTrail', - 'SignedUrl', - 'ExpiryDate', - ], + keys: [...needYourSignKeys, ...filterKeys], }; // In progress report case '1MwEuxLEkF': @@ -69,21 +86,7 @@ export default function reportJson(id, userId) { CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, ExpiryDate: { $gt: { __type: 'Date', iso: new Date().toISOString() } }, }, - keys: [ - ...commanKeys, - 'Note', - 'Folder.Name', - 'ExtUserPtr.Email', - 'AuditTrail', - 'AuditTrail.UserPtr', - 'ExpiryDate', - 'SendMail', - 'SignedUrl', - 'RequestBody', - 'RequestSubject', - 'ExtUserPtr.TenantId.RequestBody', - 'ExtUserPtr.TenantId.RequestSubject', - ], + keys: [...inProgressKeys, ...filterKeys], }; // completed documents report case 'kQUoW4hUXz': @@ -115,17 +118,7 @@ export default function reportJson(id, userId) { }, ], }, - keys: [ - ...commanKeys, - 'Note', - 'Folder.Name', - 'SignedUrl', - 'TimeToCompleteDays', - 'IsSignyourself', - 'IsCompleted', - 'ExpiryDate', - 'IsSignyourself', - ], + keys: [...commanKeys, ...filterKeys, 'IsCompleted'], }; // declined documents report case 'UPr2Fm5WY3': @@ -137,7 +130,7 @@ export default function reportJson(id, userId) { IsDeclined: true, CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, }, - keys: [...commanKeys, 'Note', 'Folder.Name', 'DeclineReason', 'SignedUrl'], + keys: [...commanKeys, 'DeclineReason'], }; // Expired Documents report case 'zNqBHXHsYH': @@ -152,7 +145,7 @@ export default function reportJson(id, userId) { ExpiryDate: { $lt: { __type: 'Date', iso: new Date().toISOString() } }, CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, }, - keys: [...commanKeys, 'Note', 'Folder.Name', 'SignedUrl', 'ExpiryDate'], + keys: [...commanKeys, ...filterKeys], }; // Recently sent for signatures report show on dashboard case 'd9k3UfYHBc': @@ -168,19 +161,7 @@ export default function reportJson(id, userId) { CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, ExpiryDate: { $gt: { __type: 'Date', iso: new Date().toISOString() } }, }, - keys: [ - ...commanKeys, - 'Folder.Name', - 'ExtUserPtr.Email', - 'AuditTrail', - 'AuditTrail.UserPtr', - 'ExpiryDate', - 'SignedUrl', - 'RequestBody', - 'RequestSubject', - 'ExtUserPtr.TenantId.RequestBody', - 'ExtUserPtr.TenantId.RequestSubject', - ], + keys: inProgressKeys, }; // Recent signature requests report show on dashboard case '5Go51Q7T8r': @@ -201,14 +182,7 @@ export default function reportJson(id, userId) { }, }, }, - keys: [ - ...commanKeys, - 'ExtUserPtr.Email', - 'Signers.UserId', - 'AuditTrail', - 'SignedUrl', - 'ExpiryDate', - ], + keys: needYourSignKeys, }; // Drafts report show on dashboard case 'kC5mfynCi4': @@ -222,7 +196,7 @@ export default function reportJson(id, userId) { SignedUrl: { $exists: false }, CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, }, - keys: [...commanKeys, 'Note', 'Folder.Name'], + keys: commanKeys, }; // contact book report case 'contacts': @@ -233,7 +207,7 @@ export default function reportJson(id, userId) { CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, IsDeleted: { $ne: true }, }, - keys: ['Name', 'Email', 'Phone'], + keys: ['Name', 'Email', 'Phone', 'JobTitle', 'Company'], }; // Templates report case '6TeaPr321t': @@ -243,8 +217,7 @@ export default function reportJson(id, userId) { params: { Type: { $ne: 'Folder' }, IsArchive: { $ne: true } }, keys: [ ...commanKeys, - 'Note', - 'Folder.Name', + ...filterKeys, 'IsPublic', 'SharedWith.Name', 'SendinOrder', diff --git a/apps/OpenSignServer/cloud/parsefunction/saveAsTemplate.js b/apps/OpenSignServer/cloud/parsefunction/saveAsTemplate.js index b7ecbd2c75..dd51382786 100644 --- a/apps/OpenSignServer/cloud/parsefunction/saveAsTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/saveAsTemplate.js @@ -32,7 +32,6 @@ export default async function saveAsTemplate(request) { templateCls.set('EmailSenderName', _docRes?.EmailSenderName); templateCls.set('SenderName', _docRes?.SenderName); templateCls.set('SenderMail', _docRes?.SenderMail); - templateCls.set('FileAdapterId', _docRes?.FileAdapterId); templateCls.set('RequestBody', _docRes?.RequestBody); templateCls.set('RequestSubject', _docRes?.RequestSubject); templateCls.set('NextReminderDate', _docRes?.NextReminderDate); @@ -56,6 +55,7 @@ export default async function saveAsTemplate(request) { ...pageItem, pos: pageItem.pos.map(p => ({ ...p, + type: p.type === 'text' ? 'text input' : p.type, options: { ...p.options, status: 'required', @@ -74,14 +74,14 @@ export default async function saveAsTemplate(request) { }; templateCls.set('Placeholders', [placeHolders]); } else { - const placeHolders = _docRes?.Placeholders.map((signer, signerIndex) => ({ + const removePrefill = _docRes?.Placeholders?.filter(x => x.Role !== 'prefill'); + const placeHolders = removePrefill.map((signer, signerIndex) => ({ // copy everything else, then overwrite these fields: ...signer, signerObjId: '', signerPtr: {}, - Role: `Role ${signerIndex + 1}`, + Role: signer?.Role ? signer.Role : `Role ${signerIndex + 1}`, email: '', - // rebuild placeHolder/pages placeHolder: (signer.placeHolder || []).map(page => ({ ...page, diff --git a/apps/OpenSignServer/cloud/parsefunction/saveFile.js b/apps/OpenSignServer/cloud/parsefunction/saveFile.js index 5b1ee71b6f..14a32f5ba1 100644 --- a/apps/OpenSignServer/cloud/parsefunction/saveFile.js +++ b/apps/OpenSignServer/cloud/parsefunction/saveFile.js @@ -1,7 +1,4 @@ -import { - flattenPdf, - getSecureUrl, -} from '../../Utils.js'; +import { flattenPdf, getSecureUrl } from '../../Utils.js'; export default async function saveFile(request) { if (!request.params.fileBase64) { throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Please provide file.'); @@ -16,29 +13,28 @@ export default async function saveFile(request) { const resExt = await extCls.first({ useMasterKey: true }); if (resExt) { const _resExt = JSON.parse(JSON.stringify(resExt)); - const fileName = request.params.fileName; - const ext = request.params.fileName?.split('.')?.pop(); - let mimeType; - let file; - if (ext === 'pdf') { - mimeType = 'application/pdf'; - const flatPdf = await flattenPdf(fileBase64); - file = [...flatPdf]; - } else if (ext === 'png' || ext === 'jpeg' || ext === 'jpg') { - mimeType = `image/${ext}`; - file = { base64: fileBase64 }; - } - const pdfFile = new Parse.File(fileName, file, mimeType); - // Save the Parse File if needed - const pdfData = await pdfFile.save({ useMasterKey: true }); - const presignedUrl = pdfData.url(); - const fileRes = getSecureUrl(presignedUrl); - return { url: fileRes.url }; + const fileName = request.params.fileName; + const ext = request.params.fileName?.split('.')?.pop(); + let mimeType; + let file; + if (ext === 'pdf') { + mimeType = 'application/pdf'; + const flatPdf = await flattenPdf(fileBase64); + file = [...flatPdf]; + } else if (ext === 'png' || ext === 'jpeg' || ext === 'jpg') { + mimeType = `image/${ext}`; + file = { base64: fileBase64 }; + } + const pdfFile = new Parse.File(fileName, file, mimeType); + // Save the Parse File if needed + const pdfData = await pdfFile.save({ useMasterKey: true }); + const presignedUrl = pdfData.url(); + const fileRes = getSecureUrl(presignedUrl); + return { url: fileRes.url }; } else { throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'User not found.'); } - } - else { + } else { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } } catch (err) { diff --git a/apps/OpenSignServer/cloud/parsefunction/savecontact.js b/apps/OpenSignServer/cloud/parsefunction/savecontact.js index 6cbfaac637..8bf497bf87 100644 --- a/apps/OpenSignServer/cloud/parsefunction/savecontact.js +++ b/apps/OpenSignServer/cloud/parsefunction/savecontact.js @@ -4,6 +4,8 @@ export default async function savecontact(request) { const requestemail = request.params?.email; const email = requestemail?.toLowerCase()?.replace(/\s/g, ''); const tenantId = request.params.tenantId; + const company = request.params?.company; + const jobTitle = request.params?.jobTitle; if (request.user) { const currentUser = request?.user; @@ -16,12 +18,18 @@ export default async function savecontact(request) { if (!res) { const contactQuery = new Parse.Object('contracts_Contactbook'); contactQuery.set('Name', name); - if (phone) { - contactQuery.set('Phone', phone); - } contactQuery.set('Email', email); contactQuery.set('UserRole', 'contracts_Guest'); contactQuery.set('IsDeleted', false); + if (phone) { + contactQuery.set('Phone', phone); + } + if (company) { + contactQuery.set('Company', company); + } + if (jobTitle) { + contactQuery.set('JobTitle', jobTitle); + } if (tenantId) { contactQuery.set('TenantId', { __type: 'Pointer', @@ -29,7 +37,6 @@ export default async function savecontact(request) { objectId: tenantId, }); } - try { const _users = Parse.Object.extend('User'); const _user = new _users(); @@ -40,7 +47,6 @@ export default async function savecontact(request) { if (phone) { _user.set('phone', phone); } - const user = await _user.save(); if (user) { contactQuery.set('CreatedBy', currentUserPtr); @@ -52,7 +58,7 @@ export default async function savecontact(request) { acl.setWriteAccess(currentUser.id, true); contactQuery.setACL(acl); - const res = await contactQuery.save(); + const res = await contactQuery.save(null, { useMasterKey: true }); const parseData = JSON.parse(JSON.stringify(res)); return parseData; } @@ -73,7 +79,7 @@ export default async function savecontact(request) { acl.setReadAccess(currentUser.id, true); acl.setWriteAccess(currentUser.id, true); contactQuery.setACL(acl); - const res = await contactQuery.save(); + const res = await contactQuery.save(null, { useMasterKey: true }); const parseData = JSON.parse(JSON.stringify(res)); return parseData; } diff --git a/apps/OpenSignServer/cloud/parsefunction/sendDeleteUserMail.js b/apps/OpenSignServer/cloud/parsefunction/sendDeleteUserMail.js new file mode 100644 index 0000000000..86a33222cd --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/sendDeleteUserMail.js @@ -0,0 +1,103 @@ +import { appName, smtpenable } from '../../Utils.js'; + +export const errHtml = err => { + return `Reset Password +

${err}

`; +}; +const sendDeleteUserMail = async req => { + const app = req.params.app || appName; + if (!req.user) { + throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); + } + try { + const { userId } = req.params; + if (!userId) { + throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Missing userId parameter.'); + } + + const userPointer = { __type: 'Pointer', className: '_User', objectId: userId }; + + const createdByPointer = { __type: 'Pointer', className: '_User', objectId: req.user.id }; + + const userCondition = new Parse.Query('contracts_Users'); + userCondition.equalTo('UserId', userPointer); + + const userAndCreatorCondition = new Parse.Query('contracts_Users'); + userAndCreatorCondition.equalTo('UserId', userPointer); + userAndCreatorCondition.equalTo('CreatedBy', createdByPointer); + + const mainQuery = Parse.Query.or(userCondition, userAndCreatorCondition); + + const result = await mainQuery.first({ useMasterKey: true }); + const username = result.get('Email')?.toLowerCase()?.replace(/\s/g, ''); + const name = result?.get('Name') ? `${result?.get('Name')}` : ''; + const isAdmin = result?.get('UserRole') === 'contracts_Admin'; + if (!isAdmin) { + throw new Parse.Error( + Parse.Error.SCRIPT_FAILED, + 'This action is not permitted. Kindly contact your administrator to request account deletion.' + ); + } + + const serverUrl = process.env?.SERVER_URL?.replace(/\/app\/?$/, '/'); + const deleteUrl = `${serverUrl}delete-account/${userId}`; + const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER; + // Render a simple HTML form. In production, consider using a templating engine. + + await Parse.Cloud.sendEmail({ + sender: app + ' <' + mailsender + '>', + recipient: username, + subject: `Account Deletion Request for ${username} – ${app}`, + text: `Account Deletion Request for ${username} – ${app}`, + html: ` + + + Account Deletion Request - ${app} + + +
+

Request to Delete Your Account

+

+ Hello ${name}, +

+

+ We have received a request to permanently delete your ${app} account associated with ${username}. +

+

+ If you did not make this request, please ignore this email. Otherwise, click the button below to proceed + with the deletion. +

+

+ + Confirm Account Deletion + +

+

+ If the button above doesn't work, please copy and open the following link with your browser. +

+

+ ${deleteUrl} +

+

+ Note: This action is irreversible and all your data will be permanently removed from our systems. +

+
+

+ If you have any questions or need assistance, please contact our support team. +

+

+ © ${new Date().getFullYear()} ${app}. All rights reserved. +

+
+ +`, + }); + return 'mail sent.'; + } catch (err) { + console.log('Err in sending delete user email ', err); + throw new Parse.Error(Parse.Error.SCRIPT_FAILED, err.message); + } +}; +export default sendDeleteUserMail; diff --git a/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js b/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js index fc90c02fb8..2712728791 100644 --- a/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js +++ b/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js @@ -57,6 +57,9 @@ export default async function updatePreferences(request) { if (request.params.IsLTVEnabled !== undefined) { newOrg.set('IsLTVEnabled', request.params.IsLTVEnabled); } + if (request.params.DownloadFilenameFormat) { + newOrg.set('DownloadFilenameFormat', request.params.DownloadFilenameFormat); + } const updateUserRes = await newOrg.save(null, { useMasterKey: true }); if (updateUserRes) { const _updateUserRes = JSON.parse(JSON.stringify(updateUserRes)); diff --git a/apps/OpenSignServer/cloud/parsefunction/updateTourStatus.js b/apps/OpenSignServer/cloud/parsefunction/updateTourStatus.js index fea5f2afb5..ba76dc58a5 100644 --- a/apps/OpenSignServer/cloud/parsefunction/updateTourStatus.js +++ b/apps/OpenSignServer/cloud/parsefunction/updateTourStatus.js @@ -15,8 +15,7 @@ export default async function updateTourStatus(request) { const msg = err?.message || 'Something went wrong.'; throw new Parse.Error(code, msg); } - } - else { + } else { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } } diff --git a/apps/OpenSignServer/databases/migrations/20250621215000-add_creditalertlevel_field.cjs b/apps/OpenSignServer/databases/migrations/20250621215000-add_creditalertlevel_field.cjs deleted file mode 100644 index ba9d6c75ea..0000000000 --- a/apps/OpenSignServer/databases/migrations/20250621215000-add_creditalertlevel_field.cjs +++ /dev/null @@ -1,19 +0,0 @@ -/** - * - * @param {Parse} Parse - */ -exports.up = async Parse => { - const schema = new Parse.Schema('contracts_Subscriptions'); - schema.addNumber('CreditAlertLevel'); - return schema.update(); -}; - -/** - * - * @param {Parse} Parse - */ -exports.down = async Parse => { - const schema = new Parse.Schema('contracts_Subscriptions'); - schema.deleteField('CreditAlertLevel'); - return schema.update(); -}; diff --git a/apps/OpenSignServer/databases/migrations/20250801113339-add_contact_field.cjs b/apps/OpenSignServer/databases/migrations/20250801113339-add_contact_field.cjs new file mode 100644 index 0000000000..03b4c01691 --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20250801113339-add_contact_field.cjs @@ -0,0 +1,19 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + const schema = new Parse.Schema('contracts_Contactbook'); + schema.addString('Company').addString('JobTitle'); + return schema.update(); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + const schema = new Parse.Schema('contracts_Contactbook'); + schema.deleteField('Company').deleteField('JobTitle'); + return schema.update(); +}; diff --git a/apps/OpenSignServer/databases/migrations/20250811191810-add_datafiles_field.cjs b/apps/OpenSignServer/databases/migrations/20250811191810-add_datafiles_field.cjs new file mode 100644 index 0000000000..14c046c465 --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20250811191810-add_datafiles_field.cjs @@ -0,0 +1,19 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + const schema = new Parse.Schema('partners_DataFiles'); + schema.addPointer('UserId', '_User'); + return schema.update(); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + const schema = new Parse.Schema('partners_DataFiles'); + schema.deleteField('UserId'); + return schema.update(); +}; diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 41cd8995c0..5fdf081d48 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -dotenv.config(); +dotenv.config({ quiet: true }); import express from 'express'; import cors from 'cors'; import { ParseServer } from 'parse-server'; diff --git a/apps/OpenSignServer/logo.png b/apps/OpenSignServer/logo.png index 8db5381242d1dafd321f1e8137d246b0b9d72cd7..b7241b8a80bbec495f066a5cf92fb2966f2bf35f 100644 GIT binary patch literal 25429 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 literal 88554 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.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.873.0.tgz", + "integrity": "sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -1017,24 +1029,37 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/xml-builder": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", + "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1042,34 +1067,36 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -1090,18 +1117,18 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1109,13 +1136,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1123,12 +1150,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1136,14 +1163,14 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1151,15 +1178,15 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1167,12 +1194,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1180,12 +1207,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1193,12 +1220,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -1207,12 +1234,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1220,12 +1247,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1233,17 +1260,17 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -1251,9 +1278,9 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1263,13 +1290,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1328,12 +1355,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1341,14 +1368,14 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -1385,47 +1412,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.840.0.tgz", - "integrity": "sha512-3Zp+FWN2hhmKdpS0Ragi5V2ZPsZNScE3jlbgoJjzjI/roHZqO+e3/+XFN4TlM0DsPKYJNp+1TAjmhxN6rOnfYA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.879.0.tgz", + "integrity": "sha512-+Pc3OYFpRYpKLKRreovPM63FPPud1/SF9vemwIJfz6KwsBCJdvg7vYD1xLSIp5DVZLeetgf4reCyAA5ImBfZuw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.840.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.6.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-retry": "^4.1.14", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.879.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.21", - "@smithy/util-defaults-mode-node": "^4.0.21", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -1434,14 +1461,14 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", + "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1449,13 +1476,13 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", + "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1463,14 +1490,14 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", + "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1478,16 +1505,16 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", + "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1495,12 +1522,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1508,24 +1535,24 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1533,34 +1560,36 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -1581,18 +1610,18 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1600,13 +1629,13 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1614,12 +1643,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1627,14 +1656,14 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1642,15 +1671,15 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1658,12 +1687,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1671,12 +1700,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1684,12 +1713,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -1698,12 +1727,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1711,12 +1740,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1724,17 +1753,17 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -1742,9 +1771,9 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1754,13 +1783,13 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1819,12 +1848,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1832,14 +1861,14 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -1876,25 +1905,25 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.840.0.tgz", - "integrity": "sha512-x3Zgb39tF1h2XpU+yA4OAAQlW6LVEfXNlSedSYJ7HGKXqA/E9h3rWQVpYfhXXVVsLdYXdNw5KBUkoAoruoZSZA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.6.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.879.0.tgz", + "integrity": "sha512-AhNmLCrx980LsK+SfPXGh7YqTyZxsK0Qmy18mWmkfY0TSq7WLaSDB5zdQbgbnQCACCHy8DUYXbi4KsjlIhv3PA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@aws-sdk/xml-builder": "3.873.0", + "@smithy/core": "^3.9.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "4.4.1", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { @@ -1902,12 +1931,25 @@ } }, "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@aws-sdk/xml-builder": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", + "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1915,12 +1957,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1928,34 +1970,36 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/core/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -1976,18 +2020,18 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1995,13 +2039,13 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2009,12 +2053,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2022,14 +2066,14 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2037,15 +2081,15 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2053,12 +2097,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2066,12 +2110,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2079,12 +2123,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -2093,12 +2137,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2106,12 +2150,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2119,17 +2163,17 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -2137,9 +2181,9 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2149,13 +2193,13 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2214,12 +2258,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2227,14 +2271,14 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -2270,16 +2314,46 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/core/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.840.0.tgz", - "integrity": "sha512-EzF6VcJK7XvQ/G15AVEfJzN2mNXU8fcVpXo4bRyr1S6t2q5zx6UPH/XjDbn18xyUmOq01t+r8gG+TmHEVo18fA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.879.0.tgz", + "integrity": "sha512-JgG7A8SSbr5IiCYL8kk39Y9chdSB5GPwBorDW8V8mr19G9L+qd6ohED4fAocoNFaDnYJ5wGAHhCfSJjzcsPBVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2287,12 +2361,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2300,12 +2374,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2313,9 +2387,9 @@ } }, "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2325,20 +2399,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.840.0.tgz", - "integrity": "sha512-wbnUiPGLVea6mXbUh04fu+VJmGkQvmToPeTYdHE8eRZq3NRDi3t3WltT+jArLBKD/4NppRpMjf2ju4coMCz91g==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.879.0.tgz", + "integrity": "sha512-2hM5ByLpyK+qORUexjtYyDZsgxVCCUiJQZRMGkNXFEGz6zTpbjfTIWoh3zRgWHEBiqyPIyfEy50eIF69WshcuA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -2346,12 +2420,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2359,12 +2433,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2372,34 +2446,36 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -2420,18 +2496,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -2439,13 +2515,13 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2453,12 +2529,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2466,14 +2542,14 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2481,15 +2557,15 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2497,12 +2573,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2510,12 +2586,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2523,12 +2599,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -2537,12 +2613,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2550,12 +2626,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2563,17 +2639,17 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -2581,9 +2657,9 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2593,13 +2669,13 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2658,12 +2734,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2671,14 +2747,14 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -2715,23 +2791,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.840.0.tgz", - "integrity": "sha512-7F290BsWydShHb+7InXd+IjJc3mlEIm9I0R57F/Pjl1xZB69MdkhVGCnuETWoBt4g53ktJd6NEjzm/iAhFXFmw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/credential-provider-env": "3.840.0", - "@aws-sdk/credential-provider-http": "3.840.0", - "@aws-sdk/credential-provider-process": "3.840.0", - "@aws-sdk/credential-provider-sso": "3.840.0", - "@aws-sdk/credential-provider-web-identity": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.879.0.tgz", + "integrity": "sha512-07M8zfb73KmMBqVO5/V3Ea9kqDspMX0fO0kaI1bsjWI6ngnMye8jCE0/sIhmkVAI0aU709VA0g+Bzlopnw9EoQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.879.0", + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2739,12 +2815,12 @@ } }, "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2752,12 +2828,12 @@ } }, "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2765,12 +2841,12 @@ } }, "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2778,9 +2854,9 @@ } }, "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2790,22 +2866,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.840.0.tgz", - "integrity": "sha512-KufP8JnxA31wxklLm63evUPSFApGcH8X86z3mv9SRbpCm5ycgWIGVCTXpTOdgq6rPZrwT9pftzv2/b4mV/9clg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.840.0", - "@aws-sdk/credential-provider-http": "3.840.0", - "@aws-sdk/credential-provider-ini": "3.840.0", - "@aws-sdk/credential-provider-process": "3.840.0", - "@aws-sdk/credential-provider-sso": "3.840.0", - "@aws-sdk/credential-provider-web-identity": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.879.0.tgz", + "integrity": "sha512-FYaAqJbnSTrVL2iZkNDj2hj5087yMv2RN2GA8DJhe7iOJjzhzRojrtlfpWeJg6IhK0sBKDH+YXbdeexCzUJvtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-ini": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2813,12 +2889,12 @@ } }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2826,12 +2902,12 @@ } }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2839,12 +2915,12 @@ } }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2852,9 +2928,9 @@ } }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2864,16 +2940,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.840.0.tgz", - "integrity": "sha512-HkDQWHy8tCI4A0Ps2NVtuVYMv9cB4y/IuD/TdOsqeRIAT12h8jDb98BwQPNLAImAOwOWzZJ8Cu0xtSpX7CQhMw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.879.0.tgz", + "integrity": "sha512-7r360x1VyEt35Sm1JFOzww2WpnfJNBbvvnzoyLt7WRfK0S/AfsuWhu5ltJ80QvJ0R3AiSNbG+q/btG2IHhDYPQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2881,12 +2957,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2894,12 +2970,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2907,12 +2983,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2920,9 +2996,9 @@ } }, "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2932,18 +3008,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.840.0.tgz", - "integrity": "sha512-2qgdtdd6R0Z1y0KL8gzzwFUGmhBHSUx4zy85L2XV1CXhpRNwV71SVWJqLDVV5RVWVf9mg50Pm3AWrUC0xb0pcA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.879.0.tgz", + "integrity": "sha512-gd27B0NsgtKlaPNARj4IX7F7US5NuU691rGm0EUSkDsM7TctvJULighKoHzPxDQlrDbVI11PW4WtKS/Zg5zPlQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.840.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/token-providers": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/client-sso": "3.879.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/token-providers": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2951,12 +3027,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2964,12 +3040,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2977,12 +3053,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2990,9 +3066,9 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3002,16 +3078,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.840.0.tgz", - "integrity": "sha512-dpEeVXG8uNZSmVXReE4WP0lwoioX2gstk4RnUgrdUE3YaPq8A+hJiVAyc3h+cjDeIqfbsQbZm9qFetKC2LF9dQ==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.879.0.tgz", + "integrity": "sha512-Jy4uPFfGzHk1Mxy+/Wr43vuw9yXsE2yiF4e4598vc3aJfO0YtA2nSfbKD3PNKRORwXbeKqWPfph9SCKQpWoxEg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3019,12 +3095,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3032,12 +3108,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3045,9 +3121,9 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3218,22 +3294,22 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.840.0.tgz", - "integrity": "sha512-Kg/o2G6o72sdoRH0J+avdcf668gM1bp6O4VeEXpXwUj/urQnV5qiB2q1EYT110INHUKWOLXPND3sQAqh6sTqHw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.879.0.tgz", + "integrity": "sha512-U1rcWToy2rlQPQLsx5h73uTC1XYo/JpnlJGCc3Iw7b1qrK8Mke4+rgMPKCfnXELD5TTazGrbT03frxH4Y1Ycvw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3242,12 +3318,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3255,12 +3331,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3268,14 +3344,14 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -3296,14 +3372,14 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3311,15 +3387,15 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3327,12 +3403,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3340,12 +3416,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3353,12 +3429,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -3367,12 +3443,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3380,9 +3456,9 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3431,12 +3507,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3444,14 +3520,14 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -3620,23 +3696,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.840.0.tgz", - "integrity": "sha512-rOUji7CayWN3O09zvvgLzDVQe0HiJdZkxoTS6vzOS3WbbdT7joGdVtAJHtn+x776QT3hHzbKU5gnfhel0o6gQA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/core": "^3.6.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.879.0.tgz", + "integrity": "sha512-ZTpLr2AbZcCsEzu18YCtB8Tp8tjAWHT0ccfwy3HiL6g9ncuSMW+7BVi1hDYmBidFwpPbnnIMtM0db3pDMR6/WA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-arn-parser": "3.873.0", + "@smithy/core": "^3.9.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3645,12 +3721,24 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.873.0.tgz", + "integrity": "sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -3658,12 +3746,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3671,34 +3759,36 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -3719,18 +3809,18 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -3738,13 +3828,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3752,12 +3842,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3765,14 +3855,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3780,15 +3870,15 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3796,12 +3886,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3809,12 +3899,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3822,12 +3912,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -3836,12 +3926,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3849,12 +3939,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3862,17 +3952,17 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -3880,9 +3970,9 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3892,13 +3982,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3957,12 +4047,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3970,14 +4060,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -4040,17 +4130,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.840.0.tgz", - "integrity": "sha512-hiiMf7BP5ZkAFAvWRcK67Mw/g55ar7OCrvrynC92hunx/xhMkrgSLM0EXIZ1oTn3uql9kH/qqGF0nqsK6K555A==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.879.0.tgz", + "integrity": "sha512-DDSV8228lQxeMAFKnigkd0fHzzn5aauZMYC3CSj6e5/qE7+9OwpkUcjHfb7HZ9KWG6L2/70aKZXHqiJ4xKhOZw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@smithy/core": "^3.6.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@smithy/core": "^3.9.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4058,12 +4148,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4071,12 +4161,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4084,34 +4174,36 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -4132,13 +4224,13 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4146,15 +4238,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4162,12 +4254,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4175,12 +4267,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -4189,9 +4281,9 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4252,12 +4344,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4265,14 +4357,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -4309,47 +4401,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.840.0.tgz", - "integrity": "sha512-LXYYo9+n4hRqnRSIMXLBb+BLz+cEmjMtTudwK1BF6Bn2RfdDv29KuyeDRrPCS3TwKl7ZKmXUmE9n5UuHAPfBpA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.879.0.tgz", + "integrity": "sha512-7+n9NpIz9QtKYnxmw1fHi9C8o0GrX8LbBR4D50c7bH6Iq5+XdSuL5AFOWWQ5cMD0JhqYYJhK/fJsVau3nUtC4g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.840.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.6.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-retry": "^4.1.14", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.879.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.21", - "@smithy/util-defaults-mode-node": "^4.0.21", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -4358,14 +4450,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", + "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4373,13 +4465,13 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", + "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4387,14 +4479,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", + "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4402,16 +4494,16 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", + "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4419,12 +4511,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4432,24 +4524,24 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4457,34 +4549,36 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -4505,18 +4599,18 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4524,13 +4618,13 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4538,12 +4632,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4551,14 +4645,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4566,15 +4660,15 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4582,12 +4676,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4595,12 +4689,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4608,12 +4702,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -4622,12 +4716,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4635,12 +4729,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4648,17 +4742,17 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -4666,9 +4760,9 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4678,13 +4772,13 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4743,12 +4837,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4756,14 +4850,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -4883,18 +4977,18 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.840.0.tgz", - "integrity": "sha512-1jcrhVoSZjiAQJGNswI0RGR36/+OG6yTV42wQamHdNHk+/68dn9MGTUVr+58AEFOyEAPE/EvkiYRD6n5WkUjMg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.879.0.tgz", + "integrity": "sha512-WNUrY4UW1ZAkBiSq9HnhJcG/1NdrEy37DDxqE8u0OdIZHhbgU1x1r4iXgQssAZhV6D+Ib70oiQGtPSH/lXeMKg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-format-url": "3.840.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "@aws-sdk/signature-v4-multi-region": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-format-url": "3.873.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4902,12 +4996,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4915,12 +5009,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4928,34 +5022,36 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -4976,18 +5072,18 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4995,13 +5091,13 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5009,12 +5105,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5022,14 +5118,14 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5037,15 +5133,15 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5053,12 +5149,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5066,12 +5162,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5079,12 +5175,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -5093,12 +5189,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5106,12 +5202,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5119,17 +5215,17 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -5137,9 +5233,9 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5149,13 +5245,13 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5214,12 +5310,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5227,14 +5323,14 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -5271,16 +5367,16 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.840.0.tgz", - "integrity": "sha512-8AoVgHrkSfhvGPtwx23hIUO4MmMnux2pjnso1lrLZGqxfElM6jm2w4jTNLlNXk8uKHGyX89HaAIuT0lL6dJj9g==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.879.0.tgz", + "integrity": "sha512-MDsw0EWOHyKac75X3gD8tLWtmPuRliS/s4IhWRhsdDCU13wewHIs5IlA5B65kT6ISf49yEIalEH3FHUSVqdmIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-sdk-s3": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5288,12 +5384,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5301,12 +5397,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5314,9 +5410,9 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5326,17 +5422,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.840.0.tgz", - "integrity": "sha512-6BuTOLTXvmgwjK7ve7aTg9JaWFdM5UoMolLVPMyh3wTv9Ufalh8oklxYHUBIxsKkBGO2WiHXytveuxH6tAgTYg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.879.0.tgz", + "integrity": "sha512-47J7sCwXdnw9plRZNAGVkNEOlSiLb/kR2slnDIHRK9NB/ECKsoqgz5OZQJ9E2f0yqOs8zSNJjn3T01KxpgW8Qw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5344,12 +5440,12 @@ } }, "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5357,12 +5453,12 @@ } }, "node_modules/@aws-sdk/token-providers/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5370,12 +5466,12 @@ } }, "node_modules/@aws-sdk/token-providers/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5383,9 +5479,9 @@ } }, "node_modules/@aws-sdk/token-providers/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5432,14 +5528,15 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.840.0.tgz", - "integrity": "sha512-eqE9ROdg/Kk0rj3poutyRCFauPDXIf/WSvCqFiRDDVi6QOnCv/M0g2XW8/jSvkJlOyaXkNCptapIp6BeeFFGYw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.879.0.tgz", + "integrity": "sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/util-endpoints": "^3.0.6", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-endpoints": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -5447,12 +5544,25 @@ } }, "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5460,11 +5570,25 @@ } }, "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5472,14 +5596,14 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.840.0.tgz", - "integrity": "sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.873.0.tgz", + "integrity": "sha512-v//b9jFnhzTKKV3HFTw2MakdM22uBAs2lBov51BWmFXuFtSTdBLrR7zgfetQPE3PVkFai0cmtJQPdc3MX+T/cQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5487,12 +5611,12 @@ } }, "node_modules/@aws-sdk/util-format-url/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5500,12 +5624,12 @@ } }, "node_modules/@aws-sdk/util-format-url/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -5514,9 +5638,9 @@ } }, "node_modules/@aws-sdk/util-format-url/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5573,15 +5697,15 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.840.0.tgz", - "integrity": "sha512-Fy5JUEDQU1tPm2Yw/YqRYYc27W5+QD/J4mYvQvdWjUGZLB5q3eLFMGD35Uc28ZFoGMufPr4OCxK/bRfWROBRHQ==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.879.0.tgz", + "integrity": "sha512-A5KGc1S+CJRzYnuxJQQmH1BtGsz46AgyHkqReKfGiNQA8ET/9y9LQ5t2ABqnSBHHIh3+MiCcQSkUZ0S3rTodrQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5597,12 +5721,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5610,14 +5734,14 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5625,12 +5749,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5638,12 +5762,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5651,9 +5775,9 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5739,10 +5863,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.5.tgz", - "integrity": "sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==", - "dev": true, + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz", + "integrity": "sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==", "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -5979,9 +6102,10 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -6030,9 +6154,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", @@ -6044,18 +6168,18 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -6100,9 +6224,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", - "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6121,30 +6245,18 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@fastify/busboy": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", @@ -6343,172 +6455,619 @@ "node": ">=10.0.0" } }, + "node_modules/@google-cloud/storage/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@google-cloud/storage/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "optional": true, - "bin": { - "uuid": "dist/bin/uuid" + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@google-cloud/storage/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", + "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", + "license": "MIT", + "dependencies": { + "@graphql-tools/merge": "^9.0.24", + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "dset": "^3.1.4", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz", + "integrity": "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", + "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", + "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", + "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", + "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", + "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", + "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", + "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", + "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", + "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", + "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@graphql-tools/merge": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", - "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", - "license": "MIT", - "dependencies": { - "@graphql-tools/utils": "^10.8.6", - "tslib": "^2.4.0" - }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", + "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.0" } }, - "node_modules/@graphql-tools/schema": { - "version": "10.0.23", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", - "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", - "license": "MIT", - "dependencies": { - "@graphql-tools/merge": "^9.0.24", - "@graphql-tools/utils": "^10.8.6", - "tslib": "^2.4.0" - }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", + "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.0" } }, - "node_modules/@graphql-tools/utils": { - "version": "10.8.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", - "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", - "license": "MIT", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "@whatwg-node/promise-helpers": "^1.0.0", - "cross-inspect": "1.0.1", - "dset": "^3.1.4", - "tslib": "^2.4.0" - }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", + "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.0" } }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", + "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.0" } }, - "node_modules/@grpc/grpc-js": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz", - "integrity": "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==", + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", + "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "cpu": [ + "x64" + ], "license": "Apache-2.0", "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=12.10.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.0" } }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", + "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "cpu": [ + "arm64" + ], "license": "Apache-2.0", "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "funding": { + "url": "https://opencollective.com/libvips" }, - "engines": { - "node": ">=6" + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" } }, - "node_modules/@grpc/proto-loader/node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", + "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "cpu": [ + "x64" + ], "license": "Apache-2.0", - "optional": true - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.0" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "node_modules/@img/sharp-wasm32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", + "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@emnapi/runtime": "^1.4.4" }, "engines": { - "node": ">=18.18.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", + "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.18" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", + "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12.22" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", - "license": "Apache-2.0", + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", + "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.18" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, "node_modules/@isaacs/cliui": { @@ -8209,6 +8768,12 @@ "node": ">=14" } }, + "node_modules/@posthog/core": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.0.2.tgz", + "integrity": "sha512-hWk3rUtJl2crQK0WNmwg13n82hnTwB99BT99/XI5gZSvIlYZ1TPmMZE8H2dhJJ98J/rm9vYJ/UXNzw3RV5HTpQ==", + "license": "MIT" + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -8498,15 +9063,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", + "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -8514,14 +9079,14 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8529,12 +9094,12 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8542,12 +9107,12 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8555,9 +9120,9 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8567,12 +9132,12 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8598,15 +9163,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -8614,14 +9179,14 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8629,12 +9194,12 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8642,12 +9207,12 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8655,12 +9220,12 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8668,9 +9233,9 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8680,13 +9245,13 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8694,13 +9259,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.4.tgz", - "integrity": "sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.5.tgz", + "integrity": "sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" }, @@ -8709,9 +9274,9 @@ } }, "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8733,13 +9298,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.4.tgz", - "integrity": "sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.5.tgz", + "integrity": "sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-serde-universal": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8747,9 +9312,9 @@ } }, "node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8759,12 +9324,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.2.tgz", - "integrity": "sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.3.tgz", + "integrity": "sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8772,9 +9337,9 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8784,13 +9349,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.4.tgz", - "integrity": "sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.5.tgz", + "integrity": "sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-serde-universal": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8798,9 +9363,9 @@ } }, "node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8810,13 +9375,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.4.tgz", - "integrity": "sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.5.tgz", + "integrity": "sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-codec": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8824,9 +9389,9 @@ } }, "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8848,14 +9413,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", - "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.5.tgz", + "integrity": "sha512-F7MmCd3FH/Q2edhcKd+qulWkwfChHbc9nhguBlVjSUE6hVHhec3q6uPQ+0u69S6ppvLtR3eStfCuEKMXBXhvvA==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.0.0", "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8863,9 +9428,9 @@ } }, "node_modules/@smithy/hash-blob-browser/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8875,12 +9440,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", + "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -8902,9 +9467,9 @@ } }, "node_modules/@smithy/hash-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8940,12 +9505,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", - "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.5.tgz", + "integrity": "sha512-IJuDS3+VfWB67UC0GU0uYBG/TA30w+PlOaSo0GPm9UHS88A6rCP6uZxNjNYiyRtOcjv7TXn/60cW8ox1yuZsLg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -8966,9 +9531,9 @@ } }, "node_modules/@smithy/hash-stream-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9004,12 +9569,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", + "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9017,9 +9582,9 @@ } }, "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9040,12 +9605,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", - "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.5.tgz", + "integrity": "sha512-8n2XCwdUbGr8W/XhMTaxILkVlw2QebkVTn5tm3HOcbPbOpWg89zr6dPXsH8xbeTsbTXlJvlJNTQsKAIoqQGbdA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -9066,9 +9631,9 @@ } }, "node_modules/@smithy/md5-js/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9104,13 +9669,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", + "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9118,12 +9683,12 @@ } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9131,9 +9696,9 @@ } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9161,18 +9726,19 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.14.tgz", - "integrity": "sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "version": "4.1.20", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.20.tgz", + "integrity": "sha512-T3maNEm3Masae99eFdx1Q7PIqBBEVOvRd5hralqKZNeIivnoGNx5OFtI3DiZ5gCjUkl0mNondlzSXeVxkinh7Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -9181,12 +9747,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9194,34 +9760,36 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -9242,18 +9810,18 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -9261,13 +9829,13 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9275,12 +9843,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9288,14 +9856,14 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9303,15 +9871,15 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9319,12 +9887,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9332,12 +9900,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9345,12 +9913,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -9359,12 +9927,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9372,12 +9940,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9385,17 +9953,17 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -9403,9 +9971,9 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9415,13 +9983,13 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9480,12 +10048,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9493,14 +10061,14 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -9639,21 +10207,21 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", + "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1" + "@smithy/types": "^4.3.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/service-error-classification/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9675,16 +10243,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.3.tgz", + "integrity": "sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -9706,12 +10274,12 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9719,9 +10287,9 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9756,12 +10324,12 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9889,14 +10457,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.21.tgz", - "integrity": "sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA==", + "version": "4.0.27", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.27.tgz", + "integrity": "sha512-i/Fu6AFT5014VJNgWxKomBJP/GB5uuOsM4iHdcmplLm8B1eAqnRItw4lT2qpdO+mf+6TFmf6dGcggGLAVMZJsQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -9905,12 +10473,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9918,34 +10486,36 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -9966,18 +10536,18 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -9985,13 +10555,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9999,12 +10569,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10012,14 +10582,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10027,15 +10597,15 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10043,12 +10613,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10056,12 +10626,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10069,12 +10639,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -10083,12 +10653,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10096,12 +10666,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10109,17 +10679,17 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -10127,9 +10697,9 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10139,13 +10709,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10204,12 +10774,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10217,14 +10787,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -10261,17 +10831,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.21.tgz", - "integrity": "sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA==", + "version": "4.0.27", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.27.tgz", + "integrity": "sha512-3W0qClMyxl/ELqTA39aNw1N+pN0IjpXT7lPFvZ8zTxqVFP7XCpACB9QufmN4FQtd39xbgS7/Lekn7LmDa63I5w==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "@smithy/config-resolver": "^4.1.5", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10279,12 +10849,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10292,34 +10862,36 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -10340,18 +10912,18 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -10359,13 +10931,13 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10373,12 +10945,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10386,14 +10958,14 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10401,15 +10973,15 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10417,12 +10989,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10430,12 +11002,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10443,12 +11015,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -10457,12 +11029,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10470,12 +11042,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10483,17 +11055,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -10501,9 +11073,9 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10513,13 +11085,13 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10578,12 +11150,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10591,14 +11163,14 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -10635,13 +11207,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", + "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10649,14 +11221,14 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10664,12 +11236,12 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10677,12 +11249,12 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10690,9 +11262,9 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10725,13 +11297,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", + "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10739,9 +11311,9 @@ } }, "node_modules/@smithy/util-retry/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10792,13 +11364,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz", - "integrity": "sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.7.tgz", + "integrity": "sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10806,12 +11378,12 @@ } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10819,9 +11391,9 @@ } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -11312,12 +11884,12 @@ } }, "node_modules/assert-options": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.2.tgz", - "integrity": "sha512-XaXoMxY0zuwAb0YuZjxIm8FeWvNq0aWNIbrzHhFjme8Smxw4JlPoyrAKQ6808k5UvQdhvnWqHZCphq5mXd4TDA==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.3.tgz", + "integrity": "sha512-s6v4HnA+vYSGO4eZX+F+I3gvF74wPk+m6Z1Q3w1Dsg4Pnv/R24vhKAasoMVZGvDpOOfTg1Qz4ptZnEbuy95XsQ==", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" } }, "node_modules/assert-plus": { @@ -11407,13 +11979,13 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -12482,6 +13054,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -12489,9 +13070,9 @@ "license": "MIT" }, "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", + "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -12684,19 +13265,19 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/eslint": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", - "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.1", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.14.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.29.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -13026,9 +13607,9 @@ } }, "node_modules/express-rate-limit": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", - "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "license": "MIT", "engines": { "node": ">= 16" @@ -13037,7 +13618,7 @@ "url": "https://github.com/sponsors/express-rate-limit" }, "peerDependencies": { - "express": "^4.11 || 5 || ^5.0.0-beta.1" + "express": ">= 4.11" } }, "node_modules/express/node_modules/media-typer": { @@ -13667,63 +14248,6 @@ "node": ">=14" } }, - "node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", - "optional": true, - "peer": true, - "dependencies": { - "gaxios": "^5.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gcp-metadata/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/gcp-metadata/node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "optional": true, - "peer": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gcp-metadata/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/generate-api-key": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/generate-api-key/-/generate-api-key-1.0.2.tgz", @@ -13966,27 +14490,27 @@ } }, "node_modules/googleapis": { - "version": "150.0.1", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-150.0.1.tgz", - "integrity": "sha512-9Wa9vm3WtDpss0VFBHsbZWcoRccpOSWdpz7YIfb1LBXopZJEg/Zc8ymmaSgvDkP4FhN+pqPS9nZjO7REAJWSUg==", + "version": "159.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-159.0.0.tgz", + "integrity": "sha512-halby2+lQwHNxUDk70aQNXP1BlBwdwr7svTJZvDi7vKwrWbVMKhVrZ86h8p3zRcWbO4qAgLQ4ODAf8TgD3DhGQ==", "license": "Apache-2.0", "dependencies": { - "google-auth-library": "^10.0.0-rc.1", - "googleapis-common": "^8.0.2-rc.0" + "google-auth-library": "^10.2.0", + "googleapis-common": "^8.0.0" }, "engines": { "node": ">=18" } }, "node_modules/googleapis-common": { - "version": "8.0.2-rc.0", - "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.2-rc.0.tgz", - "integrity": "sha512-JTcxRvmFa9Ec1uyfMEimEMeeKq1sHNZX3vn2qmoUMtnvixXXvcqTcbDZvEZXkEWpGlPlOf4joyep6/qs0BrLyg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.0.tgz", + "integrity": "sha512-66if47It7y+Sab3HMkwEXx1kCq9qUC9px8ZXoj1CMrmLmUw81GpbnsNlXnlyZyGbGPGcj+tDD9XsZ23m7GLaJQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", "gaxios": "^7.0.0-rc.4", - "google-auth-library": "^10.0.0-rc.1", + "google-auth-library": "^10.1.0", "qs": "^6.7.0", "url-template": "^2.0.8" }, @@ -13995,9 +14519,9 @@ } }, "node_modules/googleapis-common/node_modules/gaxios": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.0.tgz", - "integrity": "sha512-y1Q0MX1Ba6eg67Zz92kW0MHHhdtWksYckQy1KJsI6P4UlDQ8cvdvpLEPslD/k7vFkdPppMESFGTvk7XpSiKj8g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", + "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -14009,9 +14533,9 @@ } }, "node_modules/googleapis-common/node_modules/gcp-metadata": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.0.tgz", - "integrity": "sha512-3PfRTzvT3Msu0Hy8Gf9ypxJvaClG2IB9pyH0r8QOmRBW5mUcrHgYpF4GYP+XulDbfhxEhBYtJtJJQb5S2wM+LA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -14072,9 +14596,9 @@ } }, "node_modules/googleapis/node_modules/gaxios": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.0.tgz", - "integrity": "sha512-y1Q0MX1Ba6eg67Zz92kW0MHHhdtWksYckQy1KJsI6P4UlDQ8cvdvpLEPslD/k7vFkdPppMESFGTvk7XpSiKj8g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", + "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -14086,9 +14610,9 @@ } }, "node_modules/googleapis/node_modules/gcp-metadata": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.0.tgz", - "integrity": "sha512-3PfRTzvT3Msu0Hy8Gf9ypxJvaClG2IB9pyH0r8QOmRBW5mUcrHgYpF4GYP+XulDbfhxEhBYtJtJJQb5S2wM+LA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -14100,9 +14624,9 @@ } }, "node_modules/googleapis/node_modules/google-auth-library": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.1.0.tgz", - "integrity": "sha512-GspVjZj1RbyRWpQ9FbAXMKjFGzZwDKnUHi66JJ+tcjcu5/xYAP1pdlWotCuIkMwjfVsxxDvsGZXGLzRt72D0sQ==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.2.1.tgz", + "integrity": "sha512-HMxFl2NfeHYnaL1HoRIN1XgorKS+6CDaM+z9LSSN+i/nKDDL4KFFEWogMXu7jV4HZQy2MsxpY+wA5XIf3w410A==", "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -14556,34 +15080,6 @@ "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz", "integrity": "sha512-qsc720yevCO+4NydrJWgEWKccAQwTOvj2m73O/VBA6iUL2HGZJ9XqBiyraNrBXX/W1IAjdpXdRZk24sq8TzBRg==" }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "optional": true, - "peer": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "optional": true, - "peer": true - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "optional": true, - "peer": true - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -14933,23 +15429,23 @@ } }, "node_modules/jasmine": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.8.0.tgz", - "integrity": "sha512-1V6HGa0+TMoMY20+/vp++RqLlL1noupV8awzV6CiPuICC0g7iKZ9z87zV2KyelRyoig0G1lHn7ueElXVMGVagg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.10.0.tgz", + "integrity": "sha512-v4FojO8cXQdx15mJXovGhjJOvyIcVf7AC+H0ZahnfLk52vUbwuLxjVgbikc95yLmgwKQsFT47/FGQ3dOrWVxtQ==", "dev": true, "license": "MIT", "dependencies": { "glob": "^10.2.2", - "jasmine-core": "~5.8.0" + "jasmine-core": "~5.10.0" }, "bin": { "jasmine": "bin/jasmine.js" } }, "node_modules/jasmine-core": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.8.0.tgz", - "integrity": "sha512-Q9dqmpUAfptwyueW3+HqBOkSuYd9I/clZSSfN97wXE/Nr2ROFNCwIBEC1F6kb3QXS9Fcz0LjFYSDQT+BiwjuhA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.10.0.tgz", + "integrity": "sha512-MrChbWV5LBo+EaeKwTM1eZ6oYSz1brvFExnRafraEkJkbJ9evbUxABhnIgGQimhpMxhg+BD6QmOvb/e3NXsNdg==", "dev": true, "license": "MIT" }, @@ -15627,9 +16123,9 @@ } }, "node_modules/mongodb": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz", - "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.19.0.tgz", + "integrity": "sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.9", @@ -15645,7 +16141,7 @@ "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", + "snappy": "^7.3.2", "socks": "^2.7.1" }, "peerDependenciesMeta": { @@ -15881,9 +16377,9 @@ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/nodemailer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.4.tgz", - "integrity": "sha512-9O00Vh89/Ld2EcVCqJ/etd7u20UhME0f/NToPfArwPEe1Don1zy4mAIz6ariRr7mJ2RDxtaDzN0WJVdVXPtZaw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.6.tgz", + "integrity": "sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==", "license": "MIT-0", "engines": { "node": ">=6.0.0" @@ -16292,14 +16788,15 @@ } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.1.1.tgz", + "integrity": "sha512-i8PyM2JnsNChVSYWLr2BAjNoLi0BAYC+wecOnZnVV+YSNJkzP7cWmvI34dk0WArWfH9KwBHNoZI3P3MppImlIA==", + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.2.1" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16319,6 +16816,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", @@ -16473,14 +16997,14 @@ } }, "node_modules/parse-server": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-8.2.2.tgz", - "integrity": "sha512-qFP5QpJW0NL6s3GhIonlmdCg5lJHwDCnTlxkINCsxnsoeKJVsFou0xy2x6dNquMIU0RJi3qolQaFbNGICZV3NA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-8.2.4.tgz", + "integrity": "sha512-ebtdNwiRaMAOwn7lTixlH7K4EnpP97AA7iJhUPGsdohXfRkwViiAPvYJdb8eTeFCCcBP0+MwBFU7qgJd82RYjw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@apollo/server": "4.12.1", - "@babel/eslint-parser": "7.27.1", + "@babel/eslint-parser": "7.28.0", "@graphql-tools/merge": "9.0.24", "@graphql-tools/schema": "10.0.23", "@graphql-tools/utils": "10.8.6", @@ -16491,7 +17015,7 @@ "cors": "2.8.5", "deepcopy": "2.1.0", "express": "5.1.0", - "express-rate-limit": "7.5.0", + "express-rate-limit": "7.5.1", "follow-redirects": "1.15.9", "graphql": "16.11.0", "graphql-list-fields": "2.0.4", @@ -16511,7 +17035,7 @@ "parse": "6.1.1", "path-to-regexp": "6.3.0", "pg-monitor": "3.0.0", - "pg-promise": "11.13.0", + "pg-promise": "11.14.0", "pluralize": "8.0.0", "punycode": "2.3.1", "rate-limit-redis": "4.2.0", @@ -16551,33 +17075,6 @@ "node": "18 || 20 || 22" } }, - "node_modules/parse-server/node_modules/@babel/eslint-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.1.tgz", - "integrity": "sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==", - "license": "MIT", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/parse-server/node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/parse-server/node_modules/lru-cache": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.0.tgz", @@ -16586,6 +17083,52 @@ "node": ">=18" } }, + "node_modules/parse-server/node_modules/mongodb": { + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz", + "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.4", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, "node_modules/parse-server/node_modules/path-to-regexp": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", @@ -16720,23 +17263,23 @@ "license": "MIT" }, "node_modules/pg": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-EpAhHFQc+aH9VfeffWIVC+XXk6lmAhS9W1FxtxcPXs94yxhrI1I6w/zkWfIOII/OkBv3Be04X3xMOj0kQ78l6w==", + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", + "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", "peer": true, "dependencies": { - "pg-connection-string": "^2.8.5", - "pg-pool": "^3.9.5", - "pg-protocol": "^1.9.5", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "pg-connection-string": "^2.9.1", + "pg-pool": "^3.10.1", + "pg-protocol": "^1.10.3", + "pg-types": "2.2.0", + "pgpass": "1.0.5" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 16.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.2.5" + "pg-cloudflare": "^1.2.7" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -16748,22 +17291,22 @@ } }, "node_modules/pg-cloudflare": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz", - "integrity": "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", + "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.8.5.tgz", - "integrity": "sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", + "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", "license": "MIT" }, "node_modules/pg-cursor": { - "version": "2.14.5", - "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.14.5.tgz", - "integrity": "sha512-RvvMUhrgY5MqF6RhrOKK6n0184Ph9KqFLv3VAyUoJWO4c1JrQ/t7P5uszCXWlcNCLiiUBWkg7ZU63+1EgdpQFw==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.15.3.tgz", + "integrity": "sha512-eHw63TsiGtFEfAd7tOTZ+TLy+i/2ePKS20H84qCQ+aQ60pve05Okon9tKMC+YN3j6XyeFoHnaim7Lt9WVafQsA==", "license": "MIT", "peer": true, "peerDependencies": { @@ -16801,24 +17344,24 @@ } }, "node_modules/pg-pool": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.9.5.tgz", - "integrity": "sha512-DxyAlOgvUzRFpFAZjbCc8fUfG7BcETDHgepFPf724B0i08k9PAiZV1tkGGgQIL0jbMEuR9jW1YN7eX+WgXxCsQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", + "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-promise": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.13.0.tgz", - "integrity": "sha512-NWCsh1gnELfYRF5hNhfXPcSxuCk9C3FyM9MhmGkVTmepczAC2aXuBkyXhipVlHzp0V/IVzyCZOrlH48Ma3i7YQ==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.14.0.tgz", + "integrity": "sha512-x/HZ6hK0MxYllyfUbmN/XZc7JBYoow7KElyNW9hnlhgRHMiRZmRUtfNM/wcuElpjSoASPxkoIKi4IA5QlwOONA==", "license": "MIT", "dependencies": { - "assert-options": "0.8.2", + "assert-options": "0.8.3", "pg": "8.14.1", "pg-minify": "1.7.0", - "spex": "3.4.0" + "spex": "3.4.1" }, "engines": { "node": ">=14.0" @@ -16855,9 +17398,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.9.5.tgz", - "integrity": "sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", "license": "MIT" }, "node_modules/pg-query-stream": { @@ -17077,10 +17620,13 @@ } }, "node_modules/posthog-node": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.1.1.tgz", - "integrity": "sha512-6VISkNdxO24ehXiDA4dugyCSIV7lpGVaEu5kn/dlAj+SJ1lgcDru9PQ8p/+GSXsXVxohd1t7kHL2JKc9NoGb0w==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.8.1.tgz", + "integrity": "sha512-YJYlYnlpItVjHqM9IhvZx8TzK8gnx2nU+0uhiog4RN47NnV0Z0K1AdC4ul+O8VuvS/jHqKCQvL8iAONRA37+0A==", "license": "MIT", + "dependencies": { + "@posthog/core": "1.0.2" + }, "engines": { "node": ">=20" } @@ -17474,9 +18020,9 @@ } }, "node_modules/rate-limiter-flexible": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-7.1.1.tgz", - "integrity": "sha512-lsYRcqRSJrKBNt6pMzBJTiCJP5KnwsGWdObMZxd19JFUJRntM+yuHs4/2bs6NZweSLgpsDcykvzyQaumoslWQg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-7.2.0.tgz", + "integrity": "sha512-hrf0vIS/WOBegnHg+uPXxsXhuQYlNGfZiCmK5Wgudb12xlZUhpv9yD23yp/EW6BKQosshqnIQRQV+r3jyfIGQg==", "license": "ISC" }, "node_modules/raw-body": { @@ -17941,6 +18487,91 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sharp": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", + "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.3", + "@img/sharp-darwin-x64": "0.34.3", + "@img/sharp-libvips-darwin-arm64": "1.2.0", + "@img/sharp-libvips-darwin-x64": "1.2.0", + "@img/sharp-libvips-linux-arm": "1.2.0", + "@img/sharp-libvips-linux-arm64": "1.2.0", + "@img/sharp-libvips-linux-ppc64": "1.2.0", + "@img/sharp-libvips-linux-s390x": "1.2.0", + "@img/sharp-libvips-linux-x64": "1.2.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", + "@img/sharp-libvips-linuxmusl-x64": "1.2.0", + "@img/sharp-linux-arm": "0.34.3", + "@img/sharp-linux-arm64": "0.34.3", + "@img/sharp-linux-ppc64": "0.34.3", + "@img/sharp-linux-s390x": "0.34.3", + "@img/sharp-linux-x64": "0.34.3", + "@img/sharp-linuxmusl-arm64": "0.34.3", + "@img/sharp-linuxmusl-x64": "0.34.3", + "@img/sharp-wasm32": "0.34.3", + "@img/sharp-win32-arm64": "0.34.3", + "@img/sharp-win32-ia32": "0.34.3", + "@img/sharp-win32-x64": "0.34.3" + } + }, + "node_modules/sharp/node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/sharp/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/sharp/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -18075,32 +18706,6 @@ "node": ">=10" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "optional": true, - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "optional": true, - "peer": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -18182,9 +18787,9 @@ } }, "node_modules/spex": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/spex/-/spex-3.4.0.tgz", - "integrity": "sha512-8JeZJ7QlEBnSj1W1fKXgbB2KUPA8k4BxFMf6lZX/c1ZagU/1b9uZWZK0yD6yjfzqAIuTNG4YlRmtMpQiXuohsg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/spex/-/spex-3.4.1.tgz", + "integrity": "sha512-Br0Mu3S+c70kr4keXF+6K4B8ohR+aJjI9s7SbdsI3hliE1Riz4z+FQk7FQL+r7X1t90KPkpuKwQyITpCIQN9mg==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -18633,9 +19238,9 @@ "license": "MIT" }, "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz", + "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==", "license": "MIT", "engines": { "node": ">=14.14" @@ -19531,11 +20136,12 @@ } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index cef69beae1..ddd0b69bc5 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -1,6 +1,6 @@ { "name": "open_sign_server", - "version": "2.21.1", + "version": "2.26.0", "description": "An example Parse API server using the parse-server module", "repository": { "type": "git", @@ -18,8 +18,8 @@ "watch": "nodemon index.js" }, "dependencies": { - "@aws-sdk/client-s3": "^3.840.0", - "@aws-sdk/s3-request-presigner": "^3.840.0", + "@aws-sdk/client-s3": "^3.879.0", + "@aws-sdk/s3-request-presigner": "^3.879.0", "@parse/fs-files-adapter": "^3.0.0", "@parse/s3-files-adapter": "^4.2.0", "@pdf-lib/fontkit": "^1.1.1", @@ -27,38 +27,40 @@ "@signpdf/signer-p12": "^3.2.4", "@signpdf/signpdf": "^3.2.5", "aws-sdk": "^2.1692.0", - "axios": "^1.10.0", + "axios": "^1.11.0", "coherentpdf": "^2.5.5", "cors": "^2.8.5", "date-fns-tz": "^3.2.0", - "dotenv": "^16.6.1", + "dotenv": "^17.2.1", "express": "^5.1.0", - "form-data": "^4.0.3", + "form-data": "^4.0.4", "generate-api-key": "^1.0.2", - "googleapis": "^150.0.1", + "googleapis": "^159.0.0", "libreoffice-convert": "^1.6.1", "mailgun.js": "^12.0.3", - "mongodb": "^6.17.0", - "multer": "^2.0.1", + "mongodb": "^6.19.0", + "multer": "^2.0.2", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", - "nodemailer": "^7.0.4", + "nodemailer": "^7.0.6", + "p-limit": "^7.1.1", "parse": "^6.1.1", "parse-dbtool": "^1.2.0", - "parse-server": "^8.2.1", + "parse-server": "^8.2.4", "parse-server-api-mail-adapter": "^4.1.0", "pdf-lib": "^1.17.1", - "posthog-node": "^5.1.1", + "posthog-node": "^5.8.1", "qrcode": "^1.5.4", - "rate-limiter-flexible": "^7.1.1", + "rate-limiter-flexible": "^7.2.0", + "sharp": "^0.34.3", "speakeasy": "^2.0.0", "ws": "^8.18.3" }, "type": "module", "devDependencies": { - "@babel/eslint-parser": "^7.27.5", - "eslint": "^9.29.0", - "jasmine": "^5.8.0", + "@babel/eslint-parser": "^7.28.0", + "eslint": "^9.34.0", + "jasmine": "^5.10.0", "mongodb-runner": "^5.9.2", "nodemon": "^3.1.10", "nyc": "^17.1.0", diff --git a/apps/OpenSignServer/public/assets/images/parse-logo.png b/apps/OpenSignServer/public/assets/images/parse-logo.png index 17f2684db72c91fb8f1c6228eb2012c6d68c084b..ac5141cb7237fd33b23aaf013d30bdbf8b1add02 100644 GIT binary patch literal 3897 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 TZi-XTD*&MROh>&^%_ibM&S94N literal 5281 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 LbX4n<--rJX+6@-Y diff --git a/apps/OpenSignServer/spec/helper.js b/apps/OpenSignServer/spec/helper.js index a127c9e39e..4eb1fb45d5 100644 --- a/apps/OpenSignServer/spec/helper.js +++ b/apps/OpenSignServer/spec/helper.js @@ -1,7 +1,10 @@ import { startParseServer, stopParseServer, dropDB } from './utils/test-runner.js'; -beforeAll(async () => { - await startParseServer(); -}, 100 * 60 * 2); +beforeAll( + async () => { + await startParseServer(); + }, + 100 * 60 * 2 +); afterAll(async () => { await dropDB(); diff --git a/apps/OpenSignServer/utils/fileUtils.js b/apps/OpenSignServer/utils/fileUtils.js new file mode 100644 index 0000000000..3f76fed6ec --- /dev/null +++ b/apps/OpenSignServer/utils/fileUtils.js @@ -0,0 +1,77 @@ +function formatFixedDate(date = new Date()) { + const dd = String(date.getDate()).padStart(2, '0'); + const months = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ]; + const mmm = months[date.getMonth()]; + const yyyy = String(date.getFullYear()); + let h = date.getHours(); + const ampm = h >= 12 ? 'PM' : 'AM'; + h = h % 12; + if (h === 0) h = 12; + const HH12 = String(h).padStart(2, '0'); + const MM = String(date.getMinutes()).padStart(2, '0'); + return `${dd}-${mmm}-${yyyy} ${HH12}:${MM} ${ampm}`; +} + +/** + * Remove characters not allowed in file names for major OSes. + */ +function sanitizeDownloadFilename(name) { + return name + .replace(/[\\/:*?"<>|\u0000-\u001F]/g, ' ') // reserved + control + .replace(/\s+/g, ' ') // collapse spaces + .trim(); +} + +/** + * Build filename using the selected format ID and runtime values. + * @param {string} formatId - One of FILENAME_FORMATS ids + * @param {object} ctx - { docName, email, date, ext, isSigned, datePattern } + * @returns {string} + */ +export function buildDownloadFilename(formatId, ctx) { + const { + docName = 'Document', + email = 'user@example.com', + date = new Date(), + ext = 'pdf', + isSigned = false, + } = ctx || {}; + + const base = sanitizeDownloadFilename(String(docName) || 'Document'); + const safeEmail = sanitizeDownloadFilename(String(email) || 'user@example.com'); + const dateStr = formatFixedDate(date); + + let stem; + switch (formatId) { + case 'DOCNAME': + stem = base; + break; + case 'DOCNAME_SIGNED': + stem = isSigned ? `${base} - Signed` : base; // if not signed, fallback to base + break; + case 'DOCNAME_EMAIL': + stem = `${base} - ${safeEmail}`; + break; + case 'DOCNAME_EMAIL_DATE': + stem = `${base} - ${safeEmail} - ${dateStr}`; + break; + default: + stem = base; // safe default + } + + const safeExt = ext.replace(/\.+/g, '').toLowerCase() || 'pdf'; + return `${stem}.${safeExt}`; +}