From d1a10d86dab907043f8daf963a7b3658c21369b4 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Tue, 30 Jan 2024 16:38:16 +0530 Subject: [PATCH 01/56] feat: Add login UI --- assets/loginIcon.png | Bin 0 -> 2321 bytes assets/tic_tac_toe.png | Bin 0 -> 74101 bytes next.config.mjs | 11 ++- package-lock.json | 19 +++- package.json | 9 +- src/app/favicon.ico | Bin 25931 -> 0 bytes src/app/layout.tsx | 5 +- src/app/page.tsx | 118 +++-------------------- src/components/formAction/formAction.tsx | 26 +++++ src/components/formExtra/formExtra.tsx | 24 +++++ src/components/header/header.tsx | 35 +++++++ src/components/input/input.tsx | 33 +++++++ src/components/login/login.tsx | 49 ++++++++++ src/constants/formFields.ts | 67 +++++++++++++ src/types/types.ts | 31 ++++++ tailwind.config.ts | 6 ++ 16 files changed, 320 insertions(+), 113 deletions(-) create mode 100644 assets/loginIcon.png create mode 100644 assets/tic_tac_toe.png delete mode 100644 src/app/favicon.ico create mode 100644 src/components/formAction/formAction.tsx create mode 100644 src/components/formExtra/formExtra.tsx create mode 100644 src/components/header/header.tsx create mode 100644 src/components/input/input.tsx create mode 100644 src/components/login/login.tsx create mode 100644 src/constants/formFields.ts create mode 100644 src/types/types.ts diff --git a/assets/loginIcon.png b/assets/loginIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..a730d9b0d9dde69aa075f3dc03198592f769c871 GIT binary patch literal 2321 zcmV+s3GViZP)1^@s6$I7^K00009a7bBm000XU z000XU0RWnu7ytkW!%0LzRCt{2n|qKH#TmedU}9pTsU%vdB$Y>%8WStRZTB7`CKB_o z@+h&ia#UiB6zVS509_vtGc?K>FNH>*WcIueLb3XPR_|W8BNlDrT9dr zFY;}Q!Z%Z--$gO|GsWytiuq&4--z8yv3_d+>3Gf*{X*@dBy*J_=gRLAcKP0gCQ(F-fRY1(0B6d1hbdV zIE2b6^j^@%uWK3z>er`H#G=gyF`@*s|H0JhY7^tn7=*4iF`gp!Bs{#?0IFEY7TS8^ z3uk1VKrma|`~f=x>FL0+uQd$ByvfHt1);6^165SSj?-5D&4x@3g82(gAD{;yo&M-o z>k5NlzO?BB^QZ*#cS1P!*}8zBnEk=c!xw#57t3ypiiOwej@LeOLqt4xbJWmf)1nQ8 z!qy8-jH?Mmr!PE#Af9%5*up8gc%vgJ^n+P3JUm=b{y|o3ePU27xJC}KXxoDp88=#8ODZ(6Jj`Dy#L_ll*K|;-x@XUDYSnyD;8hxFf|e1=y93N9e11u zHl{2PUcNsrsDI?QU@I4|{%OE?bLKVs*PT*^0sf?X+8y3DVj-qQl>WAR*^rX|2qHe+ zrB$$yQ=`joiWc5nHkB7Er_0TB&23SU%Z^+JCJ%#DohD0u8WGW6E0EqDX^TaG?s_(< z1Y$&45A3j&Ks<^0msFhQ>yHfOtrC%?TJFCz>(Tr+xtekaP4ak4!D9* z4MZJ)%&pt9`LsI8}HVomab_ zDn}js1v~1d!R}QjM1xm#0%eMtEIO2?KNvc65wzV1v#XYF9D`+eL1TrFyphust18L{Yl?qCqC|E`)< z%SJ_dgY4YMdabs%jc}^ZaO$z}Kvi2QeAiiAgFA$&Y z1%|2X{}?w07eA2`>A}3Q{O)-*C0@8&?n_i)n0p_mEkVeoMHFGMx2jkMf3X%AUQ{)- zHcSyqREs40#vBaHMF{s@EQ4{xO(U>n?)q)4CO!IQ(buFB`I_5<2;>$<0JBSFJ|p6$ zk-ck*VRf`9U zZk;DoySDD$cx^Bc@0KjNjL>?gmj*XInlO^VE8FBT9%6rz=ZyS^ z7Z{KwKUKDkFV$naGRCIO8xXce3Zv5(p5V4Iv#tT1f&rH&g^g{vSu)5Ei!HMTUBLir zP>CV~Cv)C_Ab!6ThS0<~f;n^3*xM_u;Wb%eA*+8?nV8wNL_MDYS#=XMXy4w9QHp>; zulPmONFSyK^A-znZyDjMq%c4z=3TBD^K;R?x)KPOwn{qR4hB@wN>c!xljKvd6bR%% zRQnDu-nRZ4M0~nyx_)cMOQzNG5!GNoYS7G(L87R<5?87_Xi~XkQ3hjyW+%^1?foRh zEba+NnT0rku!8|p#Qgt}ooU-=!;~pZrEV8f#TUND76u4KY?1r9H{v7A1hJ`*rGn17 zh4J@0V#=9!NbZzY{nh%*4k#T_2>RG%1hHW^AnellNxd@4IKePVm#6;^#UrzRE7SG& z#Vtu;r9LD5E=^U4i$iQi)F=Z{o+K`fGAb}YA#G^>1`b*FY;dYDHO%YaEQm7*b{vjd zD8uOR_kTy_(0kQtxL*=>B^F`_W9#F^H3m4*4G#@iECift=_vqMm_c&d`2~jWRt8}T z!EC-$!%z{g8a^da=FpauG7LD20n6^v`=K-d0H8uwUXG|{J*7%8+vDlbY+zF4B7#|; zUE>e}&26}}8eU={vUI-F3iRn8MU4CG!Zs|-z>3tqN{CEy4Z;+H^dC4m)5YJ{#lL3T zbjCljtd^zoRrV%eA>a#2eF!M5L*VernqRBtJ=rX+R-u^9QhS(t1)l>4*g);-E2UB9 z`8#4_?Qf!%nyrGqS(h&l+NX;1DCQd)1*GAM*ztuEBVW<#B_Z5*0l|D{(+B2K31$PN zg-z7zErFJkmk`AFpG6iiD9wD=OBP%;@Hv9{_R$Z5hoxEXdP@lRUC@lWth%xuX_c%| zA~Z3MB7PsmEZh9STaOq7uVkOmnjxKjy_I6Vx7iRV=A8J#w`t9mb_l&-C5R=?yd|(< zNYa2W(?*j7CPgkf{Rwx&KjI^ptba=z?Vo%HF}sH%zM}yj^&O&^Ju-h{|2MR= zO#+x*3R8$6_L8S`qT!&~HUJPn;mI|BKr>pTt4)lDEE*iVC0KueB0k4Bu#ecPk*qvh re7dUlkntIL3!4Zz*=F}!8>{kvCIHVjhpL=D00000NkvXXu0mjfQ|(>P literal 0 HcmV?d00001 diff --git a/assets/tic_tac_toe.png b/assets/tic_tac_toe.png new file mode 100644 index 0000000000000000000000000000000000000000..2adab221c56a4bec12ad8fd2416cc5cb6516482d GIT binary patch literal 74101 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", + "pnpm": "8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/package.json b/package.json index bbd308b..3dc32d5 100644 --- a/package.json +++ b/package.json @@ -9,19 +9,20 @@ "lint": "next lint" }, "dependencies": { + "next": "14.1.0", "react": "^18", "react-dom": "^18", - "next": "14.1.0" + "react-hook-form": "^7.49.3" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "14.1.0", "postcss": "^8", "tailwindcss": "^3.3.0", - "eslint": "^8", - "eslint-config-next": "14.1.0" + "typescript": "^5" } } diff --git a/src/app/favicon.ico b/src/app/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3314e47..cbed011 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -12,11 +12,14 @@ export const metadata: Metadata = { export default function RootLayout({ children, }: Readonly<{ + login: React.ReactNode; children: React.ReactNode; }>) { return ( - {children} + + {children} + ); } diff --git a/src/app/page.tsx b/src/app/page.tsx index b81507d..7ac866f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,113 +1,19 @@ +import Header from "@/components/header/header"; +import Login from "@/components/login/login"; import Image from "next/image"; -export default function Home() { +export default function LoginPage() { return ( -
-
-

- Get started by editing  - src/app/page.tsx -

- -
- -
+ ); } diff --git a/src/components/formAction/formAction.tsx b/src/components/formAction/formAction.tsx new file mode 100644 index 0000000..c9a51d4 --- /dev/null +++ b/src/components/formAction/formAction.tsx @@ -0,0 +1,26 @@ +import { ParseOptions } from "querystring"; + +export default function FormAction({ + handleSubmit, + buttonType='Button', + action='submit', + text +}:Partial){ + return( + <> + { + buttonType==='Button' ? + + : + <> + } + + ) +} \ No newline at end of file diff --git a/src/components/formExtra/formExtra.tsx b/src/components/formExtra/formExtra.tsx new file mode 100644 index 0000000..ec4bfc6 --- /dev/null +++ b/src/components/formExtra/formExtra.tsx @@ -0,0 +1,24 @@ +export default function FormExtra(){ + return( +
+
+ + +
+ + +
+ + ) +} \ No newline at end of file diff --git a/src/components/header/header.tsx b/src/components/header/header.tsx new file mode 100644 index 0000000..13d064f --- /dev/null +++ b/src/components/header/header.tsx @@ -0,0 +1,35 @@ +import Image from "next/image"; +import Link from "next/link"; +import loginIcon from '../../../assets/loginIcon.png' +export default function Header({ + heading, + paragraph, + linkName, + linkUrl = "#", +}: HeaderProps) { + return ( +
+
+ Game Logo +
+

+ {heading} +

+

+ {paragraph}{" "} + + {linkName} + +

+
+ ); +} diff --git a/src/components/input/input.tsx b/src/components/input/input.tsx new file mode 100644 index 0000000..c3ceac8 --- /dev/null +++ b/src/components/input/input.tsx @@ -0,0 +1,33 @@ +const fixedInputClass = + "rounded-md appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-purple-500 focus:border-purple-500 focus:z-10 sm:text-sm"; + +export default function Input({ + handleChange, + value, + labelText, + labelFor, + id, + name, + type, + isRequired = false, + placeholder, + customClass, +}: Partial) { + return ( +
+ + +
+ ); +} diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx new file mode 100644 index 0000000..f782114 --- /dev/null +++ b/src/components/login/login.tsx @@ -0,0 +1,49 @@ +"use client"; +import { FormEvent, useState } from "react"; +import Input from "../input/input"; +import { loginFields } from "@/constants/formFields"; +import FormExtra from "../formExtra/formExtra"; +import FormAction from "../formAction/formAction"; + +const fields: LoginFields[] = loginFields; +let fieldsState = {}; +fields.forEach((field) => (fieldsState[field.id] = "")); +// console.log({ fieldsState }); + +export default function Login() { + const [loginState, setLoginState] = useState(fieldsState); + + const handleChange = (e: React.ChangeEvent) => { + setLoginState({ ...loginState, [e.target.id]: e.target.value }); + }; + const handleSubmit = (e: FormEvent) => { + e.preventDefault(); + authenticateUser(); + }; + + //Handle Login API Integration here + const authenticateUser = () => {}; + + return ( +
+
+ {fields.map((field) => ( + + ))} +
+ + + + ); +} diff --git a/src/constants/formFields.ts b/src/constants/formFields.ts new file mode 100644 index 0000000..ed72c42 --- /dev/null +++ b/src/constants/formFields.ts @@ -0,0 +1,67 @@ +const loginFields=[ + { + labelText:"Email address", + labelFor:"email-address", + id:"email-address", + name:"email", + type:"email", + autoComplete:"email", + isRequired:true, + placeholder:"Email address" + }, + { + labelText:"Password", + labelFor:"password", + id:"password", + name:"password", + type:"password", + autoComplete:"current-password", + isRequired:true, + placeholder:"Password" + } +] + +const signupFields=[ + { + labelText:"Username", + labelFor:"username", + id:"username", + name:"username", + type:"text", + autoComplete:"username", + isRequired:true, + placeholder:"Username" + }, + { + labelText:"Email address", + labelFor:"email-address", + id:"email-address", + name:"email", + type:"email", + autoComplete:"email", + isRequired:true, + placeholder:"Email address" + }, + { + labelText:"Password", + labelFor:"password", + id:"password", + name:"password", + type:"password", + autoComplete:"current-password", + isRequired:true, + placeholder:"Password" + }, + { + labelText:"Confirm Password", + labelFor:"confirm-password", + id:"confirm-password", + name:"confirm-password", + type:"password", + autoComplete:"confirm-password", + isRequired:true, + placeholder:"Confirm Password" + } +] + +export {loginFields,signupFields} \ No newline at end of file diff --git a/src/types/types.ts b/src/types/types.ts new file mode 100644 index 0000000..f91a693 --- /dev/null +++ b/src/types/types.ts @@ -0,0 +1,31 @@ + +interface HeaderProps { + heading: string; + paragraph: string; + linkName: string; + linkUrl: string; +} + +interface LoginFields { + labelText: string; + labelFor: string; + id: string; + name: string; + type: string; + autoComplete: string; + isRequired: boolean; + placeholder: string; +} + +interface FormActionsProps{ + handleSubmit:(e:React.FormEvent)=>void, + buttonType:string, + action:'submit', + text:string +} + +interface InputProps extends LoginFields { + handleChange: (e:React.ChangeEvent) => void; + value: string; + customClass: string; +} diff --git a/tailwind.config.ts b/tailwind.config.ts index e9a0944..1bf5689 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -8,6 +8,12 @@ const config: Config = { ], theme: { extend: { + colors:{ + "card-primary": "white" + }, + borderRadius:{ + "card-radius": "0.75rem" + }, backgroundImage: { "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", "gradient-conic": From 87b34a138b746c5985cc60626e29ff1961ec6bac Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Tue, 30 Jan 2024 17:16:17 +0530 Subject: [PATCH 02/56] feat: Add signup UI --- src/app/signup/page.tsx | 21 +++++++++++++ src/components/login/login.tsx | 6 ++-- src/components/signup/signup.tsx | 52 ++++++++++++++++++++++++++++++++ src/types/types.ts | 2 +- 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 src/app/signup/page.tsx create mode 100644 src/components/signup/signup.tsx diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx new file mode 100644 index 0000000..b6d232f --- /dev/null +++ b/src/app/signup/page.tsx @@ -0,0 +1,21 @@ +import Header from '@/components/header/header' +import Signup from '@/components/signup/signup' +import React from 'react' + +const SignupPage = () => { + return ( +
+
+
+ +
+
+ ) +} + +export default SignupPage diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index f782114..b68bb04 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -13,7 +13,7 @@ fields.forEach((field) => (fieldsState[field.id] = "")); export default function Login() { const [loginState, setLoginState] = useState(fieldsState); - const handleChange = (e: React.ChangeEvent) => { + const handleChange = (e: React.ChangeEvent) => { setLoginState({ ...loginState, [e.target.id]: e.target.value }); }; const handleSubmit = (e: FormEvent) => { @@ -25,13 +25,13 @@ export default function Login() { const authenticateUser = () => {}; return ( -
+
{fields.map((field) => ( (fieldsState[field.id] = "")); + +const Signup = () => { + const [signupState, setSignupState] = useState(fieldsState); + + const handleChange = (e: React.ChangeEvent) => { + setSignupState({ ...signupState, [e.target.id]: e.target.value }); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + console.log(signupState); + createAccount(); + }; + + //handle Signup API Integration here + const createAccount = () => {}; + return ( + +
+ { + fields.map(field=> + + + ) + } +
+ + + + ); +}; + +export default Signup; diff --git a/src/types/types.ts b/src/types/types.ts index f91a693..3c410c7 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -25,7 +25,7 @@ interface FormActionsProps{ } interface InputProps extends LoginFields { - handleChange: (e:React.ChangeEvent) => void; + handleChange: (e:React.ChangeEvent) => void; value: string; customClass: string; } From 891f29c02714aa84aa16c577a1fc2af57f776881 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Tue, 30 Jan 2024 18:59:55 +0530 Subject: [PATCH 03/56] feat: Add db connection, models for user --- .example.env | 1 + .gitignore | 1 + middlleware.ts | 4 + models/userModels.ts | 13 ++ package-lock.json | 329 ++++++++++++++++++++++++++- package.json | 2 + src/app/(auth)/login/loading.tsx | 7 + src/app/(auth)/login/page.tsx | 21 ++ src/app/(auth)/signup/loading.tsx | 7 + src/app/{ => (auth)}/signup/page.tsx | 2 +- src/app/layout.tsx | 9 +- src/app/page.tsx | 15 +- src/components/login/login.tsx | 3 +- src/components/signup/signup.tsx | 2 +- src/types/types.ts | 6 + utils/dbConnection.ts | 9 + 16 files changed, 401 insertions(+), 30 deletions(-) create mode 100644 .example.env create mode 100644 middlleware.ts create mode 100644 models/userModels.ts create mode 100644 src/app/(auth)/login/loading.tsx create mode 100644 src/app/(auth)/login/page.tsx create mode 100644 src/app/(auth)/signup/loading.tsx rename src/app/{ => (auth)}/signup/page.tsx (95%) create mode 100644 utils/dbConnection.ts diff --git a/.example.env b/.example.env new file mode 100644 index 0000000..5892199 --- /dev/null +++ b/.example.env @@ -0,0 +1 @@ +NEXT_PUBLIC_MONGO_URI="" diff --git a/.gitignore b/.gitignore index fd3dbb5..7e43796 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /.pnp .pnp.js .yarn/install-state.gz +.env # testing /coverage diff --git a/middlleware.ts b/middlleware.ts new file mode 100644 index 0000000..a05bd76 --- /dev/null +++ b/middlleware.ts @@ -0,0 +1,4 @@ +export {default} from "next-auth/middleware"; +export const config = { + matcher: ["/", "/profile", "/room:code"], +}; \ No newline at end of file diff --git a/models/userModels.ts b/models/userModels.ts new file mode 100644 index 0000000..3cdf633 --- /dev/null +++ b/models/userModels.ts @@ -0,0 +1,13 @@ +import mongoose, { Schema } from "mongoose"; + +const userSchema = new Schema({ + name:{type:String, required: true}, + email:{type:String, required: true, unique:true}, + password:{type:String, required: true} +},{ + timestamps:true +}); + +const User = mongoose.models.User || mongoose.model("User", userSchema); + +export default User; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e545f30..eec38e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,9 @@ "name": "game", "version": "0.1.0", "dependencies": { + "mongoose": "^8.1.1", "next": "14.1.0", + "next-auth": "^4.24.5", "react": "^18", "react-dom": "^18", "react-hook-form": "^7.49.3" @@ -50,7 +52,6 @@ "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -239,6 +240,14 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", + "integrity": "sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@next/env": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz", @@ -423,6 +432,14 @@ "node": ">= 8" } }, + "node_modules/@panva/hkdf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", + "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -494,6 +511,19 @@ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", "dev": true }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", + "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, "node_modules/@typescript-eslint/parser": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz", @@ -1009,6 +1039,14 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bson": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", + "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", + "engines": { + "node": ">=16.20.1" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -1164,6 +1202,14 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1206,7 +1252,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -2793,6 +2838,14 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", + "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2855,6 +2908,14 @@ "node": ">=4.0" } }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2951,6 +3012,11 @@ "node": "14 || >=16.14" } }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3003,11 +3069,109 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mongodb": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", + "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.2.0", + "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", + "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/mongodb-connection-string-url": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", + "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.1.1.tgz", + "integrity": "sha512-DbLb0NsiEXmaqLOpEz+AtAsgwhRw6f25gwa1dF5R7jj6lS1D8X6uTdhBSC8GDVtOwe5Tfw2EL7nTn6hiJT3Bgg==", + "dependencies": { + "bson": "^6.2.0", + "kareem": "2.5.1", + "mongodb": "6.3.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/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==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mz": { "version": "2.7.0", @@ -3088,6 +3252,33 @@ } } }, + "node_modules/next-auth": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.5.tgz", + "integrity": "sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.5.0", + "jose": "^4.11.4", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "next": "^12.2.5 || ^13 || ^14", + "nodemailer": "^6.6.5", + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" + }, + "peerDependenciesMeta": { + "nodemailer": { + "optional": true + } + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -3139,6 +3330,11 @@ "node": ">=0.10.0" } }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3266,6 +3462,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3275,6 +3479,39 @@ "wrappy": "1" } }, + "node_modules/openid-client": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz", + "integrity": "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==", + "dependencies": { + "jose": "^4.15.4", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -3573,6 +3810,26 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/preact": { + "version": "10.19.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz", + "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3582,6 +3839,11 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -3597,7 +3859,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -3711,8 +3972,7 @@ "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==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", @@ -3969,6 +4229,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3998,6 +4263,14 @@ "node": ">=0.10.0" } }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -4335,6 +4608,17 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/ts-api-utils": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", @@ -4538,6 +4822,34 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4732,8 +5044,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "2.3.4", diff --git a/package.json b/package.json index 3dc32d5..e8fb8f8 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,9 @@ "lint": "next lint" }, "dependencies": { + "mongoose": "^8.1.1", "next": "14.1.0", + "next-auth": "^4.24.5", "react": "^18", "react-dom": "^18", "react-hook-form": "^7.49.3" diff --git a/src/app/(auth)/login/loading.tsx b/src/app/(auth)/login/loading.tsx new file mode 100644 index 0000000..1ce528c --- /dev/null +++ b/src/app/(auth)/login/loading.tsx @@ -0,0 +1,7 @@ +export default function Loading() { + return ( +
+

Loading...

+
+ ); +} diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx new file mode 100644 index 0000000..3a922d8 --- /dev/null +++ b/src/app/(auth)/login/page.tsx @@ -0,0 +1,21 @@ +import Header from "@/components/header/header"; +import Login from "@/components/login/login"; +import React from "react"; + +const LoginPage = () => { + return ( +
+
+
+ +
+
+ ); +}; + +export default LoginPage; diff --git a/src/app/(auth)/signup/loading.tsx b/src/app/(auth)/signup/loading.tsx new file mode 100644 index 0000000..bc2b25c --- /dev/null +++ b/src/app/(auth)/signup/loading.tsx @@ -0,0 +1,7 @@ +export default function Loading() { + return ( +
+

Loading...

+
+ ); + } \ No newline at end of file diff --git a/src/app/signup/page.tsx b/src/app/(auth)/signup/page.tsx similarity index 95% rename from src/app/signup/page.tsx rename to src/app/(auth)/signup/page.tsx index b6d232f..30d3646 100644 --- a/src/app/signup/page.tsx +++ b/src/app/(auth)/signup/page.tsx @@ -10,7 +10,7 @@ const SignupPage = () => { heading="Create new account" paragraph="Already have an account? " linkName="Login" - linkUrl="/" + linkUrl="/login" />
diff --git a/src/app/layout.tsx b/src/app/layout.tsx index cbed011..c101323 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -5,21 +5,18 @@ import "./globals.css"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Tic Tac Toe", + description: "Tic Tac Toe Game developed using next.js + typescript", }; export default function RootLayout({ children, }: Readonly<{ - login: React.ReactNode; children: React.ReactNode; }>) { return ( - - {children} - + {children} ); } diff --git a/src/app/page.tsx b/src/app/page.tsx index 7ac866f..49fece3 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,19 +1,10 @@ import Header from "@/components/header/header"; import Login from "@/components/login/login"; -import Image from "next/image"; -export default function LoginPage() { +export default function Dashboard() { return ( -
-
-
- -
+
+

Welcome to dashboard

); } diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index b68bb04..bad8829 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -14,7 +14,8 @@ export default function Login() { const [loginState, setLoginState] = useState(fieldsState); const handleChange = (e: React.ChangeEvent) => { - setLoginState({ ...loginState, [e.target.id]: e.target.value }); + console.log(e.target.name, e.target.value) + setLoginState({ ...loginState, [e.target.name]: e.target.value }); }; const handleSubmit = (e: FormEvent) => { e.preventDefault(); diff --git a/src/components/signup/signup.tsx b/src/components/signup/signup.tsx index 20c49f8..7d1ea04 100644 --- a/src/components/signup/signup.tsx +++ b/src/components/signup/signup.tsx @@ -11,7 +11,7 @@ const Signup = () => { const [signupState, setSignupState] = useState(fieldsState); const handleChange = (e: React.ChangeEvent) => { - setSignupState({ ...signupState, [e.target.id]: e.target.value }); + setSignupState({ ...signupState, [e.target.name]: e.target.value }); }; const handleSubmit = (e: React.FormEvent) => { diff --git a/src/types/types.ts b/src/types/types.ts index 3c410c7..7797391 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -29,3 +29,9 @@ interface InputProps extends LoginFields { value: string; customClass: string; } + +interface UserSchema { + name: string, + email:string, + password:string, +} diff --git a/utils/dbConnection.ts b/utils/dbConnection.ts new file mode 100644 index 0000000..76441e8 --- /dev/null +++ b/utils/dbConnection.ts @@ -0,0 +1,9 @@ +import mongoose from "mongoose"; + +mongoose.connect(process.env.NEXT_PUBLIC_MONGO_URI!) + .then(() => { + console.log("Connected to MongoDB Atlas"); + }) + .catch((error) => { + console.error("Error connecting to MongoDB Atlas:", error.message); + }); \ No newline at end of file From 9bac8a5048e1feba11130a2f12b6c72862723cac Mon Sep 17 00:00:00 2001 From: mdkamran25 Date: Tue, 30 Jan 2024 23:25:49 +0530 Subject: [PATCH 04/56] feat: Add route for signup --- package-lock.json | 442 +++++++++++++++++++++++++++++-- package.json | 2 + src/app/api/signup/route.ts | 16 ++ src/components/login/login.tsx | 6 +- src/components/signup/signup.tsx | 77 ++++-- utils/dbConnection.ts | 11 +- 6 files changed, 496 insertions(+), 58 deletions(-) create mode 100644 src/app/api/signup/route.ts diff --git a/package-lock.json b/package-lock.json index eec38e9..c86d927 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "game", "version": "0.1.0", "dependencies": { + "bcrypt": "^5.1.1", "mongoose": "^8.1.1", "next": "14.1.0", "next-auth": "^4.24.5", @@ -16,6 +17,7 @@ "react-hook-form": "^7.49.3" }, "devDependencies": { + "@types/mongoose": "^5.11.97", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", @@ -240,6 +242,25 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", @@ -470,6 +491,16 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/mongoose": { + "version": "5.11.97", + "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", + "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", + "deprecated": "Mongoose publishes its own types, so you do not need to install this package.", + "dev": true, + "dependencies": { + "mongoose": "*" + } + }, "node_modules/@types/node": { "version": "20.11.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz", @@ -657,6 +688,11 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -678,6 +714,17 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -698,7 +745,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -737,6 +783,23 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -973,8 +1036,20 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -989,7 +1064,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1164,6 +1238,14 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -1187,6 +1269,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -1199,8 +1289,12 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "node_modules/cookie": { "version": "0.5.0", @@ -1301,6 +1395,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1310,6 +1409,14 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -2076,11 +2183,32 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "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 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -2132,6 +2260,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/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==" + }, + "node_modules/gauge/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==" + }, + "node_modules/gauge/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/get-intrinsic": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", @@ -2375,6 +2545,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -2387,6 +2562,18 @@ "node": ">= 0.4" } }, + "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==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -2425,7 +2612,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2434,8 +2620,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.6", @@ -2584,7 +2769,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -3012,6 +3196,28 @@ "node": "14 || >=16.14" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/memory-pager": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", @@ -3043,7 +3249,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3069,6 +3274,40 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mongodb": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", @@ -3306,12 +3545,69 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "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==", + "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-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/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==" + }, + "node_modules/node-fetch/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==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3330,6 +3626,17 @@ "node": ">=0.10.0" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/oauth": { "version": "0.9.15", "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", @@ -3339,7 +3646,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3474,7 +3780,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -3584,7 +3889,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3937,6 +4241,19 @@ "pify": "^2.3.0" } }, + "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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4040,7 +4357,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -4055,7 +4371,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4112,6 +4427,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", @@ -4141,7 +4475,6 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -4156,7 +4489,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -4164,6 +4496,11 @@ "node": ">=10" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/set-function-length": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", @@ -4279,6 +4616,14 @@ "node": ">=10.0.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -4413,7 +4758,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4569,6 +4913,30 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4819,8 +5187,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "8.3.2", @@ -4941,6 +5308,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/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==" + }, + "node_modules/wide-align/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -5038,8 +5431,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/yallist": { "version": "4.0.0", diff --git a/package.json b/package.json index e8fb8f8..7b3dd5a 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "bcrypt": "^5.1.1", "mongoose": "^8.1.1", "next": "14.1.0", "next-auth": "^4.24.5", @@ -17,6 +18,7 @@ "react-hook-form": "^7.49.3" }, "devDependencies": { + "@types/mongoose": "^5.11.97", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", diff --git a/src/app/api/signup/route.ts b/src/app/api/signup/route.ts new file mode 100644 index 0000000..3d5c85a --- /dev/null +++ b/src/app/api/signup/route.ts @@ -0,0 +1,16 @@ +import connectMongoDb from "../../../../utils/dbConnection"; +import User from "../../../../models/userModels"; +import { NextResponse } from "next/server"; +import bcrypt from "bcrypt"; +export async function POST(req: Request) { + try { + await connectMongoDb(); + const { username, email, password } = await req.json(); + const exists = await User.findOne({ $or: [{ username }] }); + if (exists) { + return ( + NextResponse.json({ message: "Email Already Exist" }), { status: 500 } + ); + } + } catch (error) {} +} diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index bad8829..3b83105 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -7,12 +7,12 @@ import FormAction from "../formAction/formAction"; const fields: LoginFields[] = loginFields; let fieldsState = {}; -fields.forEach((field) => (fieldsState[field.id] = "")); +fields.forEach((field) => (fieldsState[field.name] = "")); // console.log({ fieldsState }); export default function Login() { const [loginState, setLoginState] = useState(fieldsState); - +console.log({loginState}) const handleChange = (e: React.ChangeEvent) => { console.log(e.target.name, e.target.value) setLoginState({ ...loginState, [e.target.name]: e.target.value }); @@ -32,7 +32,7 @@ export default function Login() { (fieldsState[field.id] = "")); +let fieldsState: Record = {}; +fields.forEach((field) => (fieldsState[field.name] = "")); const Signup = () => { const [signupState, setSignupState] = useState(fieldsState); @@ -14,36 +25,46 @@ const Signup = () => { setSignupState({ ...signupState, [e.target.name]: e.target.value }); }; - const handleSubmit = (e: React.FormEvent) => { + const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - console.log(signupState); - createAccount(); + try { + const res = await fetch("api/signup", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(signupState) + }); + + if (res.ok) { + const form = e.target as HTMLFormElement; + form.reset(); + } else { + throw new Error("Failed to create account"); + } + } catch (error) { + console.error("Error creating account:", error); + } }; - //handle Signup API Integration here - const createAccount = () => {}; return ( -
+
- { - fields.map(field=> - - - ) - } -
- + {fields.map((field) => ( + + ))} +
); diff --git a/utils/dbConnection.ts b/utils/dbConnection.ts index 76441e8..6335749 100644 --- a/utils/dbConnection.ts +++ b/utils/dbConnection.ts @@ -1,9 +1,16 @@ import mongoose from "mongoose"; -mongoose.connect(process.env.NEXT_PUBLIC_MONGO_URI!) +const connectMongoDb = async () => { + await mongoose.connect(process.env.NEXT_PUBLIC_MONGO_URI!) .then(() => { console.log("Connected to MongoDB Atlas"); }) .catch((error) => { console.error("Error connecting to MongoDB Atlas:", error.message); - }); \ No newline at end of file + }); +} + +export default connectMongoDb; + + + \ No newline at end of file From 57dd4c2ef80a34c3f7c449f2557bb0fdc0cdc2ed Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 31 Jan 2024 10:03:13 +0530 Subject: [PATCH 05/56] feat: remove npm, added yarn --- package-lock.json | 5463 --------------------------------------------- package.json | 1 + yarn.lock | 3069 +++++++++++++++++++++++++ 3 files changed, 3070 insertions(+), 5463 deletions(-) delete mode 100644 package-lock.json create mode 100644 yarn.lock diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index c86d927..0000000 --- a/package-lock.json +++ /dev/null @@ -1,5463 +0,0 @@ -{ - "name": "game", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "game", - "version": "0.1.0", - "dependencies": { - "bcrypt": "^5.1.1", - "mongoose": "^8.1.1", - "next": "14.1.0", - "next-auth": "^4.24.5", - "react": "^18", - "react-dom": "^18", - "react-hook-form": "^7.49.3" - }, - "devDependencies": { - "@types/mongoose": "^5.11.97", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "eslint": "^8", - "eslint-config-next": "14.1.0", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", - "integrity": "sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, - "node_modules/@next/env": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz", - "integrity": "sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz", - "integrity": "sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q==", - "dev": true, - "dependencies": { - "glob": "10.3.10" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz", - "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz", - "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz", - "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz", - "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz", - "integrity": "sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz", - "integrity": "sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz", - "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz", - "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz", - "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@panva/hkdf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", - "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", - "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==", - "dev": true - }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/mongoose": { - "version": "5.11.97", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", - "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", - "deprecated": "Mongoose publishes its own types, so you do not need to install this package.", - "dev": true, - "dependencies": { - "mongoose": "*" - } - }, - "node_modules/@types/node": { - "version": "20.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.10.tgz", - "integrity": "sha512-rZEfe/hJSGYmdfX9tvcPMYeYPW2sNl50nsw4jZmRcaG0HIAb0WYEpsB05GOb53vjqpyE9GUhlDQ4jLSoB5q9kg==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", - "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" - }, - "node_modules/@types/whatwg-url": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", - "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz", - "integrity": "sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", - "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz", - "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz", - "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", - "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.20.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/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==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "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==" - }, - "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bson": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", - "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001581", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz", - "integrity": "sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.650", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.650.tgz", - "integrity": "sha512-sYSQhJCJa4aGA1wYol5cMQgekDBlbVfTRavlGZVr3WZpDdOPcp6a6xUnFfrt8TqZhsBYYbDxJZCjGfHuGupCRQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.0.tgz", - "integrity": "sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.1.0", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-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, - "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-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/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==" - }, - "node_modules/gauge/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==" - }, - "node_modules/gauge/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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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==" - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jose": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", - "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/kareem": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", - "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mongodb": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", - "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.0", - "bson": "^6.2.0", - "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", - "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/mongodb-connection-string-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", - "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^13.0.0" - } - }, - "node_modules/mongoose": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.1.1.tgz", - "integrity": "sha512-DbLb0NsiEXmaqLOpEz+AtAsgwhRw6f25gwa1dF5R7jj6lS1D8X6uTdhBSC8GDVtOwe5Tfw2EL7nTn6hiJT3Bgg==", - "dependencies": { - "bson": "^6.2.0", - "kareem": "2.5.1", - "mongodb": "6.3.0", - "mpath": "0.9.0", - "mquery": "5.0.0", - "ms": "2.1.3", - "sift": "16.0.1" - }, - "engines": { - "node": ">=16.20.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mongoose/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==" - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", - "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/next/-/next-14.1.0.tgz", - "integrity": "sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==", - "dependencies": { - "@next/env": "14.1.0", - "@swc/helpers": "0.5.2", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.1.0", - "@next/swc-darwin-x64": "14.1.0", - "@next/swc-linux-arm64-gnu": "14.1.0", - "@next/swc-linux-arm64-musl": "14.1.0", - "@next/swc-linux-x64-gnu": "14.1.0", - "@next/swc-linux-x64-musl": "14.1.0", - "@next/swc-win32-arm64-msvc": "14.1.0", - "@next/swc-win32-ia32-msvc": "14.1.0", - "@next/swc-win32-x64-msvc": "14.1.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-auth": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.5.tgz", - "integrity": "sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==", - "dependencies": { - "@babel/runtime": "^7.20.13", - "@panva/hkdf": "^1.0.2", - "cookie": "^0.5.0", - "jose": "^4.11.4", - "oauth": "^0.9.15", - "openid-client": "^5.4.0", - "preact": "^10.6.3", - "preact-render-to-string": "^5.1.19", - "uuid": "^8.3.2" - }, - "peerDependencies": { - "next": "^12.2.5 || ^13 || ^14", - "nodemailer": "^6.6.5", - "react": "^17.0.2 || ^18", - "react-dom": "^17.0.2 || ^18" - }, - "peerDependenciesMeta": { - "nodemailer": { - "optional": true - } - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" - }, - "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==", - "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-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/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==" - }, - "node_modules/node-fetch/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==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/oauth": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oidc-token-hash": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", - "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "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==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/openid-client": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz", - "integrity": "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA==", - "dependencies": { - "jose": "^4.15.4", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/openid-client/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/openid-client/node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/preact": { - "version": "10.19.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz", - "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/preact-render-to-string": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", - "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", - "dependencies": { - "pretty-format": "^3.8.0" - }, - "peerDependencies": { - "preact": ">=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, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", - "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-hook-form": { - "version": "7.49.3", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.3.tgz", - "integrity": "sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ==", - "engines": { - "node": ">=18", - "pnpm": "8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.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 - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "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==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/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==" - }, - "node_modules/wide-align/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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json index 7b3dd5a..2d69d38 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "react-hook-form": "^7.49.3" }, "devDependencies": { + "@types/bcrypt": "^5.0.2", "@types/mongoose": "^5.11.97", "@types/node": "^20", "@types/react": "^18", diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..27b5dbb --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3069 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + 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" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@mapbox/node-pre-gyp@^1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@mongodb-js/saslprep@^1.1.0": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz#24ec1c4915a65f5c506bb88c081731450d91bb1c" + integrity sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw== + dependencies: + sparse-bitfield "^3.0.3" + +"@next/env@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341" + integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw== + +"@next/eslint-plugin-next@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz#29b041233fac7417e22eefa4146432d5cd910820" + integrity sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q== + dependencies: + glob "10.3.10" + +"@next/swc-darwin-arm64@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" + integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ== + +"@next/swc-darwin-x64@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" + integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g== + +"@next/swc-linux-arm64-gnu@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" + integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ== + +"@next/swc-linux-arm64-musl@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" + integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g== + +"@next/swc-linux-x64-gnu@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz#18967f100ec19938354332dcb0268393cbacf581" + integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ== + +"@next/swc-linux-x64-musl@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz#77077cd4ba8dda8f349dc7ceb6230e68ee3293cf" + integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== + +"@next/swc-win32-arm64-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" + integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ== + +"@next/swc-win32-ia32-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" + integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw== + +"@next/swc-win32-x64-msvc@14.1.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" + integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@panva/hkdf@^1.0.2": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.1.1.tgz#ab9cd8755d1976e72fc77a00f7655a64efe6cd5d" + integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@rushstack/eslint-patch@^1.3.3": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz#2d4260033e199b3032a08b41348ac10de21c47e9" + integrity sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA== + +"@swc/helpers@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" + integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== + dependencies: + tslib "^2.4.0" + +"@types/bcrypt@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-5.0.2.tgz#22fddc11945ea4fbc3655b3e8b8847cc9f811477" + integrity sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ== + dependencies: + "@types/node" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mongoose@^5.11.97": + version "5.11.97" + resolved "https://registry.yarnpkg.com/@types/mongoose/-/mongoose-5.11.97.tgz#80b0357f3de6807eb597262f52e49c3e13ee14d8" + integrity sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q== + dependencies: + mongoose "*" + +"@types/node@*", "@types/node@^20": + version "20.11.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.13.tgz#188263ee2c8d590e181d3f5bfa7e485a932957cb" + integrity sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg== + dependencies: + undici-types "~5.26.4" + +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/react-dom@^18": + version "18.2.18" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.18.tgz#16946e6cd43971256d874bc3d0a72074bb8571dd" + integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18": + version "18.2.48" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.48.tgz#11df5664642d0bd879c1f58bc1d37205b064e8f1" + integrity sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/webidl-conversions@*": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" + integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== + +"@types/whatwg-url@^11.0.2": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.4.tgz#ffed0dc8d89d91f62e3f368fcbda222a487c4f63" + integrity sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw== + dependencies: + "@types/webidl-conversions" "*" + +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.20.0.tgz#17e314177304bdf498527e3c4b112e41287b7416" + integrity sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w== + dependencies: + "@typescript-eslint/scope-manager" "6.20.0" + "@typescript-eslint/types" "6.20.0" + "@typescript-eslint/typescript-estree" "6.20.0" + "@typescript-eslint/visitor-keys" "6.20.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.20.0": + version "6.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz#8a926e60f6c47feb5bab878246dc2ae465730151" + integrity sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA== + dependencies: + "@typescript-eslint/types" "6.20.0" + "@typescript-eslint/visitor-keys" "6.20.0" + +"@typescript-eslint/types@6.20.0": + version "6.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.20.0.tgz#5ccd74c29011ae7714ae6973e4ec0c634708b448" + integrity sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ== + +"@typescript-eslint/typescript-estree@6.20.0": + version "6.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz#5b2d0975949e6bdd8d45ee1471461ef5fadc5542" + integrity sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g== + dependencies: + "@typescript-eslint/types" "6.20.0" + "@typescript-eslint/visitor-keys" "6.20.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/visitor-keys@6.20.0": + version "6.20.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz#f7ada27f2803de89df0edd9fd7be22c05ce6a498" + integrity sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw== + dependencies: + "@typescript-eslint/types" "6.20.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== + +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + +autoprefixer@^10.0.1: + version "10.4.17" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.17.tgz#35cd5695cbbe82f536a50fa025d561b01fdec8be" + integrity sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg== + dependencies: + browserslist "^4.22.2" + caniuse-lite "^1.0.30001578" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bcrypt@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.1.1.tgz#0f732c6dcb4e12e5b70a25e326a72965879ba6e2" + integrity sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.11" + node-addon-api "^5.0.0" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.22.2: + version "4.22.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" + integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== + dependencies: + caniuse-lite "^1.0.30001580" + electron-to-chromium "^1.4.648" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bson@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.2.0.tgz#4b6acafc266ba18eeee111373c2699304a9ba0a3" + integrity sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q== + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001578, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001580: + version "1.0.30001581" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz#0dfd4db9e94edbdca67d57348ebc070dece279f4" + integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +debug@4, debug@4.x, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.4.648: + version "1.4.651" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz#ef1e822233c6fc953df3caf943f78c21b254a080" + integrity sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.12.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.0.tgz#7e309d426b8afacaba3b32fdbb02ba220b6d0a97" + integrity sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg== + dependencies: + "@next/eslint-plugin-next" "14.1.0" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.28.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.33.2: + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8: + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.0.tgz#ca5e1a90b5e68f97fc8b61330d5819b82f5fab03" + integrity sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-tsconfig@^4.5.0: + version "4.7.2" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" + integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@10.3.10, glob@^10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.2.11, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +ignore@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.19.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +jose@^4.11.4, jose@^4.15.4: + version "4.15.4" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.4.tgz#02a9a763803e3872cf55f29ecef0dfdcc218cc03" + integrity sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +kareem@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.5.1.tgz#7b8203e11819a8e77a34b3517d3ead206764d15d" + integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +language-subtag-registry@^0.3.20: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" + integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mongodb-connection-string-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz#b4f87f92fd8593f3b9365f592515a06d304a1e9c" + integrity sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ== + dependencies: + "@types/whatwg-url" "^11.0.2" + whatwg-url "^13.0.0" + +mongodb@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.3.0.tgz#ec9993b19f7ed2ea715b903fcac6171c9d1d38ca" + integrity sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA== + dependencies: + "@mongodb-js/saslprep" "^1.1.0" + bson "^6.2.0" + mongodb-connection-string-url "^3.0.0" + +mongoose@*, mongoose@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.1.1.tgz#2ea2dcdcf4943196f585b3915f63001e79214e1b" + integrity sha512-DbLb0NsiEXmaqLOpEz+AtAsgwhRw6f25gwa1dF5R7jj6lS1D8X6uTdhBSC8GDVtOwe5Tfw2EL7nTn6hiJT3Bgg== + dependencies: + bson "^6.2.0" + kareem "2.5.1" + mongodb "6.3.0" + mpath "0.9.0" + mquery "5.0.0" + ms "2.1.3" + sift "16.0.1" + +mpath@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" + integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== + +mquery@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-5.0.0.tgz#a95be5dfc610b23862df34a47d3e5d60e110695d" + integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== + dependencies: + debug "4.x" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next-auth@^4.24.5: + version "4.24.5" + resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.24.5.tgz#1fd1bfc0603c61fd2ba6fd81b976af690edbf07e" + integrity sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og== + dependencies: + "@babel/runtime" "^7.20.13" + "@panva/hkdf" "^1.0.2" + cookie "^0.5.0" + jose "^4.11.4" + oauth "^0.9.15" + openid-client "^5.4.0" + preact "^10.6.3" + preact-render-to-string "^5.1.19" + uuid "^8.3.2" + +next@14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69" + integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== + dependencies: + "@next/env" "14.1.0" + "@swc/helpers" "0.5.2" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + graceful-fs "^4.2.11" + postcss "8.4.31" + styled-jsx "5.1.1" + optionalDependencies: + "@next/swc-darwin-arm64" "14.1.0" + "@next/swc-darwin-x64" "14.1.0" + "@next/swc-linux-arm64-gnu" "14.1.0" + "@next/swc-linux-arm64-musl" "14.1.0" + "@next/swc-linux-x64-gnu" "14.1.0" + "@next/swc-linux-x64-musl" "14.1.0" + "@next/swc-win32-arm64-msvc" "14.1.0" + "@next/swc-win32-ia32-msvc" "14.1.0" + "@next/swc-win32-x64-msvc" "14.1.0" + +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +oauth@^0.9.15: + version "0.9.15" + resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" + integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6, object.entries@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.6, object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +oidc-token-hash@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" + integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +openid-client@^5.4.0: + version "5.6.4" + resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.6.4.tgz#b2c25e6d5338ba3ce00e04341bb286798a196177" + integrity sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA== + dependencies: + jose "^4.15.4" + lru-cache "^6.0.0" + object-hash "^2.2.0" + oidc-token-hash "^5.0.3" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@^6.0.11: + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8, postcss@^8.4.23: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +preact-render-to-string@^5.1.19: + version "5.2.6" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604" + integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw== + dependencies: + pretty-format "^3.8.0" + +preact@^10.6.3: + version "10.19.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" + integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +pretty-format@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" + integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0, punycode@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-hook-form@^7.49.3: + version "7.49.3" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.49.3.tgz#576a4567f8a774830812f4855e89f5da5830435c" + integrity sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" + integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + is-regex "^1.1.4" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^6.0.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== + dependencies: + define-data-property "^1.1.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +sift@16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" + integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== + +signal-exit@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@^3.3.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.1.tgz#f512ca5d1dd4c9503c7d3d28a968f1ad8f5c839d" + integrity sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.19.1" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.1.11: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== + dependencies: + punycode "^2.3.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@^5: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-url@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" + integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== + dependencies: + tr46 "^4.1.1" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 4aaed1597e0673612bc74e22102054b94acd37a3 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 31 Jan 2024 14:05:09 +0530 Subject: [PATCH 06/56] feat: store signup data to mongodb --- models/userModels.ts | 2 +- src/app/api/login/route.ts | 0 src/app/api/signup/route.ts | 22 +++++-- src/components/formAction/formAction.tsx | 52 +++++++++-------- .../loadingButton/loadingButton.tsx | 28 +++++++++ src/components/login/login.tsx | 9 ++- src/components/signup/signup.tsx | 57 +++++++++++-------- src/constants/apiUrl.ts | 3 + src/types/types.ts | 3 +- 9 files changed, 120 insertions(+), 56 deletions(-) create mode 100644 src/app/api/login/route.ts create mode 100644 src/components/loadingButton/loadingButton.tsx create mode 100644 src/constants/apiUrl.ts diff --git a/models/userModels.ts b/models/userModels.ts index 3cdf633..a1dd052 100644 --- a/models/userModels.ts +++ b/models/userModels.ts @@ -1,7 +1,7 @@ import mongoose, { Schema } from "mongoose"; const userSchema = new Schema({ - name:{type:String, required: true}, + username:{type:String, required: true}, email:{type:String, required: true, unique:true}, password:{type:String, required: true} },{ diff --git a/src/app/api/login/route.ts b/src/app/api/login/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/app/api/signup/route.ts b/src/app/api/signup/route.ts index 3d5c85a..9e6f464 100644 --- a/src/app/api/signup/route.ts +++ b/src/app/api/signup/route.ts @@ -6,11 +6,25 @@ export async function POST(req: Request) { try { await connectMongoDb(); const { username, email, password } = await req.json(); - const exists = await User.findOne({ $or: [{ username }] }); + const exists = await User.findOne({ $or: [{ email }] }); + if (exists) { - return ( - NextResponse.json({ message: "Email Already Exist" }), { status: 500 } + return NextResponse.json( + { message: "User already exist", status: false }, + { status: 500 } ); } - } catch (error) {} + const hashedPassword = await bcrypt.hash(password, 10); + await User.create({ username, email, password: hashedPassword }); + console.log("user created"); + return NextResponse.json( + { message: "User Registered...!!", status: true }, + { status: 201 } + ); + } catch (error) { + return NextResponse.json( + { message: "Error while registering user", status: false }, + { status: 500 } + ); + } } diff --git a/src/components/formAction/formAction.tsx b/src/components/formAction/formAction.tsx index c9a51d4..2c7b0c9 100644 --- a/src/components/formAction/formAction.tsx +++ b/src/components/formAction/formAction.tsx @@ -1,26 +1,30 @@ -import { ParseOptions } from "querystring"; +import LoadingButton from "../loadingButton/loadingButton"; export default function FormAction({ - handleSubmit, - buttonType='Button', - action='submit', - text -}:Partial){ - return( - <> - { - buttonType==='Button' ? - - : - <> - } - - ) -} \ No newline at end of file + handleSubmit, + loading, + buttonType = "Button", + action = "submit", + text, +}: Partial) { + return ( + <> + {buttonType === "Button" ? ( + + ) : ( + <> + )} + + ); +} diff --git a/src/components/loadingButton/loadingButton.tsx b/src/components/loadingButton/loadingButton.tsx new file mode 100644 index 0000000..06b8106 --- /dev/null +++ b/src/components/loadingButton/loadingButton.tsx @@ -0,0 +1,28 @@ +import React from "react"; + +const LoadingButton = () => { + return ( + <> + + Processing... + + ); +}; + +export default LoadingButton; diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index 3b83105..1016bc6 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -6,15 +6,18 @@ import FormExtra from "../formExtra/formExtra"; import FormAction from "../formAction/formAction"; const fields: LoginFields[] = loginFields; -let fieldsState = {}; +let fieldsState:Record = {}; fields.forEach((field) => (fieldsState[field.name] = "")); // console.log({ fieldsState }); export default function Login() { - const [loginState, setLoginState] = useState(fieldsState); + const [loginState, setLoginState] = useState({ + email:"", + password:"", + }); console.log({loginState}) const handleChange = (e: React.ChangeEvent) => { - console.log(e.target.name, e.target.value) + // console.log(e.target.name, e.target.value) setLoginState({ ...loginState, [e.target.name]: e.target.value }); }; const handleSubmit = (e: FormEvent) => { diff --git a/src/components/signup/signup.tsx b/src/components/signup/signup.tsx index ad17917..e9c2aee 100644 --- a/src/components/signup/signup.tsx +++ b/src/components/signup/signup.tsx @@ -1,18 +1,9 @@ -"use client" +"use client"; import { signupFields } from "@/constants/formFields"; import React, { useState } from "react"; import FormAction from "../formAction/formAction"; import Input from "../input/input"; - -interface LoginFields { - id: string; - name: string; - labelText: string; - labelFor: string; - type: string; - isRequired: boolean; - placeholder: string; -} +import { signup } from "@/constants/apiUrl"; const fields: LoginFields[] = signupFields; let fieldsState: Record = {}; @@ -20,36 +11,47 @@ fields.forEach((field) => (fieldsState[field.name] = "")); const Signup = () => { const [signupState, setSignupState] = useState(fieldsState); - - const handleChange = (e: React.ChangeEvent) => { + const [loading, setLoading] = useState(false); + const [apiResponse, setApiResponse] = useState({ + status: "", + message: "", + }); + const handleChange = ( + e: React.ChangeEvent + ) => { setSignupState({ ...signupState, [e.target.name]: e.target.value }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { - const res = await fetch("api/signup", { + setLoading(true); + const res = await fetch(signup, { method: "POST", headers: { - "Content-Type": "application/json" + "Content-Type": "application/json", }, - body: JSON.stringify(signupState) + body: JSON.stringify(signupState), }); - + const data = await res.json(); if (res.ok) { - const form = e.target as HTMLFormElement; - form.reset(); + setApiResponse(data); + setSignupState(fieldsState); + setLoading(false); } else { + setApiResponse(data); + setLoading(false); throw new Error("Failed to create account"); } } catch (error) { - console.error("Error creating account:", error); + setLoading(false); + console.error("Error creating account:", error?.message); } }; return ( -
-
+ +
{fields.map((field) => ( { /> ))}
- + + {apiResponse?.message && ( +

+ {apiResponse?.message} +

+ )} ); }; diff --git a/src/constants/apiUrl.ts b/src/constants/apiUrl.ts new file mode 100644 index 0000000..af4f5cf --- /dev/null +++ b/src/constants/apiUrl.ts @@ -0,0 +1,3 @@ +export const signup = "api/signup"; + +export const login = "api/login" \ No newline at end of file diff --git a/src/types/types.ts b/src/types/types.ts index 7797391..1cae2f4 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -19,6 +19,7 @@ interface LoginFields { interface FormActionsProps{ handleSubmit:(e:React.FormEvent)=>void, + loading: boolean, buttonType:string, action:'submit', text:string @@ -31,7 +32,7 @@ interface InputProps extends LoginFields { } interface UserSchema { - name: string, + username: string, email:string, password:string, } From 7bdd28784d89aa775ddecf7c8487663f3e5ca99f Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 31 Jan 2024 18:04:02 +0530 Subject: [PATCH 07/56] feat: add next-auth for login --- middlleware.ts | 4 -- src/app/api/auth/[...nextauth]/route.ts | 63 +++++++++++++++++++ src/app/layout.tsx | 5 +- src/app/page.tsx | 9 ++- src/components/formAction/formAction.tsx | 10 +++ src/components/formExtra/formExtra.tsx | 10 +-- src/components/login/login.tsx | 77 ++++++++++++++++++------ src/components/signup/signup.tsx | 13 +--- src/middlleware.ts | 4 ++ src/types/types.ts | 16 +++++ 10 files changed, 169 insertions(+), 42 deletions(-) delete mode 100644 middlleware.ts create mode 100644 src/app/api/auth/[...nextauth]/route.ts create mode 100644 src/middlleware.ts diff --git a/middlleware.ts b/middlleware.ts deleted file mode 100644 index a05bd76..0000000 --- a/middlleware.ts +++ /dev/null @@ -1,4 +0,0 @@ -export {default} from "next-auth/middleware"; -export const config = { - matcher: ["/", "/profile", "/room:code"], -}; \ No newline at end of file diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..2bd9613 --- /dev/null +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,63 @@ +import NextAuth from "next-auth/next"; +import CredentialProvider from "next-auth/providers/credentials"; +import connectMongoDb from "../../../../../utils/dbConnection"; +import User from "../../../../../models/userModels"; +import bcrypt from "bcrypt"; + +async function login(credentials:Credentials) { + try{ + connectMongoDb(); + const user = await User.findOne({email:credentials?.email}) + if(!user) throw new Error("Invalid User Credentials") + const isCorrect = await bcrypt.compare(credentials?.password, user?.password) + if(!isCorrect) throw new Error("Invalid User Credentials"); + return user; + }catch(err){ + throw new Error(err.message) + } +} +export const authOptions = { + pages: { + signIn: "/login", + }, + providers: [ + CredentialProvider({ + name: "credentials", + credentials: {}, + async authorize(credentials) { + try { + const user = await login(credentials); + console.log({ user }); + return user; + } catch (error) { + console.log({ error }); + throw new Error (error.message) + } + }, + }), + ], + callbacks:{ + async jwt({token, user}){ + // console.log({token, user}) + if(user){ + token.username= user.username; + token.email = user.email; + token.id = user.id; + } + return token; + }, + async session({session, token}){ + // console.log({session, token}) + if(token){ + session.user.username=token.username; + session.user.email=token.email; + session.id=token.id; + } + return session; + } + } +}; + +const handler = NextAuth(authOptions); + +export {handler as GET, handler as POST}; \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index c101323..d7b682f 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,7 +1,6 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; - const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -16,7 +15,9 @@ export default function RootLayout({ }>) { return ( - {children} + + {children} + ); } diff --git a/src/app/page.tsx b/src/app/page.tsx index 49fece3..9d901f2 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,10 +1,17 @@ import Header from "@/components/header/header"; import Login from "@/components/login/login"; +import { getServerSession } from "next-auth"; -export default function Dashboard() { +export default async function Dashboard() { + const session = await getServerSession(); + console.log({session}) return (

Welcome to dashboard

+ {session && <> +

{session?.email}

+ + }
); } diff --git a/src/components/formAction/formAction.tsx b/src/components/formAction/formAction.tsx index 2c7b0c9..0900567 100644 --- a/src/components/formAction/formAction.tsx +++ b/src/components/formAction/formAction.tsx @@ -1,6 +1,7 @@ import LoadingButton from "../loadingButton/loadingButton"; export default function FormAction({ + apiResponse, handleSubmit, loading, buttonType = "Button", @@ -25,6 +26,15 @@ export default function FormAction({ ) : ( <> )} + {apiResponse?.message && ( +

+ {apiResponse?.message} +

+ )} ); } diff --git a/src/components/formExtra/formExtra.tsx b/src/components/formExtra/formExtra.tsx index ec4bfc6..743b15c 100644 --- a/src/components/formExtra/formExtra.tsx +++ b/src/components/formExtra/formExtra.tsx @@ -1,6 +1,8 @@ +import Link from "next/link"; + export default function FormExtra(){ return( -
+
- diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index 1016bc6..2847491 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -1,41 +1,73 @@ "use client"; -import { FormEvent, useState } from "react"; +import { FormEvent, useReducer, useState } from "react"; import Input from "../input/input"; import { loginFields } from "@/constants/formFields"; import FormExtra from "../formExtra/formExtra"; import FormAction from "../formAction/formAction"; +import { signIn } from "next-auth/react"; +import { useRouter } from "next/navigation"; + +interface LoginState { + email: string; + password: string; +} const fields: LoginFields[] = loginFields; -let fieldsState:Record = {}; -fields.forEach((field) => (fieldsState[field.name] = "")); -// console.log({ fieldsState }); export default function Login() { - const [loginState, setLoginState] = useState({ - email:"", - password:"", + const [loginState, setLoginState] = useState({ + email: "", + password: "", }); -console.log({loginState}) - const handleChange = (e: React.ChangeEvent) => { - // console.log(e.target.name, e.target.value) - setLoginState({ ...loginState, [e.target.name]: e.target.value }); + + const router = useRouter(); + + const [loading, setLoading] = useState(false); + const [apiResponse, setApiResponse] = useState({ + status: "", + message: "", + }); + const handleChange = ( + e: React.ChangeEvent + ) => { + const { name, value } = e.target; + setLoginState({ ...loginState, [name]: value }); }; - const handleSubmit = (e: FormEvent) => { + + const handleSubmit = async (e: FormEvent) => { e.preventDefault(); - authenticateUser(); + try { + setLoading(true); + const res = await signIn("credentials", { + email: loginState?.email, + password: loginState?.password, + redirect: false, + }); + console.log({ res }); + if (res.error) { + setLoading(false); + setApiResponse({ message: res.error, status: res.ok }); + return null; + } else { + setLoading(false); + setApiResponse({ message: "", status: res.ok }); + } + } catch (error) { + setLoading(false); + console.error("something went wrong: ", error.message); + return null; + } + router.push("/"); }; - //Handle Login API Integration here - const authenticateUser = () => {}; - return ( -
-
+ +
{fields.map((field) => ( - + ); } diff --git a/src/components/signup/signup.tsx b/src/components/signup/signup.tsx index e9c2aee..9b7c50d 100644 --- a/src/components/signup/signup.tsx +++ b/src/components/signup/signup.tsx @@ -12,7 +12,7 @@ fields.forEach((field) => (fieldsState[field.name] = "")); const Signup = () => { const [signupState, setSignupState] = useState(fieldsState); const [loading, setLoading] = useState(false); - const [apiResponse, setApiResponse] = useState({ + const [apiResponse, setApiResponse] = useState({ status: "", message: "", }); @@ -67,16 +67,7 @@ const Signup = () => { /> ))}
- - {apiResponse?.message && ( -

- {apiResponse?.message} -

- )} + ); }; diff --git a/src/middlleware.ts b/src/middlleware.ts new file mode 100644 index 0000000..a216ba3 --- /dev/null +++ b/src/middlleware.ts @@ -0,0 +1,4 @@ +export { default } from "next-auth/middleware"; +export const config = { + matcher: ["/*"], +}; diff --git a/src/types/types.ts b/src/types/types.ts index 1cae2f4..a4b8a61 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -17,7 +17,13 @@ interface LoginFields { placeholder: string; } +interface ApiResponse{ + message:string, + status: boolean | string +} + interface FormActionsProps{ + apiResponse: ApiResponse handleSubmit:(e:React.FormEvent)=>void, loading: boolean, buttonType:string, @@ -25,6 +31,7 @@ interface FormActionsProps{ text:string } + interface InputProps extends LoginFields { handleChange: (e:React.ChangeEvent) => void; value: string; @@ -36,3 +43,12 @@ interface UserSchema { email:string, password:string, } + +interface Credentials{ + email:string, + password: string, + redirect: string, + csrfToken: string, + callbackUrl: string, + json: string +} \ No newline at end of file From 3217a753052521d5d2772dd2fca7352eb6a80dc7 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 1 Feb 2024 15:14:43 +0530 Subject: [PATCH 08/56] refact: resolve next-auth login error --- assets/profileIcon.png | Bin 0 -> 1622 bytes models/userModels.ts | 2 +- .../{(auth) => (verify)}/login/loading.tsx | 0 src/app/{(auth) => (verify)}/login/page.tsx | 0 .../{(auth) => (verify)}/signup/loading.tsx | 0 src/app/{(auth) => (verify)}/signup/page.tsx | 0 src/app/api/auth/[...nextauth]/route.ts | 15 ++++++----- src/app/api/login/route.ts | 0 src/app/api/signup/route.ts | 7 ++--- src/app/layout.tsx | 11 +++++--- src/app/page.tsx | 25 ++++++++++++------ src/components/login/login.tsx | 16 ++++++++--- src/constants/formFields.ts | 12 ++++----- src/middlleware.ts | 2 +- tsconfig.json | 1 + utils/sessionProvider.tsx | 9 +++++++ 16 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 assets/profileIcon.png rename src/app/{(auth) => (verify)}/login/loading.tsx (100%) rename src/app/{(auth) => (verify)}/login/page.tsx (100%) rename src/app/{(auth) => (verify)}/signup/loading.tsx (100%) rename src/app/{(auth) => (verify)}/signup/page.tsx (100%) delete mode 100644 src/app/api/login/route.ts create mode 100644 utils/sessionProvider.tsx diff --git a/assets/profileIcon.png b/assets/profileIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..13aaec36dd701722f62fa843ae69e935ed4cb88a GIT binary patch literal 1622 zcmV-c2C4apP)C@KiKa92rY{xtrP;KH4VwrEkd=ub>E{}9o%LW6MB7NV$?C%#8Byiv1v?|U;^ z?}G!wynD|%_j~W&d+s@xF~&&e!bs=BNaw;x=fX(m!bs=B9B$NH+E)0nyRX)YsQXjz({9FP%DdYVQ!>?(R-C zH8u3}=TCALVC&(-hveqwwz~uvjYb+88lv68`}glDC@5%m2#AS^q51iF+HGJ5iHnPK zE&(YiDYUY(LVE?v%gdCUoa`I|;^N{|5B|%SFVxo7M&;$@l#!7^Nl8i4bP5OvphJfa zNdjBr=^6M*8;co6w-KL*(Y>NRi!Nf(b3V|`+Q?# zqb5;XOG^tk0Y85HpvcHbZ3r+J4BQbOrpm#C2UQOq;_dBCg@uK*y1L5c1Hy5IFM#dX z0I@wU&YwT8$>8OZmzT%w2exa~1oUtoY$hfq9C2Ww0|yRB+b0j+ym_OJfQX0)PR@z$ z-o2~&;H}cs)Wq#iSXh`i0hN`N+y*aQx@4#0`t|Gd>C-1_ZEdCe{CqN*OcWd(EX{4K z6WApVA3jVcPMo02moL+uJ9lVoY>WyD3by!@o}SL_PenzAI03T)$qWoc{@IEqM6m0e zJbBX2AG}RoeE$4di~yt2DCD@Or>9NFnKNfd4W2%IYUh)WkB^X^zeI;@+Xu+ui2!fi zs-v{Dl+*xUfv>NxO&_L=2yWfF#ZQ3QY!)&m*U{0@L28kinQ5m}1a)1k4L&d*nK_NSa_5 zQA>cuV&NxXZEa2Ur?#=NL23a%UdUQ)W^cBUcSFe-|o)nkHMD|}GDk@5;BU=Q0MSumD z;~o)H)DY=qkweUpBS&mHP%}Vc^G`PLOkP(&U+8dfZGtH-j}HzGDslk({*4CF)7XSbN07*qoM6N<$g2$}({ - username:{type:String, required: true}, + name:{type:String, required: true}, email:{type:String, required: true, unique:true}, password:{type:String, required: true} },{ diff --git a/src/app/(auth)/login/loading.tsx b/src/app/(verify)/login/loading.tsx similarity index 100% rename from src/app/(auth)/login/loading.tsx rename to src/app/(verify)/login/loading.tsx diff --git a/src/app/(auth)/login/page.tsx b/src/app/(verify)/login/page.tsx similarity index 100% rename from src/app/(auth)/login/page.tsx rename to src/app/(verify)/login/page.tsx diff --git a/src/app/(auth)/signup/loading.tsx b/src/app/(verify)/signup/loading.tsx similarity index 100% rename from src/app/(auth)/signup/loading.tsx rename to src/app/(verify)/signup/loading.tsx diff --git a/src/app/(auth)/signup/page.tsx b/src/app/(verify)/signup/page.tsx similarity index 100% rename from src/app/(auth)/signup/page.tsx rename to src/app/(verify)/signup/page.tsx diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts index 2bd9613..f1554e2 100644 --- a/src/app/api/auth/[...nextauth]/route.ts +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -1,12 +1,12 @@ import NextAuth from "next-auth/next"; -import CredentialProvider from "next-auth/providers/credentials"; +import CredentialsProvider from "next-auth/providers/credentials"; import connectMongoDb from "../../../../../utils/dbConnection"; import User from "../../../../../models/userModels"; import bcrypt from "bcrypt"; async function login(credentials:Credentials) { try{ - connectMongoDb(); + await connectMongoDb(); const user = await User.findOne({email:credentials?.email}) if(!user) throw new Error("Invalid User Credentials") const isCorrect = await bcrypt.compare(credentials?.password, user?.password) @@ -21,16 +21,17 @@ export const authOptions = { signIn: "/login", }, providers: [ - CredentialProvider({ + CredentialsProvider({ + id:"credentials", name: "credentials", credentials: {}, async authorize(credentials) { try { - const user = await login(credentials); - console.log({ user }); + const user = await login(credentials); + console.log("user from auth route",{user}) return user; } catch (error) { - console.log({ error }); + console.log( error.message ); throw new Error (error.message) } }, @@ -58,6 +59,6 @@ export const authOptions = { } }; -const handler = NextAuth(authOptions); +export const handler = NextAuth(authOptions); export {handler as GET, handler as POST}; \ No newline at end of file diff --git a/src/app/api/login/route.ts b/src/app/api/login/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/api/signup/route.ts b/src/app/api/signup/route.ts index 9e6f464..5348972 100644 --- a/src/app/api/signup/route.ts +++ b/src/app/api/signup/route.ts @@ -5,9 +5,10 @@ import bcrypt from "bcrypt"; export async function POST(req: Request) { try { await connectMongoDb(); - const { username, email, password } = await req.json(); + const { name, email, password } = await req.json(); + console.log({ name, email, password }) const exists = await User.findOne({ $or: [{ email }] }); - + console.log({exists}) if (exists) { return NextResponse.json( { message: "User already exist", status: false }, @@ -15,7 +16,7 @@ export async function POST(req: Request) { ); } const hashedPassword = await bcrypt.hash(password, 10); - await User.create({ username, email, password: hashedPassword }); + await User.create({ name, email, password: hashedPassword }); console.log("user created"); return NextResponse.json( { message: "User Registered...!!", status: true }, diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d7b682f..c12108b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,8 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; +import { getServerSession } from "next-auth"; +import AuthProvider from "../../utils/sessionProvider"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -8,15 +10,16 @@ export const metadata: Metadata = { description: "Tic Tac Toe Game developed using next.js + typescript", }; -export default function RootLayout({ +export default async function RootLayout({ children, -}: Readonly<{ +}: { children: React.ReactNode; -}>) { +}) { + const session = await getServerSession(); return ( - {children} + {children} ); diff --git a/src/app/page.tsx b/src/app/page.tsx index 9d901f2..4f051d5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,17 +1,26 @@ -import Header from "@/components/header/header"; -import Login from "@/components/login/login"; +import ProfileModal from "@/components/profileModal/profileModal"; import { getServerSession } from "next-auth"; +import { redirect } from "next/navigation"; export default async function Dashboard() { const session = await getServerSession(); - console.log({session}) + + if(!session){ + redirect('/login') + } + + console.log("session Dashboard:" , session ) + return ( -
-

Welcome to dashboard

- {session && <> -

{session?.email}

+
+ - } +

Welcome to dashboard

+ {session && ( + <> +

{session?.user?.email}

+ + )}
); } diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index 2847491..a7147af 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -1,10 +1,10 @@ "use client"; -import { FormEvent, useReducer, useState } from "react"; +import { FormEvent, useEffect, useReducer, useState } from "react"; import Input from "../input/input"; import { loginFields } from "@/constants/formFields"; import FormExtra from "../formExtra/formExtra"; import FormAction from "../formAction/formAction"; -import { signIn } from "next-auth/react"; +import { signIn, useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; interface LoginState { @@ -15,12 +15,21 @@ interface LoginState { const fields: LoginFields[] = loginFields; export default function Login() { + const router = useRouter(); + const session = useSession(); + console.log("session",{session}) + useEffect(()=>{ + console.log(session?.status) + if(session?.status === "authenticated"){ + router.push('/') + } + },[session?.status]) const [loginState, setLoginState] = useState({ email: "", password: "", }); - const router = useRouter(); + const [loading, setLoading] = useState(false); const [apiResponse, setApiResponse] = useState({ @@ -49,7 +58,6 @@ export default function Login() { setApiResponse({ message: res.error, status: res.ok }); return null; } else { - setLoading(false); setApiResponse({ message: "", status: res.ok }); } } catch (error) { diff --git a/src/constants/formFields.ts b/src/constants/formFields.ts index ed72c42..ba66cd3 100644 --- a/src/constants/formFields.ts +++ b/src/constants/formFields.ts @@ -23,14 +23,14 @@ const loginFields=[ const signupFields=[ { - labelText:"Username", - labelFor:"username", - id:"username", - name:"username", + labelText:"Name", + labelFor:"name", + id:"name", + name:"name", type:"text", - autoComplete:"username", + autoComplete:"name", isRequired:true, - placeholder:"Username" + placeholder:"name" }, { labelText:"Email address", diff --git a/src/middlleware.ts b/src/middlleware.ts index a216ba3..76e6e68 100644 --- a/src/middlleware.ts +++ b/src/middlleware.ts @@ -1,4 +1,4 @@ export { default } from "next-auth/middleware"; export const config = { - matcher: ["/*"], + matcher: ["/"], }; diff --git a/tsconfig.json b/tsconfig.json index 7b28589..54698a4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "target": "es2017", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, diff --git a/utils/sessionProvider.tsx b/utils/sessionProvider.tsx new file mode 100644 index 0000000..0890bd0 --- /dev/null +++ b/utils/sessionProvider.tsx @@ -0,0 +1,9 @@ +'use client'; +import React from "react"; +import { SessionProvider } from "next-auth/react"; + +const AuthProvider = ({children}:any)=>{ + return {children} +} + +export default AuthProvider; \ No newline at end of file From 00cea5657323217c93b2f936c905a195085df06d Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 1 Feb 2024 15:16:27 +0530 Subject: [PATCH 09/56] feat: add profile menu dropdown --- src/app/page.tsx | 4 +- src/components/profileModal/profileModal.tsx | 65 ++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/components/profileModal/profileModal.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx index 4f051d5..2c8bf03 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -13,7 +13,9 @@ export default async function Dashboard() { return (
- +
+ +

Welcome to dashboard

{session && ( diff --git a/src/components/profileModal/profileModal.tsx b/src/components/profileModal/profileModal.tsx new file mode 100644 index 0000000..190d032 --- /dev/null +++ b/src/components/profileModal/profileModal.tsx @@ -0,0 +1,65 @@ +"use client"; +import { useEffect, useRef, useState } from "react"; +import Image from "next/image"; +import profileImage from "../../../assets/profileIcon.png"; +import { signOut } from "next-auth/react"; +import { useRouter } from "next/navigation"; + +const ProfileModal = () => { + const [openModal, setOpenModal] = useState(false); + return ( +
+ + + {openModal && ( +
setOpenModal(false)} + className="absolute top-full right-0 me-1 md:me-2 mt-2 w-48 bg-white rounded shadow-md z-10 flex flex-col items-center justify-center" + > +
+ profile Image + +

Md Karman

+
+ +
    +
  • + Profile +
  • +
+ +
+ +
+
+ )} +
+ ); +}; + +export default ProfileModal; From b4086b56bfb946b980f29a4379d2b459d2bcf01d Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Fri, 2 Feb 2024 19:17:35 +0530 Subject: [PATCH 10/56] feat: Add Dashboard UI --- assets/draw.png | Bin 0 -> 2394 bytes assets/lose.png | Bin 0 -> 1185 bytes assets/toatlGame.png | Bin 0 -> 1182 bytes assets/trophy.png | Bin 0 -> 1729 bytes src/app/api/user/[email]/route.ts | 28 ++++++ src/app/globals.css | 6 ++ src/app/page.tsx | 94 +++++++++++++++---- src/app/room/[code]/page.tsx | 11 +++ src/components/dashboardCard/card.tsx | 19 ++++ src/components/login/login.tsx | 1 - src/components/profileModal/profileModal.tsx | 2 +- src/components/startGame/startGame.tsx | 42 +++++++++ src/constants/apiUrl.ts | 4 +- utils/code.ts | 0 14 files changed, 188 insertions(+), 19 deletions(-) create mode 100644 assets/draw.png create mode 100644 assets/lose.png create mode 100644 assets/toatlGame.png create mode 100644 assets/trophy.png create mode 100644 src/app/api/user/[email]/route.ts create mode 100644 src/app/room/[code]/page.tsx create mode 100644 src/components/dashboardCard/card.tsx create mode 100644 src/components/startGame/startGame.tsx create mode 100644 utils/code.ts diff --git a/assets/draw.png b/assets/draw.png new file mode 100644 index 0000000000000000000000000000000000000000..92443266a8171d9d4f6ad4a9830165a24acc392d GIT binary patch literal 2394 zcmV-g38nUlP)X+U&p(uO8+oN1&;BE?b|wI7ZGI%a@QkO>6Z4E(egRybb{-++nNY5W?!BQv}Wcs(|@LCzdCG1;9?=^imM31dah`6`fd~ z06GEnz|f?9Tcx1aMN(A=;b4lsML`JRfTUfLE=bxpjR0Cns*4r?!+<(}-UPl8U5>!Z zG2^uj7#klLcm=p2R<<3O(p;JIlz2XA1kez=NP1h+NJ)=Lx<(zr-*Z#SToz&(=6ByEb+Pmpb??@PKqJ|=KJFeqzYiy{EW zc1h)t_peJ@hOhMc0}9f5BFt0g@rX?6%CgilcW$rt)%7ppc;(urvork zQf8|oD* zMkh(#Wd^d+X+;fa=>SXw_O=M|CIIXOZYl+#%iWvnUUXu4!c__1O^Qw|02_f{0Ue4? zuz7wuIxoL>l}UsEd{NR%F&%7+viXR{M>Ci3p#6uM@IgN#FDFCg3>A*f0940J9E_XPl`aNcq}mN(Nre*r`~ zeH!>HPz~GxoR$gq1psIlTcvp=O;QQKJGSx3*8rPKg{eRzgLcN!UGHJ>`CKB- zhqtK!)_MKNBzl`AiXwo>;2khWfd-5OvlFa~%V3tzirNizkH#S=h`&>&zD=2{=~ zRdFh8pM@F01lS{~x1?%GlS2q=NlL3o z&`OrkxlGcI5W>bH^OB?6RnpD=94ML%z+BWFz^q8wmA>Wu!5tginW+bEYhtXA7063_ zU<&YSr?mx`0hAY00Qa~6+WGrAz5}eq?hjlKd<63VH#;9s5b-F1j{{EwM}Qs)=?7p4 zun@b*RgGPx=@)NUhu!uX2ei*<@)hn2Oo)^%#GIs)93*G;Ble6oo?0eIL|V7_CGV!8+y((Y6`>+Gk=KAG?Py<|%gr@gz1FXWX z>719ee{`VMSY~Ab@GoDQzoUWFQX~BXa0M{cbv^I2d0HWOzeT_vV(xcA@PP*cKX#_N zW;S@!H0QfI49T<4T(=vU-y(@JwGvoQ30&DELI7^VT~)5cq;G#nfA9BecpeA7TaOLJPRmSL1>#Y30k%bf4&xL{5%;MS$h>{({{Q zy(S}?J%NMR6+2<~6n>BsNXY>7!kn6E4b;u?eSbgZYd_@gJu{*`%JqF@7UQL5Vk&S_ zA`;8a)?+8HJtF0=0=K86)jsY+U}pdafs50OSulXX*a`ASBW3e_@|%IPBjsJ3+0Uk= zH4i(8DUX!3a$B&zu$dG9%-7!ye9f5wSj~yc(YbTQKVb(K-v=sF&?(0}(YO$DcY+eR z=$Qd?mG8oWj%r{1Y46c67MwTT5&=&L5-gT9z$9#b3?85$AGzr^A zhk5-{U}^(njr4wX*m2u~nD;rjlygc9;BhQ4ngmSquU<_gy@e%4zwN(gxzLt3uyVFy z?)EBdn;li^`6Pzhg!_EbHCQMco%~r|H!)H++l8<VdJ^a0=>v6SP`96`hcVm7-1#koZ4;M8tzkRt+_zAZS z&texCpYgAKFYr14>R)YXo->CFVH)NG+|CE%h4Gjtc>wqxEpTl9U!WZzAM+Tv>;M1& M07*qoM6N<$f{-U!U;qFB literal 0 HcmV?d00001 diff --git a/assets/lose.png b/assets/lose.png new file mode 100644 index 0000000000000000000000000000000000000000..655d24bb140231cc40fb7ed1b68f2df37d3284ff GIT binary patch literal 1185 zcmV;S1YY}zP){lULe-wLq)7p3c{SuE5>E%5n-(%ur_l^%3!kdLb|o zXy_z>Bfz$Z__-ngb!bxV4!oQAw*$w3hKShHNdQ%;kOjTS^89(ST>b@Ens~j=RB*^0 zf!YQf0``-g`9R>@h`8nd2&6Uw%Yl8si$Fi%SpE`j0d@nQrS$}0#AyWRR;BQa1-6py z>Uv-_@N5T!YP-5EjrN4PRsbv2vVheE>LqDDSly~#l~b6^u}GajhAU6a7}P_I-MMnI& zlJ!zI7SixmvKOq8tat$YO?D}lM#P6zc490rBMl?M#IFNZ03Sp|o7xTd4%kU{8MhZZ zdNVg)S0(5G^)+>Rsm4Ver!G@NU9L7K{(7}bL9cjwPvqt&D*=dzed?pY)xa2_Jr{fy zFdUc{5vnafn|cm#JR(lT$)9;|;MZJ?Luyk*{8jSoGs%PcaXRE8r=w7Nmp>9w&t2@>0>gz>%t?KYfaqE&|J5RCjg;z!r6Bw!5f1ENFcPoU0;I{{%(@qa&iJ1CzOs)F-nNZfnPGK&ky}`i!k-jD|Y(Eu{fQ zs_&{J^6**(>?wgbmHfO@_EOZIQLU7YmSnqtp1_Y3Rr5ITRz&Pe{fXpV>jBUvsZVD* z2UO&Z>W0*Pt~Qi(-==&@J!7=D1YK%zEAmmm6yPv$2XKE$cQSch8E6kc&*Wz+@)v=> z6Uav319fuhF6$oXp8RY@{tB=sBKE0sfSJH=R{}tfBJ-4S3h@Dy-Y zM10XMM0JolPo1vbr1mQ5R%K0hZ!1P6-jej0bqRf=dULJc5D~j0;**H@J|g~#i1Mk| zW=*Rz)M@2|h}Ki{R1P+|;q zbt|d^4O3UD2h`_E@@45TuwuVPZBiGgi`A2PDWN`;K9jOPO5Lm;R}ZP*sa?v!2B`-v zuHFyR`H|GUoc$pc0Q=QvOZ|0fQ?}=%&xDe`tGX@a8`SG-x(15J#?FX%6POQd0Uk|# zbMk(b)oG!4taew2Qk3mKsXLPVbjf}$#j(8_ml@00I(wgE=^r+6P~WkKJ7OEi-76Cr_}Btb)kAjy+^&*;*V%~>ZWDd9M1QW7HhFs$Z3M^iQ=-r}j(dr5AO+c)Xz*XK-nPAGPNc>ST42 wTK!?&uD;U&0F4&q`~P1=8SstTl3WS;58og)!6)n=g8%>k07*qoM6N<$f{OzrF8}}l literal 0 HcmV?d00001 diff --git a/assets/trophy.png b/assets/trophy.png new file mode 100644 index 0000000000000000000000000000000000000000..24824e034482544140a09362beda545d89295a86 GIT binary patch literal 1729 zcmV;y20rC31MtnM@f(XqYf>%{V%uFn~I0rh=s#^iF~W?FGrrr5!fFX<~o{j28znY=Z$V zdw-`tmc3l)E-WkGzkc(abH3+upXdC3_YqprhE89pP|MK2zziVq zNt)-V5vWp?lL9+41s_*U+PmRw7T~Sk(~FImEkG%73P=MM=mhe-3ia*jDyk!Z?*RV+ zVjuuTz#fkoHTJ-(A2yNY7@<_4TA?HGlT^jxhgH}Wt6MzbZ^;G#o53)a)tF4Emh>BNwrTln)87=TvVYhq;S48Rgvt`yzY;R3m104yAoWe6d(GE^Gh;5 zG1HjnZmeG+E(|a>O!MA-F82tG3r7J`Hzx;(3*C+PDO}W9X( z4~(&WMsAw>z5y7!dENoBVXfFOPkeY>oL3{ZT706vxPY1tH(os5p%>1NQj^#!F4T$( zL&Sw%xhdAVGI0TG{SbWgCvoAwv5S_Ajpm9AYesIG`+oKa00@PP#0637pHLg7iVKZm z{akSYoS)i~R#*OlH!gG%=a1o{?->{7i;GT(3tcXPG|}zNwPAs=;gAV#s&!$xxR7zi zF3JvOZp~l5xoV=Q{t7rE$O08LC=UX|nqqUq=yfyp18kYRy3ciq#Nk0}??^Wv;VX&I zCDZ+uU(Y@WQ1kUwWhz<+Y>Lrmj7Sh=i9!#-Od0XJ8Gp%Jzc(|{4c=g)`UMeLn7S4}yPukPK-H8;e@tdVATfPVoss#Kjl*7Xl#H;-+)v?edW zrK-Q@H=WaIbE}FxFG7*3{9J?;!+$n;2SCkT>xNkqKd36xfR9k_i$Z2g*{f4NzLIzA zH=-P!H(FaWV_l80VWB8<5bXnu1F*qAhtgj}mNjK~>Xz5Oe5@_LZ3bx3h}Dx119P{{ zuD%`E)3Pou>;;O3y)iz(~Ox1a8V%dZJAL&FTg`ZP8nSiR}UqA9^D4@{Nl=J?knOXSM6G6Tei^ z>o1pcc>ovM)AxdWK+wykTnXS1F!Q~o>6z_iP;`B}0Zj0B5%X=JL;IT3XfnKVxt#w2 Xg0}udOLylp00000NkvXXu0mjf+88vz literal 0 HcmV?d00001 diff --git a/src/app/api/user/[email]/route.ts b/src/app/api/user/[email]/route.ts new file mode 100644 index 0000000..02a1697 --- /dev/null +++ b/src/app/api/user/[email]/route.ts @@ -0,0 +1,28 @@ +import { NextResponse } from "next/server"; +import User from "../../../../../models/userModels"; +import connectMongoDb from "../../../../../utils/dbConnection"; +import { cookies } from "next/headers"; + +export async function GET( + _req: Request, + { params }: { params: { email: string } } +) { + await connectMongoDb(); + const user = await User.findOne({ email: params?.email }); + const cookieStore = cookies(); + const visited = cookieStore.get('visited'); + + if(visited){ + return NextResponse.json( + { message: "User found", data: user, status: true, existingUser:true }, + { status: 201 } + ); + } + + cookieStore.set("visited", "true") + + return NextResponse.json( + { message: "User found", data: user, status: true, existingUser:false }, + { status: 201 } + ); +} diff --git a/src/app/globals.css b/src/app/globals.css index 875c01e..118dc8c 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -31,3 +31,9 @@ body { text-wrap: balance; } } + +.text-gradient{ + background: linear-gradient(to right, #E3FF73, #E27C39); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 2c8bf03..b691e62 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,28 +1,90 @@ import ProfileModal from "@/components/profileModal/profileModal"; +import { user } from "@/constants/apiUrl"; import { getServerSession } from "next-auth"; import { redirect } from "next/navigation"; +import { isExistingUser } from "../../utils/isExistingUser"; +import DashboardCard from "@/components/dashboardCard/card"; +import Image from "next/image"; +import win from "./../../assets/trophy.png"; +import totalGame from "./../../assets/toatlGame.png"; +import lose from "./../../assets/lose.png"; +import draw from "./../../assets/draw.png"; +import Link from "next/link"; +import StartGame from "@/components/startGame/startGame"; + export default async function Dashboard() { const session = await getServerSession(); - - if(!session){ - redirect('/login') - } - - console.log("session Dashboard:" , session ) - + if (!session) { + redirect("/login"); + } + const res = await fetch(`${user}/${session?.user?.email}`); + const resData = await res.json(); + return (
-
- +
+
+

+ Welcome to online multiplayer Tic Tac Toe game +

+

+ {resData?.data?.name} +

+
+
+ +
+
+
+ +

Total Played

+
+ Total Game Played Icon +

0

+
+
+ +

Total Win

+
+ Total Game win Icon +

0

+
+
+ +

Total Lose

+
+ Total Game Lose Icon +

0

+
+
+ +

Total Draw

+
+ Total Game Lose Icon +

0

+
+
+
+
+
- -

Welcome to dashboard

- {session && ( - <> -

{session?.user?.email}

- - )}
); } diff --git a/src/app/room/[code]/page.tsx b/src/app/room/[code]/page.tsx new file mode 100644 index 0000000..2c5b1d1 --- /dev/null +++ b/src/app/room/[code]/page.tsx @@ -0,0 +1,11 @@ +import React from 'react' + +const Room = () => { + return ( +
+ +
+ ) +} + +export default Room diff --git a/src/components/dashboardCard/card.tsx b/src/components/dashboardCard/card.tsx new file mode 100644 index 0000000..9cb4c77 --- /dev/null +++ b/src/components/dashboardCard/card.tsx @@ -0,0 +1,19 @@ +const DashboardCard = ({ children }: { children: React.ReactNode }) => { + const cardStyle = { + // width: "10rem", + // height: "5rem", + margin: "10px", + border: "0px solid", + borderRadius: "20px", + background:"rgb(24,24,24)", + boxShadow: "0px 0px 5px 1px rgb(211, 211, 211)", // Adjust the RGB values for the lighting color + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + }; + + return
{children}
; +}; + +export default DashboardCard; diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index a7147af..14c735a 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -17,7 +17,6 @@ const fields: LoginFields[] = loginFields; export default function Login() { const router = useRouter(); const session = useSession(); - console.log("session",{session}) useEffect(()=>{ console.log(session?.status) if(session?.status === "authenticated"){ diff --git a/src/components/profileModal/profileModal.tsx b/src/components/profileModal/profileModal.tsx index 190d032..1777376 100644 --- a/src/components/profileModal/profileModal.tsx +++ b/src/components/profileModal/profileModal.tsx @@ -10,7 +10,7 @@ const ProfileModal = () => { return (
+
+ + + ); +}; + +export default StartGame; diff --git a/src/constants/apiUrl.ts b/src/constants/apiUrl.ts index af4f5cf..1d067b3 100644 --- a/src/constants/apiUrl.ts +++ b/src/constants/apiUrl.ts @@ -1,3 +1,5 @@ export const signup = "api/signup"; -export const login = "api/login" \ No newline at end of file +export const login = "api/login" + +export const user = 'http://localhost:3000/api/user' \ No newline at end of file diff --git a/utils/code.ts b/utils/code.ts new file mode 100644 index 0000000..e69de29 From 24dc5ec591855fa554779ab39d0f9775c9b0c620 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Mon, 5 Feb 2024 19:19:10 +0530 Subject: [PATCH 11/56] Fix: Resolve comment --- assets/loaderIcon.svg | 16 ++++ assets/{toatlGame.png => totalGame.png} | Bin src/middlleware.ts => middlleware.ts | 2 +- models/{userModels.ts => userModel.ts} | 0 src/app/(verify)/{login => }/loading.tsx | 0 src/app/(verify)/login/page.tsx | 17 ++-- src/app/(verify)/signup/loading.tsx | 7 -- src/app/(verify)/signup/page.tsx | 7 +- src/app/api/auth/[...nextauth]/route.ts | 73 ++++++++++------- src/app/api/signup/route.ts | 12 +-- src/app/api/user/[email]/route.ts | 18 ++-- src/app/layout.tsx | 8 +- src/app/page.tsx | 39 +++------ src/app/room/[code]/page.tsx | 23 ++++-- src/components/authProvider.tsx | 8 ++ src/components/dashboardCard/card.tsx | 22 ++--- .../formAdditionalLinks.tsx} | 2 +- .../header.tsx => formHeader/formHeader.tsx} | 17 ++-- src/components/input/input.tsx | 1 + .../loadingButton/loadingButton.tsx | 26 ++---- src/components/login/login.tsx | 29 +++---- src/components/profileModal/profileModal.tsx | 4 +- src/components/startGame/startGame.tsx | 77 ++++++++++++------ src/constants/formFields.ts | 1 + src/types/types.ts | 25 ++++-- tailwind.config.ts | 13 ++- utils/dbConnection.ts | 22 ++--- utils/sessionProvider.tsx | 9 -- 28 files changed, 263 insertions(+), 215 deletions(-) create mode 100644 assets/loaderIcon.svg rename assets/{toatlGame.png => totalGame.png} (100%) rename src/middlleware.ts => middlleware.ts (69%) rename models/{userModels.ts => userModel.ts} (100%) rename src/app/(verify)/{login => }/loading.tsx (100%) delete mode 100644 src/app/(verify)/signup/loading.tsx create mode 100644 src/components/authProvider.tsx rename src/components/{formExtra/formExtra.tsx => formAdditionalLinks/formAdditionalLinks.tsx} (93%) rename src/components/{header/header.tsx => formHeader/formHeader.tsx} (77%) delete mode 100644 utils/sessionProvider.tsx diff --git a/assets/loaderIcon.svg b/assets/loaderIcon.svg new file mode 100644 index 0000000..bf0c9f8 --- /dev/null +++ b/assets/loaderIcon.svg @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/assets/toatlGame.png b/assets/totalGame.png similarity index 100% rename from assets/toatlGame.png rename to assets/totalGame.png diff --git a/src/middlleware.ts b/middlleware.ts similarity index 69% rename from src/middlleware.ts rename to middlleware.ts index 76e6e68..1411c62 100644 --- a/src/middlleware.ts +++ b/middlleware.ts @@ -1,4 +1,4 @@ export { default } from "next-auth/middleware"; export const config = { - matcher: ["/"], + matcher: ["/", "room/:code*"], }; diff --git a/models/userModels.ts b/models/userModel.ts similarity index 100% rename from models/userModels.ts rename to models/userModel.ts diff --git a/src/app/(verify)/login/loading.tsx b/src/app/(verify)/loading.tsx similarity index 100% rename from src/app/(verify)/login/loading.tsx rename to src/app/(verify)/loading.tsx diff --git a/src/app/(verify)/login/page.tsx b/src/app/(verify)/login/page.tsx index 3a922d8..29f2a89 100644 --- a/src/app/(verify)/login/page.tsx +++ b/src/app/(verify)/login/page.tsx @@ -1,16 +1,23 @@ -import Header from "@/components/header/header"; +import FormHeader from "@/components/formHeader/formHeader"; import Login from "@/components/login/login"; +import { Session, getServerSession } from "next-auth"; +import { redirect } from "next/navigation"; import React from "react"; -const LoginPage = () => { +const LoginPage = async () => { + const session: Session | null = await getServerSession(); + + if (session) { + redirect("/"); + } + return (
-
diff --git a/src/app/(verify)/signup/loading.tsx b/src/app/(verify)/signup/loading.tsx deleted file mode 100644 index bc2b25c..0000000 --- a/src/app/(verify)/signup/loading.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function Loading() { - return ( -
-

Loading...

-
- ); - } \ No newline at end of file diff --git a/src/app/(verify)/signup/page.tsx b/src/app/(verify)/signup/page.tsx index 30d3646..d2c7739 100644 --- a/src/app/(verify)/signup/page.tsx +++ b/src/app/(verify)/signup/page.tsx @@ -1,4 +1,4 @@ -import Header from '@/components/header/header' +import FormHeader from '@/components/formHeader/formHeader' import Signup from '@/components/signup/signup' import React from 'react' @@ -6,11 +6,10 @@ const SignupPage = () => { return (
-
diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts index f1554e2..dd80bbb 100644 --- a/src/app/api/auth/[...nextauth]/route.ts +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -1,64 +1,79 @@ import NextAuth from "next-auth/next"; import CredentialsProvider from "next-auth/providers/credentials"; import connectMongoDb from "../../../../../utils/dbConnection"; -import User from "../../../../../models/userModels"; +import User from "../../../../../models/userModel"; import bcrypt from "bcrypt"; +import { Document } from "mongoose"; -async function login(credentials:Credentials) { - try{ +interface user extends Document { + name: string; + email: string; + password: string; +} + +async function login(credentials: Credentials): Promise { + try { await connectMongoDb(); - const user = await User.findOne({email:credentials?.email}) - if(!user) throw new Error("Invalid User Credentials") - const isCorrect = await bcrypt.compare(credentials?.password, user?.password) - if(!isCorrect) throw new Error("Invalid User Credentials"); + const user = await User.findOne({ email: credentials?.email }); + if (!user) throw new Error("Invalid User Credentials"); + const isCorrect = await bcrypt.compare( + credentials?.password, + user?.password + ); + if (!isCorrect) throw new Error("Invalid User Credentials"); return user; - }catch(err){ - throw new Error(err.message) + } catch (err: unknown) { + if (err instanceof Error) { + throw new Error(err.message); + } else { + throw new Error("An unknown error occurred."); + } } } + export const authOptions = { pages: { signIn: "/login", }, providers: [ CredentialsProvider({ - id:"credentials", + id: "credentials", name: "credentials", credentials: {}, async authorize(credentials) { try { - const user = await login(credentials); - console.log("user from auth route",{user}) + const user = await login(credentials); return user; - } catch (error) { - console.log( error.message ); - throw new Error (error.message) + } catch (error: unknown) { + if (error instanceof Error) { + throw new Error(error.message); + } else { + throw new Error("An unknown error occurred."); + } } }, }), ], - callbacks:{ - async jwt({token, user}){ - // console.log({token, user}) - if(user){ - token.username= user.username; + callbacks: { + async jwt({ token, user }) { + if (user) { + token.username = user.username; token.email = user.email; token.id = user.id; } return token; }, - async session({session, token}){ - // console.log({session, token}) - if(token){ - session.user.username=token.username; - session.user.email=token.email; - session.id=token.id; + async session({ session, token }) { + if (token) { + session.user.username = token.username; + session.user.email = token.email; + session.id = token.id; } return session; - } - } + }, + }, }; export const handler = NextAuth(authOptions); -export {handler as GET, handler as POST}; \ No newline at end of file +export { handler as GET, handler as POST }; diff --git a/src/app/api/signup/route.ts b/src/app/api/signup/route.ts index 5348972..79f2fe5 100644 --- a/src/app/api/signup/route.ts +++ b/src/app/api/signup/route.ts @@ -1,15 +1,16 @@ import connectMongoDb from "../../../../utils/dbConnection"; -import User from "../../../../models/userModels"; +import User from "../../../../models/userModel"; import { NextResponse } from "next/server"; import bcrypt from "bcrypt"; + export async function POST(req: Request) { try { await connectMongoDb(); const { name, email, password } = await req.json(); - console.log({ name, email, password }) - const exists = await User.findOne({ $or: [{ email }] }); - console.log({exists}) - if (exists) { + + const userExist = await User.findOne({ $or: [{ email }] }); + + if (userExist) { return NextResponse.json( { message: "User already exist", status: false }, { status: 500 } @@ -17,7 +18,6 @@ export async function POST(req: Request) { } const hashedPassword = await bcrypt.hash(password, 10); await User.create({ name, email, password: hashedPassword }); - console.log("user created"); return NextResponse.json( { message: "User Registered...!!", status: true }, { status: 201 } diff --git a/src/app/api/user/[email]/route.ts b/src/app/api/user/[email]/route.ts index 02a1697..45ae06c 100644 --- a/src/app/api/user/[email]/route.ts +++ b/src/app/api/user/[email]/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from "next/server"; -import User from "../../../../../models/userModels"; +import User from "../../../../../models/userModel"; import connectMongoDb from "../../../../../utils/dbConnection"; import { cookies } from "next/headers"; @@ -10,19 +10,19 @@ export async function GET( await connectMongoDb(); const user = await User.findOne({ email: params?.email }); const cookieStore = cookies(); - const visited = cookieStore.get('visited'); + const visited = cookieStore.get("visited"); - if(visited){ + if (visited) { return NextResponse.json( - { message: "User found", data: user, status: true, existingUser:true }, - { status: 201 } - ); + { message: "User found", data: user, status: true, existingUser: true }, + { status: 201 } + ); } - cookieStore.set("visited", "true") - + cookieStore.set("visited", "true"); + return NextResponse.json( - { message: "User found", data: user, status: true, existingUser:false }, + { message: "User found", data: user, status: true, existingUser: false }, { status: 201 } ); } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index c12108b..4278a47 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,8 +1,7 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; -import { getServerSession } from "next-auth"; -import AuthProvider from "../../utils/sessionProvider"; +import AuthProvider from "../components/authProvider"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -10,16 +9,15 @@ export const metadata: Metadata = { description: "Tic Tac Toe Game developed using next.js + typescript", }; -export default async function RootLayout({ +export default function RootLayout({ children, }: { children: React.ReactNode; }) { - const session = await getServerSession(); return ( - {children} + {children} ); diff --git a/src/app/page.tsx b/src/app/page.tsx index b691e62..77a4b2e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,26 +1,25 @@ import ProfileModal from "@/components/profileModal/profileModal"; import { user } from "@/constants/apiUrl"; -import { getServerSession } from "next-auth"; +import { Session, getServerSession } from "next-auth"; import { redirect } from "next/navigation"; -import { isExistingUser } from "../../utils/isExistingUser"; import DashboardCard from "@/components/dashboardCard/card"; import Image from "next/image"; import win from "./../../assets/trophy.png"; -import totalGame from "./../../assets/toatlGame.png"; +import totalGame from "./../../assets/totalGame.png"; import lose from "./../../assets/lose.png"; import draw from "./../../assets/draw.png"; -import Link from "next/link"; import StartGame from "@/components/startGame/startGame"; - export default async function Dashboard() { - const session = await getServerSession(); + const session: Session | null = await getServerSession(); + if (!session) { redirect("/login"); } + const res = await fetch(`${user}/${session?.user?.email}`); - const resData = await res.json(); - + const resData = await res.json() as UserResponseData; + return (
@@ -40,44 +39,28 @@ export default async function Dashboard() {

Total Played

- Total Game Played Icon + Total Game Played Icon

0

Total Win

- Total Game win Icon + Total Game win Icon

0

Total Lose

- Total Game Lose Icon + Total Game Lose Icon

0

Total Draw

- Total Game Lose Icon + Total Game Lose Icon

0

diff --git a/src/app/room/[code]/page.tsx b/src/app/room/[code]/page.tsx index 2c5b1d1..1a3394e 100644 --- a/src/app/room/[code]/page.tsx +++ b/src/app/room/[code]/page.tsx @@ -1,11 +1,16 @@ -import React from 'react' +// WIP +import { Session, getServerSession } from "next-auth"; +import { redirect } from "next/navigation"; +import React from "react"; -const Room = () => { - return ( -
- -
- ) -} +const Room = async () => { + const session: Session | null = await getServerSession(); + if (!session) { + redirect("/"); + } + return
+ {/* WIP */} +
; +}; -export default Room +export default Room; diff --git a/src/components/authProvider.tsx b/src/components/authProvider.tsx new file mode 100644 index 0000000..b066fd7 --- /dev/null +++ b/src/components/authProvider.tsx @@ -0,0 +1,8 @@ +"use client"; +import { SessionProvider } from "next-auth/react"; + +const AuthProvider = ({ children }: { children: React.ReactNode }) => { + return {children}; +}; + +export default AuthProvider; diff --git a/src/components/dashboardCard/card.tsx b/src/components/dashboardCard/card.tsx index 9cb4c77..6a48ae8 100644 --- a/src/components/dashboardCard/card.tsx +++ b/src/components/dashboardCard/card.tsx @@ -1,19 +1,11 @@ -const DashboardCard = ({ children }: { children: React.ReactNode }) => { - const cardStyle = { - // width: "10rem", - // height: "5rem", - margin: "10px", - border: "0px solid", - borderRadius: "20px", - background:"rgb(24,24,24)", - boxShadow: "0px 0px 5px 1px rgb(211, 211, 211)", // Adjust the RGB values for the lighting color - display: "flex", - flexDirection: "column", - justifyContent: "center", - alignItems: "center", - }; +import React, { PropsWithChildren } from "react"; - return
{children}
; +const DashboardCard: React.FC = ({ children }) => { + return ( +
+ {children} +
+ ); }; export default DashboardCard; diff --git a/src/components/formExtra/formExtra.tsx b/src/components/formAdditionalLinks/formAdditionalLinks.tsx similarity index 93% rename from src/components/formExtra/formExtra.tsx rename to src/components/formAdditionalLinks/formAdditionalLinks.tsx index 743b15c..f2abef9 100644 --- a/src/components/formExtra/formExtra.tsx +++ b/src/components/formAdditionalLinks/formAdditionalLinks.tsx @@ -1,6 +1,6 @@ import Link from "next/link"; -export default function FormExtra(){ +export default function FormAdditionalLinks(){ return(
diff --git a/src/components/header/header.tsx b/src/components/formHeader/formHeader.tsx similarity index 77% rename from src/components/header/header.tsx rename to src/components/formHeader/formHeader.tsx index 13d064f..dc66b2a 100644 --- a/src/components/header/header.tsx +++ b/src/components/formHeader/formHeader.tsx @@ -1,12 +1,12 @@ import Image from "next/image"; import Link from "next/link"; import loginIcon from '../../../assets/loginIcon.png' -export default function Header({ + +export default function FormHeader({ heading, paragraph, - linkName, - linkUrl = "#", -}: HeaderProps) { + linkActions, +}: FormHeaderProps) { return (
@@ -23,13 +23,18 @@ export default function Header({

{paragraph}{" "} + {linkActions.map((action, index) => ( - {linkName} + {action.title} + ))}

); } + + diff --git a/src/components/input/input.tsx b/src/components/input/input.tsx index c3ceac8..6e28bd4 100644 --- a/src/components/input/input.tsx +++ b/src/components/input/input.tsx @@ -21,6 +21,7 @@ export default function Input({ { return ( <> - + src={loaderIcon} + aria-hidden="true" + alt="Loader Icon" + width={10} + height={10} + /> Processing... ); diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index 14c735a..1177b1b 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -1,10 +1,10 @@ "use client"; -import { FormEvent, useEffect, useReducer, useState } from "react"; +import { FormEvent, useState } from "react"; import Input from "../input/input"; import { loginFields } from "@/constants/formFields"; -import FormExtra from "../formExtra/formExtra"; +import FormAdditionalLinks from "../formAdditionalLinks/formAdditionalLinks"; import FormAction from "../formAction/formAction"; -import { signIn, useSession } from "next-auth/react"; +import { SignInResponse, signIn } from "next-auth/react"; import { useRouter } from "next/navigation"; interface LoginState { @@ -16,20 +16,11 @@ const fields: LoginFields[] = loginFields; export default function Login() { const router = useRouter(); - const session = useSession(); - useEffect(()=>{ - console.log(session?.status) - if(session?.status === "authenticated"){ - router.push('/') - } - },[session?.status]) const [loginState, setLoginState] = useState({ email: "", password: "", }); - - const [loading, setLoading] = useState(false); const [apiResponse, setApiResponse] = useState({ status: "", @@ -46,22 +37,24 @@ export default function Login() { e.preventDefault(); try { setLoading(true); - const res = await signIn("credentials", { + const res: SignInResponse | undefined = await signIn("credentials", { email: loginState?.email, password: loginState?.password, redirect: false, }); - console.log({ res }); - if (res.error) { + if (res?.error) { setLoading(false); setApiResponse({ message: res.error, status: res.ok }); return null; } else { - setApiResponse({ message: "", status: res.ok }); + setApiResponse({ message: "", status: res?.ok! }); } } catch (error) { setLoading(false); - console.error("something went wrong: ", error.message); + if (error instanceof Error) { + console.error("something went wrong: ", error.message); + } + return null; } router.push("/"); @@ -85,7 +78,7 @@ export default function Login() { /> ))}
- + { const [openModal, setOpenModal] = useState(false); diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index 5087768..a106654 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -2,39 +2,68 @@ import { useRouter } from "next/navigation"; import React, { useState } from "react"; import LoadingButton from "../loadingButton/loadingButton"; +import Input from "../input/input"; const StartGame = () => { - const [loading, setLoading] = useState(false) + const [loading, setLoading] = useState({ + createRoom: false, + joinRoom: false, + }); + const [joinRoomCode, setJoinRoomCode] = useState(""); + const handleChange = ( + e: React.ChangeEvent + ) => { + setJoinRoomCode(e.target.value); + }; const router = useRouter(); - const customRoomCode = () => { - setLoading(true) + + const createRoom = () => { + setLoading({ ...loading, createRoom: true }); const customRoomCode = Math.random().toString().substring(2, 8); + // Perform API call to create a room at backend router.push(`/room/${customRoomCode}`); }; + + const joinRoom = () => { + if (joinRoomCode && joinRoomCode.length === 6) { + //here I have to perform some API call to check that such room exist or not + setLoading({ ...loading, joinRoom: true }); + router.push(`/room/${joinRoomCode}`); + return; + } + }; + return ( <> -
-

Start a new game

{" "} -

{ - customRoomCode(); - }} - > - {loading ? : "Create Room"} -

-
-
- +
+

Start a new game

{" "} +

+ {loading.createRoom ? : "Create Room"} +

+
+
+ +

+ {loading.joinRoom ? : "Join Room"} +

- ); }; diff --git a/src/constants/formFields.ts b/src/constants/formFields.ts index ba66cd3..d774973 100644 --- a/src/constants/formFields.ts +++ b/src/constants/formFields.ts @@ -64,4 +64,5 @@ const signupFields=[ } ] + export {loginFields,signupFields} \ No newline at end of file diff --git a/src/types/types.ts b/src/types/types.ts index a4b8a61..9158b8c 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,9 +1,8 @@ -interface HeaderProps { +interface FormHeaderProps { heading: string; paragraph: string; - linkName: string; - linkUrl: string; + linkActions: Array<{title:string; url:string}> } interface LoginFields { @@ -39,7 +38,7 @@ interface InputProps extends LoginFields { } interface UserSchema { - username: string, + name: string, email:string, password:string, } @@ -51,4 +50,20 @@ interface Credentials{ csrfToken: string, callbackUrl: string, json: string -} \ No newline at end of file +} + +interface UserResponseData { + message: string; + data: { + _id: string; + name: string; + email: string; + password: string; + createdAt: string; + updatedAt: string; + __v: number; + }; + status: boolean; + existingUser: boolean; +} + diff --git a/tailwind.config.ts b/tailwind.config.ts index 1bf5689..0ae927c 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -8,11 +8,16 @@ const config: Config = { ], theme: { extend: { - colors:{ - "card-primary": "white" + boxShadow: { + "dashboard-card-shadow": "0px 0px 5px 1px rgb(211, 211, 211)", }, - borderRadius:{ - "card-radius": "0.75rem" + colors: { + "card-primary": "white", + "dashboard-card": "rgb(24,24,24)", + }, + borderRadius: { + "card-radius": "0.75rem", + "dashboard-card": "20px", }, backgroundImage: { "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", diff --git a/utils/dbConnection.ts b/utils/dbConnection.ts index 6335749..2bcb54a 100644 --- a/utils/dbConnection.ts +++ b/utils/dbConnection.ts @@ -1,16 +1,16 @@ import mongoose from "mongoose"; const connectMongoDb = async () => { - await mongoose.connect(process.env.NEXT_PUBLIC_MONGO_URI!) - .then(() => { - console.log("Connected to MongoDB Atlas"); - }) - .catch((error) => { - console.error("Error connecting to MongoDB Atlas:", error.message); - }); -} + if (process.env.NEXT_PUBLIC_MONGO_URI) { + await mongoose + .connect(process.env.NEXT_PUBLIC_MONGO_URI) + .then(() => { + console.log("Connected to MongoDB"); + }) + .catch((error) => { + console.error("Error connecting to MongoDB Atlas:", error.message); + }); + } +}; export default connectMongoDb; - - - \ No newline at end of file diff --git a/utils/sessionProvider.tsx b/utils/sessionProvider.tsx deleted file mode 100644 index 0890bd0..0000000 --- a/utils/sessionProvider.tsx +++ /dev/null @@ -1,9 +0,0 @@ -'use client'; -import React from "react"; -import { SessionProvider } from "next-auth/react"; - -const AuthProvider = ({children}:any)=>{ - return {children} -} - -export default AuthProvider; \ No newline at end of file From dd9e73c2d8f48464b92c59556ecc6f5be88b60d3 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Tue, 6 Feb 2024 11:11:33 +0530 Subject: [PATCH 12/56] refact: add portal for the profile modal --- src/app/layout.tsx | 1 + .../portalProvider/portalProvider.tsx | 14 ++++ src/components/profileModal/profileModal.tsx | 67 ++++++++++--------- src/types/types.ts | 6 +- 4 files changed, 54 insertions(+), 34 deletions(-) create mode 100644 src/components/portalProvider/portalProvider.tsx diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 4278a47..5649046 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -17,6 +17,7 @@ export default function RootLayout({ return ( +
{children} diff --git a/src/components/portalProvider/portalProvider.tsx b/src/components/portalProvider/portalProvider.tsx new file mode 100644 index 0000000..327b29a --- /dev/null +++ b/src/components/portalProvider/portalProvider.tsx @@ -0,0 +1,14 @@ +'use client' +import { useEffect, useRef } from "react"; +import { createPortal } from "react-dom"; + + +const PortalProvider = ({ children, selector, show }: PortalInterface) => { + const ref = useRef(null); + useEffect(() => { + ref.current = document.getElementById(selector); + }, [selector]); + return show && ref.current ? createPortal(children, ref.current) : null; +}; + +export default PortalProvider; diff --git a/src/components/profileModal/profileModal.tsx b/src/components/profileModal/profileModal.tsx index a0d9827..1015e07 100644 --- a/src/components/profileModal/profileModal.tsx +++ b/src/components/profileModal/profileModal.tsx @@ -3,7 +3,7 @@ import { useState } from "react"; import Image from "next/image"; import profileImage from "../../../assets/profileIcon.png"; import { signOut } from "next-auth/react"; - +import PortalProvider from "../portalProvider/portalProvider"; const ProfileModal = () => { const [openModal, setOpenModal] = useState(false); @@ -22,42 +22,43 @@ const ProfileModal = () => { /> - {openModal && ( -
setOpenModal(false)} - className="absolute top-full right-0 me-1 md:me-2 mt-2 w-48 bg-white rounded shadow-md z-10 flex flex-col items-center justify-center" - > -
- profile Image - -

Md Karman

-
+ + { +
setOpenModal(false)} + className="absolute top-12 right-0 me-1 md:me-2 mt-2 w-48 bg-white rounded shadow-md z-10 flex flex-col items-center justify-center" + > +
+ profile Image -
    -
  • - Profile -
  • -
+

Md Karman

+
-
- +
+ +
-
- )} + } +
); }; diff --git a/src/types/types.ts b/src/types/types.ts index 9158b8c..2d8feb0 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -26,7 +26,6 @@ interface FormActionsProps{ handleSubmit:(e:React.FormEvent)=>void, loading: boolean, buttonType:string, - action:'submit', text:string } @@ -67,3 +66,8 @@ interface UserResponseData { existingUser: boolean; } +type PortalInterface = { + children: React.ReactNode; + show?: boolean; + selector: string; +}; \ No newline at end of file From b84604c25955859bfd31afc07a184e85afb7c875 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Tue, 6 Feb 2024 12:06:57 +0530 Subject: [PATCH 13/56] refact: Add a layout for login and signup page since it has sharing same wrapper and loading page --- src/app/(authentication)/layout.tsx | 12 +++++++++ src/app/(authentication)/loading.tsx | 17 +++++++++++++ src/app/(authentication)/login/page.tsx | 32 ++++++++++++++++++++++++ src/app/(authentication)/signup/page.tsx | 23 +++++++++++++++++ src/app/(verify)/loading.tsx | 7 ------ src/app/(verify)/login/page.tsx | 28 --------------------- src/app/(verify)/signup/page.tsx | 20 --------------- 7 files changed, 84 insertions(+), 55 deletions(-) create mode 100644 src/app/(authentication)/layout.tsx create mode 100644 src/app/(authentication)/loading.tsx create mode 100644 src/app/(authentication)/login/page.tsx create mode 100644 src/app/(authentication)/signup/page.tsx delete mode 100644 src/app/(verify)/loading.tsx delete mode 100644 src/app/(verify)/login/page.tsx delete mode 100644 src/app/(verify)/signup/page.tsx diff --git a/src/app/(authentication)/layout.tsx b/src/app/(authentication)/layout.tsx new file mode 100644 index 0000000..5e60576 --- /dev/null +++ b/src/app/(authentication)/layout.tsx @@ -0,0 +1,12 @@ + +export default function AuthenticationLayout({ children }: { children: React.ReactNode }) { + return ( + +
+
+ {children} +
+
+ + ); +} diff --git a/src/app/(authentication)/loading.tsx b/src/app/(authentication)/loading.tsx new file mode 100644 index 0000000..e6cbc7f --- /dev/null +++ b/src/app/(authentication)/loading.tsx @@ -0,0 +1,17 @@ +import Image from "next/image"; +import loaderIcon from '../../../assets/loaderIcon.svg' +export default function Loading() { + return ( +
+ +

Loading...

+
+ ); +} diff --git a/src/app/(authentication)/login/page.tsx b/src/app/(authentication)/login/page.tsx new file mode 100644 index 0000000..137139b --- /dev/null +++ b/src/app/(authentication)/login/page.tsx @@ -0,0 +1,32 @@ +import FormHeader from "@/components/formHeader/formHeader"; +import Login from "@/components/login/login"; +import { Session, getServerSession } from "next-auth"; +import { redirect } from "next/navigation"; +import React from "react"; +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Login", +}; + + +const LoginPage = async () => { + const session: Session | null = await getServerSession(); + + if (session) { + redirect("/"); + } + + return ( + <> + + + + ); +}; + +export default LoginPage; diff --git a/src/app/(authentication)/signup/page.tsx b/src/app/(authentication)/signup/page.tsx new file mode 100644 index 0000000..7908d56 --- /dev/null +++ b/src/app/(authentication)/signup/page.tsx @@ -0,0 +1,23 @@ +import FormHeader from "@/components/formHeader/formHeader"; +import Signup from "@/components/signup/signup"; +import React from "react"; +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Signup", +}; + +const SignupPage = () => { + return ( + <> + + + + ); +}; + +export default SignupPage; diff --git a/src/app/(verify)/loading.tsx b/src/app/(verify)/loading.tsx deleted file mode 100644 index 1ce528c..0000000 --- a/src/app/(verify)/loading.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function Loading() { - return ( -
-

Loading...

-
- ); -} diff --git a/src/app/(verify)/login/page.tsx b/src/app/(verify)/login/page.tsx deleted file mode 100644 index 29f2a89..0000000 --- a/src/app/(verify)/login/page.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import FormHeader from "@/components/formHeader/formHeader"; -import Login from "@/components/login/login"; -import { Session, getServerSession } from "next-auth"; -import { redirect } from "next/navigation"; -import React from "react"; - -const LoginPage = async () => { - const session: Session | null = await getServerSession(); - - if (session) { - redirect("/"); - } - - return ( -
-
- - -
-
- ); -}; - -export default LoginPage; diff --git a/src/app/(verify)/signup/page.tsx b/src/app/(verify)/signup/page.tsx deleted file mode 100644 index d2c7739..0000000 --- a/src/app/(verify)/signup/page.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import FormHeader from '@/components/formHeader/formHeader' -import Signup from '@/components/signup/signup' -import React from 'react' - -const SignupPage = () => { - return ( -
-
- - -
-
- ) -} - -export default SignupPage From 5d81e0963b78c3f3f1a14007cae28525e24f5f17 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Tue, 6 Feb 2024 19:11:17 +0530 Subject: [PATCH 14/56] refact: add svg inplace of png, --- assets/formHeaderIcon.svg | 7 +++++++ assets/loginIcon.png | Bin 2321 -> 0 bytes assets/profileIcon.png | Bin 1622 -> 0 bytes assets/profileIcon.svg | 7 +++++++ assets/tic_tac_toe.png | Bin 74101 -> 0 bytes assets/totalGame.png | Bin 1182 -> 0 bytes assets/totalGame.svg | 7 +++++++ assets/trophy.png | Bin 1729 -> 0 bytes assets/trophy.svg | 7 +++++++ assets/whiteBgProfileIcon.svg | 7 +++++++ src/app/page.tsx | 4 ++-- src/components/formHeader/formHeader.tsx | 4 ++-- src/components/profileModal/profileModal.tsx | 5 +++-- 13 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 assets/formHeaderIcon.svg delete mode 100644 assets/loginIcon.png delete mode 100644 assets/profileIcon.png create mode 100644 assets/profileIcon.svg delete mode 100644 assets/tic_tac_toe.png delete mode 100644 assets/totalGame.png create mode 100644 assets/totalGame.svg delete mode 100644 assets/trophy.png create mode 100644 assets/trophy.svg create mode 100644 assets/whiteBgProfileIcon.svg diff --git a/assets/formHeaderIcon.svg b/assets/formHeaderIcon.svg new file mode 100644 index 0000000..6f01574 --- /dev/null +++ b/assets/formHeaderIcon.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/loginIcon.png b/assets/loginIcon.png deleted file mode 100644 index a730d9b0d9dde69aa075f3dc03198592f769c871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2321 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 diff --git a/assets/profileIcon.png b/assets/profileIcon.png deleted file mode 100644 index 13aaec36dd701722f62fa843ae69e935ed4cb88a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1622 zcmV-c2C4apP)C@KiKa92rY{xtrP;KH4VwrEkd=ub>E{}9o%LW6MB7NV$?C%#8Byiv1v?|U;^ z?}G!wynD|%_j~W&d+s@xF~&&e!bs=BNaw;x=fX(m!bs=B9B$NH+E)0nyRX)YsQXjz({9FP%DdYVQ!>?(R-C zH8u3}=TCALVC&(-hveqwwz~uvjYb+88lv68`}glDC@5%m2#AS^q51iF+HGJ5iHnPK zE&(YiDYUY(LVE?v%gdCUoa`I|;^N{|5B|%SFVxo7M&;$@l#!7^Nl8i4bP5OvphJfa zNdjBr=^6M*8;co6w-KL*(Y>NRi!Nf(b3V|`+Q?# zqb5;XOG^tk0Y85HpvcHbZ3r+J4BQbOrpm#C2UQOq;_dBCg@uK*y1L5c1Hy5IFM#dX z0I@wU&YwT8$>8OZmzT%w2exa~1oUtoY$hfq9C2Ww0|yRB+b0j+ym_OJfQX0)PR@z$ z-o2~&;H}cs)Wq#iSXh`i0hN`N+y*aQx@4#0`t|Gd>C-1_ZEdCe{CqN*OcWd(EX{4K z6WApVA3jVcPMo02moL+uJ9lVoY>WyD3by!@o}SL_PenzAI03T)$qWoc{@IEqM6m0e zJbBX2AG}RoeE$4di~yt2DCD@Or>9NFnKNfd4W2%IYUh)WkB^X^zeI;@+Xu+ui2!fi zs-v{Dl+*xUfv>NxO&_L=2yWfF#ZQ3QY!)&m*U{0@L28kinQ5m}1a)1k4L&d*nK_NSa_5 zQA>cuV&NxXZEa2Ur?#=NL23a%UdUQ)W^cBUcSFe-|o)nkHMD|}GDk@5;BU=Q0MSumD z;~o)H)DY=qkweUpBS&mHP%}Vc^G`PLOkP(&U+8dfZGtH-j}HzGDslk({*4CF)7XSbN07*qoM6N<$g2$} + + + + + + \ No newline at end of file diff --git a/assets/tic_tac_toe.png b/assets/tic_tac_toe.png deleted file mode 100644 index 2adab221c56a4bec12ad8fd2416cc5cb6516482d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74101 zcmce619v7()NO2=6Wg5Fwr$(y#I|ibv29~wTa#qsCwAuM{qFt#!mYJ>_3G;CUftDw zPVKYzj#5&PM1;eG0|5a+l$H`x0RaIM1pxu|hk^R;fiAM!`rbjfib$)$d^bNBv&ipb zTsLtoH&sUqH&0_1a}Y}hM|*PyS5p^ra|c%|N4FdBeu3{nEdLD>bul+~vvzbKRwi6>_r5dR zeK+WRuG;OcpKCu{>HT^CXTybi@8c`r)DuF9_5U@43Tn=7Fx>ywa-!tI|M$e&gc&v2 z|Fk3bxc^Vxf9)lTNE=F^oB8K^nRpUc6P zH{VDu`;#x;?|wPFd#m;BtjRw=wk>)qBoMjVmzgKXEVVMxs1D%x7BJc`_GTv~EsS*} z84WAJ5$u3E3efX45yfBqD&aNOG*o)Tlp^A^rYQM5@00cHVzv^WJQS82`gi3&vZcN= z=Zrks^5Gl_{qeAXpHWNrh;LY@+`*~DNI#H;5B!bkby)1;@guz5h!``7-`~qhkk3Pk zt8+U4$bU(sA7=r10f(hc-zG|EZGY{rX$F0+El*v{tnI*+(i)18nsQ*B=qp599VyAy z>^%X|QisMx{XvJsW~FJ%HG#8rI_>cxX^#tdelJu(KggV+YI;=*7=DNWsOL@F^SS8z z0g#>`AJyZbuvzLK=aHhAmBw;;gS^BZ8A;yz;T>kuEa>`YfRsNfPb4 zM*tZr_OB#E(S42Q7>%ox%EhRaJPCa)D)K7mTCBvDB-%5TMPxc`yWZS5;FNr3$CeA7 z)!GFp=<@qd{CDI`Ci7U;v{;9>lU)vY_`E>_?#++e4a1x7voT9zW4B^;MZ$d`w_EYQ zeuEEr?ow@cE3O;Tniu`n99pTGYqg0Et1>DSKi$VF`NT4yQXrBfyg8}G*7#TW<52}W zw4&T=enYu-yjmjROv>yprNz|~r&v@A;_XWc!8*3NCbyXRrP>AA67I{!kdVdYT8rMboSR!H0+($& z{?)UWIgNo}+gfM}b2R;dcwaM`sfu~3SP^s&(=c*rz|~o^g>=Q~F8}2ojg=S<}c$*j#%`sjcKHMQOYAhkd8R5YxR3UYqk50kN43bOa znH*cV(``DeyUGl9JZr^4gnMv0_jXSsAe+$el$I_$*1H2N9HRzWaF9}Eb93`gzc%ps z_TDz)Rq^s=r^#Vl`VD?=5o%}Lt@21xd*iH|YPScq5 zercYhnx8@^8QT4X;t$$UeL6mrj|lbL1$E@7zbt4JFi|vY3pr)tH^mIg8Qi6L35p0M z@>248`K2Dg$S`zjpeo>u_4PORZkr>szL51b*8u`THnLons||hE4P-Y!&T9+xppKt& zhVJLS=p4fCR_{qK2! z(wRqxbawn*yCxe zO;)`;96z+)RB~&X0!Bts1jQdueXx>QT`f0LXaB03@h*SowA0c9RLtv^=i^gQ<*UD5 zt(rAQJ_C3n3S8UM1NNn?COuvD0E*EiTFO*Y^Lb2E z)dk+AJ|1(kLHFO~-Zd-I8uoT|eJET8_kUCZE%%5C@`K7`UUoE713zOAQY>r#O_`Xh z_xmaQ`~jAFoqK&g-0OSLeS_Y2VQ}ylDHESM(9PhbyFghWfHP-?mDPcRGZx`0EBN12 z()SIm1{<}9SA-{T3!~a!zbrP+C)6r@Fo>`}R5-y7KXNw>82daiacqJ>p5=D-d7ldo z@_Y?UH5I+x`}T?aXMy#7dX0SHDBrWlHQ~kgea4O&!?sX#kI!l?V z?=RHT`IFB5eYHgWFMm~FtK=2;=NK;pN`6o2$8rTi|GNxj87^)+8U;}GV#dspNWjT( z5V^l`e;sM~wM?Mj?+oI5!@!1OlZz_C2$5O}YsBKR5sVY^6T^GQFO^O{vbJ;JXV(dq z57Ba8D-%xCd!=I;Pc)SCAw^rQ)ZIQY^HA30C097Qm;KNs|57b;`g1?zlud>G#HyJ_ za5Lv@)pfWK0$I;6u$0jat3w0a7kI&U#M*V1>*zut^45Oc6R7q(&s7h(+d4lfRH@$P z^PQQ+<6{PYzQ$Cz#44BV{+v>I=R)P;gbzGsIZ)iA`kf9O$KJmQka&&5PMeNl{(b7E zYJ`Cm4qSA98E)1v@3&+k$PR*jhF8>AG05Ay)UhzLGpxx$m`Md9dSZQ)Ny1<6mgVYZ zA7(J+9S& zrl>ehSJ;+{Jv{yh!gU2#m6G+rD@8Y1$@KMfMA)hqbXU~5IBfzaijtZ1)fD!uPSjy? zHxUKjDuJ~Xp>(o9e5N767gO8tN$``^fu^A5d*Gq_y5RS_2AT3+UN+Yow1(Kmen&C? zGko9);!r-#%Y*kzfq?nTu&dpK+;Hq;iAqP4o&PO{*R=7$K0@v~#m6q))CV5n@ppC{ zGu1b%#OUx%0G<-jcwZPF=&T%R)^ATb8VbskLG}(MDu^VgXRQA&t4b%vfRw-26p2sv zZ|sD(LC2x-mbyPD#a5=rHCZVq)0Z*ok!GaUM%AHJ+lF@D>XHjr?n_>#Y3Z%*mCli6 z!ND}p+JuGkRNOIAH00va1uiV%{Wb@?%nEnpg(UK;G+G$A>4g)#_a25{Yf|f9VOHaf zxfw#sT~~Ly`C)8HWY7mXXIQEI|0pQX6nM_2P{-AUcNO(IVI|1N zyxxM2umlN8DA>8oHaD|VtcgLm%0=rtx(N2C3|KFrQlCyeS|R$& z9Of-%QI#|m^PGlTmOc^+u=SPHw#H5N8$0Q8)0La(`fYr5zOscEo#CiBOunA~7r$D* z&n`;JV0$kvQ_e)`doA&FDb)Kj`-O;fbIBs8Cg8bSP6u(li};;YgNK`eqq0C(MVf;C zc^io_tU;xNR!AHTr+)(Y%WhVeat(B{Pd*!h;DJw|ytZd!O~89Y6#*X}Iz(OEdr{l5 zfbWoYt9V5B{ptcPKF-u>ON>1YXHP2C|AKzT^xOYRPU#M-r@#C&ycU0dZUoK0U}d3E zT1b9Uq2QWkv*dS@p!i!R&&)d15y_2PWbI7i3O@=7l8Qnt&SR{UjzmowT!{#kn(_8IMS>sB@1MXP5jUVjRmP8p5+XkUgt3=H%(qY4L=yOs>c5Lc`4 zA{9S)ITbmeKFz#CooWOHWbp6qwvKv=kK|GnyBtUR$@vMdVD0}ZRd(GeDK_~T#EBMv z6tjx%QJxI97`XT2$^f`}`KGBH2+SNnB0OOnxmA9x<1#q%lF}m_WK{zvU8_5ASUCyP z{(G@u*QuDbG|?sC$uOtRi=B0b{01*##p%B1Y+}@WsF5>Ffgh%T^J@Ol&mW-?NHuS* z3}j@cX+b{ zXc)yUU%q6>1)g%We*Cf4YaF$@diAL8Bz2x@b<$Beb0yXOMoakUUwBthkp?;nx#N|b zFiO^gDe&*!?%q(~Jx5-Xas&A%Y8WO9cMFFS=u}B13sA~7@`$J~#*dUf zvMe-O=L@N--@c=vEwRo}jFi|Gh!6`L{6sa5*{rk9@zdAi7kTSopowz%lGdL}i-K7Y zQNO#pqlXtYUP}drgHuR)z=-buM&#nn0L+&fTkWTLceBeV?*FKO!!(&YZPrZf9JE+t zJ+d%bW=y#&n~tt>GJ=Y~*}l~IPC!gGXP?Cw_|2sl9h}sie7PnY*&ii<;?RO={C{vgI^0M70>-r5B}dSr$w^!1=qg2%(3YKi;_npkmOltj z@llBco9hgoV}*2DndIjI`H#beGpO_uvP| z_#1;BXvP?fOoL?|=k!rQvPvMEF|;Gt=Ij)4Pb zJYjG8RK1P@4))nGNa@w5zNwT$){j+qVB^x1X8q=q<4-jSTs-Fka-n%U${Z)HU|W4u z%2#s=GE+Jedka>ZclR0RptdzW3o;O!487!H+Gg&Htu~~JZX!;NK zS`k@-+AVI{noYhVU6qjXhIMb(BA%rJu2N1C)Yu!ce6j=Sx_jrYKh?*C>5#7itZz94 z2OQ(&up9Ez?;-GrP)8on{<|7rf?$Q;!O#;c35}BRoGEA}nXkHqND5-blQhXrkjXb% zT#a?loE*uT^!wGXgT2TYR&M&VN_|X~*|C_(!DYv?s04`#w=JEX@0Gk=cX~rz-hcWdobIEM`@iLN)vh@AW|ZF`pCa*xPM{ z$1Hmg4N>acd6k3K_e>&=__0hC#`d!<30C^zz4^f=Q5C&S9^Wvcav6Qw-mUfuSSj!c^-6#8K(IUm9RkIKaie$y@MwdQOL zH;S+XDvGZ+k6;`z(7wmibKjxlPy(2WrfN$^(RStZ4&M(Q-nR(Qc-8xUF80+Lgx7YA z3pO)D?ljcq_T(3yTI-Xj!=&tbiC2P^Kf?f?Qc&13jq1Y>-o+M+sxo`4<#=1Iyk<1O@V zoHN~ofh6lj3zCJm&{0C1K02KZ$cQ~(uz=6kt7G0jpR$Joz%)+AlvvmhA9JauNj5Um zl14_>KmOsDg*GDdqp9=km*_Uo`*m6R`xprmJ(%NgDpulw8ka(Sb`V5Qjb~S^CWoE) z7^8%ZI>=c*a%l>ri}LN{nY6{lSu_Z}#n#<_NyQI*2_hF9FMOzdQnovw%c~QkISDGE zg|BjQBkZ*Y4z#(Nz{x{B8!TJQ`Q>Z!RpFj*g3gldn=LX__6qV5VBJ6FV_`$PuOcYt zD5obnFtuEBNlJ#4>=XN(OskeGyPyu2wYex|epsUn)*bPjyP8-e9kGG?pe2=tDjkG@ zStrB5{_A8CK1i1E!9SA2hi1pf(ZaR0z*~{@lTf4WVHTWuJr>}X3*nR5Muts_^=R=c z#S5*g{>ST=`2p@hZBntuOJ!4%awNpC-fkW>SHi1VoTsl&L?_a(7LEE&g{Cu}KwB9$ zdCA7!sg%1}@f5~h|c2=K3u{) z=sLE$a+QDc)|1yg19yIO4rl*OiLa13r&Q+TKFKJII;-vGFlv|$m_#s+ba7r_)Nj-; z)M7gwSkIKrLa;~1>0u>D6rA}cZ68gqnkNTnL?J5l$QBB7s_>%}W$7A<1j|i-A@_G% z0E#ZpG`BgrM~c3jj^`)yAS$G_c*Ka+t}1B>&yE(_v*HV-v{Q09&kiJpU`LADd%q~g7e2k0-M-~Yc60Sz>$~Y=Q8m#znG-LvpW_6 zfbPHxpJPMqYp{UpWTY&@KFSXrMrAvGq~(xvxn%jUuK`H`nM|}s*xzK18C{JU z5GOU4L=RrFMv6{|3#j&#^Fa2M!-Fr70Z z5uPyP4~>|+)8*iaC%-__?mYXalv z;2=}S1)iYwDSHX5I!+}it+$Q8#2A$6mDz;Wee_`W+4837Y4l@to__iVQq>}iA!%j1 zt$rBwyVVujWB)CEwQwXDfp*kiog?4qG5YdMtyk8r>dVw33t!%|^l4^}sIUj?J>e8B z)T|}6WOJocwm-QQ>N{w3S2m9BYH$^f1O2`dufxq#rV*hLPs5FQQ+9@#_ycDbQ`k&H z=-6r4_1fcSuy*HOR`z3z+wRmIfXA)6#(E;0nnNn92(bL5q{bgL{Ie*GO$@D@iyhqR zIq{20A7~h{#a1YJ`yVsYu*45&??lHKmaLCR)%Bc%exT`r=Bgmf& zuTtyjhcoGgTGml_zcFuxERL#X6Ai@$#U1i`*Xr_LF8fdyOPp+&rNEEABShW*o3dmj zGbL-ZC?F|m1$S@I?Cfm>LzOct$Ca&M;gYmyK*4nw$u>;7a7p=vsT8T{r5BB279J{H z+A@svH8?=-eAn?nSw?%<W-hTekZPua ziOjUxln}nP3-baX9c36@d_urMA|r31g3*c$zdS7|Hl;jKUg9TfOz%uBP6PLjM_&>T zcUhjZjWK(#-v z0@nI^zfY6Q!?uCq%o4uLJ(|KY*Z{FcD{8>7;-^A|XVU}j&YALEv$3zD25r)a9$KV$ z+n~`2s4%%2XT(H9y=l?hfxAEOQsXY4utrU!Ohc9cH)NaDPC%Bz{H542FrspEKW`$* zaYD})f!E;oe0`p~sKs0fZ#fk*@M*x#YTnn&H0^K+YJQq%0UeFDLe7mhdX1r_wen2H zk~0NmzQQ`{<%8P{T9Mj-BFa?hzhH3$3-%Xw7`G$~%RYB@Y0?qSBdd%`rgLr@;gm#a zV4L|itAM6Eoxj= zxJ3!X}Zs*fsrv?E821!7;gaqd$yq=Oh1ODiYb1Q1z zc=j|Sc@1G@X{lIjDL%uLO%n~Ur7{&B-%R99>TA!;D6FmNWsmI^waj88ox{laYthg5 zjvcIbt~KX~p8Qq4a594}2F@sVNFCeE-%gYbQsOqF&MNjO45P2GL1f}j!Z{V!3Y@V+ z4R;w~z4>=lk12>3Y=3U9{7BhYIngdu!u{q)xi($kq6kZt)`i*A62iIZcNA1XZ{PW% zjbv=z=h;Jk*qFBYl86-53FH%6$xGp>i3AM=V5f>KbK84X>g`t3uoz0qHr>fD%w8#L zlCz`!uNNQ~h$|Nzpt*?6K$=z_lh*3gSs_FvR!Zi+?DJ(8&txNnx#MSOJQaVT&CRL>cqF>BO_xW53qt2Tpdv!=y9p@5sPqDbP#5sS%kL^i7pzu_N{58(#$}ZgOBEN&NLvqayxpi(+IDqv&iyJcRwrxUZ0{1k=v)~*fqS&r{zj9l_&*uO`#ndW7)!UD$wp%;SgN z^vH5GVn?ea$}GS^!N<3BKYU@9IA24&{U>bC_5x>~VFEv){2p3>@N+m{`?+x}901?} z+AlsfW-`-|Mo!k!Cx+%KBQ0v3u9-&Ud9G&p(&&*sR_C|yWVRtg$|o{BZO*8-cfW?D}u!J`T3p+s>Q;W0dBS{n>^=FiB(ij~}qR!Syq&ZdAid-Ihg@J}}E zEUJ5?)Q}3-!9;<)HG=Xl;U>Qcv2{|$sleoIqW)^00%&R}#P;;fjCe)VuxI<`D-@aZxZ=cM5 zCFJ=H@8?qs1<83YDg1G|S}9Ruu^BsvvN0_#)p_UT28F!2yd;wAn+cj1dt_7g-lS&o z>5glUBNjf;A{8M68)JWGd2Gcy3f1S;-0FJCq7gNn3{wB3d@#PiD<4C9qNG_NMhR=# z!ua}%#qUhhI6|qpnG1AB3%I)tjzAV=2|d1OweEF?i5y`b}xF|Z8t>%T$~-OljGU`e9msBFX1?{D z)eAGGcqFJ)i@aXva8xW$ML%<7ty|XibHO*%@OswDevBr?&yRSG}+9!4HY zO2<9}2}r%l(4t#E6A_6>q)I9=O7*c8fjx2Tjh!D#l2&o6V%j+NKD~L=5DJ&S3cN~y zgV150Wepu>H@%DuDn0EDy(GC+x?)TUU)k~h9D9~R@l{cvWT&oGUW+0aVBdWUH2b{F zSz(e6sUYQm(=y-E%V^hRB3xx&&aM(4Ul8n#QxXrVWX@Aa(@e95ZH=HTJE5RTz%L8> zAC9Cle%8U<^ud8zZ;|Uk(B5f6BoL%S&H@gCsUy>pEZ?9mo>QBC8UHe+qLg|Bj!2ssgR4v%#Ox|K3tN;>UC?@@mF7B5 z!9)uZr&FYt+lVm1!2SkoExooiBbev||GUdEoyJyV)PY{14QROsFyjQ-VZZfz{P7cI zC{g37fdT=VNI1by?_)qUI?9BSKg2l!iNJrAyaiiU7rrXTop|J=Tnj@_ErpqRs!0i> z{qzTVj&JhSW+Q)M!$duG-h%no5hnPv5G3<8>N!!1%KIZqJ8u9;1!YsIeDbAZB`;w) zz4V(@v0_}j^!;BR&curNtF&OQz@n;TU>mrS(rQinsYhJpvI^4vBtM zs31EfmB9vZsee#`Az{%ydz}YH-Bv1QI`SL~o%)}GO_n@{W2Le|Z%YIdh1t*G*pYGQ zL$s`}o^y4{_PR;KOr4wQgg0Ujdi&HPQPk2;!cQo?i@{ObEOiCp%1Y?pQ33aM0MP}; zpDLRt_KLnCnqgI$m|~xexa%ts&x9d2z4-Bu#@571Hg>I>n@3c4S1u5M$c~zRTeyt& zKo-zbE}}h>Mm3DxmCMI^D35etuP5xBL5QK3MrV&7JYK)BlAqbjmF?lo#5#S=hFrOr z04pjBj9573?Ozo>a%Tw2P04RvOX#AiJa2p)?Hz^!E|!T2p)hWFWOaw&l3#ESc_ogFG|6GSl;$m<_tN?vF`9w!!yYGo0p-jIH-SmPZVybyCuaH&=u~qld!%JGg$y$~qZ?o`lON z8nt0O$qxrvuM1NA#(EU{^&$>{Y6Urv^9`NT3suycXCUnCa+%9#&>M}7jT+gs zOtI#lSwauq`9AFggF=QW%QoBBWA`LTi6$}DhzOP7#z3VYQc6oPUD_)Elge8ti4}o&r>3xuL zy5BxWtEi_w%LF$qK?Csy_Fj=1@eH%)gt6ef_R|h_bV+^Kz^yTQ;xyz_9QBPQ<^s2>j68w>jcZje5vA8SLI1<9B&sm)-tDDPZ5>U@HL@y4>%c zj1;45ID;N1$a1lvG8y{+;=#as5-qtELb3WM7IOaT2e9@QB zwf)~c`jw9%p2N4e#@=Qal9p9$4K+?yaDAUReurT647JU-?I2%27&v1#zDZfr8drN( zY7CjOGMyGF;bOND@V@f1kFWLLf7;8YBqcjp7S7*x5D`O4sNind#w8h_E>a;4izc2) zIOay9HOZ{Zun(dvdRo=;#Ds0Q3KEPM;%WgK^BF{k2&f<7J>GUEM+o90ZPz*F|1|#Y z)M6xigC8)F)o=T#HfYB+bp-vzbedD}dJo`Q2Up#AFC*i#T~{$tuif(!e>Kck%fEpc z<3dUsx_1S}Fj1?LeuQ<~mtGVBZj6b221zof%HfYMo`?N;5AN<(WB4(4*W9*TUSebA zhc_!$Ro@G+T1<~i`)JPkGEv-W>4_?CSdrsY1b8m+X?{BU5oNe5d81W}j6{=Cj8-_q zve#Lv7)W8YlH^%yo>r5+n_PC;(FvCVXh&yU;%;*Xc=Fr)dnlnMxnnKSMnejH*hKMC zE%1d`pbTm%()R)?wg6y1b{V$Yrwu{^k`{>7QEA+14+!@Y>WAk1#JvwFqY@>{fZw#w zINKCI@4@Fd{SI6selHp(w|#Z>ULNm$9`pgc=677R1!T459e(QzoKP2>DX0^noF3&i z^27BNX`1prJb5ALn5DMPYnfW^NznC?ZtZ0nVImSby!kp6=AIp%A<+pjVYwZ-%coRT zx_H!$(+fRGj8kON^Ne(}bS$Hzd#18U+2vVwbmO|X(C#$~@Bshtk@l55#Wa*4pX8aK zBa~|BGc=ZVaIj0pgCKn;FByOwA@+pk{5a0tPj!-^WAm2`ChCIjrasU>qy2B&Udd@% z`z0M02mExLxOa(VbV^Vh3>ze0A9gu>8v(9LYbe7z!Z(S)w|XU1Ycpd8P&rcOm1_I6 z;qmv;C<=~sja7Ia4H1$<3U)dA{H3QWQrN!g+76zq zoUZbRZhN${XEADxa2>bdpDZs>8%RI_DTcI)lD@cr$Tkib6}8h$<~9?oQF}#;h_cU> z394Dy3#;w1tSJP>#1nGS#sgGxiZQe>iUEev##X5AxX{Iedl!8Ci^=%|8eZiAwd=YB zm_$t-|CN&nU?aST$GU`?yVZUt_e-3n@d9;kxXmTJ2PWFHekvU}K0bhqbgX&$B6O!LS# zU-RO|COO+`KLPg>Knhpe_$L3C6oK(0l2_OKkFrlv_PToui zhl`|3zyW<4rDkp>UgWPeh9DhW6OL{7d6kF1_k~2jE}9dQ(k>|9w?2Q=z-T^^Ok!P$ zcBJ8e%;KmLR$-iDQ*rw$Q-$NcO#26;EG|l%?yj}K_>Z4djY=U2nf+Ib`=f0N;LXyn z#6X&9`VX$NubZgo2nE;AzXH07lB#+zUjtp%E%(D^zQTtz%FW ze-Ii}Z5e>Mg%O0X0xERX>g_vw<_6jfiBZ)Wi1o!S~+8{wBj$Z6C;#dWl)*G z>z6EjECBc{*S*ga9S9#@5QiP3%&J+SEBqbSaBiN=CILI=j&;@{biS1n5QC$hI>EEE znOvxKXfc{GE6Y&9$6C7<&~$hH)pqu}jw8lYxB}5vX=Y|;ToZ@DO)93$0-$?dO$JJ*QjJY9gCzW=WZ%VL6j);dFLAms0Z6+a+}I&xAb6KPCA~DvxQa z=8IRo(d`ysCF38W(->3yh1g$aFju?sRp}^^%=k}t8@!D<(zB4!jMO_=km+g3QCd~( z)EN!GleC7d2SYqlydpBEcEX`{xk68HRa zdi*mgIGH8vN^z@_d!}nY$8i$z25<}QjtsDF?U*fB1x$QUA3#;f^7}i0QhYxv8xA9E zk*s?tHq7Wo(Q$QlVq%@SW=>86qi{@K*0GADBp9|_fcKUq4%7f5g_?lm+wVJ!fmJQ8 zKdjet=<8*wfoMKjp2pR`xi(UETl7h0PQ9Fxoyl>Y@*u5AwOFQtuiExRP5JOir#x|z3%s_Q)rBM9Lq*JYOwMwk#OCzLbo}j}t zSZ$6A0R7d`W3&_r^^k6p@+W6?JO$Jq1-#-8r`0}6v(|Gj`xvnDdDMrq&}UQ^v&b$N zsr(MEeXeAVz@E-)O)Vjr>2=o^{6>1maWq89n~Ry_&$M6k*9 z;<$d&yk8~bH1%DgpY8GYwPA)hp}T-?DFJ@oM0F}+?%g<5e#?FxO{3|9>u8ZH0>9Yp zM84Oct_BJ7%7FD%3resBDU~)q;~~$2O56Exs3<8@WDfWwA*aZMs0pd)a+<2$a=cTL z5jD!#R^?n0S=wYyswu51kT78$jbPHl%s0(48=Vk6m6V?ain%`*zScDXNcc(+Cb9sB zwrIKQoQk6qIHRG^ra}>Rj1ha@!zz5P=`nW{3(_4ZoG@F_Z(U2EpK?929lJzEeIUx3 zixZNG$(^1e8T1!MS#Lq}+_xDp+~mrl39RDBIYCX8wb?j3)@Bvmc7%c4`IgT#l|(NR0?RXAP~jLO6YF zWiRz$g&bQ*oF`f3E`sx14g`RaKO;T}Oj6hV}=IBsF5&HO}#!XB&&MC9L zRP?d1SX*U{^#o(2&{1$HRX;lm6;pMLgh58Awcxrn9^6C3J%u{pXIO}B7q$?I^ouvo z;)T*=Ib)eGv+e*)=1jGNS)?|a&8*R8%upgx_GeS>Rg};7vvxZtw&gm0O9!)6JmgM6 z*WI=+$dv=nK^PI7{2A)Dj<6{Mk%O^@YN!p{C0|x#r|zH{id6RNa9;*XhCB(|ZX6|2 zx)*nL53ir|2hPl2h6r*EYPQ z2LwIIU5mKlJftuOURKBG=usz>^$%Rhs99dwSdbzZ{GAQHUY z00S|OW!G45W@h2KCm^HZ0O}*HX$Bfhh7mL=s3T zrnc6uvhSq}!O0nSmVU5l^Sy$#byBB95mc^B4igyXyMLQEL{)#$1#a;Sah)9uZE0LF zknFt7Yyc1tqJb!f%s2dXiq*c~L=2Y7?>nP#{(srI>=`qaNZ0w6dZ#0)X#RnC0c)`{ z#uNqScK4AZK(p=JLg}$vQ4!DRR>(i(m&$08j^ckzsgk{w)zeaBV2j7_m{7msJvQ1O zyBt*l0cz4VE&ghPvAFv=udi)bm8nY9I#qE$N3QU>ej?y~zV0ofR`Mqy7Vov`Cl6;$ z`j}&E!C~uvJY`K9;18&}0vUX-&L4+$JnUC7-|yJj(|i2(iT$3S=xdL*VODY9?YsB; zthMSc5q`o4CUBgzEud@BhE|-Wjn;P1M;5%ou2Ru|uk^zWZENt(;8xcD@|yvi5FV&d zds1oEG~Bn&U+WJY@&5YJ3loxJ*@_b-jN3dCx>Ppm=P&dDD31Z+%J>{pF)jAW-G_UW z08bw~y*aFn3#;d7F?NNmOSo9VM~Q2|BNXZotxutZlao$v22< zr7rrrAxPs;T|FsuFe=W~Z+25A5;OLC>!I@xO{Fs<`DUBR@1n0&AeY_(&g^BM=Kf-dZ=W#wga-|pnZgj6FEw9SQOvH1ciR3i`C zTxl}9yqU;F^z3#NBc?R@pEYr?#k&?`0awZ>0nljB-UciF?$6} zLNr#+VtYh&D>0&$LmUdqL1j~eOWROd9XvUb%%+wA0}164jn^FJj>eT_9aKv!SGZp< zu4s?)=Ymc8`*Q24y%T}4TjxTE8XK=exp!IkL;Ooh(X8xvuSlEck=>_i^g%qkngMUA zPR^BnADc57Ti9MlNH1TaLpc^<$Fx3-FSdK?MNbSZ-)^G_#qEa2br{+>`cVJBH4TyPsrxE8$ z9>!bI8})cLJ+WS;<(o@Vk02d{O6?@8V-y7|)|~y95*m<=8n0~sI^;$}RAOOXRu#pR zV5O`1yJR`lM7?D5bf{WF0Qu+w#kCT(w7Pnxn#GaBFOmmFc?WbBmLKk~)=jd;`_V8x zDy_0=C+HHSQ7&_+E6(RiRel=Dke!&MlO%0o3KET-T((3mgKx&J0zK}_Zvww-sN8L2 zf0LEb>V`wVWg9Tx9qMnMPp}_3;EUsB6dt&ke58C!gWgYFgSh$9#}6cv3?26v=xGcP z5kc`H6C8LeXAt{aefP@!0>so>Po`uAm`ch6AtGX9Yol8gYne&|wjka$*3|lSWg>)h zH%M@SSK%I6WKtpwzU|m%ag&+SFdFii+u$2n5q4r%9Yyg2nd_*V??1Tyk=7$o3=&D7 zuanwMf-_K9wsKREa!>wd89?&tqi+|;5^*isZ0Q%_Mk`;HT?tV^0ob@6hmxR>5FZMC z3C6k}GVmd1k4V%(1O}$_cNbQi&gU5E0DiGe1Cy$OC)!*b;(uKw6?dL}N=|8ihI9Hn z270Q!?0y2@*U|)Y(fhg}G$Wn@c;-WnRMS6tT(NtM$9O~xiFBwO0?&`eBdUl8?W!;! z_3HQ680jpb31v6!Az{{!xoU1Qq&gXxc4A{^hIl5FqPp;x1bRxPrFhf|F!I<2tY^#G3Ms*tgKl`%LcHlg(gu|6vxhZQQFTI%Xgdu`GW4vlfig87&#&? zr-*(JRd+8nz(MeNrb{_dED<-Y_t4YY0ANzFTSLSMG7Bw{kn(h09HR`#1 zZp)jku8`BSWxX-wl641+WO zKg{RZ=R8|y@3q!jb^%^nlsLz&_?9uuxX}iSL(SI+)9rwY^b{;< zao%`DCQ@!u^-IzfyE2F3FS`+P=K{9Ag4JsQ>Otee7zxkhmSpL-qCd_M&lc4*IjIH) zy7}wiPZN#xWURPjBP&uB<8p_DCH?D~9th$PmvD!5wNp!_FC+G{bL`2hQg>2a!`){% zY)b|sw6y? z8qx^oFsDBzEmN6L)l(=-Lt7%$XKz8jo5@-B{m1FJhuF7Za);qJW_X zU3xoPGa0&*fI+9gmWu91)1>~q)mBev740~j|3mKeNCUs1Xmj@sn)n^h# z^VxLwCdTHrX1!+EMLc#2@Q9K2>k>{k6Ot72ujYJlulIRM#N**nxe%m>rNU z15bldNUTK~W_MlTv&JJMF9O-qM+eaI^t(@3+4>ZVc_Y@Y*~aLbh#Gus=jwbgKMYL1 zRc=e-?^*8sc{N(MggO&Cl4JVf=i%@WiBxV<9}`SWKq&W<;^Tt!`G9!V?x*>hUNwIuwQ`#HdU0&dugX>Us( zklpYL{oiZ*qJ1ajzJUi^?Va{_@Ansy_Zw25XP)=ROeZ_8G6@~R-3e2z{{s1UMZcUm zw9;5zsg+o`qFnSZ*7Uz@nZ-H~zB~>w*X-eoB}+ZqK=mt<5a> zpw)W*KL4S`QfoijRF~9h-9}x(qKd&z!^mmRvC2h{^IVC4ee&I7z2erjzHi+EC^nrw z?Z#z53>Gfr`_9i;t0`Mp^E;87EVDeZIC*F9?t1h)7pqJ7Jb7Pzhdw2!wlssEF(qI| zl|B&VgQFHr=W-=aS(*E}5@H|a#8crIVabl68Lm?2=+mA+L=Ym&+7qGIMnG*SJ>T|> z-<5Nk(b(1}Ro3MSIJscA;vQ(Q4|N=87o;%^a3*NH(0aNTax?X}&Q0~ z`c|})-Q~~#4Gp)Vwt{(5tji0amZhDb(XC8`7v#Fp>?1L{&XG4o*$c(y3td&)v(ZYQGUR=drFxK`^FE{1lT`3p zJnNcrfDY8jO7>A1pog|C8Z3F`!2}`A?;E+cDW7<&BFd(?1J0&(C@b7)%K0#t8P)TO z+%FG8zlSyno%UZ#+W@&5?V0ajf*EpN{JcRE2Ka*)dL^z5O6TySDJka$VCOVR`4j~7 zgt%x%GHeqfI;v(7%h26!&kyqDYg&NOh9* z?%`6JJvk{o(;w{pm5GWSinUXTm~6Xq!C4Pr9_?CTR3ha$H%)kpbkuxdfeYfhy`rKse*H z@+Aw+zpN%H{N8q1-5FS&4BQ#?CP~yC5RLF28UGtxyseoQCIG!ZiwLfY>*tyrr>697 z!qX|DHM}G)bZG3RsVm%0LB-MqwJ~GVf6yh4+cr}MQ!b+u?c^!0tgLwNh;teikY%g- zoLi#5IRWYJ1SHt2oK}jPHv1oT+&Uqtkp<&jb7N~kvJlgV`zA#z!m>gZRy)dT?s_)N zJj=E4>K07q4)>wG{?lY_0Y+?9Ifu;`+gO}7Hr>&;U@K+d6=Amged12uV1d66S`w?Ds&=I5ooF?sW337m@@8m2AX8)n}MQf|n z&KkFy$GOM_L>VG)&ZI{tWInkB64b+RZoE z-$NuCu~YP_p+9IE%1)mpUW|BKVXU?j^;Xca<9XlG&&DD}K9w_iMB$nMwCPrA=VCLj$EZii2h$Ge;xMYGR zH3iF(UZVI8%ygpYNC9<1uTzngsJLTeGr@gBSn*qlIzF}+=mDTD?wV%kv=Z`(V(ZC+ zc!xy+59^fTNWc9B96<|SAj_1^(!n;XTalK?n7VANdcNCBW8csVL1Sj+$0K#jeX6== z7vWYZ&kZhG&0(z{aV70pOzuACbQr)n`SK;Vq|mi(67-Lv6~w6+tN%gAgK8yM_6h90 z`BSq4wp2SU5dG+stH|bEKNO_p%h)OXevtDr$H~9W4kawuOs}fV6hY$P*g#)nj;bO{# zASHtZq!B*m!87c}N_a}F%R0Dx=#QRoQ^M^@4TmdC&fb(eniHuFFA_DUdqtLgX%m+A zH=(|{4F62sv{dVA<;J1!pUQgdFqb15cug9a${JZnx+82gfX~a+4 zGU`u5Nak#pz{OpMv-W0D$E5$M9q@Y_%w=1kedfr4Yb|WeDASVK6;j_){B6;YeQK=q z#o9D24&tul(Iu|l@qy?_lW^I#GJ2CtI=M`5;;x6p^h$u*JN2&mM`%nhAyw=LbOpKK z2%WDyMuCvqxyU2opA*ab2~6r><0GQ|9i!CESx-U>8(XPvMaN-j(`CE+M&}x)=2bON z`B&G>FxOXOa)+25Ln;W3&YQ2#k{(X;pYt6`oodi~iR>%s^=BxmUp(}!ckM{yTh^BN zeMh}0GmzdFy%lgN82ppLSlsDhd3XnrF@GO z9j1OHo;aN$|F`y_WL(ame?mw^!k3;iT^qVyh|Z5mlT~UGLrs04!pr{zcQ_&Y2=xBycR13sBP_6+ zV_}KE{d=*8k(~r1Z^3P{Ge0o4Fd18}{4#i0?|2Z+^JtFwFX^vI{`5GJ)2YCI@9;Ty zy9bf)1;OE<#q5DuxGyvfv8S_JK{k0J#b6vS_13k7=@-fUnAybOGSkuYKaHQgQ=1r1 z{E+RBHg58)c2M)I7%_Yjj<wA1{e+OGAc;9|4PdJ9*T>s@;zY&S+8s>e|ILb7IV|^ zG3ACEbh#1Mao6c^kE5-I@bx^;q$x3-C2Zh>#qE>08`r$j%WA?hlOuBJ8@rn~oJ-GC zo!w+!S8u_@D2P0y#P>{n&>urm&&%1~gj*hbz9RkNy8TyfvZs+wRnf=1zC1Cm_M+y{ zv#G5?>|s!Fi0_S}oTcMIZv=nq?_+VGvpFBmu$Y9J=tRa(Cm?3J@_w(s{i3CqpW|zC znOKJ0fTeGz;Bc6 zuST_@z!Qy<37H_QpVgA zMpEb)rT;E~=`Bbe-1NxK%l{T4(f$kF5aAF$M_jSHWpxo0H*T8VGpH)PA(C2>e@rJ^3po(Yc1(Xr^BcX zF6$*G+O8~6k;0FJxzEv8fRE6bUbMwwf9PZ^o4yx()toO;&`Ii$ny);N4>&uj>$7lm zAW282_%RIb6vmo6@lPH~yKXTKR~gs69YG#(kDkiNACSmD*4&kFo6!xi+U#F%oz0BY zNp#!OpLq3UcdTgiGu!03HYWJU`afJn9;Bbuq@)I>*8_{wJ=ehpvPxzfHk@#d_fYzD zys-ZU#?7Lbn?gQEv1S-#p;;xzhu7I+l3)JVYJ1Kt<2%M@luMn=8UUhxIRuL2|ujpBN{ zKe)>TpDX{Tq0%()I)VZ>9&y|_j^Vy3>3FKY-vynwEt&HL$K#)0Yxw)@7?oDKW1DEJ zlgYZRn@(Z2#YfvS46>A-e+xZ((RjnS&U&+J?ekQoeCUTavXb96^88!R6B%oLDx=`w zt>CBS{oISWL{Xh1s0|+D?9SR9Asiv3Vy^Cp?0U3PI$>%0W^R7c`LTH~_^d%gvBhh>yy3iA}(896nn%y$hlm_-!_O(bmLo;xiVl-3QV7J@OT zc?+JOl%ABBxLBb{Y>%I`Epry;y6C9N?fAM_rf<2HblQp+BCXUw9cw~${4t|A^JVXc zvf2pEe@8n0b!=~v{VDPU;pPaY&l^g>C317DLmf?2-16pk{|<_W^2YeYT5f6^zPv3? zf9Mb5j|@=iiPrau0#<+O0KQ&Qj4mbKQh_~aIiDDVK{47Q_bcm$K){12F8xuj8!HJo zD=P-F;MBtQJMVoLPzRM=HRqEn=xfhkyjpMd91qlx>r~_*1Vr)qKAPR1nvJ~?iA3iV z_?%mVu5bXYkS=AWm&JHur1Uc3?>_-;GxC7w}8&AuL7|)Zf%9eTXqG zJ3(`*12p@tqXAf#8`{UllnoFlY?x_S!BF7dF`g<%l!s7L&(WMc?w>h}pZ;36{3ouY z-yG6?acrySM3{<;-^udH`<}nZ>z-g}TDtJIU&8FwyP)aUP4mn+Hitm*4ndiLKQ7>G zButViG&)}3%_u(RlX_yRH)?P<6HCGbDA4%j`)Uyx0lswsit3Tx{(_trnzpZX!Mr!R z?f~xFZ*6UIj|X34$2p%@Kj}pxuoy0BgDd?i6?s!t6lY!A;BzlF%5E7y;?qiBM3_5_-N0-;e6`!uNvx z1>)X+u-?uyDyj#k8zR(Q{W!t)3!B>hK-}LalX8cHI$Pn?r}(<$tYH+0;eVrS^XR-4 z#O0-7vrjqZ4KK+>uMUA-FC>YY<`uAz-^9r|s&ytlz$W56S*vWc?)w~KSxD>i@?GhK zc0Prjm?tLpJPb;OR&15^yrF$@@9I5n{`&r6@Xm>YM2W!y_CXV`_`!8j{Xsb@DHxEp ziU@n$TEEXIp!iwY-Iwi$S*0tsynK2=eMZ~+f!R#*yFkjBSbW{8xZI6cTGh|NZ&x7O zC42Aehd`)&OOiE1)nS3tdyE}++I9#5Z-D2mR{W7bB=9|;wd4ue`$mM+R?L>FHeRoG_vA#?IlQJD)(Red7)@09T*3{BGff)1V% zT57A$EN7v1x>eQnJb~*ufHW=Bwip+Lf1)i;gl}WkrvC45pkMn6YqdOx8QX`m-($oh z_(ex<@N71bPZj42AA3LJ8bOF)%Ri@|O6;3go@{eTJ(`7wS!j1x$*1&-hMFZ~? z(>P&STgwcVR!{;E?o6zoQ1$}~^pJC2yCVC*U?$Vl7T@j?dTbP=dh7I;{miQFt;srA z{x{g!w@D&ub_umwAG1F%DExXeovX+f;d}h8NKiiB?ZgEwk_|)fB&zI@ye-KDN0GRD zl=H%Vtk}|DWi9G9<6fvLyXv9&T&EQI5~V!Wj9ZICOhY}+IVCp5Pv|j8aLDgr+>RSi z>CulNTx7wl$R~Q6mLrn=f#Y=wd7e#naxcvbD^1#18~g0N(G<1j&U$d5P#Y&xqx@lC zC?LPAt*idb8>m*(%7Pa)0&VT!hy0QX|@1x26o$;iub$0Uj@J-*P0;7poj^!X{{;sL!L=UyEkIFF{E(oBJ{K|YmCdRe`LW6lGSC;Ix^6Z!9EPT(w^61=vp-hyxL>f`3z>OYw6l7}m8 zy0bd$sTgm@P%5fvuJl4V?RwzH`#7umkgNN6>BiQuDwb)41VhMJ9jsEWM}4n1*!Tph z30B}cX{6A4**0_nFda+=_9+Au(WOa~T%E}t{vz77mQ-82c44yk(v>Y1oGAnzX*%W{ zVF5%BUP(JV5%o3Ex?BnU91yqK@^p!@64-PaemhP(XpF?7t}KUIJoaJ}VfZ};J6JWx z7L2{ZBtws#!bp^r$N+~4_>HWPb78}yQWC8u^Ss6^YxF4jD-9>EMDvTaPKa65!6?sh zwmB)yAk9KA7O5+%b+kSXHI%@3po)GOHNk&G8zs^(8iWY)!}~i(ylj~rtQk5ZYlE5d zTwjB~AEN@XiLnH{P_SP6M*0lND~@2v=rk*>Axum{iTB?hrBKQV@jF{nHfO}r3uRQu zl1*sAAA~uqexD-~z#}_m%ae-xw2d{fA!M7#MA(OlkjhZi$`x{VM)N-JqWK)?J$KHJ zaWYb0{iHi<1|k#xGub&t@HvmYhDYu#j)6sRo=8|Hl#b zW6UBlG1!LAi*6PGay$IPO{MH@gIDyylR&3kKC8j+mR9H_B99#U#AGwhaeE-1E9SKG!`IY0zMjEl%0c;V$zi9mUK@jQs1pRGMovK58 zOdeHBP#=H}A3q60$`FWo2PYzhOEjX)(2w~)m|gzjFIk|4KVN=_7h&DHQW%=!i{E1j zZ*dL}Li=lFuf_uMK~57U^t-HJL@A~KUf+>9 zj>O2aHmMhXT~3;&V9I=*>E^Pw8BSb~6m5T&YqZ-k*MgpfzrEBl^%VoW0UvbtUE9Ig zQPNp6bJ|40I`Tzm_s8GsJF4LPyPA0Tqm;yEEMU^vSO(|LDNn`0C7$(Zp0ovrn3U4q zTQOf3P~d(&?$Bw7Ya!TV*Ne@G5w}_~wWWo@-wqWAKYq;4M#?(VfRF$V1ocpDnrbOm5Pbg=(5` zDe=zTlA%X=RF$%4uxIcv`#v#gVu1|1p@@KhUaX{iWm%HiyAp#w_^GYzz#Qths_|+9 zl1EGPg!BBerRBxr#~5~y)9081);wKG{~rtBH$qdTcp0eY%T*8g1!O?UBs28fpF+4j4mn z?okU_%BPb5ea=C&$uR%QUVZR61j z)-5DYYfnH`RA9KxcTVwed*o@KkK{}V_P-0iz0z;YG)U70C9V0;96^%z{Nj*dxBf!4 z=Ud*ft8Un@5B`H8!-#`jEY3kyxasqd9PY~vIHL9M<7CfI)ihu4;s=dx6w&|n(@o^y zu7UxIprE{?0q#MEfXH6`%{w{%#GhwcM;+?|x>x)aeT!fn9++Dlz@c|C);`g@zFIBd zJ)(zu;mZa&IPwH+_h$?6il6cx4fr-*|K8h3_CC66G=)^89GtyhU@R@h95PG&e)qRK z<|7G=so!MyE+g@&XpH_V{jBqbne&BCYO-=UuMEDoHjpee?Dy()xo2N1kPUQynv>{Q z@nFbu2YgIa2u{EWM6*WWS=4|{z2{YEpugwb^$d82AK~Xk`B=Ay^2?IArhQWGTi`^S z_syFIu&<0|-Sz1-zdfXMq13I}1nR#$bODV1FAu4B139xX1UyGj^S1p}UQ!tQo~loi zCk(9|Ek+jke=9PIaE9zT_swdptYho9!D%d=oroLS6Z@U0_HFz3%_t%=(of%bFGt^K zjC*U<1G4wYn`Ip{_H({Xy)M)U^8Jin=~UK2pMzaU<|>s$-uMwC{a|0VUAf?x?`5ZC zP8trQJI&j{o@vCOxSCPnSdvrgFVn*Dr(TwawyNi5O{s+`rNIr`uTA- z_5xebGT1q&4OPw9w`!(&+!yBQUiB@z8=+sGXRP`6tg*=kDlQ8+NT=F92Tj0T4(IS% z(jv+Kqwe-~_k#PRsinOJZW(aB6z{y{C~Jj+nNq*+vI2$D4f}eb9=GQpiw)C23I%SRb|hO7BGODi;tnB z9lW~Xuny$5aF>4(9#oE~?(dLc;rW5(N5EzSW&PGAw7d%#HBEvx=!;n`E*?69R6xD# z_0T`rJ(#L%LH@Yg-jBZZGr}&9Jro0jEqEBh+S$kqD>x-7q%oF=X(nGODPy?VeS?bL zzAk2we+A!5Ve$DSn)n>at~Zh9F$PS?lE^8|4sL$s@JfjFi0m#t>y(+1sAgbAmG);m zK`lA3U(NP9H8c-(b=4)q7h@+C#_{sMyW}B21D~WpMJ$aXZ{NRp~lbpw8Xs-i0FAEQP8m=!Q z?26{n3f5XS*qcXDhRo=0j zj!IqIZMJ59rx1KHEw$PE6QI_1e`ZU>8VAflg+2&F7Z^;RtsE|=vEOodX?>pm z)UXAA`LsDC+Zkv#@z;q=`r4$lbE1=VI1JiagQ9$?cY|+~OU$rpFL_n-m|N}m>?o^Z z-S|z^@pJ}zTYXDUxd;v0hmqaELmgB`fv-v)uC~$h{aR=?mQ!K!>Yq;lI60pRPI&gz zS{Y}JYu+i@{su&Uv$l-bD#|-eEjtyR{Eod2m!P)AHJp7tS?mW{Er}KTTAG@P?HA-M z+zAJBUw~L}0(@T_F3=ElgOUCEmi+))Bi$mSam8 z0JH#Kl_}3P+72hgE$unCqJE@4rcjOQ{s;{Wlbw}Jhu;!hjpIz40oMJ&%h1jhrm(P0 z0z#bcgQgb!YztvZE%uSr?6Ckm8ko-^DM-Wt(k(2s>=GnL-(eWNV*|E4g@nI`D*BE( zwn`G3_V|sx#B|gVo}u+YmUjEF?cRO8xWEzm^E9`jSz_Ig@v}-#8!97)AbVX0>)8i% zY^BEL*;juC?S>Xxn{0%K&5D9Tk`A}dthl=Q+?HHBMgxr{Rx@|x>=g#S7Q-4^T>>{x z`xQng?e&tjjc67Y3F?0rQEz?QOB^Y)VoKoPCK-Rzs%2A$nyaN7SO3DiddbVIFC=GOqbY4z*M`Q)*0(bE`ye2=kmP0>O z+~;|##Ur}?q&S_GNSU^snE_SEz;`SBCVwj9L|%iuaqB)8kX&Jfhp60qT;&p5)t@LiVOAaJRhbc*^PCZ+qux%u5M>!C z|E!|TSMS|)#5r_$h4Q)nMt>jtp)%Hb@TOOe#jqu~LV(M{l+|X2Tvgd#nr-Vam<9bc zKD8v$ z!Ml}FW;-}+9m1G2AgF!`oqbAxPI@cYsqa}_;7cjs&N0Kv_gGq~ma*d^GY?^@!iYu@ zhXSC-A5j#jh7Ie-p0TlnwT_(@a%Ziuc!p!v5txV8|PH1nC4`#nsv?T0#vS6BS|a1{G;84#CGL6V^167@PMCCwHBFVSLsfoJmX5^Ku$PFG?zu%j9 znpo}v&WNhvuthW_PzOo}vA=t&XgKv(VPJ)Yp@PROTO{yE=h2MPnWjr3nGfl7#BUQ)t$>>bg?c3WJnvenNxSB`D zmIZ!?|22*lD;T)HHr5ZNHh-*@iSS~FvpSlqoQ}#=S9e4G(Q#rR^5Xz+du1(-X2SB*tnFGDJP0XCa>PH z#^t+FI<>D&;GD-tZ4XuPVFAIzEP1_t<)`wST^Z2}kCqNuw8;xwiJ@Nx#)tNloTv~+ zc?fZiYmQY&=Gv-FZP1RiZ*~x7uNB>J^Y7ZEl?IkXZ1Xxkdz=~Vb86EibR8pAYSC6# z2n#7JL)|D?W{zj*!}3(VC{%Lr@8mzgOq5f}=G7U#jQvaE2TsyQf{E34IcWbh?x8mH z*9DsNchxF)Cq>VYl;V#ooLS~`L=vi?m6vbt zE}2;bReeHD*t$z-tJO39gl?jH^kjvO30;k*+E1Laqqg+z(>-=-nTD;>GL_>J9Wa)oT})NrS-5J{#p&ScsC2XfZ_!$cB>M36D-TPeKQ zTXGzAA;hT~fbb7?|0IVQyKCIC!ABbS86M_ROd@I_HeJc=-vgfMCqMi4xUVZ$e&%!ZG3mf0aOqM;1&_offY^Vx!O2YRZ#NArytA$p!2ZO;*NQ zTa&MkUV~T~4HBSc3Di_%%O}&BUO+thf>}_iu>7DQYG`$hZdqEGu7cdBP*uQ_9t|$N zX4l3*!HR+jkmKT@G-MXREaanyj5QHlKB;>5fyos!?8{aZ zuBAgGD9mmgdh0QiT^$qNTZT0jo2!na)vNskK5u*^vM8^KYB_Bdfu$2ApFmQ+Mk{&+ z;gK*#9V+)jO%kxd-I%0B$&nylCXOBlBdzjx1yc18Kdn%t56w(BJ;z5M`~gRz77fE6 zc`jy=Z>)b9m-gx96<}#x_*as<_QNNJ(fa4VfRv))+sk5iSye8H}{Hg;X)m$id(AjwqcQt%_DKFgPs;5^Sw9~k^PW$patz$ z2C8}wDzP~89-N$zW?w*evPD{lk`A6K!IxgFm4upQ(OotNm?Mpn&bMQCxD?`Oq#3EhnPkys` zh>am=78j-{QH<(ZP@_eR&Iq1E!K9|CLhAAo=T{wfNn-Vs8XEYBkOPod+Jsx|pW!8p zYrCA~nic-SIsncujS1CaNkBE+YS@mgIuv`dIRJkcp01tS|sB->kkT{;GREC zTjTMiD!tECT_I=y<|-=3n&*Q3X=<}q*DG^A>gUs#^nFK5*0Wb9hPhWmY(Hn8k^=R9_rxbyPxS+VNU z!{vxULRZ2hZFfS+zT)xaa+mF87eO6!k0yBm(H{KwIRW9TL|7uyYSah*GkGZt<&QKI ztBfbyUtn~0lv=em3f6O5tu=$4v~%fvIt?pU8v!h;a>Gk*o%vY^gIWD@ge177iKZiI zI+=oU$Hn=*76~s@YzM(95(zPKBds=7$1u0_rNpJX=ccOaB|OGoVLQ!GuJ->fOx}EJ zhHJKdy(8VxlY&{;5jGdK$oXNV2@cSin;y%lmfv%H^GAEr9oRDr4 z5mjpHLhiD$-Z=7tWbuP(QSlKgH~K=3eQ5Hbg!DBY)7`}iQZ22pG1+2L5!6z&Z9#3W zKPm?G3`)*@4q#?EFK&{S>4EG3^TC>wq0yw=U*dV{XQGBu_yJy_q7iRwkNE!?leIUs zi%{Ay@45{=5`j5MLr`LSeTbW3ZFOV&FMw+U37u$di*14Fxx6|5`>EWZGO243SkgcA zHhk!AF^Ht$yO=*t7{h>vWady3TSFQT^W8O+bhQ4*HU!y!s^!gJ_mH%gWYi`oFUGRb z+E?G-=kU{HgaMhNuH^_9He9S}7y_cTcx#}<%iCMz3#gC*vM!v8@Zy#wO{0(&gov0{ z68D_Zh9H8&0MdfJWI!4h1gs~)=FNflssqySr~{S#7-7P$PpP-wLctw#=v?BVC%#>a zr`tx>d~xM+&W%&?KfdO`#wLT|)zWVWEYDd3w0%gsH>6C9=}w90xnvir3;Uq_IJBY- zIEK>}eHwzXc+taE-UgZ+0owo9Zwkzqnjf1sRqEssih_$UXZ`V20J`JDeybhCO1E^2fdJqKA-*#l5TBXO4;hvAC4t)PtHW()+M|7=~MyGPL(xAC3PmW`EL+w z4~bOi?VE4q^o#<)d);N6(-1z8ZqcT0Egq{@%O;Q(hY^!Rc}7QE3k5;a6&@j)9}wUF9B5LV>$#5!EYp5jXq0c z|4Q+SHxXM#*}M2s_jxt@63=qd6qJxDE_(vfNx@xtGi-{<80Ba*kAI_{G?9zAno+4T z{c(go`7Pt=5lP%L{!uum3QJ9D*BW5_(`%C+^98(>uY+&zQ7h1lW(b9cmiH@941*c( zJR)ZC^~Nuwh154oR+)~Hr8lxJ9!0_kMuc4|Xz#C-nY>xV9UK8@n<6w{DlAauA^PnM zix;Ns@&J7;Hv(i3`=u1_m@Ph*UvWR`x^YolxO3ZJO#2iGm#W)PVw6-ROq!#QS>j8u ztW(MO;y3JNl`dCbyo~PwDDVl%^TcKo?%d?sDiYjt#I@}S8Y&xfCzMLbnc?ve_SJ4J zY%=2qY#SsYxRn#aL0{z)6+NxOq2;2YyXR&}GI$}Re=!?tebEW#`~8rfQ)WCFii9*jbT#lOO^WSY0J|b9zhSgukyGUkiu~=i9(%CCI?Ld5SUElYFYgfK!d- zYOurTK>I)=w=a`)T-ZDST9bVG3zFuIWa&)Cq(X-Yctc+b%F|3v@_i<%se zb$|JrvwtrPUV4uRx?=6Leaxhx$yrE9H@vtg-pVplQ+^8rSm4iE z9mvYD)_%vD>fVH$CV|;kyFY&#$7CxJdi8FXbShSIx*PA-fmptHUxzMC_(<}$ZxRtzwZcN04=MQEWnNDwy&D} zrhZhl_LsQI&rzWuOLMskqYcv~HcUaeGw5g4AM&L2IuPjuHLMUH1Mwb1q#?}oKg7(k zcN0J(Bsr?&Y~^>=KQ#*YNrHLOt|D9{zCI4}&t;RE5inY&3h+-Mo=K-lr3fd{H>@Xk zpo#6rd`&Ucglk^LpI+3qypTdvUA<6Q>#;>woI}p(W)nl&!WM~@=YbNH?i9&&iw|-8 zTegmF3;{46*a>$d0|U+DUft!a@~WF^ip!2_vl^DbGl-U&vJIRz0n6E41xHEqIw#k= zr`f2NWkeZqz{0OrgwrZTxsog?B6(KQWs#~sk*oz7p3t|80w7K+!#+H(n%-U_cof>s`1Ex|R zK+}zHIvy7r8DE>MhfmD)08xLfr`cCx%?!3zsWBY-ju%t}L`y?iW@lc96Q+KfmFGvg zlb;$s^zcGYm?sdP3K4krCFc}z2}mzVNe8UV#zfe>@XAM#k1>K=zEd?W94Y{J6B`-0e@*BX8JEpk?jCIJ-{b@g$?5}!lFvp z7b{8RCt#zX(8MDP!SV&T#KbQC;q!qzElAxwYS~(=Aiqr&pW@}09UsE4@Tl5A@^r+`S1!|8J?)mI#io6Y^3i<|2FG9XoClP+rrJg3@NCAq&bz{yM6 z^Rwe%db`QzA}i88<%~fdk|>q)J&UT%XE&B)eDUovCF@r@k(xAOho|UEmc~WX4^bIl zv6k)+-Xw&u9v=-4pK72a5|z*WU*K$KUmT5*#Lsf=VsEyBnM`mpcufyj=TkOKlcbf-v=cN@?_oQ7~tLnMSw&T!gVy43nJzEMzoLYhq#_3 zexTzR*CJf1rPxI7`sPNmx^$m8XP_7s(ebr1f>e=DuhaHm6))viSP$H+E~{oqAhCU@ z8`SHiKVHxv+RY88`S{#X{C17T-5IsJd?=41EF?Nyxb1^fnp(^@0;XddkQT1cHQ|>$ zB(0uy>INaCGg2V~(DwZzGiGxyzim29;GFzT&iFB5AOBJzRl!AEJV916OJQuO?kv(;Z?U`sPe~GyFrfa)U>SQ!lBcy{{ z2Op`MSPC(7BkOux@%|Y<=E1`>hJ=}EEQEfZM;LVsHzXS2J1_hflVkjk(tyw>+HQem zV4Sa>-&=@lmy7wx?aWiFAq7c7V%`E-#d4MC4^$)am!YZaC!8`2Mmk<=D0@-|)1Sa% z1-F;M;WnRRr7<65)eu*Bj%6uWTE&Z&MJ=n*jeII+^Q#ct=kxySbED@G2(r(;2#78x zw}HmSrP7kYNk_?X$LG=q2K=?v5l5BNS_LmGSRW9#`c#1hQG7jpAq%gR+TAwRz$PBv z9kaa>jvJON0V_NuMs|OZEc40oCQeoupqh8WqMpTv!?EZZ|6=_sgYp2q`9}RzxyTVs zL=JGyp$upXyWRjIeeJYbc3n%wgk&={#CjiU^Gu-KOB&L`;ES$}h(>cnsi!k<5dX)aY(xta5Mpt4uCff_kk zhZe*qj;2$F0hsnhVm*-d464Ozp_2|&Eh95IWxK@~!5sZr0uU1l@PaQ=W23%$3Y{%e z{?EO5_KZzaVhkKZMM)$N$SYxhL@Zt~P;;q@5;#ZI``d`8Y-D`ED9@;^nU|WYY4jY^ zmM$sJ*sv@uK3ph@okfjI-R|4uAX7XBI}4WMs+nFAJ1saWPYQVsyh)d0t!2fSeP)fC z9nymzHStz$I@bOAN*#gny;Z7GOijR6j>zI*)GfL4)z`$d9jVXp?-c*{8*YIoha7!y zx>g-%MYQW9hY43%D`MBLpF;nLa7*Wy`&cDa{Q3(jj%42lb@S$KW*Tp8*fAXd6hZ`k{tQ@z)0(^UH94I{S=eV5Aci41hvisMNLj&mf_z04^=6ENSDB%P98 z!ZI&3T$Vp$ob5UV@>j(T$tcSm|4aYA3I$1bN@aN*(K0b3mt5YWmGg8W!44jJq~Zrs zB=vcW^CV}l&=!Yx&Gox2T*G?119eaXPm23Oq{0&5WWfsH(*m*At&&b%Z&P>>@|kH9 zDa4+WZ{Kn_P$l}BSQ1*L>8d2wwQyykuAh5}zV4_VuUm&LYI?k)&#ckORdL)g{&|g3 zS0gqXI#*!4Iv)xY@TBy9#=(8iJdaYTB(ng&KFh5$JC|t17=|2&RnFFvYTN}ftD`dH z&GNj~Z(-kmbPNCJV>T=7)jgbNPxG{jUg~8wQCJr4GJyoQpd2R$b6hs>BvJdmAe2m} z&bnb!XVu9Tw(y4ujzdYKVs}L};gq*`xJ1H>@*-jl|7YjyLXO{`5}3GTVeBht;`CD- zfx8g`!J7f_j}s*8G%Aru0~GWFupTaBGqJINUs@3V9}6((BkSzjL9fKjbO@70GZkhURB?+^or70 zvNz=mXgZN!-CZ(b*f078D4P*-vq6bTN|QhnD!3e&Dn(RuQWUd-fmLp(Os;rVWZn-^ zgu(d4H2V~vjCwN@$EAps)u$C@UM)Ei%p*>hD4h8!5oWNm8Lw>UERAdt{IGw3kg7$g zKIoETy(I5TkSuyhLq0e9x};fhqNqj;4*-@c`C)uliBmDj&A@x*hk&yd9sl7TKoQlW z%4yVQf^(4kkjG$R9>O{oeV%oQEa`i%>L+3x zob<3U7*2~(knTl&fT>1`zS16hJ5Rhaj;|r{{zAvuWJcW7;@?sqqTML4)3D;H^n($K zG(XV~qwr<^{{Rm`@V*cHg)^^4$JR58RE}V~S68aIKvfD6p>S0iQ&wt`siAT>F3R!g zyy}sYked#Ql8b*=3|G8&PhsaXq^Kk~4-;znmn2F8#VBlBq~MI1438LRKl1J}DKV`|LCQ_;9 zg;n1ZV|eIL%1=GBm$$AAIelsUp7l+O?T<~9A+HPt?iMX}D7@2jVhht!@ro5LRNA<{ z*sV-EFE_c1B{o5o`v|V1CdH)5zo^L54`>$1jUh|?)cUXRb_eOk(v)qXB1jYZLWBA=5+bxzhjOd6nPm6!UhSra$B)eL(MNaD zpYE~d+w+D*%608g^JVb7*!&6^2WtARt7nPOv^~&iE-z-mm21$uJGj1 zS^mdQ9^@k@cR`l3KCk}#4KL~7B|N&s?-j@SgVxN z>hFg#)a@9aJU-8Zhvvyl%Fx5irU`%Y(iQ&IpT5l-=T})B<}Sw01l(B5 zxx6&u?W+U6_x1{(dwMUw`0+y=-rZ*~vhEz-M%}GIZnl>)1jQ^*#!2M;Mq-3xd#CvH zQ~T)8OtHM4f!T-&0XTAVerd>m`09K7$qSb_e|_K-y$CjkQLd~FE!S5wE-a3C{o)$G z__2fh?N1#g>A|2NMDev1J_D=>`}U-K{IR|K;M^*2oL||R4rsCCvH1wpRI^pK&n?;F zcHz#Y8$=Uz%8=N~jRFF-WRl{uQT~y#q2cEQ$LL$DxRxd>4gSx?%@*?HE;h*cHfv!f z%L8*ssMw5=z(~QVsYia>E%br4wx&UZ=EL|H@$GByC-VJRniu2kwpzK~7U}NgeVQ2I z@a`Uu9$%n4-DlNW)R+dt*!Xd#lkmmwU*ezs?i*ZO9BfE}LRf{hVa}Tu*SPxi^ITrZ z`PI)I=lH&9rx2-57Bi#z7$anoH`MU{p^T~?T-VzHA~4lUdFaS2$B)jlstF@=^PcOZ z2^W?f5&ENVU*z(Q!7VFZgUoXJ;u`<%FW*B=!r%Gy1AsEhi)pb)HkB$ajUO;dKiAM~1LGzukqxKT*Hn%$ zO@j$&OfibfuGL-34=3)p2-M!ZF?kGC)Ci-345>FOO{m|bHn}8G8)DxdpEjO37Lcl# z5c#}qSf>WFq!eY=RJ-Df79_}>Qz>JD-K#q_O%2Bn&T{nNJT~nx9NH?rObDeMyb=*i zNBGhYF7bc-r&n)la13EpxxO;uOW(T$#_;!k`~-*hOfeYRiS3WOH!-+K=G%u0IkTs` z;cog8axWnw?49fK!AJHnJ2%7P>IgCM)Ui5}M7Tc4`Q2}v=a0T~VN>VYTIKw;0l)u^ z3mo1*$ETk?z+h$M?t6(taZ+CVnZn+^Gd%V1ZhrXo4X!S=v4>jRp_xpiFw1VA`?AF* z;LT)yu(aybA@BHHGs95H&{`-u-kjF-+8rt@o)nbZ0}@a(6Z!N3X$Z@&G7riu%tN^` zWTsQLqf!IBDXT~>xG2P-Cs9Z&B9m7bK|5BAYHeunDQf)QaJ>KSNsxb_d%_v^nJ=R; z@;6So^=2|Z>(j3{cQ23{VgH^P<`-rdk&+wFvd809sXDWz=@?!=zs$e+(py|v8s5ojj9|@(2Kshi;XGWnm(Nfl!k&dG z9)4gqYu1pNv>@sP9bDZtVgxJj{F&?g#fz7@ytp~i3(hC*+~rmN%QxQR(ix2xZhp%%a$kRkteG8VnJ#g0NreyB{Jbw8ZSJfzWaetY>lc%sE- zDgP*JG6#j9HFI1{9-`kRAqz^$C1I2lQ|rT^Nm>w`;wi00$W30XO-43Ar&e&C~Pg#R%7z2YmhIE1cZ|Gu3cp zIdgu6=T9&46CXQ<)vRucu5SDCw=sr&`{&s;HwE0dvkJ6$U*HaWh7`5M#kI9{YH^QY zRY3g0yKdTfX;29Ld7`IQ=+jbDCsb<@a!YbReb6tD@q>71Zu6>Bt)5z@kNs(^Dmh9P z#u# zCu6)Y15{&#;O^TrF}!u@2CtsG!P+3(AoE*;s&Z|4!1v$0&Zj0J8LbX0lVeS`bTGz6q<-td3fFFIO`IPER@X;-^?UEKxHh8KNp7kv ziU?V5IrGjUqjq|I3+^P&P&qJCjYchYE<{`i*aF@GH=NZ}BSB3*G|_bNP+ifGI7Cy; zC(fj5Fh%)%>(AIKCX!p5EG^Z`LW>BFEaKQ0Au|RQ6Yi?DDJC^#l86ZT?J80Wo>+HI zDcWIenchbEmCn?~F}1s@!AX5mG;e<{Fb1_bDz1l$lQ))rt06|1n(on=>NAp*%mfju z)b~}97DtAzF0J$GTUYPOz?5Z{cP}n;`n@F{diVg{PD-BH(v78QI<`#=Bk2Ujp6vk@ zsrk}v2XuM~vkNnfOv*?s`2JKW*Prui$|Xj)zOu$!7nixQvUR>Xd9GZzyuyXc?Ns>| zo5SYFkRLexA~`m1xzG-V8UqxAr!kcRoxfC#7dVoY;Q~-nEYa8E%Z-OUw5fTT@Lqo zBIpTdyj=^0$_Cqfc}hXd#DFA4tOTv>Wp@!GLZ{b-ZjT|IIvMgG&N2(enN6;*u5k9< z8|3-jc}pJ*Gv2$r!qO0SO?4S*xT>P>XRYcchFor8e)zqF2qa0tBrWLuUtdc^NV^@< z=_%H2%E$!fWUA}Ee54q|%4m(Ni|ed!fr+d|i><;PIZ%r+U?)#kZLtF&f?xGgj49M1 zulm`FNJIl}?B4?Qp`|vY1;nSOm;`w>nbyY0PoSWLb?`?hkcnYr5;yLf`kF5)(m}^o7rl@0=hR3MHvax2Nrb7X9!bB?K+MK|Rsx9_me(z->sh0!*`me$ z!sf}4HwhTy!nL*+_RfVQZtyMCK5tej9d50k&|61sc9qYnNvWVxHfr14jw-Ksnv6!l z7;O|0I4~{w{Bx7IsrBlW6A0f>3xg42ge(z97K(<(H7u2wsEwfyPfhJ0?(61? zuN0m!^I6a@;X86o4TEwaSg!=BYK<&Tiu2^n(_;!;*j`h_P%?>IFjK8tkKisVM2b^; zGLvGG4mp!YK2taZkM4oep+IH~BUAV>Ifhy8tp>^hV{Q6RJ0p zRG}vFM%aI0+l%~a{S%Zi)@Mz`)0f?JZlq9S3I$gbRPK$6t3ZY$9maIXG!Ocvem=wq zMg-IA-rWISfHXxrJ+dTaR9No(O7@@y$#65D5+hhiw%4PrP=*j7+a49OstiUs>sFXb z-MRLiRt8>FXBzdy*P3+OkhvBuJnqP6$jxlf?e)NDaodo@DMA>7CdLgAex=Vq8EJ~~ zQ~oCW*{mX!(}5$0>@skojouf1+NN?sb;YYQs>MRBDdRpsj&8UIv^bw3QF2_gT$kN= z6zC@3ow0TXq%bB*etVg|LGhWC|D1;oXC(3v@UbS%zvz zk`B2_sj$S_nTSD*A)THkNpH5w`R3tgxS3v`%ybzQB)anL@=Nu)@71y{+v(xvp1DQM z?{{SYM}~$Y%Rq&0(k08?46*SDTooCTUJui`gSk5`THFO}KF*La?jb9!GPJW%s0T?3 zMuLH}P)9X(KODG2wW-03)->2py3Cxi6PU@w%>uF;_^OC8 z#oA=mavXTB5c&$mBqbtjHL?OaKk1NdV4V{Yj4^Z<=9u5Nz?BPE$u~M+lSn%$bNhCaOwTY9H{HLi zFZfA^C5%am>u4K2+=?~R3c2ro*9LGa$FHpoSsCQace-RFJ4S~5cOyb#49WB~y;-LO z-i>qJqQz!#XFfwFaZY{Qedos(cMDz_N{XP1g;TttTs?j4;Wj}bnzXQJ6UNdt_~L9> zZnWL0ScL<1lGc==Fdt7?oHCSS!#FYxWNl*o{N^Sz+6HFBv2tKs6>3Pk;kGf-q(Bj0 zNCZi8u-uxuwFOYCtgVk&8!5ACmr<}9hdTRZ%}L*gp|@*+gAX6$>?>!te1J5@Ftclp zJ;x4Vrl%PK)>LM@af6OiF!E%ZIZ)%3Az|BuKT^oDoTZf!`_mp-QUtS9Z;}SztGPgK z49V;)yAJKAKQqP3;_{YMLyXXy>NC50-YvB2-)^eAjM|wlCM~Qkt+KwfTCP3V;;%36 zU~0V}X##oD&L-RGND?GT5mN+SbTUGHko9IQibskBE2jIwJ$8U@P>gE6LjKr*Of<&l z@p%RL*2#_EEKV6J&18O14X)3k(#9CF#3@5AKb=VG;}}R|CNHfInKhNG!HiW_CH7D9 z)${!jl?(Mgs?~w`T;K?B=Z>&%uJ8NkDZ|R zmG3ef44XS_lSn!#`yV{Qo(GRO2kIw_(+M~j_{J8+;jm3d_wJuh0^CIlzF7XzmH6{r0)5b7qKCKF8) zIjCVHr6e*lH7)%yDW58h`%~1#8Ilevel}S{d$n+&Hfgyi?almDZo24sGv!w;muoW-wcNRk3G!cM;~P6n=fLw zNF5R*Oz)cG$df0TIdp)bq~s#FwLpC7aeun0^|{no2Tt9!A zH=cjBRfSprnxYPn-5;Bt)K2qv!W8*4T+~(NC<@d$vQLNy^hzX+9 zm*QybpPMOe<*&e}PZWGCqkD9(s#XNO+UbyISy1-)SrHZbd-w3@XFtaI zH{RjKrK`;*!rMfr*W>ULCpq%m6EHo^V3d_k$e!qz19kboVvL)WXt&j)t(f2-QmqVs zpP{M@*Vei8_63$!2F&c5C(|M2OH}#4?_)tQ%p5w%k*6Q!{2S+3x^(r9>R{4@`9pg- z@Wd%@td1D24iE{ivFLge=jQR=*^69$=Mvd)bVud4czdBBQBno0HN9wx_Rb{X?;M#?&EUyfh z-8V&k3#`IO!jTU?%_E^pg!Q$O}`=8hg=sBR%&iBwM*pZG5( zAvc|E_G}Y0NeaW$Heo|RKFV0Uc#X^NUS|5xK}MMkjAITpIwFFZ?r`)&Px0RCXIcNN z7dCyaMTGv`EDwC>X?8#SAcG8Sa+6`L@E5xL?q!y*E^eya7Vkf7UKuh5OzH;D7CRV% zngmImFM=kCQz(j+#>Zwv5&5)4s7*~Tzl=W^Yy0D41HYj$Riu7EEk6};@nMp*Fn!s= z93o}5z6evK%aI!4s`*8QMR_Sb_HSx1afSXqu?f-pRZWWCJ=VTR1q;gwx7F*R#mu9` z^?~(1L-$U_wOPj1cQ117(sgAH-kbtKgZ)g_jy)sEc3=!zR759eN*Kpos|8L zoZzWn_;C(B_Y_&0I@6mm6P%_C;$L1L37L0R-YyV>Bx!Iiw+GZJE7ulz=an-YeC}y% zr;p9^`t@4$t=}dX=8hlZ)aO6N^3@w$c;nAP|EXO|b40JjSM_EB2YFb}Y26!`BwjI|d zOA3Ovjh?xx%3yhw^RJxY>V<2}A3aF6x)!9U&TqKQBnbzeeUc|eIV4}=;tyXV8{E1= z)S2pY^dleOsbBtCrjH(BZ8!vf&I;eaqJ~weMzAK~>iH{NdFx%W!En>B=Fg!Jla28+_abbTE zK5W7^LOvXE^{sa}`}|8hdgL&9+Cz&)yvy?|)aUJ~V0u#=`NW4wckSZzm;RD>zVThw zu3WE_*any+VeZ&rj(y@ooc#PJ*?sB+>%$Q$NuanozsLCAmn31hw9Gr-e}(Jk-rMSK zXt9HFXRFpHN%f}EVuwPC^O!m%#U$>H%118_QZ`L7Z(L#`!X%%erqmnGtlFp<#c^&K zg(A*SFkp;bp~eMgv{FzZtp|DBs4ioDvO#^CNZ?rBQ8_jLij5HTV=bDucLewTUxo68 zxwrReJ{)oJ@sea}9_!ii(0Iu!Qc*vpNAbW`>{`!xMS z2ig17<6Qc|E8IBuF6&pXlMe=kU~NdJ`b_QH!@@%kaQL}r*#FdH^yX$5WJSC%lSF0J zmsk=P&Wjx4*~2laDiV_z*e6v3{P|#>~~Zf8;2K z4<2Oy$3DzxWtDt=fXy@1Dv~55-7e{LpYF^QNw*6MgDfjZz4NirEMsu}2BzDkJ2zWO zXyHPwAzTFN?X@R03evba`d3p;A^yX$k4C|vIb)~F+pH~G7 zCQVttc8zmif1Ycn&)m^-t1(TLEC2u?07*naRK@!bcR+@uFq5^j$#ym*@ENl1yNH{O zTj@nf9SfL8cdF4W_fNn7VSi~@rq=+*#!Cxn=0}Y%%thfJt ztKC3l-ts2KMg=X(f0DWs=BwbQ(Wj|1{T0WmNx0Y1;GrXs ztlS^J$yeK|KG)15l454(=*=&H1hKHR=m)Fh){^D6I4`MFdJ08l_40MDzW6Hh51$~} zv&WfX)R$ZR@B7D?gi*23?Y4nP6?Ac%naRMZLu*&Baqg?%Wai{U9Qu)uW36CIb6NF& z?YQF8O?d2*?%Pji{{d!IQCkH>mBhug)7&!5a#U?y^{eGxZBg9x`{8iJyWjo+?|%K; zjFwmLPA9b3vDm!NkOXG3mJID|n1T%1+&SHbv$>!g4(lls<=8v(3S;Ksp zpqfmGx8skM;CtmWWEh!_D^+b-ep!yMSK`*E@>A=59mmS4l~J!(t=@ruLeq@8vfN31 z*3iy!`HV?U*HIZ|J_?9I%P<{=f-Se#j~5_8Om)qPF{rg%`r&I_{_gkb9Xm?i={Z6c`&tF{7L#nh#&G2aukhBN{MrA{-kU{Pa-8>_zc2FM+LzuNjb70WbYmq5g5WL! zqDhL2NRuK(Qi~<~Xgp&-&DiJ6_?($DbL^)%e(=MLZF#IY*2udyQl==1A}JAEL1G~Z zfCND7KriUMySnzOdo#Xyh>Xn0xOs0?S5>3yg83&Kb#G>5WJKi6jDP;WC73-``wG?Q z#G1*Fm?T^2y!ILDYxuX#q~RvZMg!6`h`cGDGNFQ^6sk!#wvtEvBA-kyrlWYnUCo7`y2Zy1We5mdHjY zF^c=!`TpN)Y8B(i!|bcaIrHd`SiW=_+Zd#s3}91n%0j8Of)a@jt=~*9dYKw8P%Of` z*`P{mZk`K2dV*wZjGKP#GmPDIh;(7m`6TA(=}A=Hp8ux35iI^q1b#uqTZgMHF^Dlt zKl?l{{n?kf{L^Pj%4Cfi9_#WMqS446u$$@sw zf7lPH8kgX6<#=|yZ?fC`HKl&pY+qQA=H-DX>8*acZEMyT! zp?+4tyT5vJRQB&F>3o#0vl|mLFv#-d%bfiBgIs$2Nk;bXBTXDxw#I_SInsRX68H>l zB4pRpEw{3XpSh|mOMkcM}l-o!U%joy$ft8HTdY&*zfVoX{8ZFzgs^3s-Uh_mF|En&7%&l7Q%_;G@vTi4tGL-kO^KqQl8#p!h zTw;Un<5blTpX|{SLcgtw0QDkd1=-T!g&`m0}Od1{K`1N$@Ou!%M5 z$gh^F@bf5k(%xdA=-I-oX005Ibod@&cz+RM;RGPNwQVzGcO{I zYV^5zjPn^%Oow{Yv6focw#Z!8(cj>Esa)VR9%rwvB2ZO1h$^pxM9N)gCTlcuWynn) z*LNL3wU(ue7diV^UuW^$1#bL}-(cb`_kt>RaiJJH6bWWS^+d-6mnokJv&qq0b(4f- zaFE3d7dZ2UFL3t1eUYWJXEO!cU32%(7OG!1c>Xsj0Euj_(0VA$Wa2{WH$7BYo|@vq zx4*;E#Y^n|j)3)Lnr!Dgro0^jSvY-~ zsUJPgj*otXvAf@ljE$pkKl`#0(5#mzSA&?1!BH z{O6ha{`Y84&!A~ajT$Rq?LI?U25KMfSff9oWNJ{O>E_Kw15%f_!+K?i3U$USMm-dj zaC;SjC=1^~`S5#mjw= zU_B6KQm%@c3&$V~@2@&XsogePnnVQ6lp#{PUZEt7m`#-?Qop;gLwgWK+yR?8VExQ1Ym42qiAVWi#!67tFSw4TB`6qtB)HnW` z=|>-?b?#iP2GzJKtkF#7d@iKfKpUIn0b65j5Zol$$d+zM8bIpaLZRyf?6*nuy$X30 zS{JpYO6_oMt0qDn1jKJoQ(7}~EMC0qCQn9{CP5laXLgX(ZQo>mCTcD1%a^(GgYPr@lP4KGaDd6b z^#MljeH#M@57FFxgZpg;*U>x7stBYh?F;8v{Lzn@ee7YTzxg0bue^d?T)|2()<{brPvqAeu}uL(xL6WmQkY_AHc*ri46`6b#HFERJSN0Grn8ryf!ykQRmH}0je za~EcE5;HP_863hcFJWirNT;vRI(wG(=~FD9I!Suz654K|tyXOgtFbPuV{J0$Go+jJ z0b66W5Er4+9B?yfqk&uB)HuZ=@}JQ#FAx=eF|qp7LpiaLBXJDBHT2=}=B19z)FSB8 z60H-*SM^ZL$;`k&=7&LtuTN;2A|z&E`&Q}qv{ISaEZ2)zbql`_bq+BJ+8D^bq|W_f zlSh84wdmp^c5#vR^c9v~dLj3D3PQ>}69%D1g#WFE&xlNA&ae9>x;{1f8|(5J(ncd#4Z22O zLV!l%uBA=U#Qh|!5w}Je!Gs$q7lqlWn2dWSVDyu{KVGC9VHMRCo7E~wgk-)x0U=^w z03TQsb}^6Qiay8Z?dsI+Ria=ldMRIB)tidXRegzxR=49ygfQ&4WPW|dfDM$Pez{dM zpRa3CZ+{|FgPK{uN&NM}8Y!%u!v> zQPI};=up`yscBV2u1me)7*{Dlp`&$7-tsZ`2WmD?G+B+c!IonT$Lktx3;X*hi+rE;x@OVvrLsL)^WTiL)pY>45TKTKiBReSmQb)yC+==j6Qdu zu2EwXV$DxS&CFy{ht~HuM8GuBM$`ESWj;f_WO&;{ov5roLN7<-+?Pj+Rp3LX>8{6A z`0V5f3uDD;Ep6&$4y&lMr>1%o75F2|Ze&8=_M{)I6} za{!+~y+(~18;5nQTHkPHvPMmY`Whlg(_KrkDUvimrKAjX3-u27yQ(^UTe^{&u+G@@ z6_X}oiZK6>R8>ZRQSG0!QoFnQ@2vFOt}p{$O+A&Q&5xOu9kgRLE*!VA1GT!f<(kcm z3}w+drgot2Yxwo%jMNU)HEL`y)>-ro>`Bul!OrY;Ie6(hw0rYlYK zRiE>6QYcK_!q^d$|KI1|l6>udBUoEjv}0jCVr*Rn>94aGV#P#d(_gn_}r>9$7y zA&Ux>W)oU1r}!yuC3}yMG<2Dat5CI6Mb&Y6nI83o$5wrg&lm2Gm8Y-`mG#8!%1lyK z=;ar*q62l%KTnWi)u?LRs#Gf^Tx?dH^K`>4u_7ixjj1C)`yC=^vx&S>lP=b%aUHP+ z7NelnN$)0s;ZbB@(5>#Qb>`5%f*2SYhM^HRQ7+EI&@eJQf({M2iPa}FtWq#MLFf{l zwUWBiaZE)WRrSW_a7_rzM{x*x?p)ltuj)Ki?dWBmi|bga&)w9j{M=pI*2|%~FlQ<> zn#j7G!+F zDGcqJ4D}U~1lh6;nV5uT6MOzFX4?+Tj@{_^B$_0MwN6zaN+KB6vkJ40N3O^~$3m_@ikfOZQ#{t`NK1sxiJU3*|+OKF`TPhwWqczVDq7(En^@NZ9_ zpUUd1>+0R49x74RhSI-o^;FcW(f8~_X<3pyl|V&*yS1fD0jKs&Zh>t(pxHz(p2MCw z2?(-dw4FspC$0+jRqG z-$7((cvWLjW0OD(OiW@9-QpbLFJD5>pS|9#s!`(&g|#U|X&ZatEcX0aH=!OmhU~bZ ze&g&XBnh%}H|FRafMU;|#h!cxJ^6}@KH9zmx%oEd9KViLq&vt%w7rsCusVO6Zse;Q zkyweebyHq?DO5m7EnBG#-TLFrgjds!j_(LeY{A@gi!-Ur&7kLALr>)omvHQrEIqnXUY)Ft%9OX%_<=D-n>+wMZf zYIUe@Ff@X>_Z`TA!!Ezj^UuJ-JodyZ*mI|0+YZc|-iqwm*J09HNoA>=$Scb9I)0^c zRm5O5^>;hQ*SA`S@2dT)X=^WH74BQj0414EASFUhh`bsPTrwnv+#%YZ?3U3+UNXPQtzS zU6?~hT-Mtfn;S_3v+p2{_q-p*C(sM$uunYV%r%$KW1n~o1_t2h?Z|!aMjK7k+77eU zil(t1W%KP+lZDlq-+C!KD=9#$J*Mhk7@B{zZM`PPAkH*)_kD2SFicNjpZzKJ{26q5 z3j4y((AjBZ{~?lh+>hC@s}8g82Mi99-1!!gd)@)YkiPIU?90zz?^e~Q@rJ|NGk3My z=<%1ZPdyGxOPFJKk-Yo;$hMsu*t{AW4r7q*J4xRE%gB*ikyeZJvF|zMK-Il@KJf_l zHisewJrWxYsHPxMesR(qbSEw|b_;$v2$SZx$mJ03YkM&ZqGL*DrS zjErJmcn16IPhnvmmX{qddf{gsbmlU8^0;%ZuCe(rGD`E8K1t)3KZA@- zVxN4B_MiL#I+aDIsKVj`GBikX_kEZhyJ2`3d*WsE^2LtouGXB>ZRw5Ggw^*tceirg z>RC;~$d%6D?Kst7d5j)q^7BOFan%?a#@zK5l8=5GbM#L1^a;|heUbF1KZdlOUsC{c z_!wsYVPwlT^!#b`+!_a1b53O#+IzG*ibM#pH}|4TGK^Y<|OZ$eL>p#7izjhi$>w3cCZ z2HAC^Q-yZzL57B~uN_CHF6HZl^%FvWpsU@#(y{Al(`wsO=}V*vgG0z2_t5zCZ(;6z z7tGJm{_DRW{pMf6^p&ElO<{H#86L$Py&bdf5VCzITyQ=`r0ItDuf`f-5@gSQ8lU`4 z8Xx%-GB$>N;xStP;djyVr>}SGYSef`Vtr%?+(Y!rB~%1+_!i8eTQGYMIGO*C2cs`!UDvboq$J#^KU= z^zwyDlUc7MiM^DY^(ZvG_V-!>Brdm7J9?pK-PzyOs6-YWz_UXs3ck61@c*A1-WC&ns5j}SXRdvxSM{dO&xfL0oa7p|wU0hdqc8ztQ z*~A>Xi^ivZi{`KVCg$d2==rm>{^;M){>m57nd$1|(l$(8g6Sz|2EF+h=HSi94SS*0 zLNA^}mllEUYl`(ksC=j@#+2RHHbRN%MKogNrD`3u^`2v;bM`t{X?)1WI5Ve-NsvAJ zXngorX#DEmC3)++5LMFe{SB=@{rA}CpK(f1XQk-uG zXBwMdK=vQT963sI%N-=g?m)I~hqQ%GU9R6gUk`}D$SCIM9W*}tDVm@A9h&d^2xiY- z^wpPW{m1`@_E$cSUb@hG;%l|g3um!sUqi+xF~{!096pM<`Br52Ubk4}>{Ej*rXxPts^$Zro4u3m>5I z>E9;#_~$UU+=k9hlYZ^bY5&O|V4r@Xw|UxHbn24x>q9U{ZX-Ez40G%b8^8pwcM9-hazWBV0QhN4jw>-eb^Vr3Cw^F*b!7P=nf8|?t z&0JH0^TgYMjU1NF`Zus{#f^J&07l1*yUMcf1*M^cb>pH#)b7efZn7{^Z}2 ze*Z!A%H`Ef{vt3ug1PN(njinHdt=>mBRY2lefcHqGe32aO0T?tUO4MaE=!BhPAmEu z_I)+uAP8C5c-P~qu2)svMLEg;OTH}|$l$wVwnu$uk{+mi+i4kQ??oB6{na zFt^`@+_)E#Cia=9Xn*OCNWb<)?5S7X{j?e+39|PfjrV_?#wUIabLZV)Tj4RoH<0CLH>%=Lid~)P}5l<#QyiPx5<}p+RJH0@=O` zbLeKw?RS&hb|-T92r@Q_o;yeTt6!w`Cx76gb=#}FrZsBRSTiyqSFrQ5u)IvZ+P#uF=4$YL1KJeUlYcIz*{B0S!By0E zHEn=m1^ABktOH_@fk7A>L$*yITPI+2D>6C;%Ps8l&(r$y=SlzO%jgR~bN)bAd)WsD zFuQLgdFy*fKKdz=cfA+cz6BN*(Ag=tGKF56L8oWXg@sH3EIL=F9wFHXh9dhCQ-=KK z&}GcxD^~rZF3uU&p%we%OHwt5YL^RF*>>q{PZcdHZBs=X4P;~#*)oCboJ2;qz}O@- z8tBQ_Xn*r-w7>EN>=Tc=NWZI9wv0h0wqowMo5m-8o#cHV!R*})X&b$A1?DcHmuJxP zQ|Q7RwA=Z;Qy!TOMAfjy&xLN~uD0F|1mq_8TH0SCK37SGQ0E*yGz{b8?q1!p1sUIp zj0~ceuF!tyd+wS(@*V8SSF6pPHEPt@aBMso@-W$o=m&11@y`26-t#`>w!3L<+l6f; zkXVouWRpwr*HoR_NEpxrNd>dCOmgu&{On26@B9tv4}XAt`FR&Uzn+Jy2r@i^>^q2g z)4e3`x*zkVw_y()CLI|;6TqZ^1+@FvUG4U@pppQuqmFBduICX@12)05m1K4X^YXK# zk9?Q(``;#g`Uw|Zv|bZRvx(fW4|D6CG~V`Z%-eneZn>S-*rdCrjo_MY7IY;|t0=po zLbO5c>52r@AZ;O;U%;Gv8U4wlq~H4%>En-LPrl;vL)E@pHEO(WxOQa7!x&_I64|y3 zvwI(7ci+j4w;y50!Cj1QnV``$SgS##c43?-JzKO;1|)pj4%CE>7e|S{#}j1vkaGEo z7r=abceH%C2vY&|^lMIdwW&&8Kymh&*glb6CN2#8-IxeGj zTvm5X>7eNR`G2Z^YgN}MRIYq|`8lPcO;Mve3@qJ*g<$)_%siLRT;}x8UghFXen$Gz zbLi!>&i`&hb9sp)MUz{Q?Yl|#A7Se~ce3Z^z3e!&hvD(z!iT8K@4J$7#N$ADT)T3b ziVI)*?fdU5+$(h1=6^FCzqO#frQcL|AGfaZsn!Ek z_6PsHs&0+`Qn78d=MCFfRd>8^Ep-Lk)hg+7%FNsnuU?+#>2r%be6GzS7nSo1U^nn8 zi@4+?=O72Sjk0rMh{2%-reRjsud4B{+Sl!PkGO2Fy04}^A*zmF?RnPv zTLaSNl*RcLuT3rT(&c%6d~S(vol#zxfpmjK)rP>nQF!16;qAKzII?quUE@QHjSON2 z)}E|>)wQ{>_y7PP07*naRCv9Vxa$ntwk$8DT$)|v<%@GXac+@^&RL$g2y=CONsSuU z1=oxWB?1Q~;A01c4<8h6-wu<*Fw}%5U^17IuJc&MgE4-4?&f;aZBC7=^zJ(y=l10) z_J^o?^9;9Fou}%Y@iA+i%Q0XLv;-E~Ff|WPU4XxMMfvlWl{53}BSj*xbr9aQ2Y&U4 z@U|O-9iuQZ2m=(B&#G&&s`^(^zOqcPF+Xp&i&J%27nLICCE@j>^SZC5zbkP+|67Z> zx(H|jZGj~Vvy1TR75L^U<%=)D56{DLy1rYuY2ena@R?hL4;>KpO$cLymO+$;1+kD; z^gkYhe!|uA){Q)m0Aj!jEE||_8!pTVkDY@*d&%@<42?A4LkEQa z{x0F3-LRzzjYPPzq`Y_qUY${1xdPKmjx@y+mY2yjdeU~JWLd?87nW72F1k`R-DLaK zpci54FsF618AKIyn~cW?guP?R&6C1SlQ1zLq*l4K1dpD9fA^H->nC7-4R48hu(iuo#-m#TCK$4ND0+$6NJ3OaFvGe%ag0q- z(dMgeSNx(CHlpNDot}o7>!@wdp3@kAy$`Zo4Md7Qjz`uUd^3+9T zojkWjjT)=OhLRy8ux||h{_VoA9X0G7b5D)uuE1ZuqC9vCp1!0kw4t57ZT=jn;;#?H z1%@{gXTrL5D|~Rj@Zm$kp$Vr5otYE<)3cV}eE>W`!@g2Ex3Kz2VtfGJw-5fuyM=pq z2~8thTvWdMn(~*&;jy#M6xZ?!Lj3^WI0!TaMw)P79Nx1>_}~HIt-IYz$K^%%)+y!x zdIG+GMpv!;H4WUk4gTl18s5L(FwwBIEWETh!uMx(@Y97!URWGsHf;i-1+Npvzn-t-xOTxc;!ty6CSeEO6vKlq6IW~+88G(c2@Q?2iK6%(MKA>D! zfG@nL{D+?@FHbuap}on2$KD7KATco7gxj|XzjiZx;)t+i5awI($1f=V=MR-LbGb!^=x*Wg7I*v)&cGi$qkQ+Ylk;14V||ipbV6|V*kA&?N8khd;kR!S?%Xac zwuQ$pDF62p%2!@pnGg*o@a`Lhe{!$kzMX<#Ik_~*H)nS9?U`M?vM`1U3`vS9sc?ZL zBH_bBa)~VuE+8ZT0g3U7j>KgmXZw;e>;o)3B?{u9&^Yw&PH|D43 z;CrXx*~@TvQrI;Dw@eB*j0z8(Ru;RwbqX*!2p_)*{H5p3ay?cfK^}d9=cL+;u z<>8sF{O;LX`0J@XOt%{hn3MrYF?gBJ{qu@OP9*$Tq8o#FX~vUVg{y{@)$-%9mn?Z~$arHtGK9ShnRj7ND4;;|{t zlc;o~<6 ziGja9q5QK)l^>jOj=c44eEpy}QuOjP{N$ptcT~7>Ot^UhMhD=#uXU1C!Kq3Q?1g{y zW?|Qe@WK`N-JdAG_mpyJu_m_H8*K|07U7x8?iwH6D(oJC9m8;P7Ea7|9@7w4?jPTi zaPKZyY{NIEck%n@4|9BJgkh61V5}nx;hJlivXZMRet)LKD1v<*$s}B^J zV1JblP-zih$_i7yCu&39UcarXTm`~9C0;f~!UUehIQg=KeTwUq*u3V*WYbut(;;`_UTZFLz_}*#dpZ`dC>LRuC z-zGw;@Y)sjP05H*xcF_Z)&%R$`L)^dV?|0Ns+_ATYD=!f(6O*>cpi-jncpAv z!Jj{H3(C*05lIW%P_@{ub}6IUEqA#?Q{4XN7sr`No7_Bfh0#R0b$h}iXD#REyBt`f zMvZl0U1Vq=fqQqsZ{8~G9TlFrto+L-l_xLML})WYf$0{!HZR<|MVK6b1LMNuSuP@Q z&-)uj;O`t0-nUOUH3wgK5&qM&H4)m3P+(@+nW9G;aBQoveF!cu!Sh$hoo~mR@UbHa zzjDMdm?)3UY~v3v9^yi4kRg*+xImZBp_EBaSiZ7d;X=D!Rf+RTxPqNNM!~k6CiNiKCQiTf(Zc?~smoVCJ zA>0q0b`RyD1m3&@e*Kt1fJe{4??0nlSnOSIjq3*m=334qedDML#Rq2^Ju~l=zC)A3 zuilbyXdF&14e_O^y&PX2b!IVoo3}bsNSDn*l`2wYZi1rzSZxXG>F^)&U!j9wNzev~ z%~YY8FK%bt--^DM%~?eorRtcl{URl$tZHmZX1xkxO*_}K( zw*yrd{E({`fhj9CJB8aj*R7H6`+XS#b5>Zkn>jAq7ZMUrE=s1Zz?@d8SOv;VTwmO# zoVQmH&il{Wu_xfjx?;_+K%O8H8^kRcU1K+^l8%I zGhzR-bK3B4)E67~HK>!Y9lQvZLrUhh~<^#F&>@W#!{->IF@kd_Sa!)lo~aD z&akGtDlxEY7!FRjH_Ku#`Ho^ZXS+ob&D2034Zgljns+c=CetJ*m+j zXj$h>{iE|RwG2ClozwKbal@W5VOfRe7shyPX*e_Y*iM4sEAwhj)kGhB7aU>nM9NS2 zB_a?Jsr+;B4^_zO@aNC>dqU*5hs4F7zha+Om5qr`1vx5_v7o$Hp={8XV)5Ft`W2G5 zkOUEY4*Qjt2^`P8LbRL;KUmtc?r_>=+WZ4GMEDc=ob# zd8t+q`UzH@qW8oF1$B$*-nvydFfODD=N6P_F4xzzpP;y;n8&A;({svj!!5jeVBF>Y zy4-4Ve0hW=6;RuuzPK+1DX@`(5fUP`Hdi=G6MsY`N+c*C4*B;AB4s^E2-_7BrQkd< zxyjoR)LAMY9UH4vAsNj39@dqSqF71t$JwyY@wkQU4aXrH3k~ba$4fDyoLU~?_|gas zEc?a{+lOj4RHMd5qOq2P5`l?9Xe7$il5k=cW@}Zb@35T0%U6_3OTtJKZk~W`L&|a+ zUYUlowf|S&p{>qo`s_T6HLQl1{{wUo4T&P5I-;er{kb|6 zHX7m5cV+#Z$5!}+`UIr(!`w>)%RuJp{;Oo zR=BXBY#nqC)sszOuH}~Ms8`PJKX^y#3yZLS9JUX`P*XtRa=XcbZMZqsF_Zi_PilZt zg2H^V4^X$V^eYh|cLjg7=rlOe&8p~1x6pwr9BY^z>f zxgTK_rk0hNWnrx8RG~qE*|sp(t}kf6Vljm)OU^HBv?&ZUg;a&PcEXbN6MH%FVXlN^ z-@}B6aVWT0n@{%nwr;8kR8Ia?=e(cl@zk``l|RLIo%q(^5aOeW@xf3*8qesZpcGT5;86$iF?N z>fSu-Rm=MuN=9n4e^RSw!6?ae;NWkZu$H#1!oiRl?I2jSa<`lp)1A-!5DCz^#R${)JMge67^wjcQpTtuJa{!(UTU zum&v7Z^&^D?J#S1C^8kMpp||RetwSqW;(Jf2m33d(n7TMg@3KOds7sw*6L7=8XJkVnaR|dQQFp#qI%lwW2n1^E$bwBM}`zz zU(~*aS8mCIyd3HE#G+H3sdPT}h)9x#ich>RZb)Eu0!og_B}7U{Y?A6wV1oKOs|r-A z==^z^s%0_4a|dlI5yjwpX`H&5$Oy)^Nr7otZ$`Jav zY)neJ?eC@*MJSolf^%!Izw|w*kBZ~MHiSwPVYz^yb-PU@EEo4JXoo~~=Y8(jF4*ja z1+DMT8Z|Z=YgUH*!?sq2`WuS(8B$v6e1_VYvu%z3MEla zp=@aNq)nl=^i+6aC*Up#7mLGt5FlTFMHvg7If-I3R&~uq8@iaOLM5idoL1p<-3yj7 znd)!|kIa%QMxIp=BIgwE$Wm=4t5IWPvG&mV>|vYM4%B@OPi)&3TB%}1XlWg-($7#b z2kOjcNUbxAwL>4Ayl^o2RxC-8FQpMBWn5iDB2^`h9t#jVS%)NNB_gq6Yhr(+a66PT zREPUIl%pZ6tIM$^M)eh8e479CgK0|^P zcTH<9)W^`mq#{1o5dOu*o5&(_RxtU8lX$)@A_t)_PG~BNl^03d$kGy$reQ(6d$8vf zApt6z*Qk8JtfUB4wdZOM)% za~naO?eQ(Njvc^`O@i7A{~EXDT6@5BkdUr~NI-etV9r69uf~+2XyK z%$N0qBQ$}PRG=P!KUf3H%MqH91#WZT&~koEmpqsGQ!&1A@`i#l>yZR@bkfh|H_2JrNUU@0y6$&##M~VM(H7QhVVg&=r zrlT}PT1&{%qVpS~JmEt?5IP*JrKrkk?p!2VnAghcQgPnG**W`9oSZTC?eW`;L5)Gu zR-kYx)|(G2)=MKAuQG`#6gA>~6k|%fKWd+5oBVPdH5sZ=V`H(7O_ zyN+o#;aII5sQVh~@W5?(w? zr4wFO@oflCo0-YfW>I(Q+Uosyl){WCt5|}hG;UR8gO--AN8q&Xx4Y#yBqzHyYSh>` ztjmEq&HmNsU#LPm)r{CWB_RcDt@rgcG*kQ9UKvtvCc{n2-GqhEVcLI>d|FBlz655i z3eyf~u`hdYcoiq)PnA*dHYQ6IDpe@*ge(aN)*J~XrgBB`u8_cysc4bPl<$q5#>24) zPql)tRkca1!pF#8!#vuvMvWR9h4uLi**Yi98v&^btt@O;P*SA!N$6uJfdjP#V_mp- zs#-FU#pbOb5Ub29tSzY>5|g924)36?>U@1vT@;p&?f31B2$8R7B^PPeMo-ox*p~eb zm8SSWvU6tToYk(N9fE?jsI@MlQbA0Rd@>xD;0*EKa4f0#9F`&Y-Vs?A9Ai=1*86Cy&_q$;G| zzv%dhIwnG;C@JrJ?b$|d77`RGtxuMp9>7qz5D^l9fEd_fYo4AbsK*DI(!FS)c6FrIcBSzO4=s0AaLsjtK&vLZ0j9tZ-9oL-{9ygW zS))Ipg*sFYtyiqr!l#F>0ak^=BT`zLB{!!9OJ?N92a~_}2|Y>B;gJ%-imh9@zY$p| zyFb=iq}_7apz{!Wn{kCI&uiB&O$_PCFlKZN9V(L{qI1V%P&86XN>_=iX^?m_>uVlF zQqj+jMQ+0}ipL`ByLOycuvx$g)KR=OYHT#t>_Dv<8LIQq^gmpR1jSmg;$`^yY1^;R zOd0agWZr?=ia=n}$<1DnJ3g1qPJ+#D@X&F(w3w@pG|M8!yhE{9MY2;DWkP}xe+b!iBeHcnjEd3w3gB7DfH3> zxNsId{v!I?NocpOcModxLeg;8^Uy8Gz5}pjJ2Eke3=KOowkovSFh2*=Q|QHW=;;&a z@t4u*%h#1qtbJ`V&3uNaR(xyp2b?k_w5^liYX|B#0My@~&L22cK~%74;lC0n5aA?T zy6i#b<(|27LKPz<4qcpz^9Z$Yf8t71$#+84CJpHreSjRvhCPN9kxjbX=_LDn{}@@fC1GZ6ukAX~R1x4j9u_nnxd zcOct$!NgW%c-W0gnwBRLF_4iXou5UgF2UK?(5IgueeApF^Ut^mRr_Wn-k1=9<^Zzq z5auoK#JuJ0u>U5Q*n*kZf|>-fSa}ag(N1b(3a?w?mD7f#T+fRNccT$yTpVbFX2|iA%RD zoSSX}lbDCZq@iMYi%|9PWlG9XRz5aWdDSG}pXVm>M967Ph0``UvB;y*)aDA7SAuL6 zd7=1)huNe{ZHYd2B|9O>jE@hT&Lt@8zvtwz%Go+l6K;*y55~aA81m+~VLtG2%w2Cm#wVfOcGtGu!d^HVyc~r~L%Z()YBJJ$ z<3Z%W5xD=CFsDzVKYWPvn}3DA^eikcye_0@&1N#InFDn#A@ntzGE^viB7V_?8vP8H zJIaxvRNWF779UZjdE!B@5OpO06%V0Yd8tr2LZTBLR5l9*$9vM%k;8~0(n~d4!^5$- z>JaN+q1QSq}9&1iAgZG+=1MD8|H%_ zC;iG7u;2eC%v^!A_IA9c5P{)Qnhz~Co0G*WnVJcHWzrw|&7mneKL?BRuw@&`r+*uB*IV7Sef$xaoxWy-BLV*D z)gB}Q!wncn+`@tL?K--lUtt7Bn}U&IwR)?TV{W&=eLr|3)S>VuBE5VV1BiI+d3aQLq-QCB1P!OZU7ZD`OE)7_ubc zD(e6MAOJ~3K~%r_zpR?Z`7;bY{bOWi8f`SPW=Kvn3SXn3jlSPi@&BP&D+;wQlnhGS zD<9b5So^+*b#|E~z)cj!wrSWUEHJZ}GPk^mZqP;(*|QJx;ZKqL>fgicz7b|;GGbzb zGzebp3Vfw1RK!T0!yoRC1t3*qdCC0__8mly-RT^!PoIF+@-^-5&m9H^k(+O$@f-gG z$p=2>?%~;K&`!S|2~^oa<<>(!Ir2q+famEaAwzOMZWRd2@5@(kfbm11eI^0n`Fo@InXbNl7IMiBJ%VpPx$#5*;3sht&sd3RRKZ zVK`DqtZGr8`g3J7s6uJC7KFl~XGx+;-Q{A792D0}c=3}43Jn$i>$Sf^750RMQgkMW4WXxQN z=1I-fOv!C%g(JO!i$+_Rhv5;-M?VcoLi*)Dh3Tmc@AA(TnoZ=`T_nHu_c2FqbwtQ| zMY4E?h`4A~XZ{p-eTpA+anBMS8vKyMd#H3jWxtVyc^DYPeBf`pXUl*4FX*N78+s$G zoeWV#A8nc&v&PlKKV+>7sW1F3YVI71?YK6+~?CyUYBFmX~3081suCfrSOquYD2bXRp-=ys=>tWY0d55B~~s_!e|w z&i%HlF0E$wSLleB7!X6pot3}Ls3TT3TC=e9+X&vTmKKqL0px)XA(t+oU;Q(eUSWf< zu4ppnV^Z~asL?NQ4_FtKV~dyII+{nq!mw{^k!a%741+}L@dSTG!?7-e6L zaeg3V<$SNa|5`?F#irRcwYf4>Qk}BjvNNd)+G-)=TQI-)Vf69^>_ZRMK15dw5!ki^ z^TEH3yy;#S$<=NLFCD=>P$I4dl1#N-Zo%RLIz8q5i(1PrfMZ|?nb-moTadv)FiAm- z!e@gg$6g=>ba@dO7{YwuR_PVR_ z%_ipXQOx^30>i^Ds)#}z5YNcTD3Ih=!x5$=n*ir#(JPnHxfyg}9%;8=U=T(|U2dVt zt?s+1%O#YVU;L!(K4-r-uQ;i=Ox4?WA@BZM$ca~6zM2}V$G{-w_BUhR@-8q5+FEw& z0s@YB;_f%=?{!C9G)a(!d6zN#XFoxYzl2^q4>MQL*0Q@u14GE~f^2-6ki^{zBugcjhm)w1jNiN%G-Ok)C|TC1~7$8)99d^=Y@6rx(<pm(}l=1@Xkd z`Vxf?5@dugdnOg+uZ)ggc1XZ{yCR|}1mhO8y;H#{TYBRD=w5v_F0n5G-$2M z$8%lDkO*wqhTQ)lWdBX*+-w&TTbRJ|O-bUe&4sh@^7H7kPhpS0vx!PQ|DwqV>eIs(; zdtiJLmY0#-SvmMcYw-R zP{@~5$(?SkQ&#c?RH1D42`B%M=ukHIl(J1%s7v|7F^&=okB!>ep%j(MxlZK7Nn@Xd z=mF%FuY$If30j;^AZSAz@*aP#%7qjX84b#n#RbyDI}v>V9fl5-!`;zU89fNbSQjs`OqPjW|hv0|mQ+S?05y_+z_h3Y$ zg;UGZpZivX)#v(9V2<{O_tu?oM3eemNEq4J!uN)?X>#n}3>aglP@(N8mJ zxTQ93zXx4f3Q`>u3XN(sZblptdgQyd=*M0EKzgl-*DYMoC{Uo|6 z)56!dDp)s#xM&rXY%$3C!uB;HLgW%I`U#`>mluydhf7UpxSc|^sVb*blYy!-;fqw< zro5b|G^)j-d1|w_M$P|~l0W8usi==~AFB3gL85y83+sx;E#6# z8}KGlas^R~Y~|Z`BKvQ0$JD5X2n>zDfg>&<3$uIOnG+(rUTv;|FhE_vzP8h6102dfM!7_>f({CRwp+eT{yE zR}f+{lyeEl$wLRBi3kZqt}K8Hu}FMLxA3V5mxmemQ7lHQTvw6;{f>`_Cm@V!R+lHYL zL=&EqvQpx9_+zuWgNJhXfG+Cx=P$-1Y;WHF66vZ|eu(;?e-HZ9 zp{j-B6xJ0TllL_%Z{u>|7-#(syZX8#Nst}8Vb6Y8TqqOL@CTNUtDs8@=yOk@FZ^ud zR+L{_bk5h$J_U_NK0c-2gD1z??}0`G*?9wO-M%qxcq1ZdAiMS;+jltbUPMa^NOM;MRe4MU!o~17(ftf;^9F7|n7W z+f!rx$mXK_IZ~`mRxE?jc|f;{{70?azS40kJ}0`=mHP+f58&W$ad7d`S{K=3{p(r} zwQ4oz_qDI4eAU==^PTEZPq*^EE%}_(z1C}oW&_!?&xO4&%n`BGsIYsZ*Gm`Cm!8}B zWie)F(8nJ}Zo3P_WWFW7EfH*Ht{WXgwroRg}}KKkrEE zs|xGwhDep^X3i@4@x)_O(Z`N{1!LB6d_`Sx+x2=rbCV|Q+LNgUg=wJkf?47P&lD?kcXnR#lBEg%27$tUcfo;n@c zHZM$)JzV{RU$TgS8hwkH5E(& z2QnlEhDXTb5(CFkPg+GN^3k-GVD`$jTO>7YJ9Q{ivE6kdo0PL$`d+3oxW)|**5UP4 z5OL;42@kWEknE$s7sRH>*6qlLK1rToD*HKTwou?&f1#?HE#jLL{zwtQ^|!qv zzs^^1z2?t#n8{4`Z(ZlFu^C|8we(AIxNYJVx2n;f@MI{-{uz^5nOvTZDw>ijA%Xgn zzug7IAXibU%xB?p9pUjSHdi_(e#v|S%Axg{;v-on0sWwls5M^fAjrI7w<2-t#~bydHKm2>YVDzLf4wAKwoPMv{23e zs?h2E0W6PX8?iVb0=cV5n@f%&6Y6A;Q4vI<%w)z4s?9DT_+j*br+}CTW0miVE*tcp z2^}*~pG&sXmFSR~0?9ECL-VEzu+ZPFnJnzz)2#3Q`eS~3ts^>e6JKflF}Hv19NYij zH?i4$$xb}C-iew3p{5JgIXH-*#ywywRYX?j>sTsC24<&$dR;GM>nt_xxR{aMV5F-B z#0`CvktF)M%M&XqaR%nMMR!*3&%-x!;l4<%P^^;mk{ZK7NYxycwP>Jz~8T_&V6{%!C zt2&;i44LxweycjRITr+VK3$u^Ed#@5B-U(HEfdFXCsav8-0a1+M9@l^I`>AYa@MnA z(;i(mPqej!jp|S^l)54%$mVHsu3hK-z}^Q!09{@Ab)CPysD1R-;);W<=M~C}y3NzS zndep>@B@*m)D7bcTaIJi$`CpJ2vHg8WDr;+pd@kfx*(=Z=yYghh?2zKt8BA0t0I=H zxa&BfJgFCagpAKnz$w``shQ8EsoNz5u1U_RUl&k`2+hOUw#5)A=dIIewV%wf&`$UG zx)O#%I2<#fZMRm0-0y{Fp3@JvE?4ofB+}WJow`vmt}Y2<2yn7Yss=Mqud6>mnabc? zCrT>IU+c{^A(Ew|9wb2BJ)k57%PGUroC(v7Fe63g8nY_oKf(hmvsBhVL4`E|3YG=I znwn{520U^RoHf9dfGAHS>Ynuc9`$Y==fS{*?*UboUB3?ZqrOEDx;)|Xe zp;b~thze#h7;~3?z4w(Q`=n*g{b(FhntzPYasB?tCVh9+AYVbX{uNyGyYi#gO6r<# zCiKP)h5!=meYz~B9+?5tllf%nw9z$#sIpSEv8Pur?XUy{BoW}AUKPpY1bh^Ty!l|F zpk`))Mt$+y(&=CZW@nYNyI$VJf2lBh7eZNu`0{DUzy5RJ=5=tA6n%NLNDCm3E@Kq< zPT}y*XYGGox~^=!wlQW0Qf(h!ScKrhLhFsUcT^EN7X@cb!K(jd1|-=q zYpIESA$O7Eq-_ZcQ1JaJIEn)WCupnsgzDlvu_O`M&~pGPGSgLj%nPKeHigEia1M0x z%tWUSSdRNM%fRC|v>7F*9t5u+%<2TyYAQs!rx%!5f>8FP23omNWkN1o&!tgSL@1NM z%v8)VRE5T@c1X`k&jLUN_$Vrmf?lS(sBgSm^RVF}_ zD}Ucm!8u}K%8*C^N>J)eLn^B0 zAqVjQL99$3={R1y6AC%wSWuFXCwDAZ4+1KjI;V*xW49bx13Y>~JGJK?$|lE?ZKM8| zlN7Xa6==l@@M4o8qdKkM1k~$b6LkdSWXzwJ>NCL28)^a2h$5JQ=^60No1jJpN>ea9 zrcgunjX7LOpl<*e7zD14l!#NY?iSmsc5P?-!uU@C^PBMqg&Zc43w1E`xuit-4M7NP zHj5{^hMr^Wes)wEX{CBy zit{Bo)WW5C+Z179r(ayG&ugpSPTL2^>~D_m_nZB`1^Vc}S+o0_LzaxHR2T>ExV9ei z+$Dhpt)w(xG#YB+15`AbJ~zZtaSsNRPn!CJAYjcpVEx9$Z%dj0>xMvU)+@7DX}Ji_ zw?UJ~sY#VJIg+6=nAN!4xCUf(YkJQ84AluHHVfi5fWCfU`>ZXa2gJU zt2_Jp#|9goqlu1gBiqCy>^Ns?B|z$I#08#vH^b~KeKen z5#1cqcg%)Ikj%^HawtQM25{*jFf#=Rg3K~~9YHzIn$rvhvwo=>SOeNH3_kMS;`-|J zt^nQr0H|*eJUsz71p}ivJXRx`ngniMkAALIkPWqT%FHxmcduRo$GJ7xy?>QY7;V`O ze(SZxYl9HLz$(y&%|LgL_q=e`M@RW10D`JJ6StEHfq9YAbNZ31Jt0$*RbyPzLj^jOSLON(c|@+@Tjcro6o^jfxPj05fL7&V{k>?WAnQQQ z%ki$#Xn-%C0bd>gZP*OTCZSuU#1{b8Th{m=uIL5r-UmAJF8JK3#c2l#VC5Q!yAFV} zI#^2O&!VsEg4GUCLD*RXeB+uTLlI$Q5V5Ppr*cngvURGJ3Y3E*`w-=aN zSdJfyt}f914?{fj95A>FTyHoI*X|w408HX%g8b3n0H;4((4psVCQAg6>g=|W4RtOE z$~;#1)46FPIukmq9;xvcO0+|@&b|!C41;{4E|`PNB(B$?a!oeok?5L>D*xb2=28|& zM5tV4TeLaM`m31j`m0mD0h{r9U?;}-*c{h&{N8W`HF);-f1 zli8SX%=k)Y>?bFH(3TW$I@&hwcBXBn_%8|dDL z7U%dxKyM#tcsnq#O1%tNt3^`qeS}Dr4`eD7i#dOK!H1vcj7Qpmx(1@Oy*I>&+Z6h3 z)A$UTKM~1L$AXYYd#0M)n#eLhTbPQPXR~XQ>2K57UdWwYq4st^EqpPSM)c$z0o-D4Xj7<2S*V&Vv`2rT8NaHe~m#GARN%2{QK=Tw;`gyL&(%`z7VfzEIS< zKs)vV+xMvNGc!PA7SyPNvpP_3C{t}i<-6jB%8A4m&H-l^t~$>D%5)txBN^&!Bs%IS zNtK$AM1tGdp!`jW60k@Ck*Xy*DpU^tdtqBZ(P_EHmotg`M2U!O_&l873{mkF9oCbb zAv(5AniR2~_;S^yI2r{~VH~r8f_mdBH7;2yj7LGKsZe=*GU$#&pe?Q{WZP@X71|GF zfiiE(%i%x`0JAgT50uG^y1M{&$)^OFb<4mYsTI3M9lUNm=&5Hx2Odz*nYn@p=ve`} z{}G7iz6{P9!0e35jO?m|nk=(4xpJg3rJX;$C==#K9`!nK>KJ(R3alEb&#h62>2sQgcb7uM0}jsQC_?~pGUE^j6B=%Q z(*^Bh@2W8VavP-tk8W9@@E~TuPPEo-nzi$;-KH{aOO_DMQ^_SL)>p?hNqKFyq{!LV zj75pKgvQ^?S>%qVX@jd4h0aAW{}HUu5Scu0%Z2e9kgvZ4F}z(7?krQjLtI|aQ~k%F zdIQ+B75MyDfK_Y3Z@;dR7u+rl$0`Xhq0elkPbuWx=4a ztB@bOyC@UpM;=)NeCa%J`Z%y*v-W#a=O`3RL0P7Jhn{#AqTYaf@%wp}@^+D?z|dyk ziO+%dKL9`}zJ>dW+2$9r*P4`|(JSCXKU+|jZ8PS*r$|&Tf`)EU4k-)nGQyVAQCluO;qvkPNV5EgT&W6@v{3$`3N$U}t43ZlnOlyX&x(iX^GeH1 zhGwRLBkzJwe+aRC4=_0nW&&GUtefrb!x^|Pfwe=RXMYv6b1(SKSAer8!BbO;6iI#V zG>Jiys;IFYdq9sr1KPb8JX;4(PZx;0{Wmo1jal%SlfbEkIoIA%n4JNRz6b2O3s|Sq zA~5@G2$u5B&Vte!=;>!cy*=QUeyoUYqaJ()SO}r~$cDG8^Sl2(^}K1+;jeYipgc3R zR796V0zP^e{NV?S((QSYA(1<1>XmMzGSs24%1{a&- zkcWP@XsHqwW+oFlS|vu4budWz3#F-2_;jcuk%$DhQ=tj2a)dX3q!(+=%}lP`4gJ|w zBl3^#gjQB^$b^80R37s=P;be6=GAF-Wa9?{STg7CPpr1HUJffKPSwXRwbxa^+%iCM zX$`k;9^vuHk2`J!b**6j^2nk)2Hrjl%KdGY+ox}48u;Kax=sg6tM!Pl-ThisPW zoc9fY)~*Mw-w5=tROfDbQWGXp=hMCj5sC}IvI+{R*MZl63Y<9FTz#4Y=1qo32-PSf z+eUOI2s%wds-GbQWE7*xIvSKO#o?}6Z|~EvvQb)z9-azPQO5mT@U zHFM_7%zd5f%$eg;Amcd4SeOOWNRm(VtZ5#h7%5t!FwmQG8Urbjf?az{mZ$|d5%)gC z16;fCs!YLErrEuS&F3*U{JkYY)SF6pBsF-|j9R~r7Kc9}HrY{%3glUtTnS@TY%(yO zKC4+p_Z4Pol8Z*#CTP2ue(+?Xz{hVzv7hdP5K2jOf@}>tu$5mdtW{tU&P7`U+x+0* zCsl>`9*iq0fHalM|14;dI4uX7Jzwm;@X#7TJ!SBZw8Do^Bz(hmt2S*`U-|UP3RNfM zOR6Z8kFV(L!p!FXvikF`=uwzglB_`Zc?=-N9e|7LGZtUpR7xky`Msc3b-+Z1q;}@Y zD(#z_&xTU*`$z9J7Dmb~ai;}dkGBivCPpLU6aL)>W9q`6*Lj+IiGSXDf-S8%^XmWt z`dq$JlG&~bnm&A7#cJaDWhH_DLg&!iLqe2nAalkevsui9>|~1@185deo`qz ziQ;K@dd~_ooo~NpwAZN_mEB-|WE>I2sZ-nYs*;&@swh}szAwFqtDOXu%Hql1Nw3d{ zvsAO5Ex9FIe(8KLRw6&t^3LrCmAm|=V?t)v^9Fws=&SefVP@w9hkqzXMQ|CMW2zx* z{`l98+o`Xc)LQHZR@o%k8RrP{y=#}==UnF4tOhvE$Mcvlulk5u?f#8Sl)bG{X=oc7 zt>ArxmV-8wvl0s&A!Wg z!&vsYHIvTIm&hMw^0p9oRIU!rj+n!ip2%-1{NaJg3~S$&!=sBhlh zaizva?uMPz?a!PEd~!+$8mg~C%>sdTR{2VK0EpfuYG8Tdbj|ppaeLfvzASHLZ|TDP z;7wz=Hd9v>Fh>e?+IY0ILAkoasA zGiu1BdsWEmBEU^_QRY%co>jJ_LS(>SP=}s)MNdRiEKd_?l$ZO&g;OXq_K*Ggj$h)( z-}wnaL`{COQ{Raqw+dAYTdg%S}`b4^+Q@mVZCloeTq|)9Nu`=2V|C^j6<2kq{+h4T zlyaLK^zMvLk4A=D(g67qj(>qSG$Z3;z(e37&S7B8+9Myr&81aRU6R13>f=JCFSI$t z9BY12A@I*4N3rLnXKK&V{Q)aaOOiJ42V!r@nrynWI5SeC`%hPpQSU9-lJH;-NE4CX zEPO|u25D-#^3s|=T!$AzeUh%h30;-*EV26ZV`KmR;o3a$z1PX7FgN+Pa@5f|)}oYc z0RkiH_J8Cw$cRk{oi_-yTTWuPL(WJ;NSQ$#E@{*yFZ#QN$o@mt$>W7`!~wv zUk+dbY_}6x#e13fP&ra{P??W(x}Y25T7Bs} z$1SA0g-(|)wNw9 zdjV3RMCa)<@r1IzbO;d2%7v_T0gc=7Wc(<^{>3--aqQAi8tSn=+{In3O_YF#ODjg( zG4_5H$oJ~lHo@oCd!$~3?q&IcST-Fn^u> zEft#-wZL;7DYfAfT4T7?9EL2m(Q9X)G5ChfZY!JzOt9@IhS|hoFM9;hy!%GQQb|g@ zPIRHrZA-nR>uYvr4)^OYBKVL$?pgT;6{3d-=JhLC11Rd^vX52Dx_RWWH?j6WCE~Rm zwVH*Vm_V*q3jZ{JH+wlZMd|R$m8-j5gr% zL-0UNNUf>vg)0XK8B~M3l}xLmKW3q}d{a`l7Cip|SUC^i(F2F^gi!MY*W`x&$p&D* z2ntmTYOg(fjs0K>sWFAPtZHNqxeCyrVAb+_*m1h)B$h;z`rH}bJQ(ydS~c;O5@a=$ zDDvrEn@`BgTOOc$+?6!{e9!KT(^`e|g%=v`V~zLs%i4DDlBhVt&_#$rF?M0v{c}g$ zS@ddgX@8y$(fNkT|pmf5AAs@9X;f$~dW8vKqe@}D;ePNADz8C(~ z62b27eEcoP5p)(VDOt%e_D9)TB6AOvPu>a{?pYwY{h7{h?$igf=1SEONj>7q#S z&BllkIbrGY>nek}^CINf*oUF;>WN)3OD$`+(T@G_x;m6yFSUYo#dCKUMK8?K|@%cEY-m9Yow& ztCN@gP57IzSLG_!Gt;<~i(yKk?<(Yk)a{#bG5W$os^XIB%ll>SlInu+#Xl`HIC#c1 zU^~RAFs(XY&+_Byp7Ep`>AQAtf69V&15g#$n42(#Sd4i+!xhRib8p%?SCg%IJFac zJq^nEk(RWBU&S;^7gM>Dkx^0K`avnImK?Do8l_>KxBHa>V`O4pR5lWa_AqS z&t~q@{Y5G``QC8GyB|Mw!$+QQyRO+JX@}SS6}|o-k8S;uLrrfI)R?T}jJ;=C86c0g zOw@WyH~oQ;ynaYOSTF@-uP6M`LqheviXqq`hJ>7K9GA1HH6q8#RUs;(Nl7uIh-WbT zx)jRo{B$?Ew;MH!<`Ua?Dvgn-So~g!0NzYqDbWqpix^<%-6*n(2$Qr>(e09oZBZi9?}s_UY^}QO$~fa?=F8*IEh_+r+*8 zs<{ga>11|tr)F_1-4tpkRZIn<-(R#YCA5q-z3CuM(gE$U>pG;$Xp@tZpA2@TvZ{GHfbs$Q7p$ zaCho89%{cx%m4OpvCj9~YM=cp@}-^cwB+?=`tR)o(I3gCGpBxaAUa_poRb>H@rCY4 z@FR^q5PP|bdFjIS8uD=+e??5XBU z#{NiW0)>^ll-d0(cU7y$qg1mo>$mVVRckIWG0BpW3p*}Rt+6%C1#_&K#JoN$!})um(2&XA@5^28sQ2)tV<*#J+&WV^HnTwU4Ok>R&73#%@!OVLbO+o zzcO+s%2d)^ahQM5>J(zvd}w*xntI9X5O!5);#$+d@UK<+u5F|&2h}L@O9{01Vs(EhWVB@GFozBncUl$5%ks%8e^$ zn#d03>1riz5V4^?iLAP$KNL-*^{*gv+|8PdyHbR}U1mHi7Hnd&UaxsL%T^Wyn3b(t zu8z$hC3N`m$oSqa2BNM8Q&X>?O}_=c)l0{oyh+#3pv}=pjW3`S&K6;X5vF+ccE)H6 zQKk#zwOesoUAo<*S41iAJS@J&8&aoc6&yTC70d(ZFji9kV+9MJA+3S<&Nimm+Gd~f zK%o{c8O&kB^nLwe2ph7>1z447;iD_41hM^ni|^0+vsht*s7%s1ACqa)dQWf}KSe=& z7+HP~aB7`CzmmZphpePP!7#^2Sip@r5hZPTw5A<}s}kK&kZrBZU90X@_GFEr)jDO< zh=g>*W@{mL%BrhZnR82*CUUGrE1}|Q>$KSZ#{T|~HfrH#gt=LOgf%<2l&Gkvb_-Lh zC~Jt%3B>9#Shogr-xXYtJoQh06GWhkQNNu?N(AV$#ddxvVtu;Yz}V#S)$O@}MGZo0 zYD#fx3L=6u6C;-KGE6GMGK63mKHKXFOvZogdInd!M(f~}&}Gf-QIMIL0Kbf+q%`nZ zSLk#uTQ(Vq77?{O;Od=LmT}GwP#ld3T5mmCh2RWOlMuph=2TgYGa~v;?noluKn>{m zAWmg6$+HlM9-rHHXc`q9mq)RKAxLRI8F+|F`noQ}*{2MmUj!^RyS5wA3DA;-`0Bx& zem)Rrq7#eR-K!B~$M{T{}rR(TmJzWJawiECQSt+f72V7yfw`9iy5BqnU5g0$h zCO52Gt8jry5trSb+Eh0wkVj7;-V|ciP2%&57gc;RVsP81&=)bzPCbxOFuTR!@G5qA z>1J7#F>}-vQ-6Q?G~(3NdZPmBb1RlIqMPcfbU~DIG+6hJsR-|^1|WTj_pFILBQrwk zShR2MCLt;+Lvrf?DjRbyRJesz$NOpkU(DfExoT|lpkcYttt;j>^?h;Zvi6)w>QJ3Qp2DCj=a?+Yajt5j zBCvx6fXi*_V%#{gg(-u?-N=t`yh5FEQ=1`+<5=2cD#y5cy$M+4k9R&In1Up-MkN5V z3kiR}o59hz7Gt=<5?!paiX6qoLH#ZU*N^tdj9MNCY@LuPWT$lwlUHk0%HaTYGA^3Y z6bMHB{5Z54MC^Ye;q5>ar%(%(3;^vgzxUo~?5nv+gz{bNP-&BHH^#|~5-%Pjhu7|w zCkje*P<<78&QH`Z^@inwfmfA;+LCyj+O9&_kprXhS6ZPA_sz|zcSi3(P0po6Zr)hV z^=Tfyy*Qi(3|qA%0^r}zlWwl94~yONJ@%3Uw_?fs4s?@9$y+%cOvt=sgHf?&;rqKG zT@s=Dok5@OWN;Qbm1)p3!-GIrF?SD>w*&7}ojh3S!ELuKXGHF$b<~v%BsU}2|BUSX z?>%hiSnx|)7Se8_+#Eb~2l1cuK(K|~N5i`2(5SW^Nmi)V3uuL^HgZj2sgeQ~(K4wM zeh>YfXneM?0*z#gmBS9YFSj@o^xcFZWUkoR@-BG+u$~)w`pKYHw5Jjr-jsmX*PC~? zY5@6Q0>=K8-|r-7^5E>B;y^gd#CoEaNN`8jnF)@~U}jlyf3A@y_uD8aX5b`9@5#Vx zTo$YzE5?Uxc%qwI(B2Jnd``eUsNIhaV*@%rQoLNQMV^kDK{_0UOt0?Iuiem`Z?tzA z&jZXD@SW*(fuy)-lyLalKo>UeA*g zq$B>e-ci?iO275MYs97L$>oZ*SfQh%+CJ7l6T}0=NqD0`b~lPqD_5*7=+Ga+Br<+P z{^$y*D)}f0$k&$zBOX<=cIAa&_9x+Gr(e4g-3>a9uTq*j=Kj_dV$YR6&Ke9LU4rVv6rutY=lCJqjdUuq^huPm6#`BUex+0>in1v2PVKF7ERh*fm$;$jx23kn zwI@v!Ho;8!@{%A?>Oy=r@N6wK!YjDOOyNfTjxdh-*16pOUodL^%Zd68q3fdzE~T0e^wUY^EW{F zb~2B}Z+b~Io}?6{leHN;HmKU zJGF~>8=_=ZBCU~sK)KljZBJeGeH)&v%?eNq#0{*WtIrhg46I?=*_@ESVU{s z;DE;6+8r3{dVBOm;vqTtG*zrZL=hftdE|)^8TQ_@Sb91&A&ro^#Vd0KNV#d2lN!*B z^S0vQ%{t_N)fM>WH#nXJzW$_+_M)ioCyO3=&|}XtQ<|r6c5n@xv6Ueu1mX^x**n!r z0<5nGyNllo)*o98N|v@AfMKac3wE_i0|7MMf%%^VW?$U=0hH5+agdO}dE zVKBq6N9}-%UG=H+KcuW{ehgB+bQzhtFPn$FwP^3l1Dfe^OqZeLdz57YtIx4J;(-hi zz5YF>?$G_sZOywa=Er_$PPBSf^Ha7n*$;~gL8QZ$>S6O$_>-z(Yd+vO=4;uZ1+&mD zZzd@re23Y&ezY0}@Pn;xi>6f|91*GaK1ZT!=jMy2V3PBMjIUq)vls$vP6k-zX%_C) zht$hoj9;nhNOfDsPbJIewmbb;bZa8o4p`apyg?h&r7WVZb4eWs$fI#t#hW|a16uQs zp*Uy}`!WI`;`5*eemO>)cze0Pis{y?{+L2^xJf=lnxK#?MkIqHG{iB|)Z+~RsRPB# z2l$c$YDjsynLMzP2Xm9VlS1VU55bzFtseoq#vMz48am&^kEI0-s5T+B0+{uJe9jqX zd$F`bJ$KF`821-mr2QcT)7Z&7_GERL;xx}441{BlRXs0M>J)gsuRK(*>F7}I#LYc% zAAe-b@_I>v>5HC`q_blw#^%c48}id$btkRG4WzgQ^OK<7`eB(zi0d+5o=nWZ*)1f_ z^^P4i>?1Z$1YB%-aq%eNPh~z1$9$Hna{|ylg)#XsANLEqcvo7w-@SYMKrg5KefL^S zj80-#J(WeBEUh1A>1+6}5r!DPMNAP?K421fY{j?(WKex=&qngo9y=h z>T^1ZVD_VE^5U`ERADgyCYG_h8=Ca^v*kFinWB@=T`(MfyzxZt^VPH@Tjw^{yJ~S~ zVpB(?r%3zi_1*wR%flp_xslHNm;=>5n&{dcJwSR(^OHD;phspNGWsDZN}rdPkxmey z6*X?e%H&J3u^L8pbpUoYB$!?*Tun@7dwvzk6f*%%&vC~0CVg>$&xa@(`e}~H3^MMd zjP!|FVGh|YxjI$;W|tlKqLeg`gIh|2Ph7!2c)x&Jh>5RCjg;z!r6Bw!5f1ENFcPoU0;I{{%(@qa&iJ1CzOs)F-nNZfnPGK&ky}`i!k-jD|Y(Eu{fQ zs_&{J^6**(>?wgbmHfO@_EOZIQLU7YmSnqtp1_Y3Rr5ITRz&Pe{fXpV>jBUvsZVD* z2UO&Z>W0*Pt~Qi(-==&@J!7=D1YK%zEAmmm6yPv$2XKE$cQSch8E6kc&*Wz+@)v=> z6Uav319fuhF6$oXp8RY@{tB=sBKE0sfSJH=R{}tfBJ-4S3h@Dy-Y zM10XMM0JolPo1vbr1mQ5R%K0hZ!1P6-jej0bqRf=dULJc5D~j0;**H@J|g~#i1Mk| zW=*Rz)M@2|h}Ki{R1P+|;q zbt|d^4O3UD2h`_E@@45TuwuVPZBiGgi`A2PDWN`;K9jOPO5Lm;R}ZP*sa?v!2B`-v zuHFyR`H|GUoc$pc0Q=QvOZ|0fQ?}=%&xDe`tGX@a8`SG-x(15J#?FX%6POQd0Uk|# zbMk(b)oG!4taew2Qk3mKsXLPVbjf}$#j(8_ml@00I(wgE=^r+6P~WkKJ7OEi-76Cr_}Btb)kAjy+^&*;*V%~>ZWDd9M1QW7HhFs$Z3M^iQ=-r}j(dr5AO+c)Xz*XK-nPAGPNc>ST42 wTK!?&uD;U&0F4&q`~P1=8SstTl3WS;58og)!6)n=g8%>k07*qoM6N<$f{OzrF8}}l diff --git a/assets/totalGame.svg b/assets/totalGame.svg new file mode 100644 index 0000000..07d4456 --- /dev/null +++ b/assets/totalGame.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/trophy.png b/assets/trophy.png deleted file mode 100644 index 24824e034482544140a09362beda545d89295a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729 zcmV;y20rC31MtnM@f(XqYf>%{V%uFn~I0rh=s#^iF~W?FGrrr5!fFX<~o{j28znY=Z$V zdw-`tmc3l)E-WkGzkc(abH3+upXdC3_YqprhE89pP|MK2zziVq zNt)-V5vWp?lL9+41s_*U+PmRw7T~Sk(~FImEkG%73P=MM=mhe-3ia*jDyk!Z?*RV+ zVjuuTz#fkoHTJ-(A2yNY7@<_4TA?HGlT^jxhgH}Wt6MzbZ^;G#o53)a)tF4Emh>BNwrTln)87=TvVYhq;S48Rgvt`yzY;R3m104yAoWe6d(GE^Gh;5 zG1HjnZmeG+E(|a>O!MA-F82tG3r7J`Hzx;(3*C+PDO}W9X( z4~(&WMsAw>z5y7!dENoBVXfFOPkeY>oL3{ZT706vxPY1tH(os5p%>1NQj^#!F4T$( zL&Sw%xhdAVGI0TG{SbWgCvoAwv5S_Ajpm9AYesIG`+oKa00@PP#0637pHLg7iVKZm z{akSYoS)i~R#*OlH!gG%=a1o{?->{7i;GT(3tcXPG|}zNwPAs=;gAV#s&!$xxR7zi zF3JvOZp~l5xoV=Q{t7rE$O08LC=UX|nqqUq=yfyp18kYRy3ciq#Nk0}??^Wv;VX&I zCDZ+uU(Y@WQ1kUwWhz<+Y>Lrmj7Sh=i9!#-Od0XJ8Gp%Jzc(|{4c=g)`UMeLn7S4}yPukPK-H8;e@tdVATfPVoss#Kjl*7Xl#H;-+)v?edW zrK-Q@H=WaIbE}FxFG7*3{9J?;!+$n;2SCkT>xNkqKd36xfR9k_i$Z2g*{f4NzLIzA zH=-P!H(FaWV_l80VWB8<5bXnu1F*qAhtgj}mNjK~>Xz5Oe5@_LZ3bx3h}Dx119P{{ zuD%`E)3Pou>;;O3y)iz(~Ox1a8V%dZJAL&FTg`ZP8nSiR}UqA9^D4@{Nl=J?knOXSM6G6Tei^ z>o1pcc>ovM)AxdWK+wykTnXS1F!Q~o>6z_iP;`B}0Zj0B5%X=JL;IT3XfnKVxt#w2 Xg0}udOLylp00000NkvXXu0mjf+88vz diff --git a/assets/trophy.svg b/assets/trophy.svg new file mode 100644 index 0000000..3869472 --- /dev/null +++ b/assets/trophy.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/assets/whiteBgProfileIcon.svg b/assets/whiteBgProfileIcon.svg new file mode 100644 index 0000000..4ecc615 --- /dev/null +++ b/assets/whiteBgProfileIcon.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 77a4b2e..0a6d95f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -4,8 +4,8 @@ import { Session, getServerSession } from "next-auth"; import { redirect } from "next/navigation"; import DashboardCard from "@/components/dashboardCard/card"; import Image from "next/image"; -import win from "./../../assets/trophy.png"; -import totalGame from "./../../assets/totalGame.png"; +import win from "./../../assets/trophy.svg"; +import totalGame from "./../../assets/totalGame.svg"; import lose from "./../../assets/lose.png"; import draw from "./../../assets/draw.png"; import StartGame from "@/components/startGame/startGame"; diff --git a/src/components/formHeader/formHeader.tsx b/src/components/formHeader/formHeader.tsx index dc66b2a..372547b 100644 --- a/src/components/formHeader/formHeader.tsx +++ b/src/components/formHeader/formHeader.tsx @@ -1,6 +1,6 @@ import Image from "next/image"; import Link from "next/link"; -import loginIcon from '../../../assets/loginIcon.png' +import icon from '../../../assets/formHeaderIcon.svg' export default function FormHeader({ heading, @@ -15,7 +15,7 @@ export default function FormHeader({ className="h-14 w-14" width={100} height={100} - src={loginIcon} + src={icon} />

diff --git a/src/components/profileModal/profileModal.tsx b/src/components/profileModal/profileModal.tsx index 1015e07..c50137c 100644 --- a/src/components/profileModal/profileModal.tsx +++ b/src/components/profileModal/profileModal.tsx @@ -1,7 +1,8 @@ "use client"; import { useState } from "react"; import Image from "next/image"; -import profileImage from "../../../assets/profileIcon.png"; +import profileImage from "../../../assets/profileIcon.svg"; +import whiteBgProfileIcon from '../../../assets/whiteBgProfileIcon.svg' import { signOut } from "next-auth/react"; import PortalProvider from "../portalProvider/portalProvider"; @@ -30,7 +31,7 @@ const ProfileModal = () => { >
Date: Tue, 6 Feb 2024 19:11:53 +0530 Subject: [PATCH 15/56] refact: changes button to type submit always --- src/components/formAction/formAction.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/formAction/formAction.tsx b/src/components/formAction/formAction.tsx index 0900567..6f27fa4 100644 --- a/src/components/formAction/formAction.tsx +++ b/src/components/formAction/formAction.tsx @@ -5,7 +5,6 @@ export default function FormAction({ handleSubmit, loading, buttonType = "Button", - action = "submit", text, }: Partial) { return ( @@ -13,7 +12,7 @@ export default function FormAction({ {buttonType === "Button" ? ( + ) + + } + + function value(i:number){ + let value; + if( squares[i] ==="X"){ + value= + }else if( squares[i] === "O"){ + value= + }else{ + value=null; + } + + return value; + + } + + const renderSquare = (i: number) => { + return handlePlayer(i)} /> + } + + return ( +
+
+
+
+ {playerX + ? +
+ + X + + {" "} + Turn +
+ + : +
+ + O + + {" "} + Turn +
+ + } + +
+
+
+ {renderSquare(0)} + {renderSquare(1)} + {renderSquare(2)} +
+ +
+ {renderSquare(3)} + {renderSquare(4)} + {renderSquare(5)} +
+ +
+ {renderSquare(6)} + {renderSquare(7)} + {renderSquare(8)} +
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/dashboardCard/card.tsx b/src/components/dashboardCard/card.tsx index 6a48ae8..937eec9 100644 --- a/src/components/dashboardCard/card.tsx +++ b/src/components/dashboardCard/card.tsx @@ -2,7 +2,7 @@ import React, { PropsWithChildren } from "react"; const DashboardCard: React.FC = ({ children }) => { return ( -
+
{children}
); diff --git a/src/components/dashboardHeader/dashboardHeader.tsx b/src/components/dashboardHeader/dashboardHeader.tsx new file mode 100644 index 0000000..a75030e --- /dev/null +++ b/src/components/dashboardHeader/dashboardHeader.tsx @@ -0,0 +1,18 @@ +import React from 'react' + +const DashboardHeader = ({headerMessage}:DashboardHeader) => { + return ( +
+
+

+ Welcome to online multiplayer Tic Tac Toe game +

+

+ {headerMessage} +

+
+
+ ) +} + +export default DashboardHeader diff --git a/src/components/gameBoard/gameBoard.tsx b/src/components/gameBoard/gameBoard.tsx new file mode 100644 index 0000000..d024f8e --- /dev/null +++ b/src/components/gameBoard/gameBoard.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import { Board } from '../board/board' + +const GameBoard = () => { + return ( + + ) +} + +export default GameBoard diff --git a/src/components/gameDetails/gameDetails.tsx b/src/components/gameDetails/gameDetails.tsx new file mode 100644 index 0000000..6a2f5b5 --- /dev/null +++ b/src/components/gameDetails/gameDetails.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import DashboardCard from "../dashboardCard/card"; + +const GameDetails = () => { + return ( + <> + +
+

+ Oppoenent:{" "} + + Not Joined Yet + {" "} +

+

+ Your Symbol:{" "} + X +

+

+ Game Status:{" "} + Progress... +

+
+
+ + ); +}; + +export default GameDetails; diff --git a/src/components/oIcon/oIcon.tsx b/src/components/oIcon/oIcon.tsx new file mode 100644 index 0000000..4dea022 --- /dev/null +++ b/src/components/oIcon/oIcon.tsx @@ -0,0 +1,10 @@ +import React from 'react' + +export const OIcon = () => { + return ( +
+
+
+
+ ) +} diff --git a/src/components/signup/signup.tsx b/src/components/signup/signup.tsx index 9b7c50d..889e77e 100644 --- a/src/components/signup/signup.tsx +++ b/src/components/signup/signup.tsx @@ -43,9 +43,11 @@ const Signup = () => { setLoading(false); throw new Error("Failed to create account"); } - } catch (error) { - setLoading(false); - console.error("Error creating account:", error?.message); + } catch (error:unknown) { + if(error instanceof Error){ + setLoading(false); + console.error("Error creating account:", error?.message); + } } }; diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index a106654..b6ebd05 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -3,6 +3,7 @@ import { useRouter } from "next/navigation"; import React, { useState } from "react"; import LoadingButton from "../loadingButton/loadingButton"; import Input from "../input/input"; +import { room } from "@/constants/apiUrl"; const StartGame = () => { const [loading, setLoading] = useState({ @@ -17,11 +18,34 @@ const StartGame = () => { }; const router = useRouter(); - const createRoom = () => { + const createRoom = async () => { setLoading({ ...loading, createRoom: true }); + const customRoomCode = Math.random().toString().substring(2, 8); - // Perform API call to create a room at backend - router.push(`/room/${customRoomCode}`); + // Perform API call to create a room at backend + try { + const res = await fetch(room, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(customRoomCode), + }); + const data = await res.json(); + console.log({data}) + if (res.ok) { + router.push(`/room/${customRoomCode}`); + } else { + // setApiResponse(data); + setLoading({ ...loading, createRoom: false }); + throw new Error("Failed to create account"); + } + } catch (error: unknown) { + if (error instanceof Error) { + setLoading({ ...loading, createRoom: false }); + console.error("Error creating account:", error?.message); + } + } }; const joinRoom = () => { @@ -37,32 +61,37 @@ const StartGame = () => { <>

Start a new game

{" "} -

{loading.createRoom ? : "Create Room"} -

+
-
- -

- {loading.joinRoom ? : "Join Room"} -

+
+
+ +
+ +
+ +
); diff --git a/src/components/xIcon/xIcon.tsx b/src/components/xIcon/xIcon.tsx new file mode 100644 index 0000000..198fcfa --- /dev/null +++ b/src/components/xIcon/xIcon.tsx @@ -0,0 +1,12 @@ +import React from 'react' + +export const XIcon = () => { + return ( +
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/constants/apiUrl.ts b/src/constants/apiUrl.ts index 1d067b3..2f246e8 100644 --- a/src/constants/apiUrl.ts +++ b/src/constants/apiUrl.ts @@ -2,4 +2,6 @@ export const signup = "api/signup"; export const login = "api/login" -export const user = 'http://localhost:3000/api/user' \ No newline at end of file +export const user = `${process.env.NEXT_PUBLIC_BASE_URL}/api/user` + +export const room = `${process.env.NEXT_PUBLIC_BASE_URL}/api/createRoom` \ No newline at end of file diff --git a/src/types/types.ts b/src/types/types.ts index 2d8feb0..f9e688b 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -66,8 +66,24 @@ interface UserResponseData { existingUser: boolean; } -type PortalInterface = { +interface PortalInterface { children: React.ReactNode; show?: boolean; selector: string; -}; \ No newline at end of file +}; + +interface DashboardHeader { + headerMessage : string; +} + +interface GameSchema { + roomCode: string; + board: string[]; + turn: string; + winner: string | null; + status: boolean; + leftGame: { + playerX: boolean; + playerO: boolean; + }; +} From 3f4b901ebc8dde303e2bd1cc5343e2b6eee1ff6f Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 8 Feb 2024 19:29:45 +0530 Subject: [PATCH 17/56] feat: Add Loading UI for dashboard --- src/app/loading.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/app/loading.tsx diff --git a/src/app/loading.tsx b/src/app/loading.tsx new file mode 100644 index 0000000..1ac2976 --- /dev/null +++ b/src/app/loading.tsx @@ -0,0 +1,12 @@ +import React from "react"; +import gameLoader from "../../assets/gameLoader.gif"; +import Image from "next/image"; +const LoaderDashboardPage = () => { + return ( +
+ Game Loader +
+ ); +}; + +export default LoaderDashboardPage; From a5eeafec767c0045f2d19a4c2e5ba44ec5a7c29b Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 8 Feb 2024 19:30:00 +0530 Subject: [PATCH 18/56] feat: add mongodb for create abd join room --- assets/gameLoader.gif | Bin 0 -> 168621 bytes models/gameModel.ts | 30 +++++++----- src/app/api/createRoom/route.ts | 9 ++-- src/app/api/joinRoom/[roomCode]/route.ts | 57 ++++++++++++++++++++++ src/app/layout.tsx | 7 ++- src/app/page.tsx | 2 +- src/app/room/[code]/page.tsx | 4 +- src/components/startGame/startGame.tsx | 58 ++++++++++++++++++----- src/constants/apiUrl.ts | 4 +- src/context/gameContext.tsx | 23 +++++++++ src/types/types.ts | 22 +++++++++ 11 files changed, 181 insertions(+), 35 deletions(-) create mode 100644 assets/gameLoader.gif create mode 100644 src/app/api/joinRoom/[roomCode]/route.ts create mode 100644 src/context/gameContext.tsx diff --git a/assets/gameLoader.gif b/assets/gameLoader.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd3d697bfd5219a086b1a99beba7f25ca7170a74 GIT binary patch literal 168621 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 z%0D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 +const GameSchema: Schema = new Schema( { roomCode: { type: String, required: true, }, - playerX: { + playerXId: { type: Schema.Types.ObjectId, - ref: 'User', + ref: "User", required: true, }, - playerO: { + playerOId: { type: Schema.Types.ObjectId, - ref: 'User', + ref: "User", }, board: { type: [String], - default: ['', '', '', '', '', '', '', '', ''], + default: ["", "", "", "", "", "", "", "", ""], }, turn: { type: String, - default: 'X', + default: "X", }, winner: { type: String, @@ -52,5 +56,7 @@ const GameSchema: Schema = new Schema( } ); -const Game = mongoose.model('Game', GameSchema); +const Game = + mongoose.models.Game || + mongoose.model("Game", GameSchema); export default Game; diff --git a/src/app/api/createRoom/route.ts b/src/app/api/createRoom/route.ts index a80a21b..c38a677 100644 --- a/src/app/api/createRoom/route.ts +++ b/src/app/api/createRoom/route.ts @@ -6,10 +6,10 @@ export async function POST(req: Request) { try { console.log("api"); await connectMongoDb(); - const { customRoomCode } = await req.json(); - console.log({ customRoomCode }); + const { game } = await req.json(); + console.log(game); const roomExist = await Game.findOne({ - $or: [{ roomCode: customRoomCode }], + $or: [{ roomCode: game.roomCode }], }); console.log({ roomExist }) if (roomExist) { @@ -19,11 +19,10 @@ export async function POST(req: Request) { ); } - await Game.create({ roomCode: customRoomCode }); + await Game.create(game); return NextResponse.json({ message: "", status: true }, { status: 201 }); } catch (error) { - console.log({error}) return NextResponse.json( { message: "Error while creating Room", status: false }, { status: 500 } diff --git a/src/app/api/joinRoom/[roomCode]/route.ts b/src/app/api/joinRoom/[roomCode]/route.ts new file mode 100644 index 0000000..ec65965 --- /dev/null +++ b/src/app/api/joinRoom/[roomCode]/route.ts @@ -0,0 +1,57 @@ +import { NextResponse } from "next/server"; +import connectMongoDb from "../../../../../utils/dbConnection"; +import Game from "../../../../../models/gameModel"; + +export async function PATCH( + req: Request, + { params }: { params: JoinRoomApiParams } +) { + const { roomCode } = params; + const game = await req.json(); + const { playerOId, status } = game; + + await connectMongoDb(); + try { + const roomExist = await Game.findOne({ roomCode }); + console.log( roomExist); + + if (!roomExist) { + console.log("room not found") + return NextResponse.json( + { message: "No such room found...", status: false }, + { status: 500 } + ); + } + + if (roomExist.playerOId && roomExist?.playerOId !== playerOId) { + return NextResponse.json( + { message: "Room is full...", status: false }, + { status: 500 } + ); + } + + + const room = await Game.findOneAndUpdate( + { roomCode }, + { $set: {playerOId, status } }, + { new: true } + ); + + + return NextResponse.json( + { message: "", status: true }, + { status: 200 } + ); + + } catch (error) { + if (error instanceof Error) + return NextResponse.json( + { + message: `Error while Joining Room: ${error.message} `, + status: false, + }, + { status: 500 } + ); + } + return null; +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 5649046..159d9a2 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,11 +2,12 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; import AuthProvider from "../components/authProvider"; +import GameContextProvider from "@/context/gameContext"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { title: "Tic Tac Toe", - description: "Tic Tac Toe Game developed using next.js + typescript", + description: "Tic Tac Toe game developed using next.js + typescript", }; export default function RootLayout({ @@ -18,7 +19,9 @@ export default function RootLayout({

- +
); diff --git a/src/app/room/[code]/page.tsx b/src/app/room/[code]/page.tsx index 0fac6e9..6baec87 100644 --- a/src/app/room/[code]/page.tsx +++ b/src/app/room/[code]/page.tsx @@ -11,9 +11,9 @@ const Room = async () => { if (!session) { redirect("/"); } - console.log({session}) + // console.log({session}) return ( -
+
diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index b6ebd05..47aee99 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -1,11 +1,14 @@ "use client"; import { useRouter } from "next/navigation"; -import React, { useState } from "react"; +import React, { useContext, useState } from "react"; import LoadingButton from "../loadingButton/loadingButton"; import Input from "../input/input"; -import { room } from "@/constants/apiUrl"; +import { joinRoom, room } from "@/constants/apiUrl"; +import { GameContext } from "@/context/gameContext"; -const StartGame = () => { +const StartGame = ({ userData }: { userData: UserResponseData }) => { + const { game, setGame } = useContext(GameContext) as GameContextType; + console.log(game); const [loading, setLoading] = useState({ createRoom: false, joinRoom: false, @@ -22,21 +25,32 @@ const StartGame = () => { setLoading({ ...loading, createRoom: true }); const customRoomCode = Math.random().toString().substring(2, 8); - // Perform API call to create a room at backend + + setGame({ + ...game, + roomCode: customRoomCode, + playerXId: userData.data._id, + }); + try { + console.log({ game }); const res = await fetch(room, { method: "POST", headers: { "Content-Type": "application/json", }, - body: JSON.stringify(customRoomCode), + body: JSON.stringify({ + game: { + ...game, + roomCode: customRoomCode, + playerXId: userData.data._id, + }, + }), }); const data = await res.json(); - console.log({data}) if (res.ok) { router.push(`/room/${customRoomCode}`); } else { - // setApiResponse(data); setLoading({ ...loading, createRoom: false }); throw new Error("Failed to create account"); } @@ -48,12 +62,32 @@ const StartGame = () => { } }; - const joinRoom = () => { + const handleJoinRoom = async () => { if (joinRoomCode && joinRoomCode.length === 6) { - //here I have to perform some API call to check that such room exist or not setLoading({ ...loading, joinRoom: true }); - router.push(`/room/${joinRoomCode}`); - return; + + try { + const res = await fetch(`${joinRoom}/${joinRoomCode}`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + status: "true", + playerOId: userData.data._id, + }), + }); + + const resD = await res.json(); + if (res.ok) { + router.push(`/room/${joinRoomCode}`); + } + setLoading({ ...loading, joinRoom: false }); + console.log({ resD }); + } catch (error) { + setLoading({ ...loading, joinRoom: false }); + console.error(error); + } } }; @@ -87,7 +121,7 @@ const StartGame = () => {
diff --git a/src/constants/apiUrl.ts b/src/constants/apiUrl.ts index 2f246e8..d7296a2 100644 --- a/src/constants/apiUrl.ts +++ b/src/constants/apiUrl.ts @@ -4,4 +4,6 @@ export const login = "api/login" export const user = `${process.env.NEXT_PUBLIC_BASE_URL}/api/user` -export const room = `${process.env.NEXT_PUBLIC_BASE_URL}/api/createRoom` \ No newline at end of file +export const room = `${process.env.NEXT_PUBLIC_BASE_URL}/api/createRoom` + +export const joinRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/joinRoom` \ No newline at end of file diff --git a/src/context/gameContext.tsx b/src/context/gameContext.tsx new file mode 100644 index 0000000..ecda74c --- /dev/null +++ b/src/context/gameContext.tsx @@ -0,0 +1,23 @@ +'use client' +import React, { createContext, useState } from "react"; + +export const GameContext = createContext(null); + +const GameContextProvider = ({ children }: { children: React.ReactNode }) => { + const [game, setGame] = useState({ + roomCode: "", + playerXId: "", + turn: "", + board: ["", "", "", "", "", "", "", "", ""], + winner: "", + status: false, + leftGame: { playerX: false, playerO: false }, + }); + return ( + + {children} + + ); +}; + +export default GameContextProvider; diff --git a/src/types/types.ts b/src/types/types.ts index f9e688b..26b7460 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -87,3 +87,25 @@ interface GameSchema { playerO: boolean; }; } + +interface Game{ + roomCode: string; + playerXId: string; + turn: string; + board: string[]; + winner: string; + status: boolean; + leftGame: { + playerX: boolean; + playerO: boolean; + }; +} + +interface GameContextType{ + game: Game; + setGame: (game: Game)=>void +} + +interface JoinRoomApiParams{ + roomCode: string; +} \ No newline at end of file From c8f46dfd24be7a36a0d2d846f9ef02f218dbea28 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Fri, 9 Feb 2024 18:48:43 +0530 Subject: [PATCH 19/56] refac: add session in sessionProvider --- src/app/layout.tsx | 6 ++++-- src/components/authProvider.tsx | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 159d9a2..2d0537c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,6 +3,7 @@ import { Inter } from "next/font/google"; import "./globals.css"; import AuthProvider from "../components/authProvider"; import GameContextProvider from "@/context/gameContext"; +import { getServerSession } from "next-auth"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -10,16 +11,17 @@ export const metadata: Metadata = { description: "Tic Tac Toe game developed using next.js + typescript", }; -export default function RootLayout({ +export default async function RootLayout({ children, }: { children: React.ReactNode; }) { + const session = await getServerSession() return (
- + {children} diff --git a/src/components/authProvider.tsx b/src/components/authProvider.tsx index b066fd7..f213295 100644 --- a/src/components/authProvider.tsx +++ b/src/components/authProvider.tsx @@ -1,8 +1,9 @@ "use client"; +import { Session } from "next-auth"; import { SessionProvider } from "next-auth/react"; -const AuthProvider = ({ children }: { children: React.ReactNode }) => { - return {children}; +const AuthProvider = ({ children, session }: { children: React.ReactNode, session:Session | null }) => { + return {children}; }; export default AuthProvider; From f8a39912982e9dccaaacc03020d2512b26145acf Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Mon, 12 Feb 2024 19:03:34 +0530 Subject: [PATCH 20/56] feat: add game login and win and lose UI --- models/gameModel.ts | 8 +- package.json | 4 +- src/app/api/auth/[...nextauth]/route.ts | 2 +- src/app/api/createRoom/route.ts | 34 +- src/app/api/getRoom/[roomCode]/route.tsx | 28 + src/app/api/joinRoom/[roomCode]/route.ts | 15 +- src/app/api/signup/route.ts | 2 +- src/app/api/updateRoom/[roomCode]/route.ts | 33 + src/app/api/user/[email]/route.ts | 2 +- src/app/layout.tsx | 1 + src/app/page.tsx | 2 +- src/app/room/{[code] => [roomCode]}/page.tsx | 18 +- src/components/board/board.tsx | 109 --- src/components/gameBoard/gameBoard.tsx | 49 +- src/components/gameDetails/gameDetails.tsx | 41 +- src/components/squares/squares.tsx | 63 ++ src/components/startGame/startGame.tsx | 60 +- src/components/toastConainer.tsx | 24 + src/components/turn/turn.tsx | 24 + src/constants/apiUrl.ts | 6 +- src/constants/winningPatterns.ts | 10 + src/context/gameContext.tsx | 4 +- src/hooks/useWindowSize.ts | 22 + .../profileModal => modal}/profileModal.tsx | 6 +- src/modal/react-confetti.tsx | 32 + src/modal/resultModal.tsx | 48 + src/types/types.ts | 108 ++- src/utils/checkCurrentTurn.ts | 24 + src/utils/checkGameStatus.ts | 16 + src/utils/checkOpponent.ts | 7 + src/utils/checkWinner.ts | 18 + {utils => src/utils}/dbConnection.ts | 0 src/utils/handleGameEnd.ts | 33 + src/utils/handleGameState.ts | 32 + src/utils/toast.ts | 16 + utils/code.ts | 0 yarn.lock | 848 +++++++++--------- 37 files changed, 1100 insertions(+), 649 deletions(-) create mode 100644 src/app/api/getRoom/[roomCode]/route.tsx create mode 100644 src/app/api/updateRoom/[roomCode]/route.ts rename src/app/room/{[code] => [roomCode]}/page.tsx (72%) delete mode 100644 src/components/board/board.tsx create mode 100644 src/components/squares/squares.tsx create mode 100644 src/components/toastConainer.tsx create mode 100644 src/components/turn/turn.tsx create mode 100644 src/constants/winningPatterns.ts create mode 100644 src/hooks/useWindowSize.ts rename src/{components/profileModal => modal}/profileModal.tsx (90%) create mode 100644 src/modal/react-confetti.tsx create mode 100644 src/modal/resultModal.tsx create mode 100644 src/utils/checkCurrentTurn.ts create mode 100644 src/utils/checkGameStatus.ts create mode 100644 src/utils/checkOpponent.ts create mode 100644 src/utils/checkWinner.ts rename {utils => src/utils}/dbConnection.ts (100%) create mode 100644 src/utils/handleGameEnd.ts create mode 100644 src/utils/handleGameState.ts create mode 100644 src/utils/toast.ts delete mode 100644 utils/code.ts diff --git a/models/gameModel.ts b/models/gameModel.ts index 5feea13..9c1036f 100644 --- a/models/gameModel.ts +++ b/models/gameModel.ts @@ -9,6 +9,7 @@ interface Game extends Document, GameSchema { playerOId: { type: typeof Schema.Types.ObjectId; ref: string }; } + const GameSchema: Schema = new Schema( { roomCode: { @@ -56,7 +57,6 @@ const GameSchema: Schema = new Schema( } ); -const Game = - mongoose.models.Game || - mongoose.model("Game", GameSchema); -export default Game; +const GameModel = + mongoose.models.Game || mongoose.model("Game", GameSchema); +export default GameModel; diff --git a/package.json b/package.json index 2d69d38..ffe2a97 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,10 @@ "next": "14.1.0", "next-auth": "^4.24.5", "react": "^18", + "react-confetti": "^6.1.0", "react-dom": "^18", - "react-hook-form": "^7.49.3" + "react-hook-form": "^7.49.3", + "react-toastify": "^10.0.4" }, "devDependencies": { "@types/bcrypt": "^5.0.2", diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts index dd80bbb..62bfff7 100644 --- a/src/app/api/auth/[...nextauth]/route.ts +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -1,6 +1,6 @@ import NextAuth from "next-auth/next"; import CredentialsProvider from "next-auth/providers/credentials"; -import connectMongoDb from "../../../../../utils/dbConnection"; +import connectMongoDb from "../../../../utils/dbConnection"; import User from "../../../../../models/userModel"; import bcrypt from "bcrypt"; import { Document } from "mongoose"; diff --git a/src/app/api/createRoom/route.ts b/src/app/api/createRoom/route.ts index c38a677..15a996b 100644 --- a/src/app/api/createRoom/route.ts +++ b/src/app/api/createRoom/route.ts @@ -1,31 +1,33 @@ -import connectMongoDb from "../../../../utils/dbConnection"; +import connectMongoDb from "../../../utils/dbConnection"; import { NextResponse } from "next/server"; import Game from "../../../../models/gameModel"; export async function POST(req: Request) { try { - console.log("api"); + console.log("Create room API called"); await connectMongoDb(); const { game } = await req.json(); - console.log(game); - const roomExist = await Game.findOne({ - $or: [{ roomCode: game.roomCode }], - }); - console.log({ roomExist }) + console.log("Room Code: ", game) + + const roomExist = await Game.findOne({ roomCode: game.roomCode }); if (roomExist) { - return NextResponse.json( - { message: "Room already exist. Please Try again...", status: false }, - { status: 500 } - ); + return NextResponse.json({ + message: "A room with the same roomCode already exists.", + status: false, + }, { status: 409 }); } await Game.create(game); - return NextResponse.json({ message: "", status: true }, { status: 201 }); + return NextResponse.json({ + message: "Room created successfully.", + status: true, + }, { status: 201 }); } catch (error) { - return NextResponse.json( - { message: "Error while creating Room", status: false }, - { status: 500 } - ); + console.error("Error while creating Room:", error.message); + return NextResponse.json({ + message: `Error while creating Room: ${error.message}`, + status: false, + }, { status: 500 }); } } diff --git a/src/app/api/getRoom/[roomCode]/route.tsx b/src/app/api/getRoom/[roomCode]/route.tsx new file mode 100644 index 0000000..318e250 --- /dev/null +++ b/src/app/api/getRoom/[roomCode]/route.tsx @@ -0,0 +1,28 @@ +import { NextResponse } from "next/server"; +import connectMongoDb from "../../../../utils/dbConnection"; +import Game from "../../../../../models/gameModel"; + +export async function GET( + _req: Request, + { params }: { params: { roomCode: string } } +) { + const { roomCode } = params; + + try { + console.log("Get Room APi called") + await connectMongoDb(); + const room = await Game.findOne({ roomCode }) + .populate("playerXId") + .populate("playerOId"); + + return NextResponse.json( + { message: "Room found", data: room, status: true }, + { status: 201 } + ); + } catch (error) { + return NextResponse.json( + { message: error, status: false }, + { status: 500 } + ); + } +} diff --git a/src/app/api/joinRoom/[roomCode]/route.ts b/src/app/api/joinRoom/[roomCode]/route.ts index ec65965..4acc333 100644 --- a/src/app/api/joinRoom/[roomCode]/route.ts +++ b/src/app/api/joinRoom/[roomCode]/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from "next/server"; -import connectMongoDb from "../../../../../utils/dbConnection"; +import connectMongoDb from "../../../../utils/dbConnection"; import Game from "../../../../../models/gameModel"; export async function PATCH( @@ -12,11 +12,10 @@ export async function PATCH( await connectMongoDb(); try { + console.log("Join Room Api is called") const roomExist = await Game.findOne({ roomCode }); - console.log( roomExist); if (!roomExist) { - console.log("room not found") return NextResponse.json( { message: "No such room found...", status: false }, { status: 500 } @@ -30,19 +29,13 @@ export async function PATCH( ); } - const room = await Game.findOneAndUpdate( { roomCode }, - { $set: {playerOId, status } }, + { $set: { playerOId, status } }, { new: true } ); - - return NextResponse.json( - { message: "", status: true }, - { status: 200 } - ); - + return NextResponse.json({ message: "", status: true }, { status: 200 }); } catch (error) { if (error instanceof Error) return NextResponse.json( diff --git a/src/app/api/signup/route.ts b/src/app/api/signup/route.ts index 79f2fe5..c512a3a 100644 --- a/src/app/api/signup/route.ts +++ b/src/app/api/signup/route.ts @@ -1,4 +1,4 @@ -import connectMongoDb from "../../../../utils/dbConnection"; +import connectMongoDb from "../../../utils/dbConnection"; import User from "../../../../models/userModel"; import { NextResponse } from "next/server"; import bcrypt from "bcrypt"; diff --git a/src/app/api/updateRoom/[roomCode]/route.ts b/src/app/api/updateRoom/[roomCode]/route.ts new file mode 100644 index 0000000..1631570 --- /dev/null +++ b/src/app/api/updateRoom/[roomCode]/route.ts @@ -0,0 +1,33 @@ +import { NextResponse } from "next/server"; +import connectMongoDb from "../../../../utils/dbConnection"; +import Game from "../../../../../models/gameModel"; + +export async function PATCH( + req: Request, + { params }: { params: JoinRoomApiParams } +) { + console.log("Update room Api is called") + const { roomCode } = params; + const game = await req.json(); + console.log({game}, roomCode); + await connectMongoDb(); + try { + const room = await Game.findOneAndUpdate( + { roomCode }, + { $set: { ...game } }, + { new: true } + ); + + return NextResponse.json({ message: "Game Updated", data: room, status: true }, { status: 200 }); + } catch (error) { + if (error instanceof Error) + return NextResponse.json( + { + message: `Error while Joining Room: ${error.message} `, + status: false, + }, + { status: 500 } + ); + } + return null; +} diff --git a/src/app/api/user/[email]/route.ts b/src/app/api/user/[email]/route.ts index 45ae06c..dce8c1b 100644 --- a/src/app/api/user/[email]/route.ts +++ b/src/app/api/user/[email]/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from "next/server"; import User from "../../../../../models/userModel"; -import connectMongoDb from "../../../../../utils/dbConnection"; +import connectMongoDb from "../../../../utils/dbConnection"; import { cookies } from "next/headers"; export async function GET( diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2d0537c..7b37ce5 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -21,6 +21,7 @@ export default async function RootLayout({
+
{children} diff --git a/src/app/page.tsx b/src/app/page.tsx index 31e550c..3284f8b 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,4 +1,3 @@ -import ProfileModal from "@/components/profileModal/profileModal"; import { user } from "@/constants/apiUrl"; import { Session, getServerSession } from "next-auth"; import { redirect } from "next/navigation"; @@ -10,6 +9,7 @@ import lose from "./../../assets/lose.png"; import draw from "./../../assets/draw.png"; import StartGame from "@/components/startGame/startGame"; import DashboardHeader from "@/components/dashboardHeader/dashboardHeader"; +import ProfileModal from "@/modal/profileModal"; export default async function Dashboard() { const session: Session | null = await getServerSession(); diff --git a/src/app/room/[code]/page.tsx b/src/app/room/[roomCode]/page.tsx similarity index 72% rename from src/app/room/[code]/page.tsx rename to src/app/room/[roomCode]/page.tsx index 6baec87..3a678ea 100644 --- a/src/app/room/[code]/page.tsx +++ b/src/app/room/[roomCode]/page.tsx @@ -1,17 +1,25 @@ -// WIP import DashboardHeader from "@/components/dashboardHeader/dashboardHeader"; import GameBoard from "@/components/gameBoard/gameBoard"; import GameDetails from "@/components/gameDetails/gameDetails"; +import { getRoom } from "@/constants/apiUrl"; import { Session, getServerSession } from "next-auth"; import { redirect } from "next/navigation"; import React from "react"; -const Room = async () => { +const Room = async ({params}:{params:{roomCode:string}}) => { const session: Session | null = await getServerSession(); + const {roomCode} = params; if (!session) { redirect("/"); } - // console.log({session}) + + console.log("page renders") + + const room = await fetch(`${getRoom}/${roomCode}`) ; + const data = await room.json(); + const roomData = data?.data as Game; + + return (
@@ -19,10 +27,10 @@ const Room = async () => {
- +
- +
diff --git a/src/components/board/board.tsx b/src/components/board/board.tsx deleted file mode 100644 index cc1622c..0000000 --- a/src/components/board/board.tsx +++ /dev/null @@ -1,109 +0,0 @@ -'use client' -import React, { useState } from 'react' -import { XIcon } from '../xIcon/xIcon'; -import { OIcon } from '../oIcon/oIcon'; -// import { OIcon } from './OIcon' -// import { XIcon } from './XIcon' - -interface PlayerProp { - winner:string, - playerX: boolean, - squares: Array, - handlePlayer(i: number): void, - handleRestartGame(): void, -} - -interface SquareProp { - value: JSX.Element | string | null, - onClick(): void, -} - - - - -export const Board = ({ winner, playerX, handleRestartGame}: PlayerProp) => { - const [squares, setSqaures] = useState>(Array(9).fill(null)); - console.log({squares}) - const [isX, setIsX] = useState(true); - function handlePlayer(i: number) { - squares[i] = isX ? "X" : "O"; - setSqaures(squares); - setIsX(!isX); - } - - function Square({ value, onClick }: SquareProp) { - return ( - - ) - - } - - function value(i:number){ - let value; - if( squares[i] ==="X"){ - value= - }else if( squares[i] === "O"){ - value= - }else{ - value=null; - } - - return value; - - } - - const renderSquare = (i: number) => { - return handlePlayer(i)} /> - } - - return ( -
-
-
-
- {playerX - ? -
- - X - - {" "} - Turn -
- - : -
- - O - - {" "} - Turn -
- - } - -
-
-
- {renderSquare(0)} - {renderSquare(1)} - {renderSquare(2)} -
- -
- {renderSquare(3)} - {renderSquare(4)} - {renderSquare(5)} -
- -
- {renderSquare(6)} - {renderSquare(7)} - {renderSquare(8)} -
-
-
- ) -} \ No newline at end of file diff --git a/src/components/gameBoard/gameBoard.tsx b/src/components/gameBoard/gameBoard.tsx index d024f8e..fce94c9 100644 --- a/src/components/gameBoard/gameBoard.tsx +++ b/src/components/gameBoard/gameBoard.tsx @@ -1,10 +1,45 @@ -import React from 'react' -import { Board } from '../board/board' +'use client' +import React, { useContext, useEffect } from "react"; +import Squares from "../squares/squares"; +import Turn from "../turn/turn"; +import { GameContext } from "@/context/gameContext"; -const GameBoard = () => { +const GameBoard = ({ roomData }: { roomData: Game }) => { + const { game, setGame } = useContext(GameContext) as GameContextType; + + useEffect(()=>{ + setGame({ + ...roomData + }) + },[roomData]) + + // console.log({game},{roomData}) return ( - - ) -} +
+
+
+ +
+
+ {[0, 1, 2].map((i) => ( + + ))} +
+ +
+ {[3, 4, 5].map((i) => ( + + ))} +
+ +
+ {[6, 7, 8].map((i) => ( + + ))} +
+
+
+ ); +}; -export default GameBoard +export default React.memo(GameBoard); diff --git a/src/components/gameDetails/gameDetails.tsx b/src/components/gameDetails/gameDetails.tsx index 6a2f5b5..b30fed2 100644 --- a/src/components/gameDetails/gameDetails.tsx +++ b/src/components/gameDetails/gameDetails.tsx @@ -1,7 +1,20 @@ -import React from "react"; +"use client"; +import React, { useContext, useMemo } from "react"; import DashboardCard from "../dashboardCard/card"; +import { checkGameStatus } from "@/utils/checkGameStatus"; +import { checkOpponent } from "@/utils/checkOpponent"; +import { GameContext } from "@/context/gameContext"; +import { useSession } from "next-auth/react"; +import ReactConfetti from "@/modal/react-confetti"; +import ResultModal from "@/modal/resultModal"; + +const GameDetails = ({ roomData }: { roomData: Game }) => { + const { data: session, status: sessionStatus } = useSession(); + const { game } = useContext(GameContext) as GameContextType; + const status: string = useMemo(() => { + return checkGameStatus(game, session?.user?.email as string); + }, [game, session?.user?.email]); -const GameDetails = () => { return ( <> @@ -9,19 +22,35 @@ const GameDetails = () => {

Oppoenent:{" "} - Not Joined Yet - {" "} + {checkOpponent(game, session?.user?.email as string)} + +

+

+ Room Code:{" "} + + {roomData?.roomCode} +

Your Symbol:{" "} - X + + {(session?.user?.email as string) === + (game.playerXId as UserData).email + ? "X" + : "O"} +

Game Status:{" "} - Progress... + {status}

+ {(status === "You Won" || status === "You Lose") && ( + + + + )} ); }; diff --git a/src/components/squares/squares.tsx b/src/components/squares/squares.tsx new file mode 100644 index 0000000..8e8098e --- /dev/null +++ b/src/components/squares/squares.tsx @@ -0,0 +1,63 @@ +"use client"; +import React, { useContext } from "react"; +import { OIcon } from "../oIcon/oIcon"; +import { XIcon } from "../xIcon/xIcon"; +import { GameContext } from "@/context/gameContext"; +import { checkTurn } from "@/utils/checkCurrentTurn"; +import { useSession } from "next-auth/react"; +import { updateRoom } from "@/constants/apiUrl"; +import { checkWinner } from "@/utils/checkWinner"; +import { handleGameState } from "@/utils/handleGameState"; +import { handleGameEnd } from "@/utils/handleGameEnd"; + + +function Square({ value, i, session, roomData }: SquareProps) { + const { game, setGame } = useContext(GameContext) as GameContextType; + + +async function handlePlayer(index: number) { + const updatedBoard = [...game.board]; + updatedBoard[index] = game.turn === "X" ? "X" : "O"; + const updatedTurn = game.turn === "X" ? "O" : "X"; + + const winner = checkWinner(updatedBoard); + if (winner) { + handleGameEnd(game, setGame, updatedBoard, updatedTurn, winner); + return; + } + + handleGameState(game, setGame, updatedBoard, updatedTurn); +} + + return ( + + ); +} + + + + +const Squares = ({ i, roomData }: SquaresProps) => { + const { game } = useContext(GameContext) as GameContextType; + const { data: session } = useSession(); + + const value = + game.board[i] === "X" ? : game.board[i] === "O" ? : null; + + return ( + + ); +}; + +export default Squares; diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index 47aee99..8d23d0e 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -5,15 +5,18 @@ import LoadingButton from "../loadingButton/loadingButton"; import Input from "../input/input"; import { joinRoom, room } from "@/constants/apiUrl"; import { GameContext } from "@/context/gameContext"; +import ToastConainer from "../toastConainer"; +import { showErrorToast } from "../../utils/toast"; const StartGame = ({ userData }: { userData: UserResponseData }) => { const { game, setGame } = useContext(GameContext) as GameContextType; - console.log(game); + const [loading, setLoading] = useState({ createRoom: false, joinRoom: false, }); const [joinRoomCode, setJoinRoomCode] = useState(""); + const handleChange = ( e: React.ChangeEvent ) => { @@ -23,49 +26,48 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { const createRoom = async () => { setLoading({ ...loading, createRoom: true }); - - const customRoomCode = Math.random().toString().substring(2, 8); - - setGame({ - ...game, - roomCode: customRoomCode, - playerXId: userData.data._id, - }); - + try { - console.log({ game }); + const customRoomCode = Math.random().toString().substring(2, 8); + + const newGame = { + roomCode: customRoomCode, + playerXId: userData.data._id, + }; + const res = await fetch(room, { method: "POST", headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ - game: { - ...game, - roomCode: customRoomCode, - playerXId: userData.data._id, - }, - }), + body: JSON.stringify({ game: newGame }), }); + const data = await res.json(); if (res.ok) { router.push(`/room/${customRoomCode}`); } else { + showErrorToast(data.message); setLoading({ ...loading, createRoom: false }); - throw new Error("Failed to create account"); + throw new Error("Failed to create room"); } - } catch (error: unknown) { + } catch (error) { + setLoading({ ...loading, createRoom: false }); if (error instanceof Error) { - setLoading({ ...loading, createRoom: false }); - console.error("Error creating account:", error?.message); + console.error("Error creating room:", error.message); } } }; + const handleJoinRoom = async () => { if (joinRoomCode && joinRoomCode.length === 6) { setLoading({ ...loading, joinRoom: true }); - + setGame({ + ...game, + status: true, + playerOId: userData.data._id, + }); try { const res = await fetch(`${joinRoom}/${joinRoomCode}`, { method: "PATCH", @@ -78,15 +80,18 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { }), }); - const resD = await res.json(); + const data = await res.json(); if (res.ok) { router.push(`/room/${joinRoomCode}`); } + showErrorToast(data.message); setLoading({ ...loading, joinRoom: false }); - console.log({ resD }); + console.log({ data }); } catch (error) { setLoading({ ...loading, joinRoom: false }); - console.error(error); + if (error instanceof Error) { + console.error(error.message); + } } } }; @@ -103,7 +108,7 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => {
-
+
{
+ ); }; diff --git a/src/components/toastConainer.tsx b/src/components/toastConainer.tsx new file mode 100644 index 0000000..89377da --- /dev/null +++ b/src/components/toastConainer.tsx @@ -0,0 +1,24 @@ +import React from "react"; +import { Bounce, ToastContainer } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; + +const ToastConainer = () => { + return ( + + ); +}; + +export default ToastConainer; diff --git a/src/components/turn/turn.tsx b/src/components/turn/turn.tsx new file mode 100644 index 0000000..ff64ab4 --- /dev/null +++ b/src/components/turn/turn.tsx @@ -0,0 +1,24 @@ +"use client" +import { GameContext } from '@/context/gameContext' +import React, { useContext } from 'react' + +const Turn = () => { + const{game} = useContext(GameContext) as GameContextType; + return ( +
+ {game.turn === "X" ? ( +
+ X{" "} + Turn +
+ ) : ( +
+ O{" "} + Turn +
+ )} +
+ ) +} + +export default React.memo(Turn) diff --git a/src/constants/apiUrl.ts b/src/constants/apiUrl.ts index d7296a2..b1ac4ad 100644 --- a/src/constants/apiUrl.ts +++ b/src/constants/apiUrl.ts @@ -6,4 +6,8 @@ export const user = `${process.env.NEXT_PUBLIC_BASE_URL}/api/user` export const room = `${process.env.NEXT_PUBLIC_BASE_URL}/api/createRoom` -export const joinRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/joinRoom` \ No newline at end of file +export const joinRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/joinRoom` + +export const getRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/getRoom` + +export const updateRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/updateRoom` \ No newline at end of file diff --git a/src/constants/winningPatterns.ts b/src/constants/winningPatterns.ts new file mode 100644 index 0000000..70458ce --- /dev/null +++ b/src/constants/winningPatterns.ts @@ -0,0 +1,10 @@ +export const winningPatterns = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6] +] \ No newline at end of file diff --git a/src/context/gameContext.tsx b/src/context/gameContext.tsx index ecda74c..1540d59 100644 --- a/src/context/gameContext.tsx +++ b/src/context/gameContext.tsx @@ -7,8 +7,8 @@ const GameContextProvider = ({ children }: { children: React.ReactNode }) => { const [game, setGame] = useState({ roomCode: "", playerXId: "", - turn: "", - board: ["", "", "", "", "", "", "", "", ""], + turn: "X", + board: Array(9).fill(null), winner: "", status: false, leftGame: { playerX: false, playerO: false }, diff --git a/src/hooks/useWindowSize.ts b/src/hooks/useWindowSize.ts new file mode 100644 index 0000000..2dd1b26 --- /dev/null +++ b/src/hooks/useWindowSize.ts @@ -0,0 +1,22 @@ +import React, { useEffect, useState } from "react"; +export const useWindowSize = () => { + const [windowSize, setWindowSize] = useState({ + width: undefined, + height: undefined, + }); + + useEffect(() => { + const handleResize = () => + setWindowSize({ width: window.innerWidth, height: window.innerHeight }); + + window.addEventListener('resize', handleResize); + + handleResize(); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }, []); + + return windowSize; + }; \ No newline at end of file diff --git a/src/components/profileModal/profileModal.tsx b/src/modal/profileModal.tsx similarity index 90% rename from src/components/profileModal/profileModal.tsx rename to src/modal/profileModal.tsx index c50137c..0562f38 100644 --- a/src/components/profileModal/profileModal.tsx +++ b/src/modal/profileModal.tsx @@ -1,10 +1,10 @@ "use client"; import { useState } from "react"; import Image from "next/image"; -import profileImage from "../../../assets/profileIcon.svg"; -import whiteBgProfileIcon from '../../../assets/whiteBgProfileIcon.svg' +import profileImage from "../../assets/profileIcon.svg"; +import whiteBgProfileIcon from '../../assets/whiteBgProfileIcon.svg' import { signOut } from "next-auth/react"; -import PortalProvider from "../portalProvider/portalProvider"; +import PortalProvider from "../components/portalProvider/portalProvider"; const ProfileModal = () => { const [openModal, setOpenModal] = useState(false); diff --git a/src/modal/react-confetti.tsx b/src/modal/react-confetti.tsx new file mode 100644 index 0000000..038c3e9 --- /dev/null +++ b/src/modal/react-confetti.tsx @@ -0,0 +1,32 @@ +import React from "react"; +import Confetti from "react-confetti"; +import { useWindowSize } from "@/hooks/useWindowSize"; + +interface ReactConfettiProps { + children?: React.ReactNode; + status:string; +} + +const ReactConfetti: React.FC = ({ status, children }) => { + const { width, height } = useWindowSize(); + + return ( +
+ {status==="You Won" && } + {children} +
+ ); +}; + +export default ReactConfetti; diff --git a/src/modal/resultModal.tsx b/src/modal/resultModal.tsx new file mode 100644 index 0000000..1c0bf70 --- /dev/null +++ b/src/modal/resultModal.tsx @@ -0,0 +1,48 @@ +"use client"; +import PortalProvider from "@/components/portalProvider/portalProvider"; +import React, { useState } from "react"; + +const ResultModal = ({ status }: { status: string }) => { + const [showModal, setShowModal] = useState(true); + + const closeModal = () => { + setShowModal(false); + }; + + return ( + + {showModal && ( + <> + +
+
+

{status}

+
+ +
+ +
+
+ + )} +
+ ); +}; + +export default ResultModal; diff --git a/src/types/types.ts b/src/types/types.ts index 26b7460..daaa711 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,8 +1,7 @@ - interface FormHeaderProps { heading: string; paragraph: string; - linkActions: Array<{title:string; url:string}> + linkActions: Array<{ title: string; url: string }>; } interface LoginFields { @@ -16,52 +15,55 @@ interface LoginFields { placeholder: string; } -interface ApiResponse{ - message:string, - status: boolean | string +interface ApiResponse { + message: string; + status: boolean | string; } -interface FormActionsProps{ - apiResponse: ApiResponse - handleSubmit:(e:React.FormEvent)=>void, - loading: boolean, - buttonType:string, - text:string +interface FormActionsProps { + apiResponse: ApiResponse; + handleSubmit: (e: React.FormEvent) => void; + loading: boolean; + buttonType: string; + text: string; } - interface InputProps extends LoginFields { - handleChange: (e:React.ChangeEvent) => void; + handleChange: ( + e: React.ChangeEvent + ) => void; value: string; customClass: string; } interface UserSchema { - name: string, - email:string, - password:string, + name: string; + email: string; + password: string; } -interface Credentials{ - email:string, - password: string, - redirect: string, - csrfToken: string, - callbackUrl: string, - json: string +interface Credentials { + email: string; + password: string; + redirect: string; + csrfToken: string; + callbackUrl: string; + json: string; } +interface UserData { + _id: string; + name: string; + email: string; + password: string; + createdAt: string; + updatedAt: string; + __v: number; +}; + interface UserResponseData { message: string; - data: { - _id: string; - name: string; - email: string; - password: string; - createdAt: string; - updatedAt: string; - __v: number; - }; + data: UserData status: boolean; existingUser: boolean; } @@ -70,10 +72,10 @@ interface PortalInterface { children: React.ReactNode; show?: boolean; selector: string; -}; +} interface DashboardHeader { - headerMessage : string; + headerMessage: string; } interface GameSchema { @@ -88,24 +90,48 @@ interface GameSchema { }; } -interface Game{ +interface Game { roomCode: string; - playerXId: string; + playerXId: UserData | string; turn: string; board: string[]; winner: string; status: boolean; leftGame: { - playerX: boolean; - playerO: boolean; + playerX: boolean; + playerO: boolean; }; + playerOId?: UserData | string; } -interface GameContextType{ +interface GameContextType { game: Game; - setGame: (game: Game)=>void + setGame: (game: Game) => void; } -interface JoinRoomApiParams{ +interface JoinRoomApiParams { roomCode: string; +} + +interface Session { + name?: string | null | undefined; + email?: string | null | undefined; + image?: string | null | undefined; +} + +interface SquaresProps { + i: number; + roomData: Game; +} + +interface SquareProps { + value: JSX.Element | null; + i: number; + session: Session | undefined; + roomData: Game; +} + +interface WindowSize { + width: number | undefined; + height: number | undefined; } \ No newline at end of file diff --git a/src/utils/checkCurrentTurn.ts b/src/utils/checkCurrentTurn.ts new file mode 100644 index 0000000..42dd8d4 --- /dev/null +++ b/src/utils/checkCurrentTurn.ts @@ -0,0 +1,24 @@ +export const checkTurn = ( + game: Game, + session: Session | undefined, + i: number, +) => { + if (!game.winner && + game.status && + game.board[i] === "" && + game.turn === "X" && + (game.playerXId as UserData).email === session!.email + ) { + return false; + } else if ( + !game.winner && + game.status && + game.board[i] === "" && + game.turn === "O" && + (game.playerOId as UserData).email === session!.email + ) { + return false; + } else { + return true; + } +}; diff --git a/src/utils/checkGameStatus.ts b/src/utils/checkGameStatus.ts new file mode 100644 index 0000000..89366d3 --- /dev/null +++ b/src/utils/checkGameStatus.ts @@ -0,0 +1,16 @@ +export const checkGameStatus = (roomData: Game, userEmail: string | undefined): string => { + if (!roomData) return "Not Started"; + + return roomData.winner + ? roomData.winner === "X" + ? (roomData.playerXId as UserData).email === userEmail + ? "You Won" + : "You Lose" + :(roomData.playerOId as UserData).email === userEmail + ? "You Won" + : "You Lose" + : roomData.status + ? "In Progress..." + : "Not Started"; + }; + \ No newline at end of file diff --git a/src/utils/checkOpponent.ts b/src/utils/checkOpponent.ts new file mode 100644 index 0000000..ae1ca7f --- /dev/null +++ b/src/utils/checkOpponent.ts @@ -0,0 +1,7 @@ +export const checkOpponent = (roomData: Game, userEmail: string): string => { + return roomData?.status + ? userEmail === (roomData.playerXId as UserData).email + ? (roomData?.playerOId as UserData).name + : (roomData.playerXId as UserData).name + : "Not Joined Yet"; +} diff --git a/src/utils/checkWinner.ts b/src/utils/checkWinner.ts new file mode 100644 index 0000000..86d03c2 --- /dev/null +++ b/src/utils/checkWinner.ts @@ -0,0 +1,18 @@ +export const checkWinner = (board) => { + + const winningCombos = [ + [0, 1, 2], [3, 4, 5], [6, 7, 8], + [0, 3, 6], [1, 4, 7], [2, 5, 8], + [0, 4, 8], [2, 4, 6] + ]; + + for (let combo of winningCombos) { + const [a, b, c] = combo; + if (board[a] && board[a] === board[b] && board[a] === board[c]) { + return board[a]; + } + } + + return null; + } + \ No newline at end of file diff --git a/utils/dbConnection.ts b/src/utils/dbConnection.ts similarity index 100% rename from utils/dbConnection.ts rename to src/utils/dbConnection.ts diff --git a/src/utils/handleGameEnd.ts b/src/utils/handleGameEnd.ts new file mode 100644 index 0000000..3e8ebb6 --- /dev/null +++ b/src/utils/handleGameEnd.ts @@ -0,0 +1,33 @@ +import { updateRoom } from "@/constants/apiUrl"; + +export async function handleGameEnd(game:Game, setGame: (game:Game)=>void, updatedBoard: string[], updatedTurn: string, winner: string) { + console.log("Handle Game End") + setGame({ + ...game, + board: updatedBoard, + turn: updatedTurn, + winner: winner, + }); + + try { + console.log("Update room API called"); + const res = await fetch(`${updateRoom}/${game?.roomCode}`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + board: updatedBoard, + turn: updatedTurn, + winner: winner, + }), + }); + if (!res.ok) { + console.error("Failed to update game state in API:", res.status); + } + } catch (error) { + if(error instanceof Error){ + console.error("Error updating game state in API:", error.message); + } + } + } \ No newline at end of file diff --git a/src/utils/handleGameState.ts b/src/utils/handleGameState.ts new file mode 100644 index 0000000..7802871 --- /dev/null +++ b/src/utils/handleGameState.ts @@ -0,0 +1,32 @@ +import { updateRoom } from "@/constants/apiUrl"; + +export async function handleGameState(game:Game, setGame: (game: Game) => void, updatedBoard: string[], updatedTurn: string) { + setGame({ + ...game, + board: updatedBoard, + turn: updatedTurn, + }); + + try { + console.log("Update room API called"); + const res = await fetch(`${updateRoom}/${game?.roomCode}`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + board: updatedBoard, + turn: updatedTurn, + winner: null, + status: true, + }), + }); + if (!res.ok) { + console.error("Failed to update game state in API:", res.status); + } + } catch (error) { + if(error instanceof Error){ + console.error("Error updating game state in API:", error?.message); + } + } + } \ No newline at end of file diff --git a/src/utils/toast.ts b/src/utils/toast.ts new file mode 100644 index 0000000..b2d73d9 --- /dev/null +++ b/src/utils/toast.ts @@ -0,0 +1,16 @@ +import { Bounce, toast } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; + +export const showErrorToast = (message: string) => { + toast.error(message, { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); +}; diff --git a/utils/code.ts b/utils/code.ts deleted file mode 100644 index e69de29..0000000 diff --git a/yarn.lock b/yarn.lock index 27b5dbb..7f9cc86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,36 +4,36 @@ "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2": version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz" integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== dependencies: regenerator-runtime "^0.14.0" "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -48,12 +48,12 @@ "@eslint/js@8.56.0": version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz" integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== "@humanwhocodes/config-array@^0.11.13": version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: "@humanwhocodes/object-schema" "^2.0.2" @@ -62,17 +62,17 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^2.0.2": version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz" integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -84,7 +84,7 @@ "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -93,22 +93,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.9": version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz" integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -116,7 +116,7 @@ "@mapbox/node-pre-gyp@^1.0.11": version "1.0.11" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz" integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== dependencies: detect-libc "^2.0.0" @@ -131,19 +131,19 @@ "@mongodb-js/saslprep@^1.1.0": version "1.1.4" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz#24ec1c4915a65f5c506bb88c081731450d91bb1c" + resolved "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz" integrity sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw== dependencies: sparse-bitfield "^3.0.3" "@next/env@14.1.0": version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341" + resolved "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz" integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw== "@next/eslint-plugin-next@14.1.0": version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz#29b041233fac7417e22eefa4146432d5cd910820" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.0.tgz" integrity sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q== dependencies: glob "10.3.10" @@ -170,12 +170,12 @@ "@next/swc-linux-x64-gnu@14.1.0": version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz#18967f100ec19938354332dcb0268393cbacf581" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz" integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ== "@next/swc-linux-x64-musl@14.1.0": version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz#77077cd4ba8dda8f349dc7ceb6230e68ee3293cf" + resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz" integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== "@next/swc-win32-arm64-msvc@14.1.0": @@ -195,7 +195,7 @@ "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -203,12 +203,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -216,67 +216,67 @@ "@panva/hkdf@^1.0.2": version "1.1.1" - resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.1.1.tgz#ab9cd8755d1976e72fc77a00f7655a64efe6cd5d" + resolved "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz" integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA== "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@rushstack/eslint-patch@^1.3.3": version "1.7.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz#2d4260033e199b3032a08b41348ac10de21c47e9" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz" integrity sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA== "@swc/helpers@0.5.2": version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz" integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== dependencies: tslib "^2.4.0" "@types/bcrypt@^5.0.2": version "5.0.2" - resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-5.0.2.tgz#22fddc11945ea4fbc3655b3e8b8847cc9f811477" + resolved "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz" integrity sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ== dependencies: "@types/node" "*" "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/mongoose@^5.11.97": version "5.11.97" - resolved "https://registry.yarnpkg.com/@types/mongoose/-/mongoose-5.11.97.tgz#80b0357f3de6807eb597262f52e49c3e13ee14d8" + resolved "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz" integrity sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q== dependencies: mongoose "*" "@types/node@*", "@types/node@^20": version "20.11.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.13.tgz#188263ee2c8d590e181d3f5bfa7e485a932957cb" + resolved "https://registry.npmjs.org/@types/node/-/node-20.11.13.tgz" integrity sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg== dependencies: undici-types "~5.26.4" "@types/prop-types@*": version "15.7.11" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== "@types/react-dom@^18": version "18.2.18" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.18.tgz#16946e6cd43971256d874bc3d0a72074bb8571dd" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz" integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18": version "18.2.48" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.48.tgz#11df5664642d0bd879c1f58bc1d37205b064e8f1" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz" integrity sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w== dependencies: "@types/prop-types" "*" @@ -285,24 +285,24 @@ "@types/scheduler@*": version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== "@types/webidl-conversions@*": version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" + resolved "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz" integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== "@types/whatwg-url@^11.0.2": version "11.0.4" - resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.4.tgz#ffed0dc8d89d91f62e3f368fcbda222a487c4f63" + resolved "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz" integrity sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw== dependencies: "@types/webidl-conversions" "*" "@typescript-eslint/parser@^5.4.2 || ^6.0.0": version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.20.0.tgz#17e314177304bdf498527e3c4b112e41287b7416" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.20.0.tgz" integrity sha512-bYerPDF/H5v6V76MdMYhjwmwgMA+jlPVqjSDq2cRqMi8bP5sR3Z+RLOiOMad3nsnmDVmn2gAFCyNgh/dIrfP/w== dependencies: "@typescript-eslint/scope-manager" "6.20.0" @@ -313,7 +313,7 @@ "@typescript-eslint/scope-manager@6.20.0": version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz#8a926e60f6c47feb5bab878246dc2ae465730151" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz" integrity sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA== dependencies: "@typescript-eslint/types" "6.20.0" @@ -321,12 +321,12 @@ "@typescript-eslint/types@6.20.0": version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.20.0.tgz#5ccd74c29011ae7714ae6973e4ec0c634708b448" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz" integrity sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ== "@typescript-eslint/typescript-estree@6.20.0": version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz#5b2d0975949e6bdd8d45ee1471461ef5fadc5542" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz" integrity sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g== dependencies: "@typescript-eslint/types" "6.20.0" @@ -340,7 +340,7 @@ "@typescript-eslint/visitor-keys@6.20.0": version "6.20.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz#f7ada27f2803de89df0edd9fd7be22c05ce6a498" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz" integrity sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw== dependencies: "@typescript-eslint/types" "6.20.0" @@ -348,34 +348,34 @@ "@ungap/structured-clone@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== abbrev@1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -385,34 +385,34 @@ ajv@^6.12.4: ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -420,12 +420,12 @@ anymatch@~3.1.2: "aproba@^1.0.3 || ^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== are-we-there-yet@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== dependencies: delegates "^1.0.0" @@ -433,24 +433,24 @@ are-we-there-yet@^2.0.0: arg@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-query@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" array-buffer-byte-length@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== dependencies: call-bind "^1.0.2" @@ -458,7 +458,7 @@ array-buffer-byte-length@^1.0.0: array-includes@^3.1.6, array-includes@^3.1.7: version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz" integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" @@ -469,12 +469,12 @@ array-includes@^3.1.6, array-includes@^3.1.7: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.findlastindex@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz" integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== dependencies: call-bind "^1.0.2" @@ -485,7 +485,7 @@ array.prototype.findlastindex@^1.2.3: array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" @@ -495,7 +495,7 @@ array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" @@ -505,7 +505,7 @@ array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: array.prototype.tosorted@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz" integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== dependencies: call-bind "^1.0.2" @@ -516,7 +516,7 @@ array.prototype.tosorted@^1.1.1: arraybuffer.prototype.slice@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz" integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: array-buffer-byte-length "^1.0.0" @@ -529,19 +529,19 @@ arraybuffer.prototype.slice@^1.0.2: ast-types-flow@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== asynciterator.prototype@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + resolved "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz" integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== dependencies: has-symbols "^1.0.3" autoprefixer@^10.0.1: version "10.4.17" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.17.tgz#35cd5695cbbe82f536a50fa025d561b01fdec8be" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz" integrity sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg== dependencies: browserslist "^4.22.2" @@ -553,29 +553,29 @@ autoprefixer@^10.0.1: available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axe-core@=4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== axobject-query@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== dependencies: dequal "^2.0.3" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bcrypt@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.1.1.tgz#0f732c6dcb4e12e5b70a25e326a72965879ba6e2" + resolved "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz" integrity sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww== dependencies: "@mapbox/node-pre-gyp" "^1.0.11" @@ -583,12 +583,12 @@ bcrypt@^5.1.1: binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -596,21 +596,21 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browserslist@^4.22.2: version "4.22.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz" integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== dependencies: caniuse-lite "^1.0.30001580" @@ -620,19 +620,19 @@ browserslist@^4.22.2: bson@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.2.0.tgz#4b6acafc266ba18eeee111373c2699304a9ba0a3" + resolved "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz" integrity sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q== busboy@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz" integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: function-bind "^1.1.2" @@ -641,22 +641,22 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001578, caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001580: version "1.0.30001581" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz#0dfd4db9e94edbdca67d57348ebc070dece279f4" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001581.tgz" integrity sha512-whlTkwhqV2tUmP3oYhtNfaWGYHDdS3JYFQBKXxcUR9qqPWsRhFHhoISO2Xnl/g0xyKzht9mI1LZpiNWfMzHixQ== chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -664,7 +664,7 @@ chalk@^4.0.0: chokidar@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -679,54 +679,59 @@ chokidar@^3.5.3: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== client-only@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +clsx@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-support@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== commander@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== cookie@^0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -735,41 +740,41 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== debug@4, debug@4.x, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== define-data-property@^1.0.1, define-data-property@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz" integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" @@ -778,7 +783,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.1: define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -787,73 +792,73 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detect-libc@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dlv@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.648: version "1.4.651" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz#ef1e822233c6fc953df3caf943f78c21b254a080" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.651.tgz" integrity sha512-jjks7Xx+4I7dslwsbaFocSwqBbGHQmuXBJUK9QBZTIrzPq3pzn6Uf2szFSP728FtLYE3ldiccmlkOM/zhGKCpA== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== enhanced-resolve@^5.12.0: version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" @@ -861,7 +866,7 @@ enhanced-resolve@^5.12.0: es-abstract@^1.22.1: version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz" integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== dependencies: array-buffer-byte-length "^1.0.0" @@ -906,7 +911,7 @@ es-abstract@^1.22.1: es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: version "1.0.15" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz" integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== dependencies: asynciterator.prototype "^1.0.0" @@ -926,7 +931,7 @@ es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: es-set-tostringtag@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz" integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== dependencies: get-intrinsic "^1.2.2" @@ -935,14 +940,14 @@ es-set-tostringtag@^2.0.1: es-shim-unscopables@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -951,17 +956,17 @@ es-to-primitive@^1.2.1: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-config-next@14.1.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.0.tgz#7e309d426b8afacaba3b32fdbb02ba220b6d0a97" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.0.tgz" integrity sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg== dependencies: "@next/eslint-plugin-next" "14.1.0" @@ -976,7 +981,7 @@ eslint-config-next@14.1.0: eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -985,7 +990,7 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: eslint-import-resolver-typescript@^3.5.2: version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz" integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== dependencies: debug "^4.3.4" @@ -998,14 +1003,14 @@ eslint-import-resolver-typescript@^3.5.2: eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" eslint-plugin-import@^2.28.1: version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: array-includes "^3.1.7" @@ -1028,7 +1033,7 @@ eslint-plugin-import@^2.28.1: eslint-plugin-jsx-a11y@^6.7.1: version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz" integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== dependencies: "@babel/runtime" "^7.23.2" @@ -1050,12 +1055,12 @@ eslint-plugin-jsx-a11y@^6.7.1: "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.33.2: version "7.33.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz" integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" @@ -1077,7 +1082,7 @@ eslint-plugin-react@^7.33.2: eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -1085,12 +1090,12 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8: version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz" integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1134,7 +1139,7 @@ eslint@^8: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -1143,36 +1148,36 @@ espree@^9.6.0, espree@^9.6.1: esquery@^1.4.2: version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1183,38 +1188,38 @@ fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.0.tgz#ca5e1a90b5e68f97fc8b61330d5819b82f5fab03" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz" integrity sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w== dependencies: reusify "^1.0.4" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1222,7 +1227,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -1231,19 +1236,19 @@ flat-cache@^3.0.4: flatted@^3.2.9: version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" foreground-child@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== dependencies: cross-spawn "^7.0.0" @@ -1251,19 +1256,19 @@ foreground-child@^3.1.0: fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: @@ -1273,12 +1278,12 @@ fsevents@~2.3.2: function-bind@^1.1.1, function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" @@ -1288,12 +1293,12 @@ function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gauge@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== dependencies: aproba "^1.0.3 || ^2.0.0" @@ -1308,7 +1313,7 @@ gauge@^3.0.0: get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz" integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: function-bind "^1.1.2" @@ -1318,7 +1323,7 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -1326,28 +1331,28 @@ get-symbol-description@^1.0.0: get-tsconfig@^4.5.0: version "4.7.2" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz" integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== dependencies: resolve-pkg-maps "^1.0.0" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@10.3.10, glob@^10.3.10: version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: foreground-child "^3.1.0" @@ -1358,7 +1363,7 @@ glob@10.3.10, glob@^10.3.10: glob@^7.1.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -1370,21 +1375,21 @@ glob@^7.1.3: globals@^13.19.0: version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -1396,70 +1401,70 @@ globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" graceful-fs@^4.2.11, graceful-fs@^4.2.4: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz" integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: get-intrinsic "^1.2.2" has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" has-unicode@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== hasown@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz" integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: function-bind "^1.1.2" https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -1467,12 +1472,12 @@ https-proxy-agent@^5.0.0: ignore@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz" integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -1480,12 +1485,12 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -1493,12 +1498,12 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== internal-slot@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz" integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== dependencies: get-intrinsic "^1.2.2" @@ -1507,7 +1512,7 @@ internal-slot@^1.0.5: is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" @@ -1516,28 +1521,28 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: is-async-function@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== dependencies: has-tostringtag "^1.0.0" is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -1545,84 +1550,84 @@ is-boolean-object@^1.1.0: is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== dependencies: call-bind "^1.0.2" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-map@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== is-negative-zero@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -1630,52 +1635,52 @@ is-regex@^1.1.4: is-set@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: which-typed-array "^1.1.11" is-weakmap@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-weakset@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== dependencies: call-bind "^1.0.2" @@ -1683,17 +1688,17 @@ is-weakset@^2.0.1: isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== iterator.prototype@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: define-properties "^1.2.1" @@ -1704,7 +1709,7 @@ iterator.prototype@^1.1.2: jackspeak@^2.3.5: version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" @@ -1713,51 +1718,51 @@ jackspeak@^2.3.5: jiti@^1.19.1: version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== jose@^4.11.4, jose@^4.15.4: version "4.15.4" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.4.tgz#02a9a763803e3872cf55f29ecef0dfdcc218cc03" + resolved "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz" integrity sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ== "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" @@ -1767,31 +1772,31 @@ json5@^1.0.2: kareem@2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.5.1.tgz#7b8203e11819a8e77a34b3517d3ead206764d15d" + resolved "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz" integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" language-subtag-registry@^0.3.20: version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: language-subtag-registry "^0.3.20" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -1799,70 +1804,70 @@ levn@^0.4.1: lilconfig@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lilconfig@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz" integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" "lru-cache@^9.1.1 || ^10.0.0": version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== make-dir@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" memory-pager@^1.0.2: version "1.5.0" - resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + resolved "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz" integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -1870,43 +1875,43 @@ micromatch@^4.0.4, micromatch@^4.0.5: minimatch@9.0.3, minimatch@^9.0.1: version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass@^3.0.0: version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" minipass@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -1914,12 +1919,12 @@ minizlib@^2.1.1: mkdirp@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mongodb-connection-string-url@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz#b4f87f92fd8593f3b9365f592515a06d304a1e9c" + resolved "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz" integrity sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ== dependencies: "@types/whatwg-url" "^11.0.2" @@ -1927,7 +1932,7 @@ mongodb-connection-string-url@^3.0.0: mongodb@6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.3.0.tgz#ec9993b19f7ed2ea715b903fcac6171c9d1d38ca" + resolved "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz" integrity sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA== dependencies: "@mongodb-js/saslprep" "^1.1.0" @@ -1936,7 +1941,7 @@ mongodb@6.3.0: mongoose@*, mongoose@^8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.1.1.tgz#2ea2dcdcf4943196f585b3915f63001e79214e1b" + resolved "https://registry.npmjs.org/mongoose/-/mongoose-8.1.1.tgz" integrity sha512-DbLb0NsiEXmaqLOpEz+AtAsgwhRw6f25gwa1dF5R7jj6lS1D8X6uTdhBSC8GDVtOwe5Tfw2EL7nTn6hiJT3Bgg== dependencies: bson "^6.2.0" @@ -1949,29 +1954,29 @@ mongoose@*, mongoose@^8.1.1: mpath@0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" + resolved "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz" integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== mquery@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/mquery/-/mquery-5.0.0.tgz#a95be5dfc610b23862df34a47d3e5d60e110695d" + resolved "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz" integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== dependencies: debug "4.x" ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3, ms@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mz@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -1980,17 +1985,17 @@ mz@^2.7.0: nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== next-auth@^4.24.5: version "4.24.5" - resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.24.5.tgz#1fd1bfc0603c61fd2ba6fd81b976af690edbf07e" + resolved "https://registry.npmjs.org/next-auth/-/next-auth-4.24.5.tgz" integrity sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og== dependencies: "@babel/runtime" "^7.20.13" @@ -2005,7 +2010,7 @@ next-auth@^4.24.5: next@14.1.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69" + resolved "https://registry.npmjs.org/next/-/next-14.1.0.tgz" integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== dependencies: "@next/env" "14.1.0" @@ -2028,41 +2033,41 @@ next@14.1.0: node-addon-api@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== node-fetch@^2.6.7: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-releases@^2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== nopt@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== npmlog@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== dependencies: are-we-there-yet "^2.0.0" @@ -2072,37 +2077,37 @@ npmlog@^5.0.1: oauth@^0.9.15: version "0.9.15" - resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" + resolved "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz" integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.13.1, object-inspect@^1.9.0: version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.4: version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: call-bind "^1.0.5" @@ -2112,7 +2117,7 @@ object.assign@^4.1.4: object.entries@^1.1.6, object.entries@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz" integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== dependencies: call-bind "^1.0.2" @@ -2121,7 +2126,7 @@ object.entries@^1.1.6, object.entries@^1.1.7: object.fromentries@^2.0.6, object.fromentries@^2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz" integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" @@ -2130,7 +2135,7 @@ object.fromentries@^2.0.6, object.fromentries@^2.0.7: object.groupby@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz" integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== dependencies: call-bind "^1.0.2" @@ -2140,7 +2145,7 @@ object.groupby@^1.0.1: object.hasown@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz" integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== dependencies: define-properties "^1.2.0" @@ -2148,7 +2153,7 @@ object.hasown@^1.1.2: object.values@^1.1.6, object.values@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz" integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" @@ -2157,19 +2162,19 @@ object.values@^1.1.6, object.values@^1.1.7: oidc-token-hash@^5.0.3: version "5.0.3" - resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" + resolved "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz" integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" openid-client@^5.4.0: version "5.6.4" - resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.6.4.tgz#b2c25e6d5338ba3ce00e04341bb286798a196177" + resolved "https://registry.npmjs.org/openid-client/-/openid-client-5.6.4.tgz" integrity sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA== dependencies: jose "^4.15.4" @@ -2179,7 +2184,7 @@ openid-client@^5.4.0: optionator@^0.9.3: version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: "@aashutoshrathi/word-wrap" "^1.2.3" @@ -2191,48 +2196,48 @@ optionator@^0.9.3: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.10.1: version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz" integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== dependencies: lru-cache "^9.1.1 || ^10.0.0" @@ -2240,32 +2245,32 @@ path-scurry@^1.10.1: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -2274,14 +2279,14 @@ postcss-import@^15.1.0: postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" postcss-load-config@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: lilconfig "^3.0.0" @@ -2289,14 +2294,14 @@ postcss-load-config@^4.0.1: postcss-nested@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: postcss-selector-parser "^6.0.11" postcss-selector-parser@^6.0.11: version "6.0.15" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz" integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== dependencies: cssesc "^3.0.0" @@ -2304,12 +2309,12 @@ postcss-selector-parser@^6.0.11: postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@8.4.31: version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" @@ -2318,7 +2323,7 @@ postcss@8.4.31: postcss@^8, postcss@^8.4.23: version "8.4.33" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz" integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== dependencies: nanoid "^3.3.7" @@ -2327,29 +2332,29 @@ postcss@^8, postcss@^8.4.23: preact-render-to-string@^5.1.19: version "5.2.6" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604" + resolved "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz" integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw== dependencies: pretty-format "^3.8.0" preact@^10.6.3: version "10.19.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" + resolved "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz" integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== pretty-format@^3.8.0: version "3.8.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz" integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -2358,17 +2363,24 @@ prop-types@^15.8.1: punycode@^2.1.0, punycode@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +react-confetti@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz" + integrity sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw== + dependencies: + tween-functions "^1.2.0" + react-dom@^18: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" @@ -2376,31 +2388,38 @@ react-dom@^18: react-hook-form@^7.49.3: version "7.49.3" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.49.3.tgz#576a4567f8a774830812f4855e89f5da5830435c" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.3.tgz" integrity sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ== react-is@^16.13.1: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-toastify@^10.0.4: + version "10.0.4" + resolved "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.4.tgz" + integrity sha512-etR3RgueY8pe88SA67wLm8rJmL1h+CLqUGHuAoNsseW35oTGJEri6eBTyaXnFKNQ80v/eO10hBYLgz036XRGgA== + dependencies: + clsx "^2.1.0" + react@^18: version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -2409,14 +2428,14 @@ readable-stream@^3.6.0: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" reflect.getprototypeof@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz" integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== dependencies: call-bind "^1.0.2" @@ -2428,12 +2447,12 @@ reflect.getprototypeof@^1.0.4: regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz" integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" @@ -2442,17 +2461,17 @@ regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -2461,7 +2480,7 @@ resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: resolve@^2.0.0-next.4: version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: is-core-module "^2.13.0" @@ -2470,26 +2489,26 @@ resolve@^2.0.0-next.4: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" safe-array-concat@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz" integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== dependencies: call-bind "^1.0.5" @@ -2499,12 +2518,12 @@ safe-array-concat@^1.0.1: safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz" integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== dependencies: call-bind "^1.0.5" @@ -2513,31 +2532,31 @@ safe-regex-test@^1.0.0: scheduler@^0.23.0: version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" semver@^6.0.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.5, semver@^7.5.4: version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-function-length@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz" integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== dependencies: define-data-property "^1.1.1" @@ -2548,7 +2567,7 @@ set-function-length@^1.1.1: set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz" integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== dependencies: define-data-property "^1.0.1" @@ -2557,19 +2576,19 @@ set-function-name@^2.0.0, set-function-name@^2.0.1: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -2578,44 +2597,44 @@ side-channel@^1.0.4: sift@16.0.1: version "16.0.1" - resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" + resolved "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz" integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== signal-exit@^3.0.0: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== sparse-bitfield@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + resolved "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz" integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== dependencies: memory-pager "^1.0.2" streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -2624,7 +2643,7 @@ streamsearch@^1.1.0: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -2633,7 +2652,7 @@ string-width@^5.0.1, string-width@^5.1.2: string.prototype.matchall@^4.0.8: version "4.0.10" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz" integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: call-bind "^1.0.2" @@ -2648,7 +2667,7 @@ string.prototype.matchall@^4.0.8: string.prototype.trim@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz" integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" @@ -2657,7 +2676,7 @@ string.prototype.trim@^1.2.8: string.prototype.trimend@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz" integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" @@ -2666,7 +2685,7 @@ string.prototype.trimend@^1.0.7: string.prototype.trimstart@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz" integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" @@ -2675,45 +2694,45 @@ string.prototype.trimstart@^1.0.7: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== styled-jsx@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: client-only "0.0.1" sucrase@^3.32.0: version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -2726,19 +2745,19 @@ sucrase@^3.32.0: supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tailwindcss@^3.3.0: version "3.4.1" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.1.tgz#f512ca5d1dd4c9503c7d3d28a968f1ad8f5c839d" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz" integrity sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA== dependencies: "@alloc/quick-lru" "^5.2.0" @@ -2766,12 +2785,12 @@ tailwindcss@^3.3.0: tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.1.11: version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== dependencies: chownr "^2.0.0" @@ -2783,55 +2802,55 @@ tar@^6.1.11: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tr46@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + resolved "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz" integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== dependencies: punycode "^2.3.0" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== ts-api-utils@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== tsconfig-paths@^3.15.0: version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -2841,24 +2860,29 @@ tsconfig-paths@^3.15.0: tslib@^2.4.0: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tween-functions@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz" + integrity sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== typed-array-buffer@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== dependencies: call-bind "^1.0.2" @@ -2867,7 +2891,7 @@ typed-array-buffer@^1.0.0: typed-array-byte-length@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz" integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== dependencies: call-bind "^1.0.2" @@ -2877,7 +2901,7 @@ typed-array-byte-length@^1.0.0: typed-array-byte-offset@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz" integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== dependencies: available-typed-arrays "^1.0.5" @@ -2888,7 +2912,7 @@ typed-array-byte-offset@^1.0.0: typed-array-length@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: call-bind "^1.0.2" @@ -2897,12 +2921,12 @@ typed-array-length@^1.0.4: typescript@^5: version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -2912,12 +2936,12 @@ unbox-primitive@^1.0.2: undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== update-browserslist-db@^1.0.13: version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" @@ -2925,34 +2949,34 @@ update-browserslist-db@^1.0.13: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== whatwg-url@^13.0.0: version "13.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz" integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== dependencies: tr46 "^4.1.1" @@ -2960,7 +2984,7 @@ whatwg-url@^13.0.0: whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -2968,7 +2992,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -2979,7 +3003,7 @@ which-boxed-primitive@^1.0.2: which-builtin-type@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz" integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== dependencies: function.prototype.name "^1.1.5" @@ -2997,7 +3021,7 @@ which-builtin-type@^1.1.3: which-collection@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== dependencies: is-map "^2.0.1" @@ -3007,7 +3031,7 @@ which-collection@^1.0.1: which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz" integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== dependencies: available-typed-arrays "^1.0.5" @@ -3018,21 +3042,21 @@ which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@^1.1.2: version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -3041,7 +3065,7 @@ wide-align@^1.1.2: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -3050,20 +3074,20 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.3.4: version "2.3.4" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 6974341e286c50b4d75fcfa5f22f812057af8c0c Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 14 Feb 2024 10:03:55 +0530 Subject: [PATCH 21/56] refac: corrected portal for the result modal --- assets/cross.svg | 9 ++++ folder-alias.json | 1 + src/app/api/createRoom/route.ts | 39 +++++++++------ src/app/api/updateRoom/[roomCode]/route.ts | 3 +- src/app/globals.css | 1 + src/app/page.tsx | 4 +- src/components/gameDetails/gameDetails.tsx | 8 ++-- .../portalProvider/portalProvider.tsx | 3 +- src/components/signup/signup.tsx | 3 ++ src/modal/resultModal.tsx | 48 ------------------- src/{modal => modals}/profileModal.tsx | 2 +- src/{modal => modals}/react-confetti.tsx | 6 +-- src/modals/resultModal.tsx | 46 ++++++++++++++++++ tailwind.config.ts | 1 + 14 files changed, 98 insertions(+), 76 deletions(-) create mode 100644 assets/cross.svg create mode 100644 folder-alias.json delete mode 100644 src/modal/resultModal.tsx rename src/{modal => modals}/profileModal.tsx (92%) rename src/{modal => modals}/react-confetti.tsx (80%) create mode 100644 src/modals/resultModal.tsx diff --git a/assets/cross.svg b/assets/cross.svg new file mode 100644 index 0000000..60226af --- /dev/null +++ b/assets/cross.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/folder-alias.json b/folder-alias.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/folder-alias.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/app/api/createRoom/route.ts b/src/app/api/createRoom/route.ts index 15a996b..54e115e 100644 --- a/src/app/api/createRoom/route.ts +++ b/src/app/api/createRoom/route.ts @@ -7,27 +7,38 @@ export async function POST(req: Request) { console.log("Create room API called"); await connectMongoDb(); const { game } = await req.json(); - console.log("Room Code: ", game) + // console.log("Room Code: ", game) const roomExist = await Game.findOne({ roomCode: game.roomCode }); if (roomExist) { - return NextResponse.json({ - message: "A room with the same roomCode already exists.", - status: false, - }, { status: 409 }); + return NextResponse.json( + { + message: "A room with the same roomCode already exists.", + status: false, + }, + { status: 409 } + ); } await Game.create(game); - return NextResponse.json({ - message: "Room created successfully.", - status: true, - }, { status: 201 }); + return NextResponse.json( + { + message: "Room created successfully.", + status: true, + }, + { status: 201 } + ); } catch (error) { - console.error("Error while creating Room:", error.message); - return NextResponse.json({ - message: `Error while creating Room: ${error.message}`, - status: false, - }, { status: 500 }); + if (error instanceof Error) { + console.error("Error while creating Room:", error.message); + return NextResponse.json( + { + message: `Error while creating Room: ${error.message}`, + status: false, + }, + { status: 500 } + ); + } } } diff --git a/src/app/api/updateRoom/[roomCode]/route.ts b/src/app/api/updateRoom/[roomCode]/route.ts index 1631570..c25b6e7 100644 --- a/src/app/api/updateRoom/[roomCode]/route.ts +++ b/src/app/api/updateRoom/[roomCode]/route.ts @@ -9,7 +9,7 @@ export async function PATCH( console.log("Update room Api is called") const { roomCode } = params; const game = await req.json(); - console.log({game}, roomCode); + // console.log({game}, roomCode); await connectMongoDb(); try { const room = await Game.findOneAndUpdate( @@ -19,6 +19,7 @@ export async function PATCH( ); return NextResponse.json({ message: "Game Updated", data: room, status: true }, { status: 200 }); + } catch (error) { if (error instanceof Error) return NextResponse.json( diff --git a/src/app/globals.css b/src/app/globals.css index 20055d1..200e087 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,5 +1,6 @@ @tailwind base; @tailwind components; +@tailwind modals; @tailwind utilities; :root { diff --git a/src/app/page.tsx b/src/app/page.tsx index 3284f8b..a778a70 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -9,7 +9,7 @@ import lose from "./../../assets/lose.png"; import draw from "./../../assets/draw.png"; import StartGame from "@/components/startGame/startGame"; import DashboardHeader from "@/components/dashboardHeader/dashboardHeader"; -import ProfileModal from "@/modal/profileModal"; +import ProfileModal from "@/modals/profileModal"; export default async function Dashboard() { const session: Session | null = await getServerSession(); @@ -19,7 +19,7 @@ export default async function Dashboard() { } const res = await fetch(`${user}/${session?.user?.email}`); - const resData = await res.json() as UserResponseData; + const resData = (await res.json()) as UserResponseData; return (
diff --git a/src/components/gameDetails/gameDetails.tsx b/src/components/gameDetails/gameDetails.tsx index b30fed2..af0705e 100644 --- a/src/components/gameDetails/gameDetails.tsx +++ b/src/components/gameDetails/gameDetails.tsx @@ -5,8 +5,8 @@ import { checkGameStatus } from "@/utils/checkGameStatus"; import { checkOpponent } from "@/utils/checkOpponent"; import { GameContext } from "@/context/gameContext"; import { useSession } from "next-auth/react"; -import ReactConfetti from "@/modal/react-confetti"; -import ResultModal from "@/modal/resultModal"; +import ReactConfetti from "@/modals/react-confetti"; +import ResultModal from "@/modals/resultModal"; const GameDetails = ({ roomData }: { roomData: Game }) => { const { data: session, status: sessionStatus } = useSession(); @@ -47,9 +47,7 @@ const GameDetails = ({ roomData }: { roomData: Game }) => {
{(status === "You Won" || status === "You Lose") && ( - - - + )} ); diff --git a/src/components/portalProvider/portalProvider.tsx b/src/components/portalProvider/portalProvider.tsx index 327b29a..2dfde52 100644 --- a/src/components/portalProvider/portalProvider.tsx +++ b/src/components/portalProvider/portalProvider.tsx @@ -1,8 +1,7 @@ -'use client' +"use client"; import { useEffect, useRef } from "react"; import { createPortal } from "react-dom"; - const PortalProvider = ({ children, selector, show }: PortalInterface) => { const ref = useRef(null); useEffect(() => { diff --git a/src/components/signup/signup.tsx b/src/components/signup/signup.tsx index 889e77e..620cb93 100644 --- a/src/components/signup/signup.tsx +++ b/src/components/signup/signup.tsx @@ -4,12 +4,14 @@ import React, { useState } from "react"; import FormAction from "../formAction/formAction"; import Input from "../input/input"; import { signup } from "@/constants/apiUrl"; +import { useRouter } from "next/navigation"; const fields: LoginFields[] = signupFields; let fieldsState: Record = {}; fields.forEach((field) => (fieldsState[field.name] = "")); const Signup = () => { + const router = useRouter(); const [signupState, setSignupState] = useState(fieldsState); const [loading, setLoading] = useState(false); const [apiResponse, setApiResponse] = useState({ @@ -37,6 +39,7 @@ const Signup = () => { if (res.ok) { setApiResponse(data); setSignupState(fieldsState); + router.push("/login") setLoading(false); } else { setApiResponse(data); diff --git a/src/modal/resultModal.tsx b/src/modal/resultModal.tsx deleted file mode 100644 index 1c0bf70..0000000 --- a/src/modal/resultModal.tsx +++ /dev/null @@ -1,48 +0,0 @@ -"use client"; -import PortalProvider from "@/components/portalProvider/portalProvider"; -import React, { useState } from "react"; - -const ResultModal = ({ status }: { status: string }) => { - const [showModal, setShowModal] = useState(true); - - const closeModal = () => { - setShowModal(false); - }; - - return ( - - {showModal && ( - <> - -
-
-

{status}

-
- -
- -
-
- - )} -
- ); -}; - -export default ResultModal; diff --git a/src/modal/profileModal.tsx b/src/modals/profileModal.tsx similarity index 92% rename from src/modal/profileModal.tsx rename to src/modals/profileModal.tsx index 0562f38..e89ad8b 100644 --- a/src/modal/profileModal.tsx +++ b/src/modals/profileModal.tsx @@ -27,7 +27,7 @@ const ProfileModal = () => { {
setOpenModal(false)} - className="absolute top-12 right-0 me-1 md:me-2 mt-2 w-48 bg-white rounded shadow-md z-10 flex flex-col items-center justify-center" + className="absolute top-[3.5rem] right-0 me-1 md:me-2 mt-2 w-48 bg-white rounded shadow-md z-10 flex flex-col items-center justify-center" >
= ({ status, children }) => { +const ReactConfetti: React.FC = ({ status }) => { const { width, height } = useWindowSize(); return ( @@ -24,7 +24,7 @@ const ReactConfetti: React.FC = ({ status, children }) => { }} > {status==="You Won" && } - {children} +
); }; diff --git a/src/modals/resultModal.tsx b/src/modals/resultModal.tsx new file mode 100644 index 0000000..6e2ca53 --- /dev/null +++ b/src/modals/resultModal.tsx @@ -0,0 +1,46 @@ +// ResultModal component +import PortalProvider from "@/components/portalProvider/portalProvider"; +import { useRouter } from "next/navigation"; +import React from "react"; +import closeIcon from "../../assets/cross.svg"; +import Image from "next/image"; + +const ResultModal = ({ status }: { status: string }) => { + const router = useRouter(); + + const closeModal = () => { + router.push("/"); + }; + + return ( + +
+
+ +
+
+

{status}

+
+
+ +
+
+
+ ); +}; + +export default ResultModal; diff --git a/tailwind.config.ts b/tailwind.config.ts index 0ae927c..d3525df 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -5,6 +5,7 @@ const config: Config = { "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", "./src/components/**/*.{js,ts,jsx,tsx,mdx}", "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + "./src/modals/**/*.{js,ts,jsx,tsx,mdx}", ], theme: { extend: { From 833311c96e91f2ca45bc9b702eeb0200d3c9fb92 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 14 Feb 2024 18:40:40 +0530 Subject: [PATCH 22/56] feat: Create a new collections for game records --- models/resultModel.ts | 36 +++++++++++ src/app/api/createResult/route.ts | 44 +++++++++++++ src/app/api/getResult/[userId]/route.ts | 1 + src/constants/apiUrl.ts | 6 +- src/types/types.ts | 12 +++- src/utils/handleGameEnd.ts | 83 ++++++++++++++++++------- 6 files changed, 155 insertions(+), 27 deletions(-) create mode 100644 models/resultModel.ts create mode 100644 src/app/api/createResult/route.ts create mode 100644 src/app/api/getResult/[userId]/route.ts diff --git a/models/resultModel.ts b/models/resultModel.ts new file mode 100644 index 0000000..77fbcb7 --- /dev/null +++ b/models/resultModel.ts @@ -0,0 +1,36 @@ +import mongoose, { Schema, Document } from "mongoose"; + +interface Result extends Document, ResultSchema { + gameId: { + type: typeof Schema.Types.ObjectId; + ref: string; + }; +} + +const ResultSchema: Schema = new Schema( + { + gameId: { + type: Schema.Types.ObjectId, + ref: "Game", + }, + gameStatus: { + type: String, + default: null, + }, + player: { + x: { type: String, default: null }, + o: { type: String, default: null }, + }, + winner: { + type: String, + default: null, + }, + }, + { + timestamps: true, + } +); + +const ResultModel= + mongoose.models.Result || mongoose.model("Result", ResultSchema); +export default ResultModel; diff --git a/src/app/api/createResult/route.ts b/src/app/api/createResult/route.ts new file mode 100644 index 0000000..761aa42 --- /dev/null +++ b/src/app/api/createResult/route.ts @@ -0,0 +1,44 @@ +import connectMongoDb from "../../../utils/dbConnection"; +import { NextResponse } from "next/server"; +import Result from "../../../../models/resultModel"; + +export async function POST(req: Request) { + try { + console.log("Create result API"); + const { result } = await req.json(); + console.log({result}) + await connectMongoDb(); + + // const resultExist = await Result.findOne({ gameId: result.gameId }); + // if (resultExist) { + // return NextResponse.json( + // { + // message: "Result already added for this game", + // status: false, + // }, + // { status: 409 } + // ); + // } + + await Result.create(result); + + return NextResponse.json( + { + message: "Result added successfully.", + status: true, + }, + { status: 201 } + ); + } catch (error) { + if (error instanceof Error) { + console.error("Error while adding result:", error.message); + return NextResponse.json( + { + message: `Error while adding result: ${error.message}`, + status: false, + }, + { status: 500 } + ); + } + } +} diff --git a/src/app/api/getResult/[userId]/route.ts b/src/app/api/getResult/[userId]/route.ts new file mode 100644 index 0000000..425e38f --- /dev/null +++ b/src/app/api/getResult/[userId]/route.ts @@ -0,0 +1 @@ +//WIP \ No newline at end of file diff --git a/src/constants/apiUrl.ts b/src/constants/apiUrl.ts index b1ac4ad..ad4be29 100644 --- a/src/constants/apiUrl.ts +++ b/src/constants/apiUrl.ts @@ -10,4 +10,8 @@ export const joinRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/joinRoom` export const getRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/getRoom` -export const updateRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/updateRoom` \ No newline at end of file +export const updateRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/updateRoom` + +export const createResult = `${process.env.NEXT_PUBLIC_BASE_URL}/api/createResult` + +export const getResult = `${process.env.NEXT_PUBLIC_BASE_URL}/api/getResult` \ No newline at end of file diff --git a/src/types/types.ts b/src/types/types.ts index daaa711..c0f37fe 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -91,6 +91,7 @@ interface GameSchema { } interface Game { + _id?:string; roomCode: string; playerXId: UserData | string; turn: string; @@ -121,17 +122,24 @@ interface Session { interface SquaresProps { i: number; - roomData: Game; } interface SquareProps { value: JSX.Element | null; i: number; session: Session | undefined; - roomData: Game; } interface WindowSize { width: number | undefined; height: number | undefined; +} + +interface ResultSchema { + gameStatus: string; + player: { + x:string|null; + o:string|null; + } + winner:string|null; } \ No newline at end of file diff --git a/src/utils/handleGameEnd.ts b/src/utils/handleGameEnd.ts index 3e8ebb6..8a1c2bf 100644 --- a/src/utils/handleGameEnd.ts +++ b/src/utils/handleGameEnd.ts @@ -1,33 +1,68 @@ -import { updateRoom } from "@/constants/apiUrl"; +import { createResult, updateRoom } from "@/constants/apiUrl"; -export async function handleGameEnd(game:Game, setGame: (game:Game)=>void, updatedBoard: string[], updatedTurn: string, winner: string) { - console.log("Handle Game End") +export async function handleGameEnd( + game: Game, + setGame: (game: Game) => void, + updatedBoard: string[], + updatedTurn: string, + winner: string +) { + console.log("Handle Game End"); + if (winner) setGame({ ...game, board: updatedBoard, turn: updatedTurn, winner: winner, }); - - try { - console.log("Update room API called"); - const res = await fetch(`${updateRoom}/${game?.roomCode}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - board: updatedBoard, - turn: updatedTurn, + + try { + console.log("Update room API called"); + const res = await fetch(`${updateRoom}/${game?.roomCode}`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + board: updatedBoard, + turn: updatedTurn, + winner: winner, + }), + }); + if (!res.ok) { + console.error("Failed to update game state in API:", res.status); + } + } catch (error) { + if (error instanceof Error) { + console.error("Error updating game state in API:", error.message); + } + } + + try { + console.log("create result api called"); + const res = await fetch(createResult, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + result: { + gameId: game._id, + gameStatus: game?.winner ? "Completed" : "Incompleted", + player: { + x: (game.playerXId as UserData)._id, + o: (game.playerOId as UserData)._id, + }, winner: winner, - }), - }); - if (!res.ok) { - console.error("Failed to update game state in API:", res.status); - } - } catch (error) { - if(error instanceof Error){ - console.error("Error updating game state in API:", error.message); - } + }, + }), + }); + if (!res.ok) { + throw new Error("Error adding result"); + } + } catch (error: unknown) { + if (error instanceof Error) { + console.error("Error adding result: ", error?.message); } - } \ No newline at end of file + } +} From b268c804fb375f77734212d09928f66b288e5ffa Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 14 Feb 2024 18:42:49 +0530 Subject: [PATCH 23/56] feat: add draw game logic --- src/components/gameDetails/gameDetails.tsx | 2 +- src/utils/checkGameStatus.ts | 32 ++++++++++++---------- src/utils/checkWinner.ts | 5 +++- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/components/gameDetails/gameDetails.tsx b/src/components/gameDetails/gameDetails.tsx index af0705e..b8ecea1 100644 --- a/src/components/gameDetails/gameDetails.tsx +++ b/src/components/gameDetails/gameDetails.tsx @@ -46,7 +46,7 @@ const GameDetails = ({ roomData }: { roomData: Game }) => {

- {(status === "You Won" || status === "You Lose") && ( + {(status === "You Won" || status === "You Lose" || status==="Match Draw" ) && ( )} diff --git a/src/utils/checkGameStatus.ts b/src/utils/checkGameStatus.ts index 89366d3..0c76e98 100644 --- a/src/utils/checkGameStatus.ts +++ b/src/utils/checkGameStatus.ts @@ -1,16 +1,20 @@ -export const checkGameStatus = (roomData: Game, userEmail: string | undefined): string => { - if (!roomData) return "Not Started"; - - return roomData.winner - ? roomData.winner === "X" - ? (roomData.playerXId as UserData).email === userEmail - ? "You Won" - : "You Lose" - :(roomData.playerOId as UserData).email === userEmail +export const checkGameStatus = ( + roomData: Game, + userEmail: string | undefined +): string => { + if (!roomData) return "Not Started"; + + return roomData.winner + ? roomData.winner === "Match Draw" + ? "Match Draw" + : roomData.winner === "X" + ? (roomData.playerXId as UserData).email === userEmail ? "You Won" : "You Lose" - : roomData.status - ? "In Progress..." - : "Not Started"; - }; - \ No newline at end of file + : (roomData.playerOId as UserData).email === userEmail + ? "You Won" + : "You Lose" + : roomData.status + ? "In Progress..." + : "Not Started"; +}; diff --git a/src/utils/checkWinner.ts b/src/utils/checkWinner.ts index 86d03c2..c4cffcc 100644 --- a/src/utils/checkWinner.ts +++ b/src/utils/checkWinner.ts @@ -1,4 +1,4 @@ -export const checkWinner = (board) => { +export const checkWinner = (board: string[]) => { const winningCombos = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], @@ -12,6 +12,9 @@ export const checkWinner = (board) => { return board[a]; } } + if(board.every((square) => square === "X" || square === "O")){ + return "Match Draw"; + } return null; } From 161cc72ea5dfea2c2bd3606f356294630f50a0bc Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 14 Feb 2024 18:43:34 +0530 Subject: [PATCH 24/56] refac: correct route validation for room page --- src/app/api/getRoom/[roomCode]/route.tsx | 7 +++++++ src/app/page.tsx | 2 +- src/app/room/[roomCode]/page.tsx | 9 ++++++--- src/components/gameBoard/gameBoard.tsx | 9 ++++----- src/components/gameDetails/gameDetails.tsx | 1 - src/components/squares/squares.tsx | 12 +++++------- src/modals/resultModal.tsx | 18 +++++++++--------- 7 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/app/api/getRoom/[roomCode]/route.tsx b/src/app/api/getRoom/[roomCode]/route.tsx index 318e250..1faee03 100644 --- a/src/app/api/getRoom/[roomCode]/route.tsx +++ b/src/app/api/getRoom/[roomCode]/route.tsx @@ -14,6 +14,13 @@ export async function GET( const room = await Game.findOne({ roomCode }) .populate("playerXId") .populate("playerOId"); + + if(!room){ + return NextResponse.json( + { message: "Room Not found", data: null, status: false }, + { status: 500 } + ); + } return NextResponse.json( { message: "Room found", data: room, status: true }, diff --git a/src/app/page.tsx b/src/app/page.tsx index a778a70..8eda41a 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -17,7 +17,7 @@ export default async function Dashboard() { if (!session) { redirect("/login"); } - + const res = await fetch(`${user}/${session?.user?.email}`); const resData = (await res.json()) as UserResponseData; diff --git a/src/app/room/[roomCode]/page.tsx b/src/app/room/[roomCode]/page.tsx index 3a678ea..5b804d7 100644 --- a/src/app/room/[roomCode]/page.tsx +++ b/src/app/room/[roomCode]/page.tsx @@ -12,10 +12,13 @@ const Room = async ({params}:{params:{roomCode:string}}) => { if (!session) { redirect("/"); } - - console.log("page renders") - const room = await fetch(`${getRoom}/${roomCode}`) ; + const room = await fetch(`${getRoom}/${roomCode}`); + + if(!room.ok){ + redirect("/"); + } + const data = await room.json(); const roomData = data?.data as Game; diff --git a/src/components/gameBoard/gameBoard.tsx b/src/components/gameBoard/gameBoard.tsx index fce94c9..fe9aca9 100644 --- a/src/components/gameBoard/gameBoard.tsx +++ b/src/components/gameBoard/gameBoard.tsx @@ -5,7 +5,7 @@ import Turn from "../turn/turn"; import { GameContext } from "@/context/gameContext"; const GameBoard = ({ roomData }: { roomData: Game }) => { - const { game, setGame } = useContext(GameContext) as GameContextType; + const { setGame } = useContext(GameContext) as GameContextType; useEffect(()=>{ setGame({ @@ -13,7 +13,6 @@ const GameBoard = ({ roomData }: { roomData: Game }) => { }) },[roomData]) - // console.log({game},{roomData}) return (
@@ -22,19 +21,19 @@ const GameBoard = ({ roomData }: { roomData: Game }) => {
{[0, 1, 2].map((i) => ( - + ))}
{[3, 4, 5].map((i) => ( - + ))}
{[6, 7, 8].map((i) => ( - + ))}
diff --git a/src/components/gameDetails/gameDetails.tsx b/src/components/gameDetails/gameDetails.tsx index b8ecea1..c5174d0 100644 --- a/src/components/gameDetails/gameDetails.tsx +++ b/src/components/gameDetails/gameDetails.tsx @@ -6,7 +6,6 @@ import { checkOpponent } from "@/utils/checkOpponent"; import { GameContext } from "@/context/gameContext"; import { useSession } from "next-auth/react"; import ReactConfetti from "@/modals/react-confetti"; -import ResultModal from "@/modals/resultModal"; const GameDetails = ({ roomData }: { roomData: Game }) => { const { data: session, status: sessionStatus } = useSession(); diff --git a/src/components/squares/squares.tsx b/src/components/squares/squares.tsx index 8e8098e..e01cc4e 100644 --- a/src/components/squares/squares.tsx +++ b/src/components/squares/squares.tsx @@ -11,21 +11,20 @@ import { handleGameState } from "@/utils/handleGameState"; import { handleGameEnd } from "@/utils/handleGameEnd"; -function Square({ value, i, session, roomData }: SquareProps) { +function Square({ value, i, session }: SquareProps) { const { game, setGame } = useContext(GameContext) as GameContextType; - async function handlePlayer(index: number) { const updatedBoard = [...game.board]; updatedBoard[index] = game.turn === "X" ? "X" : "O"; const updatedTurn = game.turn === "X" ? "O" : "X"; - const winner = checkWinner(updatedBoard); + let winner = checkWinner(updatedBoard); if (winner) { handleGameEnd(game, setGame, updatedBoard, updatedTurn, winner); return; } - + handleGameState(game, setGame, updatedBoard, updatedTurn); } @@ -43,19 +42,18 @@ async function handlePlayer(index: number) { -const Squares = ({ i, roomData }: SquaresProps) => { +const Squares = ({ i }: SquaresProps) => { const { game } = useContext(GameContext) as GameContextType; const { data: session } = useSession(); const value = game.board[i] === "X" ? : game.board[i] === "O" ? : null; - + // console.log("draw:",game.board.every((square) => square === "X" || square === "O") && !game.winner) return ( ); }; diff --git a/src/modals/resultModal.tsx b/src/modals/resultModal.tsx index 6e2ca53..e629334 100644 --- a/src/modals/resultModal.tsx +++ b/src/modals/resultModal.tsx @@ -27,17 +27,17 @@ const ResultModal = ({ status }: { status: string }) => { className="bg-white rounded shadow-md z-10 flex flex-col items-center justify-center" >
- -
-
-

{status}

-
-
-
+ +

+ {status} +

); From 8b528e88678ee91944d8591f013a8b3d5c2f2cd5 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Fri, 16 Feb 2024 15:59:51 +0530 Subject: [PATCH 25/56] fix: Add socket on join game feature --- package.json | 6 +- src/app/api/getResult/[userId]/route.ts | 108 +++++++++++++- src/app/globals.css | 1 - src/app/page.tsx | 16 +- src/app/room/[roomCode]/page.tsx | 29 ++-- src/components/gameDetails/gameDetails.tsx | 39 ++++- src/components/squares/squares.tsx | 1 - src/components/startGame/startGame.tsx | 8 +- src/types/types.ts | 28 +++- src/utils/handleGameEnd.ts | 2 +- yarn.lock | 166 ++++++++++++++++++++- 11 files changed, 357 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index ffe2a97..fcb5077 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,9 @@ "lint": "next lint" }, "dependencies": { + "@types/socket.io": "^3.0.2", "bcrypt": "^5.1.1", + "cors": "^2.8.5", "mongoose": "^8.1.1", "next": "14.1.0", "next-auth": "^4.24.5", @@ -17,7 +19,9 @@ "react-confetti": "^6.1.0", "react-dom": "^18", "react-hook-form": "^7.49.3", - "react-toastify": "^10.0.4" + "react-toastify": "^10.0.4", + "socket.io": "^4.7.4", + "socket.io-client": "^4.7.4" }, "devDependencies": { "@types/bcrypt": "^5.0.2", diff --git a/src/app/api/getResult/[userId]/route.ts b/src/app/api/getResult/[userId]/route.ts index 425e38f..55b3da1 100644 --- a/src/app/api/getResult/[userId]/route.ts +++ b/src/app/api/getResult/[userId]/route.ts @@ -1 +1,107 @@ -//WIP \ No newline at end of file +import { NextResponse } from "next/server"; +import connectMongoDb from "../../../../utils/dbConnection"; +import Result from "../../../../../models/resultModel"; + +export async function GET( + _req: Request, + { params }: { params: { userId: string } } +) { + const { userId } = params; + + try { + console.log("Get Result API called"); + await connectMongoDb(); + + const aggregationPipeline = [ + { + $match: { + $or: [{ "player.x": userId }, { "player.o": userId }], + }, + }, + { + $group: { + _id: null, + totalGames: { $sum: 1 }, + totalWins: { + $sum: { + $cond: [ + { $eq: ["$winner", "X"] }, + { + $cond: [{ $eq: ["$player.x", userId] }, 1, 0], + }, + { + $cond: [ + { $eq: ["$winner", "O"] }, + { + $cond: [{ $eq: ["$player.o", userId] }, 1, 0], + }, + 0, + ], + }, + ], + }, + }, + totalLosses: { + $sum: { + $cond: [ + { $eq: ["$winner", "X"] }, + { + $cond: [{ $eq: ["$player.x", userId] }, 0, 1], + }, + { + $cond: [ + { $eq: ["$winner", "O"] }, + { + $cond: [{ $eq: ["$player.o", userId] }, 0, 1], + }, + 0, + ], + }, + ], + }, + }, + totalDraws: { + $sum: { + $cond: [{ $eq: ["$winner", "Match Draw"] }, 1, 0], + }, + }, + }, + }, + ]; + + const resultAggregation = await Result.aggregate(aggregationPipeline); + const aggregatedResult = resultAggregation[0]; + + if (!aggregatedResult) { + return NextResponse.json( + { + message: "Results found", + data: { + _id: null, + totalGames: 0, + totalWins: 0, + totalLosses: 0, + totalDraws: 0, + }, + status: true, + }, + { status: 200 } + ); + } + return NextResponse.json( + { + message: "Results found", + data: aggregatedResult, + status: true, + }, + { status: 200 } + ); + } catch (error) { + if (error instanceof Error) { + return NextResponse.json( + { message: error.message, status: false }, + { status: 500 } + ); + } + } +} diff --git a/src/app/globals.css b/src/app/globals.css index 200e087..20055d1 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,6 +1,5 @@ @tailwind base; @tailwind components; -@tailwind modals; @tailwind utilities; :root { diff --git a/src/app/page.tsx b/src/app/page.tsx index 8eda41a..93a1436 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,4 +1,4 @@ -import { user } from "@/constants/apiUrl"; +import { user, getResult } from "@/constants/apiUrl"; import { Session, getServerSession } from "next-auth"; import { redirect } from "next/navigation"; import DashboardCard from "@/components/dashboardCard/card"; @@ -17,10 +17,14 @@ export default async function Dashboard() { if (!session) { redirect("/login"); } - + const res = await fetch(`${user}/${session?.user?.email}`); const resData = (await res.json()) as UserResponseData; + const result = await fetch(`${getResult}/${resData.data._id}`); + const resultData = (await result.json()) as ResultResponse; + + return (
@@ -34,28 +38,28 @@ export default async function Dashboard() {

Total Played

Total Game Played Icon -

0

+

{resultData?.data?.totalGames}

Total Win

Total Game win Icon -

0

+

{resultData?.data?.totalWins}

Total Lose

Total Game Lose Icon -

0

+

{resultData?.data?.totalLosses}

Total Draw

Total Game Lose Icon -

0

+

{resultData?.data?.totalDraws}

diff --git a/src/app/room/[roomCode]/page.tsx b/src/app/room/[roomCode]/page.tsx index 5b804d7..d178e3a 100644 --- a/src/app/room/[roomCode]/page.tsx +++ b/src/app/room/[roomCode]/page.tsx @@ -6,38 +6,35 @@ import { Session, getServerSession } from "next-auth"; import { redirect } from "next/navigation"; import React from "react"; -const Room = async ({params}:{params:{roomCode:string}}) => { + +const Room = async ({ params }: { params: { roomCode: string } }) => { const session: Session | null = await getServerSession(); - const {roomCode} = params; + const { roomCode } = params; if (!session) { redirect("/"); } - + const room = await fetch(`${getRoom}/${roomCode}`); - - if(!room.ok){ + const data = await room.json(); + const roomData = data?.data as Game; + + if (!room.ok) { redirect("/"); } - const data = await room.json(); - const roomData = data?.data as Game; - - return ( -
+
-
- +
+
-
- +
+
- -
); }; diff --git a/src/components/gameDetails/gameDetails.tsx b/src/components/gameDetails/gameDetails.tsx index c5174d0..50aed3c 100644 --- a/src/components/gameDetails/gameDetails.tsx +++ b/src/components/gameDetails/gameDetails.tsx @@ -1,15 +1,38 @@ "use client"; -import React, { useContext, useMemo } from "react"; +import React, { useContext, useEffect, useMemo } from "react"; import DashboardCard from "../dashboardCard/card"; import { checkGameStatus } from "@/utils/checkGameStatus"; import { checkOpponent } from "@/utils/checkOpponent"; import { GameContext } from "@/context/gameContext"; import { useSession } from "next-auth/react"; import ReactConfetti from "@/modals/react-confetti"; +import { io } from "socket.io-client"; +import { getRoom } from "@/constants/apiUrl"; + +const socket = io("http://localhost:8000"); + +const GameDetails = ({ roomCode }: { roomCode: string }) => { + const { data: session } = useSession(); + const { game, setGame } = useContext(GameContext) as GameContextType; + + useEffect(() => { + const receiveGameHandler = async () => { + const room = await fetch(`${getRoom}/${roomCode}`); + const data = await room.json(); + + setGame({ + ...game, + ...data.data + }); + }; + + socket.on("recieveJoinGame", receiveGameHandler); + + return () => { + socket.off("recieveJoinGame", receiveGameHandler); + }; + }, []); -const GameDetails = ({ roomData }: { roomData: Game }) => { - const { data: session, status: sessionStatus } = useSession(); - const { game } = useContext(GameContext) as GameContextType; const status: string = useMemo(() => { return checkGameStatus(game, session?.user?.email as string); }, [game, session?.user?.email]); @@ -27,7 +50,7 @@ const GameDetails = ({ roomData }: { roomData: Game }) => {

Room Code:{" "} - {roomData?.roomCode} + {game?.roomCode}

@@ -45,9 +68,9 @@ const GameDetails = ({ roomData }: { roomData: Game }) => {

- {(status === "You Won" || status === "You Lose" || status==="Match Draw" ) && ( - - )} + {(status === "You Won" || + status === "You Lose" || + status === "Match Draw") && } ); }; diff --git a/src/components/squares/squares.tsx b/src/components/squares/squares.tsx index e01cc4e..25cf684 100644 --- a/src/components/squares/squares.tsx +++ b/src/components/squares/squares.tsx @@ -5,7 +5,6 @@ import { XIcon } from "../xIcon/xIcon"; import { GameContext } from "@/context/gameContext"; import { checkTurn } from "@/utils/checkCurrentTurn"; import { useSession } from "next-auth/react"; -import { updateRoom } from "@/constants/apiUrl"; import { checkWinner } from "@/utils/checkWinner"; import { handleGameState } from "@/utils/handleGameState"; import { handleGameEnd } from "@/utils/handleGameEnd"; diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index 8d23d0e..19f5622 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -7,6 +7,9 @@ import { joinRoom, room } from "@/constants/apiUrl"; import { GameContext } from "@/context/gameContext"; import ToastConainer from "../toastConainer"; import { showErrorToast } from "../../utils/toast"; +import { io } from "socket.io-client"; + +const socket = io("http://localhost:8000"); const StartGame = ({ userData }: { userData: UserResponseData }) => { const { game, setGame } = useContext(GameContext) as GameContextType; @@ -82,11 +85,14 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { const data = await res.json(); if (res.ok) { + socket.emit("joinGame", { + status: true, + playerOId: userData.data._id, + }) router.push(`/room/${joinRoomCode}`); } showErrorToast(data.message); setLoading({ ...loading, joinRoom: false }); - console.log({ data }); } catch (error) { setLoading({ ...loading, joinRoom: false }); if (error instanceof Error) { diff --git a/src/types/types.ts b/src/types/types.ts index c0f37fe..127f014 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -59,11 +59,11 @@ interface UserData { createdAt: string; updatedAt: string; __v: number; -}; +} interface UserResponseData { message: string; - data: UserData + data: UserData; status: boolean; existingUser: boolean; } @@ -91,7 +91,7 @@ interface GameSchema { } interface Game { - _id?:string; + _id?: string; roomCode: string; playerXId: UserData | string; turn: string; @@ -138,8 +138,20 @@ interface WindowSize { interface ResultSchema { gameStatus: string; player: { - x:string|null; - o:string|null; - } - winner:string|null; -} \ No newline at end of file + x: string | null; + o: string | null; + }; + winner: string | null; +} + +interface ResultResponse { + message: string; + data: { + _id: null; + totalGames: number; + totalWins: number; + totalLosses: number; + totalDraws: number; + }; + status: boolean; +} diff --git a/src/utils/handleGameEnd.ts b/src/utils/handleGameEnd.ts index 8a1c2bf..e8c7150 100644 --- a/src/utils/handleGameEnd.ts +++ b/src/utils/handleGameEnd.ts @@ -48,7 +48,7 @@ export async function handleGameEnd( body: JSON.stringify({ result: { gameId: game._id, - gameStatus: game?.winner ? "Completed" : "Incompleted", + gameStatus: winner ? "Completed" : "Incompleted", player: { x: (game.playerXId as UserData)._id, o: (game.playerOId as UserData)._id, diff --git a/yarn.lock b/yarn.lock index 7f9cc86..f4ce1df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -229,6 +229,11 @@ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz" integrity sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA== +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + "@swc/helpers@0.5.2": version "0.5.2" resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz" @@ -243,6 +248,18 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" @@ -255,7 +272,7 @@ dependencies: mongoose "*" -"@types/node@*", "@types/node@^20": +"@types/node@*", "@types/node@>=10.0.0", "@types/node@^20": version "20.11.13" resolved "https://registry.npmjs.org/@types/node/-/node-20.11.13.tgz" integrity sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg== @@ -288,6 +305,13 @@ resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== +"@types/socket.io@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/socket.io/-/socket.io-3.0.2.tgz" + integrity sha512-pu0sN9m5VjCxBZVK8hW37ZcMe8rjn4HHggBN5CbaRTvFwv5jOmuIRZEuddsBPa9Th0ts0SIo3Niukq+95cMBbQ== + dependencies: + socket.io "*" + "@types/webidl-conversions@*": version "7.0.3" resolved "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz" @@ -356,6 +380,14 @@ abbrev@1: resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +accepts@~1.3.4: + 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== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" @@ -573,6 +605,11 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + bcrypt@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz" @@ -729,6 +766,27 @@ cookie@^0.5.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -753,7 +811,7 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -debug@4, debug@4.x, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.x, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -856,6 +914,38 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +engine.io-client@~6.5.2: + version "6.5.3" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz" + integrity sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + enhanced-resolve@^5.12.0: version "5.15.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" @@ -1873,6 +1963,18 @@ micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + minimatch@9.0.3, minimatch@^9.0.1: version "9.0.3" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" @@ -1993,6 +2095,11 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + next-auth@^4.24.5: version "4.24.5" resolved "https://registry.npmjs.org/next-auth/-/next-auth-4.24.5.tgz" @@ -2080,7 +2187,7 @@ oauth@^0.9.15: resolved "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz" integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== -object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -2615,6 +2722,44 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +socket.io-adapter@~2.5.2: + version "2.5.2" + resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz" + integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== + dependencies: + ws "~8.11.0" + +socket.io-client@^4.7.4: + version "4.7.4" + resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.4.tgz" + integrity sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@*, socket.io@^4.7.4: + version "4.7.4" + resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz" + integrity sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" @@ -2964,6 +3109,11 @@ uuid@^8.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +vary@^1: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -3077,6 +3227,16 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" From 2b2fb9ca080f1c1e7019baa527dfb35a49d43b8f Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Fri, 16 Feb 2024 17:56:25 +0530 Subject: [PATCH 26/56] feat: Add Socket for update game board --- src/components/squares/squares.tsx | 17 +++++++- src/utils/handleGameState.ts | 63 +++++++++++++++++------------- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/components/squares/squares.tsx b/src/components/squares/squares.tsx index 25cf684..e9c7529 100644 --- a/src/components/squares/squares.tsx +++ b/src/components/squares/squares.tsx @@ -1,5 +1,5 @@ "use client"; -import React, { useContext } from "react"; +import React, { useContext, useEffect } from "react"; import { OIcon } from "../oIcon/oIcon"; import { XIcon } from "../xIcon/xIcon"; import { GameContext } from "@/context/gameContext"; @@ -8,11 +8,26 @@ import { useSession } from "next-auth/react"; import { checkWinner } from "@/utils/checkWinner"; import { handleGameState } from "@/utils/handleGameState"; import { handleGameEnd } from "@/utils/handleGameEnd"; +import { io } from "socket.io-client"; +const socket = io("http://localhost:8000"); function Square({ value, i, session }: SquareProps) { const { game, setGame } = useContext(GameContext) as GameContextType; + useEffect(()=>{ + socket.on("recieveUpdateGameData", (data) => { + console.log("Recieved Game Data") + setGame({ + ...game, + ...data, + }); + }); + return ()=>{ + socket.off("recieveUpdateGameData") + } + }) + async function handlePlayer(index: number) { const updatedBoard = [...game.board]; updatedBoard[index] = game.turn === "X" ? "X" : "O"; diff --git a/src/utils/handleGameState.ts b/src/utils/handleGameState.ts index 7802871..34bd87f 100644 --- a/src/utils/handleGameState.ts +++ b/src/utils/handleGameState.ts @@ -1,32 +1,39 @@ import { updateRoom } from "@/constants/apiUrl"; +import { io } from "socket.io-client"; -export async function handleGameState(game:Game, setGame: (game: Game) => void, updatedBoard: string[], updatedTurn: string) { - setGame({ - ...game, - board: updatedBoard, - turn: updatedTurn, +const socket = io("http://localhost:8000"); + +export async function handleGameState( + game: Game, + setGame: (game: Game) => void, + updatedBoard: string[], + updatedTurn: string +) { + try { + // Emit updated game data to server + socket.emit("updateGame", { board: updatedBoard, turn: updatedTurn }); + + const res = await fetch(`${updateRoom}/${game?.roomCode}`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + board: updatedBoard, + turn: updatedTurn, + winner: null, + status: true, + }), }); - - try { - console.log("Update room API called"); - const res = await fetch(`${updateRoom}/${game?.roomCode}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - board: updatedBoard, - turn: updatedTurn, - winner: null, - status: true, - }), - }); - if (!res.ok) { - console.error("Failed to update game state in API:", res.status); - } - } catch (error) { - if(error instanceof Error){ - console.error("Error updating game state in API:", error?.message); - } + + if (!res.ok) { + console.error("Failed to update game state in API:", res.status); + return; + } + + } catch (error) { + if(error instanceof Error){ + console.error("Error handling game state:", error?.message); } - } \ No newline at end of file + } +} From 31b57a4c35a0fbf5f47632f754a72c2be6dd85bc Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Fri, 16 Feb 2024 18:08:21 +0530 Subject: [PATCH 27/56] feat: Add socket for handle end game func --- src/components/startGame/startGame.tsx | 20 ++++++++++---------- src/utils/handleGameEnd.ts | 6 ++++-- src/utils/handleGameState.ts | 1 - 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index 19f5622..1afdba7 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -60,8 +60,7 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { console.error("Error creating room:", error.message); } } - }; - + }; const handleJoinRoom = async () => { if (joinRoomCode && joinRoomCode.length === 6) { @@ -84,15 +83,16 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { }); const data = await res.json(); - if (res.ok) { - socket.emit("joinGame", { - status: true, - playerOId: userData.data._id, - }) - router.push(`/room/${joinRoomCode}`); + if (!res.ok) { + showErrorToast(data.message); + setLoading({ ...loading, joinRoom: false }); + return; } - showErrorToast(data.message); - setLoading({ ...loading, joinRoom: false }); + socket.emit("joinGame", { + status: true, + playerOId: userData.data._id, + }); + router.push(`/room/${joinRoomCode}`); } catch (error) { setLoading({ ...loading, joinRoom: false }); if (error instanceof Error) { diff --git a/src/utils/handleGameEnd.ts b/src/utils/handleGameEnd.ts index e8c7150..da18882 100644 --- a/src/utils/handleGameEnd.ts +++ b/src/utils/handleGameEnd.ts @@ -1,4 +1,7 @@ import { createResult, updateRoom } from "@/constants/apiUrl"; +import { io } from "socket.io-client"; + +const socket = io("http://localhost:8000"); export async function handleGameEnd( game: Game, @@ -9,8 +12,7 @@ export async function handleGameEnd( ) { console.log("Handle Game End"); if (winner) - setGame({ - ...game, + socket.emit("updateGame", { board: updatedBoard, turn: updatedTurn, winner: winner, diff --git a/src/utils/handleGameState.ts b/src/utils/handleGameState.ts index 34bd87f..48d2799 100644 --- a/src/utils/handleGameState.ts +++ b/src/utils/handleGameState.ts @@ -10,7 +10,6 @@ export async function handleGameState( updatedTurn: string ) { try { - // Emit updated game data to server socket.emit("updateGame", { board: updatedBoard, turn: updatedTurn }); const res = await fetch(`${updateRoom}/${game?.roomCode}`, { From 23f20d783ce6dce69a08476316a2863800105cc8 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Fri, 16 Feb 2024 19:14:52 +0530 Subject: [PATCH 28/56] feat: Add channel for the room --- src/app/room/[roomCode]/page.tsx | 2 +- src/components/gameBoard/gameBoard.tsx | 1 + src/components/startGame/startGame.tsx | 6 +++++- src/utils/handleGameEnd.ts | 1 + src/utils/handleGameState.ts | 2 +- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app/room/[roomCode]/page.tsx b/src/app/room/[roomCode]/page.tsx index d178e3a..efb2ca0 100644 --- a/src/app/room/[roomCode]/page.tsx +++ b/src/app/room/[roomCode]/page.tsx @@ -32,7 +32,7 @@ const Room = async ({ params }: { params: { roomCode: string } }) => {
- +
diff --git a/src/components/gameBoard/gameBoard.tsx b/src/components/gameBoard/gameBoard.tsx index fe9aca9..ef34726 100644 --- a/src/components/gameBoard/gameBoard.tsx +++ b/src/components/gameBoard/gameBoard.tsx @@ -7,6 +7,7 @@ import { GameContext } from "@/context/gameContext"; const GameBoard = ({ roomData }: { roomData: Game }) => { const { setGame } = useContext(GameContext) as GameContextType; + useEffect(()=>{ setGame({ ...roomData diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index 1afdba7..13b1c4d 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -48,6 +48,7 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { const data = await res.json(); if (res.ok) { + socket.emit("joinSocketChannel", customRoomCode) router.push(`/room/${customRoomCode}`); } else { showErrorToast(data.message); @@ -88,9 +89,12 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { setLoading({ ...loading, joinRoom: false }); return; } + socket.emit("joinSocketChannel", joinRoomCode) + socket.emit("joinGame", { status: true, - playerOId: userData.data._id, + playerOId: userData.data, + roomCode: joinRoomCode, }); router.push(`/room/${joinRoomCode}`); } catch (error) { diff --git a/src/utils/handleGameEnd.ts b/src/utils/handleGameEnd.ts index da18882..40e4ac8 100644 --- a/src/utils/handleGameEnd.ts +++ b/src/utils/handleGameEnd.ts @@ -16,6 +16,7 @@ export async function handleGameEnd( board: updatedBoard, turn: updatedTurn, winner: winner, + roomCode: game.roomCode, }); try { diff --git a/src/utils/handleGameState.ts b/src/utils/handleGameState.ts index 48d2799..d4cb55b 100644 --- a/src/utils/handleGameState.ts +++ b/src/utils/handleGameState.ts @@ -10,7 +10,7 @@ export async function handleGameState( updatedTurn: string ) { try { - socket.emit("updateGame", { board: updatedBoard, turn: updatedTurn }); + socket.emit("updateGame", { board: updatedBoard, turn: updatedTurn, roomCode:game.roomCode }); const res = await fetch(`${updateRoom}/${game?.roomCode}`, { method: "PATCH", From 3b383e1ebe4b9708236f0b2e129bd0e758cf72c3 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Mon, 19 Feb 2024 10:53:55 +0530 Subject: [PATCH 29/56] feat: Add socket with room implementation --- .example.env | 4 +- socker-server/.gitignore | 1 + socker-server/index.js | 40 + socker-server/package.json | 20 + socker-server/yarn.lock | 824 +++++++++++++++++++++ src/components/gameDetails/gameDetails.tsx | 6 +- src/components/squares/squares.tsx | 7 +- src/components/startGame/startGame.tsx | 4 +- src/utils/handleGameEnd.ts | 19 +- src/utils/handleGameState.ts | 14 +- src/utils/socket.ts | 7 + 11 files changed, 917 insertions(+), 29 deletions(-) create mode 100644 socker-server/.gitignore create mode 100644 socker-server/index.js create mode 100644 socker-server/package.json create mode 100644 socker-server/yarn.lock create mode 100644 src/utils/socket.ts diff --git a/.example.env b/.example.env index ad09d91..f5494f0 100644 --- a/.example.env +++ b/.example.env @@ -1,4 +1,4 @@ NEXT_PUBLIC_MONGO_URI="" NEXT_PUBLIC_BASE_URL="" -NEXTAUTH_URL="" -NEXTAUTH_SECRET="" \ No newline at end of file +NEXTAUTH_SECRET="" +NEXT_PUBLIC_SOCKET_SERVER_URL="" \ No newline at end of file diff --git a/socker-server/.gitignore b/socker-server/.gitignore new file mode 100644 index 0000000..30bc162 --- /dev/null +++ b/socker-server/.gitignore @@ -0,0 +1 @@ +/node_modules \ No newline at end of file diff --git a/socker-server/index.js b/socker-server/index.js new file mode 100644 index 0000000..b3abebf --- /dev/null +++ b/socker-server/index.js @@ -0,0 +1,40 @@ +import express from "express"; +import http from "http"; +import { Server } from "socket.io"; + + +const app = express(); +const server = http.createServer(app); +const io = new Server(server, { + cors: { + origin: '*' + } + }); + + const socketConnections = new Map(); + + io.on("connection", (socket) => { + const socketId = socket.id; + + socketConnections.set(socketId, socket); + + socket.on("joinSocketChannel", (data) => { + socket.join(data); + }); + + socket.on("joinGame", (data) => { + socket.to(data.roomCode).emit("recieveJoinGame", data); + }); + + socket.on("updateGame", (data) => { + socket.to(data.roomCode).emit("recieveUpdateGameData", data); + }); + + socket.on("disconnect", () => { + socketConnections.delete(socketId); + }); + }); + + server.listen(8000, () => { + console.log("Server running on port: 8000"); + }); \ No newline at end of file diff --git a/socker-server/package.json b/socker-server/package.json new file mode 100644 index 0000000..9b75a66 --- /dev/null +++ b/socker-server/package.json @@ -0,0 +1,20 @@ +{ + "name": "socket", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "start": "nodemon index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "express": "^4.18.2", + "nodemon": "^3.0.3", + "socket.io": "^4.7.4" + } +} diff --git a/socker-server/yarn.lock b/socker-server/yarn.lock new file mode 100644 index 0000000..2321586 --- /dev/null +++ b/socker-server/yarn.lock @@ -0,0 +1,824 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "20.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" + integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== + dependencies: + undici-types "~5.26.4" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +chokidar@^3.5.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@^2.8.5, cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +define-data-property@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-property-descriptors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" + integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== + dependencies: + function-bind "^1.1.2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +nodemon@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.3.tgz#244a62d1c690eece3f6165c6cdb0db03ebd80b76" + integrity sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.5.3: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-function-length@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== + dependencies: + define-data-property "^1.1.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" + integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +socket.io-adapter@~2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" + integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== + dependencies: + ws "~8.11.0" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.4.tgz#2401a2d7101e4bdc64da80b140d5d8b6a8c7738b" + integrity sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/src/components/gameDetails/gameDetails.tsx b/src/components/gameDetails/gameDetails.tsx index 50aed3c..c0fec02 100644 --- a/src/components/gameDetails/gameDetails.tsx +++ b/src/components/gameDetails/gameDetails.tsx @@ -6,10 +6,8 @@ import { checkOpponent } from "@/utils/checkOpponent"; import { GameContext } from "@/context/gameContext"; import { useSession } from "next-auth/react"; import ReactConfetti from "@/modals/react-confetti"; -import { io } from "socket.io-client"; import { getRoom } from "@/constants/apiUrl"; - -const socket = io("http://localhost:8000"); +import socket from "@/utils/socket"; const GameDetails = ({ roomCode }: { roomCode: string }) => { const { data: session } = useSession(); @@ -19,7 +17,7 @@ const GameDetails = ({ roomCode }: { roomCode: string }) => { const receiveGameHandler = async () => { const room = await fetch(`${getRoom}/${roomCode}`); const data = await room.json(); - + setGame({ ...game, ...data.data diff --git a/src/components/squares/squares.tsx b/src/components/squares/squares.tsx index e9c7529..85ae564 100644 --- a/src/components/squares/squares.tsx +++ b/src/components/squares/squares.tsx @@ -8,16 +8,14 @@ import { useSession } from "next-auth/react"; import { checkWinner } from "@/utils/checkWinner"; import { handleGameState } from "@/utils/handleGameState"; import { handleGameEnd } from "@/utils/handleGameEnd"; -import { io } from "socket.io-client"; - -const socket = io("http://localhost:8000"); +import socket from "@/utils/socket"; function Square({ value, i, session }: SquareProps) { const { game, setGame } = useContext(GameContext) as GameContextType; useEffect(()=>{ socket.on("recieveUpdateGameData", (data) => { - console.log("Recieved Game Data") + setGame({ ...game, ...data, @@ -62,7 +60,6 @@ const Squares = ({ i }: SquaresProps) => { const value = game.board[i] === "X" ? : game.board[i] === "O" ? : null; - // console.log("draw:",game.board.every((square) => square === "X" || square === "O") && !game.winner) return ( { const { game, setGame } = useContext(GameContext) as GameContextType; diff --git a/src/utils/handleGameEnd.ts b/src/utils/handleGameEnd.ts index 40e4ac8..5450b31 100644 --- a/src/utils/handleGameEnd.ts +++ b/src/utils/handleGameEnd.ts @@ -1,7 +1,5 @@ import { createResult, updateRoom } from "@/constants/apiUrl"; -import { io } from "socket.io-client"; - -const socket = io("http://localhost:8000"); +import socket from "./socket"; export async function handleGameEnd( game: Game, @@ -10,17 +8,21 @@ export async function handleGameEnd( updatedTurn: string, winner: string ) { - console.log("Handle Game End"); if (winner) - socket.emit("updateGame", { + setGame({ + ...game, board: updatedBoard, turn: updatedTurn, winner: winner, - roomCode: game.roomCode, }); - + socket.emit("updateGame", { + board: updatedBoard, + turn: updatedTurn, + winner: winner, + roomCode: game.roomCode, + }); + try { - console.log("Update room API called"); const res = await fetch(`${updateRoom}/${game?.roomCode}`, { method: "PATCH", headers: { @@ -42,7 +44,6 @@ export async function handleGameEnd( } try { - console.log("create result api called"); const res = await fetch(createResult, { method: "POST", headers: { diff --git a/src/utils/handleGameState.ts b/src/utils/handleGameState.ts index d4cb55b..13741a0 100644 --- a/src/utils/handleGameState.ts +++ b/src/utils/handleGameState.ts @@ -1,7 +1,5 @@ import { updateRoom } from "@/constants/apiUrl"; -import { io } from "socket.io-client"; - -const socket = io("http://localhost:8000"); +import socket from "./socket"; export async function handleGameState( game: Game, @@ -9,8 +7,13 @@ export async function handleGameState( updatedBoard: string[], updatedTurn: string ) { + setGame({ ...game, board: updatedBoard, turn: updatedTurn }); try { - socket.emit("updateGame", { board: updatedBoard, turn: updatedTurn, roomCode:game.roomCode }); + socket.emit("updateGame", { + board: updatedBoard, + turn: updatedTurn, + roomCode: game.roomCode, + }); const res = await fetch(`${updateRoom}/${game?.roomCode}`, { method: "PATCH", @@ -29,9 +32,8 @@ export async function handleGameState( console.error("Failed to update game state in API:", res.status); return; } - } catch (error) { - if(error instanceof Error){ + if (error instanceof Error) { console.error("Error handling game state:", error?.message); } } diff --git a/src/utils/socket.ts b/src/utils/socket.ts new file mode 100644 index 0000000..96b68b0 --- /dev/null +++ b/src/utils/socket.ts @@ -0,0 +1,7 @@ +import { io } from "socket.io-client"; + +const url:string = process.env.NEXT_PUBLIC_SOCKET_SERVER_URL as string; + +const socket = io(url); + +export default socket; From 1fd1575961e51051650b30a32b943cfe7ccbaca7 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Mon, 19 Feb 2024 10:54:22 +0530 Subject: [PATCH 30/56] refac: remove console.log --- src/app/api/createResult/route.ts | 14 -------------- src/app/api/createRoom/route.ts | 2 -- src/app/api/getResult/[userId]/route.ts | 1 - src/app/api/getRoom/[roomCode]/route.tsx | 1 - src/app/api/joinRoom/[roomCode]/route.ts | 1 - src/app/api/updateRoom/[roomCode]/route.ts | 2 -- 6 files changed, 21 deletions(-) diff --git a/src/app/api/createResult/route.ts b/src/app/api/createResult/route.ts index 761aa42..82c3772 100644 --- a/src/app/api/createResult/route.ts +++ b/src/app/api/createResult/route.ts @@ -4,22 +4,9 @@ import Result from "../../../../models/resultModel"; export async function POST(req: Request) { try { - console.log("Create result API"); const { result } = await req.json(); - console.log({result}) await connectMongoDb(); - // const resultExist = await Result.findOne({ gameId: result.gameId }); - // if (resultExist) { - // return NextResponse.json( - // { - // message: "Result already added for this game", - // status: false, - // }, - // { status: 409 } - // ); - // } - await Result.create(result); return NextResponse.json( @@ -31,7 +18,6 @@ export async function POST(req: Request) { ); } catch (error) { if (error instanceof Error) { - console.error("Error while adding result:", error.message); return NextResponse.json( { message: `Error while adding result: ${error.message}`, diff --git a/src/app/api/createRoom/route.ts b/src/app/api/createRoom/route.ts index 54e115e..b7baa43 100644 --- a/src/app/api/createRoom/route.ts +++ b/src/app/api/createRoom/route.ts @@ -4,10 +4,8 @@ import Game from "../../../../models/gameModel"; export async function POST(req: Request) { try { - console.log("Create room API called"); await connectMongoDb(); const { game } = await req.json(); - // console.log("Room Code: ", game) const roomExist = await Game.findOne({ roomCode: game.roomCode }); if (roomExist) { diff --git a/src/app/api/getResult/[userId]/route.ts b/src/app/api/getResult/[userId]/route.ts index 55b3da1..b0fdecc 100644 --- a/src/app/api/getResult/[userId]/route.ts +++ b/src/app/api/getResult/[userId]/route.ts @@ -9,7 +9,6 @@ export async function GET( const { userId } = params; try { - console.log("Get Result API called"); await connectMongoDb(); const aggregationPipeline = [ diff --git a/src/app/api/getRoom/[roomCode]/route.tsx b/src/app/api/getRoom/[roomCode]/route.tsx index 1faee03..301f0cf 100644 --- a/src/app/api/getRoom/[roomCode]/route.tsx +++ b/src/app/api/getRoom/[roomCode]/route.tsx @@ -9,7 +9,6 @@ export async function GET( const { roomCode } = params; try { - console.log("Get Room APi called") await connectMongoDb(); const room = await Game.findOne({ roomCode }) .populate("playerXId") diff --git a/src/app/api/joinRoom/[roomCode]/route.ts b/src/app/api/joinRoom/[roomCode]/route.ts index 4acc333..9d86ab1 100644 --- a/src/app/api/joinRoom/[roomCode]/route.ts +++ b/src/app/api/joinRoom/[roomCode]/route.ts @@ -12,7 +12,6 @@ export async function PATCH( await connectMongoDb(); try { - console.log("Join Room Api is called") const roomExist = await Game.findOne({ roomCode }); if (!roomExist) { diff --git a/src/app/api/updateRoom/[roomCode]/route.ts b/src/app/api/updateRoom/[roomCode]/route.ts index c25b6e7..5fdfc3f 100644 --- a/src/app/api/updateRoom/[roomCode]/route.ts +++ b/src/app/api/updateRoom/[roomCode]/route.ts @@ -6,10 +6,8 @@ export async function PATCH( req: Request, { params }: { params: JoinRoomApiParams } ) { - console.log("Update room Api is called") const { roomCode } = params; const game = await req.json(); - // console.log({game}, roomCode); await connectMongoDb(); try { const room = await Game.findOneAndUpdate( From 64c4a919881759705ac35a346ed235e81f945091 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Mon, 19 Feb 2024 11:17:52 +0530 Subject: [PATCH 31/56] feat: add .env for the port number --- socker-server/.env.example | 1 + socker-server/.gitignore | 3 ++- socker-server/index.js | 6 ++++-- socker-server/package.json | 1 + socker-server/yarn.lock | 5 +++++ 5 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 socker-server/.env.example diff --git a/socker-server/.env.example b/socker-server/.env.example new file mode 100644 index 0000000..2f304be --- /dev/null +++ b/socker-server/.env.example @@ -0,0 +1 @@ +PORT="" \ No newline at end of file diff --git a/socker-server/.gitignore b/socker-server/.gitignore index 30bc162..94c74ef 100644 --- a/socker-server/.gitignore +++ b/socker-server/.gitignore @@ -1 +1,2 @@ -/node_modules \ No newline at end of file +/node_modules +/.env diff --git a/socker-server/index.js b/socker-server/index.js index b3abebf..3259238 100644 --- a/socker-server/index.js +++ b/socker-server/index.js @@ -1,8 +1,10 @@ import express from "express"; import http from "http"; import { Server } from "socket.io"; +import dotenv from 'dotenv' +dotenv.config() - +const PORT = process.env.PORT; const app = express(); const server = http.createServer(app); const io = new Server(server, { @@ -36,5 +38,5 @@ const io = new Server(server, { }); server.listen(8000, () => { - console.log("Server running on port: 8000"); + console.log("Server running on port: ", PORT); }); \ No newline at end of file diff --git a/socker-server/package.json b/socker-server/package.json index 9b75a66..ebb28f3 100644 --- a/socker-server/package.json +++ b/socker-server/package.json @@ -13,6 +13,7 @@ "dependencies": { "body-parser": "^1.20.2", "cors": "^2.8.5", + "dotenv": "^16.4.4", "express": "^4.18.2", "nodemon": "^3.0.3", "socket.io": "^4.7.4" diff --git a/socker-server/yarn.lock b/socker-server/yarn.lock index 2321586..5beaa43 100644 --- a/socker-server/yarn.lock +++ b/socker-server/yarn.lock @@ -222,6 +222,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +dotenv@^16.4.4: + version "16.4.4" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.4.tgz#a26e7bb95ebd36272ebb56edb80b826aecf224c1" + integrity sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" From 894b10448fec5ac979207cc39623204973a93831 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 21 Feb 2024 19:12:18 +0530 Subject: [PATCH 32/56] refac: change static to dynamic --- src/modals/profileModal.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/modals/profileModal.tsx b/src/modals/profileModal.tsx index e89ad8b..f54d6ff 100644 --- a/src/modals/profileModal.tsx +++ b/src/modals/profileModal.tsx @@ -1,13 +1,24 @@ "use client"; + import { useState } from "react"; + import Image from "next/image"; + import profileImage from "../../assets/profileIcon.svg"; -import whiteBgProfileIcon from '../../assets/whiteBgProfileIcon.svg' + +import whiteBgProfileIcon from "../../assets/whiteBgProfileIcon.svg"; + import { signOut } from "next-auth/react"; + import PortalProvider from "../components/portalProvider/portalProvider"; -const ProfileModal = () => { +const ProfileModal = ({ + userName, +}: { + userName: string | null | undefined; +}) => { const [openModal, setOpenModal] = useState(false); + return (
    From 025fe599f85e34fb15fe45240e3e6e0cfaf9c04b Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 21 Feb 2024 19:19:42 +0530 Subject: [PATCH 33/56] feat: add rematch --- assets/rematch.svg | 7 +++++ src/components/rematch/rematch.tsx | 38 ++++++++++++++++++++++++++ src/components/squares/squares.tsx | 9 ++++-- src/components/startGame/startGame.tsx | 4 +-- src/modals/resultModal.tsx | 34 +++++++++++++++++++---- 5 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 assets/rematch.svg create mode 100644 src/components/rematch/rematch.tsx diff --git a/assets/rematch.svg b/assets/rematch.svg new file mode 100644 index 0000000..3ebd656 --- /dev/null +++ b/assets/rematch.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/components/rematch/rematch.tsx b/src/components/rematch/rematch.tsx new file mode 100644 index 0000000..f0a98d8 --- /dev/null +++ b/src/components/rematch/rematch.tsx @@ -0,0 +1,38 @@ +"use client"; + +import Image from "next/image"; +import React, { useContext } from "react"; +import rematch from "../../../assets/rematch.svg"; +import { GameContext } from "@/context/gameContext"; +import { handleGameState } from "@/utils/handleGameState"; + +const Rematch = () => { + const { game, setGame } = useContext(GameContext) as GameContextType; + const handleRematch = () => { + handleGameState( + game, + setGame, + Array(9).fill(""), + game.winner === "X" || game.winner == null ? "O" : "X" + ); + }; + return ( +
    + +
    + ); +}; + +export default Rematch; diff --git a/src/components/squares/squares.tsx b/src/components/squares/squares.tsx index 85ae564..11ee94a 100644 --- a/src/components/squares/squares.tsx +++ b/src/components/squares/squares.tsx @@ -10,7 +10,12 @@ import { handleGameState } from "@/utils/handleGameState"; import { handleGameEnd } from "@/utils/handleGameEnd"; import socket from "@/utils/socket"; -function Square({ value, i, session }: SquareProps) { + +interface Props extends SquareProps{ + session: ClientSideSession | undefined; +} + +function Square({ value, i, session }: Props) { const { game, setGame } = useContext(GameContext) as GameContextType; useEffect(()=>{ @@ -56,7 +61,7 @@ async function handlePlayer(index: number) { const Squares = ({ i }: SquaresProps) => { const { game } = useContext(GameContext) as GameContextType; - const { data: session } = useSession(); + const { data: session } = useSession(); const value = game.board[i] === "X" ? : game.board[i] === "O" ? : null; diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index 7bc4820..7fc29d2 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -49,7 +49,7 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { socket.emit("joinSocketChannel", customRoomCode) router.push(`/room/${customRoomCode}`); } else { - showErrorToast(data.message); + showErrorToast(data.message, "error"); setLoading({ ...loading, createRoom: false }); throw new Error("Failed to create room"); } @@ -83,7 +83,7 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { const data = await res.json(); if (!res.ok) { - showErrorToast(data.message); + showErrorToast(data.message, "error"); setLoading({ ...loading, joinRoom: false }); return; } diff --git a/src/modals/resultModal.tsx b/src/modals/resultModal.tsx index e629334..51518ca 100644 --- a/src/modals/resultModal.tsx +++ b/src/modals/resultModal.tsx @@ -1,19 +1,38 @@ -// ResultModal component import PortalProvider from "@/components/portalProvider/portalProvider"; import { useRouter } from "next/navigation"; -import React from "react"; +import React, { useContext, useEffect, useState } from "react"; import closeIcon from "../../assets/cross.svg"; import Image from "next/image"; - +import Rematch from "@/components/rematch/rematch"; +import socket from "@/utils/socket"; +import { GameContext } from "@/context/gameContext"; +import { showErrorToast } from "@/utils/toast"; +import ToastConainer from "@/components/toastConainer"; const ResultModal = ({ status }: { status: string }) => { + const [show, setShow] = useState(true); + const {game} = useContext(GameContext) as GameContextType; const router = useRouter(); - const closeModal = () => { + socket.emit("leaveGame", { + roomCode: game.roomCode, + message: "Opponent left game", + }); router.push("/"); + setShow(false) }; + useEffect(()=>{ + socket.on("recieveLeaveGame", (data)=>{ + showErrorToast(data, "error") + }) + return () => { + socket.off("recieveLeaveGame"); + }; + },[]) + + return ( - +
    { Cross Icon{" "}
    -

    {status}

    +
    + +
+ ); }; From 74949d28027bab94c656b505c2f16f8178f58735 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 21 Feb 2024 19:35:53 +0530 Subject: [PATCH 34/56] refac: add ts and seperate auth file because of issue at built time --- socker-server/.env.example | 1 - socker-server/.gitignore | 2 - socker-server/index.js | 42 -- socker-server/package.json | 21 - socker-server/yarn.lock | 829 ----------------------- src/app/(authentication)/signup/page.tsx | 9 +- src/app/api/auth/[...nextauth]/route.ts | 77 +-- src/app/api/joinRoom/[roomCode]/route.ts | 3 +- src/app/page.tsx | 2 +- src/types/types.ts | 26 +- src/utils/authOptions.ts | 76 +++ src/utils/checkCurrentTurn.ts | 15 +- src/utils/toast.ts | 39 +- 13 files changed, 149 insertions(+), 993 deletions(-) delete mode 100644 socker-server/.env.example delete mode 100644 socker-server/.gitignore delete mode 100644 socker-server/index.js delete mode 100644 socker-server/package.json delete mode 100644 socker-server/yarn.lock create mode 100644 src/utils/authOptions.ts diff --git a/socker-server/.env.example b/socker-server/.env.example deleted file mode 100644 index 2f304be..0000000 --- a/socker-server/.env.example +++ /dev/null @@ -1 +0,0 @@ -PORT="" \ No newline at end of file diff --git a/socker-server/.gitignore b/socker-server/.gitignore deleted file mode 100644 index 94c74ef..0000000 --- a/socker-server/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/node_modules -/.env diff --git a/socker-server/index.js b/socker-server/index.js deleted file mode 100644 index 3259238..0000000 --- a/socker-server/index.js +++ /dev/null @@ -1,42 +0,0 @@ -import express from "express"; -import http from "http"; -import { Server } from "socket.io"; -import dotenv from 'dotenv' -dotenv.config() - -const PORT = process.env.PORT; -const app = express(); -const server = http.createServer(app); -const io = new Server(server, { - cors: { - origin: '*' - } - }); - - const socketConnections = new Map(); - - io.on("connection", (socket) => { - const socketId = socket.id; - - socketConnections.set(socketId, socket); - - socket.on("joinSocketChannel", (data) => { - socket.join(data); - }); - - socket.on("joinGame", (data) => { - socket.to(data.roomCode).emit("recieveJoinGame", data); - }); - - socket.on("updateGame", (data) => { - socket.to(data.roomCode).emit("recieveUpdateGameData", data); - }); - - socket.on("disconnect", () => { - socketConnections.delete(socketId); - }); - }); - - server.listen(8000, () => { - console.log("Server running on port: ", PORT); - }); \ No newline at end of file diff --git a/socker-server/package.json b/socker-server/package.json deleted file mode 100644 index ebb28f3..0000000 --- a/socker-server/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "socket", - "version": "1.0.0", - "description": "", - "main": "index.js", - "type": "module", - "scripts": { - "start": "nodemon index.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "body-parser": "^1.20.2", - "cors": "^2.8.5", - "dotenv": "^16.4.4", - "express": "^4.18.2", - "nodemon": "^3.0.3", - "socket.io": "^4.7.4" - } -} diff --git a/socker-server/yarn.lock b/socker-server/yarn.lock deleted file mode 100644 index 5beaa43..0000000 --- a/socker-server/yarn.lock +++ /dev/null @@ -1,829 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.12": - version "2.8.17" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" - integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@>=10.0.0": - version "20.11.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" - integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== - dependencies: - undici-types "~5.26.4" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.4, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -body-parser@^1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -chokidar@^3.5.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - 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" - optionalDependencies: - fsevents "~2.3.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -cors@^2.8.5, cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4, debug@~4.3.1, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -define-data-property@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -dotenv@^16.4.4: - version "16.4.4" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.4.tgz#a26e7bb95ebd36272ebb56edb80b826aecf224c1" - integrity sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -engine.io-parser@~5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" - integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== - -engine.io@~6.5.2: - version "6.5.4" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" - integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.2.1" - ws "~8.11.0" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -express@^4.18.2: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-property-descriptors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" - integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== - dependencies: - function-bind "^1.1.2" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -nodemon@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.3.tgz#244a62d1c690eece3f6165c6cdb0db03ebd80b76" - integrity sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^7.5.3: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-function-length@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" - integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== - dependencies: - define-data-property "^1.1.2" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.1" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -side-channel@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" - integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - -socket.io-adapter@~2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" - integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== - dependencies: - ws "~8.11.0" - -socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -socket.io@^4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.4.tgz#2401a2d7101e4bdc64da80b140d5d8b6a8c7738b" - integrity sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - cors "~2.8.5" - debug "~4.3.2" - engine.io "~6.5.2" - socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.4" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -ws@~8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/src/app/(authentication)/signup/page.tsx b/src/app/(authentication)/signup/page.tsx index 7908d56..5bcc056 100644 --- a/src/app/(authentication)/signup/page.tsx +++ b/src/app/(authentication)/signup/page.tsx @@ -2,12 +2,19 @@ import FormHeader from "@/components/formHeader/formHeader"; import Signup from "@/components/signup/signup"; import React from "react"; import { Metadata } from "next"; +import { getServerSession } from "next-auth"; +import { redirect } from "next/navigation"; export const metadata: Metadata = { title: "Signup", }; -const SignupPage = () => { +const SignupPage = async () => { + const session: Session | null = await getServerSession(); + + if (session) { + redirect("/"); + } return ( <> { - try { - await connectMongoDb(); - const user = await User.findOne({ email: credentials?.email }); - if (!user) throw new Error("Invalid User Credentials"); - const isCorrect = await bcrypt.compare( - credentials?.password, - user?.password - ); - if (!isCorrect) throw new Error("Invalid User Credentials"); - return user; - } catch (err: unknown) { - if (err instanceof Error) { - throw new Error(err.message); - } else { - throw new Error("An unknown error occurred."); - } - } -} - -export const authOptions = { - pages: { - signIn: "/login", - }, - providers: [ - CredentialsProvider({ - id: "credentials", - name: "credentials", - credentials: {}, - async authorize(credentials) { - try { - const user = await login(credentials); - return user; - } catch (error: unknown) { - if (error instanceof Error) { - throw new Error(error.message); - } else { - throw new Error("An unknown error occurred."); - } - } - }, - }), - ], - callbacks: { - async jwt({ token, user }) { - if (user) { - token.username = user.username; - token.email = user.email; - token.id = user.id; - } - return token; - }, - async session({ session, token }) { - if (token) { - session.user.username = token.username; - session.user.email = token.email; - session.id = token.id; - } - return session; - }, - }, -}; - -export const handler = NextAuth(authOptions); +const handler = NextAuth(authOptions); export { handler as GET, handler as POST }; diff --git a/src/app/api/joinRoom/[roomCode]/route.ts b/src/app/api/joinRoom/[roomCode]/route.ts index 9d86ab1..0407a5d 100644 --- a/src/app/api/joinRoom/[roomCode]/route.ts +++ b/src/app/api/joinRoom/[roomCode]/route.ts @@ -5,7 +5,7 @@ import Game from "../../../../../models/gameModel"; export async function PATCH( req: Request, { params }: { params: JoinRoomApiParams } -) { +): Promise { const { roomCode } = params; const game = await req.json(); const { playerOId, status } = game; @@ -45,5 +45,4 @@ export async function PATCH( { status: 500 } ); } - return null; } diff --git a/src/app/page.tsx b/src/app/page.tsx index 93a1436..17b2c94 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -30,7 +30,7 @@ export default async function Dashboard() {
- +
diff --git a/src/types/types.ts b/src/types/types.ts index 127f014..f851312 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -115,6 +115,7 @@ interface JoinRoomApiParams { } interface Session { + session: any; name?: string | null | undefined; email?: string | null | undefined; image?: string | null | undefined; @@ -127,7 +128,6 @@ interface SquaresProps { interface SquareProps { value: JSX.Element | null; i: number; - session: Session | undefined; } interface WindowSize { @@ -155,3 +155,27 @@ interface ResultResponse { }; status: boolean; } + +interface Token { + _id:string|undefined; + name: string; + email: string; + sub: string; + picture: undefined; + id: string; + iat: number; + exp: number; + jti: string; +} + +interface CallbacksSession{ + id:string|undefined, + user: { name: string|undefined, email: string|undefined, image: string|undefined }, + expires: string +} + +interface ClientSideSession { + name?: string | null | undefined; + email?: string | null | undefined; + image?: string | null | undefined; +} \ No newline at end of file diff --git a/src/utils/authOptions.ts b/src/utils/authOptions.ts new file mode 100644 index 0000000..37ccef2 --- /dev/null +++ b/src/utils/authOptions.ts @@ -0,0 +1,76 @@ +import NextAuth from "next-auth/next"; +import CredentialsProvider from "next-auth/providers/credentials"; +import connectMongoDb from "./dbConnection"; +import User from "../../models/userModel"; +import bcrypt from "bcrypt"; +import { Document } from "mongoose"; + +interface user extends Document { + name: string; + email: string; + password: string; +} + +async function login(credentials: Credentials): Promise { + try { + await connectMongoDb(); + const user = await User.findOne({ email: credentials?.email }); + if (!user) throw new Error("Invalid User Credentials"); + const isCorrect = await bcrypt.compare( + credentials?.password, + user?.password + ); + if (!isCorrect) throw new Error("Invalid User Credentials"); + return user; + } catch (err: unknown) { + if (err instanceof Error) { + throw new Error(err.message); + } else { + throw new Error("An unknown error occurred."); + } + } +} + +export const authOptions = { + pages: { + signIn: "/login", + }, + providers: [ + CredentialsProvider({ + id: "credentials", + name: "credentials", + credentials: {}, + async authorize(credentials: any) { + try { + const user = await login(credentials); + return user; + } catch (error: unknown) { + if (error instanceof Error) { + throw new Error(error.message); + } else { + throw new Error("An unknown error occurred."); + } + } + }, + }), + ], + callbacks: { + // async jwt({ token, user }:{token: Partial, user:Partial}) { + // if (user) { + // token.name = user.name; + // token.email = user.email; + // token.id = user._id; + // } + // return token; + // }, + // async session({ session, token }: {session:CallbacksSession, token:Partial}) { + // console.log({session}, {token}) + // if (token) { + // session.user.name = token.name; + // session.user.email = token.email; + // session.id = token._id; + // } + // return session; + // }, + }, +}; \ No newline at end of file diff --git a/src/utils/checkCurrentTurn.ts b/src/utils/checkCurrentTurn.ts index 42dd8d4..1643f90 100644 --- a/src/utils/checkCurrentTurn.ts +++ b/src/utils/checkCurrentTurn.ts @@ -1,21 +1,24 @@ +import { Session } from "next-auth"; + export const checkTurn = ( game: Game, - session: Session | undefined, - i: number, + session: ClientSideSession | undefined, + i: number ) => { - if (!game.winner && + if ( + !game.winner && game.status && game.board[i] === "" && game.turn === "X" && - (game.playerXId as UserData).email === session!.email + (game.playerXId as UserData).email === session?.email ) { return false; } else if ( - !game.winner && + !game.winner && game.status && game.board[i] === "" && game.turn === "O" && - (game.playerOId as UserData).email === session!.email + (game.playerOId as UserData).email === session?.email ) { return false; } else { diff --git a/src/utils/toast.ts b/src/utils/toast.ts index b2d73d9..843bb90 100644 --- a/src/utils/toast.ts +++ b/src/utils/toast.ts @@ -1,16 +1,31 @@ import { Bounce, toast } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; -export const showErrorToast = (message: string) => { - toast.error(message, { - position: "top-center", - autoClose: 5000, - hideProgressBar: false, - closeOnClick: true, - pauseOnHover: true, - draggable: true, - progress: undefined, - theme: "light", - transition: Bounce, - }); +export const showErrorToast = (message: string, messageType:string) => { + if(messageType ==="success"){ + toast.success(message, { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + }else if(messageType==="error"){ + toast.error(message, { + position: "top-center", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "light", + transition: Bounce, + }); + } + }; From 0be8138438fed29924c7f7863a694e8bea14f24c Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Wed, 21 Feb 2024 19:44:00 +0530 Subject: [PATCH 35/56] refac: add react-hook-form lib --- package.json | 6 +- src/components/input/input.tsx | 34 ----- src/components/login/login.tsx | 80 ++++++----- src/components/signup/signup.tsx | 128 ++++++++++++----- src/constants/formFields.ts | 68 --------- yarn.lock | 234 ++++++++++++++++++------------- 6 files changed, 273 insertions(+), 277 deletions(-) delete mode 100644 src/components/input/input.tsx delete mode 100644 src/constants/formFields.ts diff --git a/package.json b/package.json index fcb5077..15541da 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "@hookform/resolvers": "^3.3.4", "@types/socket.io": "^3.0.2", "bcrypt": "^5.1.1", "cors": "^2.8.5", @@ -18,10 +19,11 @@ "react": "^18", "react-confetti": "^6.1.0", "react-dom": "^18", - "react-hook-form": "^7.49.3", + "react-hook-form": "^7.50.1", "react-toastify": "^10.0.4", "socket.io": "^4.7.4", - "socket.io-client": "^4.7.4" + "socket.io-client": "^4.7.4", + "yup": "^1.3.3" }, "devDependencies": { "@types/bcrypt": "^5.0.2", diff --git a/src/components/input/input.tsx b/src/components/input/input.tsx deleted file mode 100644 index 6e28bd4..0000000 --- a/src/components/input/input.tsx +++ /dev/null @@ -1,34 +0,0 @@ -const fixedInputClass = - "rounded-md appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-purple-500 focus:border-purple-500 focus:z-10 sm:text-sm"; - -export default function Input({ - handleChange, - value, - labelText, - labelFor, - id, - name, - type, - isRequired = false, - placeholder, - customClass, -}: Partial) { - return ( -
- - -
- ); -} diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index 1177b1b..163d949 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -1,24 +1,41 @@ "use client"; -import { FormEvent, useState } from "react"; -import Input from "../input/input"; -import { loginFields } from "@/constants/formFields"; -import FormAdditionalLinks from "../formAdditionalLinks/formAdditionalLinks"; +import { useState } from "react"; import FormAction from "../formAction/formAction"; import { SignInResponse, signIn } from "next-auth/react"; import { useRouter } from "next/navigation"; +import { useForm, SubmitHandler } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; + +const InputClass = + "rounded-md appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-purple-500 focus:border-purple-500 focus:z-10 sm:text-sm"; interface LoginState { email: string; password: string; } -const fields: LoginFields[] = loginFields; +const schema = yup + .object() + .shape({ + email: yup + .string() + .required("Email is required") + .email("Invalid email format"), + password: yup + .string() + .required("Password is required"), + }) + .required(); export default function Login() { const router = useRouter(); - const [loginState, setLoginState] = useState({ - email: "", - password: "", + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), }); const [loading, setLoading] = useState(false); @@ -26,20 +43,13 @@ export default function Login() { status: "", message: "", }); - const handleChange = ( - e: React.ChangeEvent - ) => { - const { name, value } = e.target; - setLoginState({ ...loginState, [name]: value }); - }; - const handleSubmit = async (e: FormEvent) => { - e.preventDefault(); + const onSubmit: SubmitHandler = async (data) => { try { setLoading(true); const res: SignInResponse | undefined = await signIn("credentials", { - email: loginState?.email, - password: loginState?.password, + email: data.email, + password: data.password, redirect: false, }); if (res?.error) { @@ -61,27 +71,25 @@ export default function Login() { }; return ( -
-
- {fields.map((field) => ( - - ))} + +
+
+ + +

{errors.email?.message}

+
+
+ + +

{errors.password?.message}

+
- diff --git a/src/components/signup/signup.tsx b/src/components/signup/signup.tsx index 620cb93..b5eee3e 100644 --- a/src/components/signup/signup.tsx +++ b/src/components/signup/signup.tsx @@ -1,31 +1,64 @@ "use client"; -import { signupFields } from "@/constants/formFields"; import React, { useState } from "react"; import FormAction from "../formAction/formAction"; -import Input from "../input/input"; import { signup } from "@/constants/apiUrl"; import { useRouter } from "next/navigation"; +import { useForm, SubmitHandler } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +const InputClass = + "rounded-md appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-purple-500 focus:border-purple-500 focus:z-10 sm:text-sm"; -const fields: LoginFields[] = signupFields; -let fieldsState: Record = {}; -fields.forEach((field) => (fieldsState[field.name] = "")); +interface SignupState { + name: string; + email: string; + password: string; + confirmPassword: string; +} + +const schema = yup + .object() + .shape({ + name: yup + .string() + .required("Name is required") + .max(30, "Not more than 30 letters") + .min(4, "Not less than 4 letters"), + email: yup + .string() + .required("Email is required") + .email("Invalid email format") + .max(30, "Not more than 30 letters") + .min(4, "Not less than 4 letters"), + password: yup + .string() + .required("Password is required") + .max(10, "Not more than 10 letters") + .min(4, "Not less than 4 letters"), + confirmPassword: yup + .string() + .required("Confirm password is required") + .oneOf([yup.ref("password")], "Passwords must match"), + }) + .required(); const Signup = () => { const router = useRouter(); - const [signupState, setSignupState] = useState(fieldsState); const [loading, setLoading] = useState(false); const [apiResponse, setApiResponse] = useState({ status: "", message: "", }); - const handleChange = ( - e: React.ChangeEvent - ) => { - setSignupState({ ...signupState, [e.target.name]: e.target.value }); - }; - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + + const onSubmit: SubmitHandler = async (data) => { try { setLoading(true); const res = await fetch(signup, { @@ -33,21 +66,20 @@ const Signup = () => { headers: { "Content-Type": "application/json", }, - body: JSON.stringify(signupState), + body: JSON.stringify(data), }); - const data = await res.json(); + const resData = await res.json(); if (res.ok) { - setApiResponse(data); - setSignupState(fieldsState); - router.push("/login") + setApiResponse(resData); + router.push("/login"); setLoading(false); } else { - setApiResponse(data); + setApiResponse(resData); setLoading(false); throw new Error("Failed to create account"); } - } catch (error:unknown) { - if(error instanceof Error){ + } catch (error: unknown) { + if (error instanceof Error) { setLoading(false); console.error("Error creating account:", error?.message); } @@ -55,24 +87,46 @@ const Signup = () => { }; return ( - -
- {fields.map((field) => ( - +
+
+ + +

{errors.name?.message}

+
+
+ + +

{errors.email?.message}

+
+
+ + +

{errors.password?.message}

+
+
+ + - ))} +

{errors.confirmPassword?.message}

+
- + ); }; diff --git a/src/constants/formFields.ts b/src/constants/formFields.ts deleted file mode 100644 index d774973..0000000 --- a/src/constants/formFields.ts +++ /dev/null @@ -1,68 +0,0 @@ -const loginFields=[ - { - labelText:"Email address", - labelFor:"email-address", - id:"email-address", - name:"email", - type:"email", - autoComplete:"email", - isRequired:true, - placeholder:"Email address" - }, - { - labelText:"Password", - labelFor:"password", - id:"password", - name:"password", - type:"password", - autoComplete:"current-password", - isRequired:true, - placeholder:"Password" - } -] - -const signupFields=[ - { - labelText:"Name", - labelFor:"name", - id:"name", - name:"name", - type:"text", - autoComplete:"name", - isRequired:true, - placeholder:"name" - }, - { - labelText:"Email address", - labelFor:"email-address", - id:"email-address", - name:"email", - type:"email", - autoComplete:"email", - isRequired:true, - placeholder:"Email address" - }, - { - labelText:"Password", - labelFor:"password", - id:"password", - name:"password", - type:"password", - autoComplete:"current-password", - isRequired:true, - placeholder:"Password" - }, - { - labelText:"Confirm Password", - labelFor:"confirm-password", - id:"confirm-password", - name:"confirm-password", - type:"password", - autoComplete:"confirm-password", - isRequired:true, - placeholder:"Confirm Password" - } -] - - -export {loginFields,signupFields} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index f4ce1df..0feee96 100644 --- a/yarn.lock +++ b/yarn.lock @@ -51,6 +51,11 @@ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz" integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@hookform/resolvers@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.4.tgz" + integrity sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ== + "@humanwhocodes/config-array@^0.11.13": version "0.11.14" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" @@ -148,26 +153,6 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39" - integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ== - -"@next/swc-darwin-x64@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9" - integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g== - -"@next/swc-linux-arm64-gnu@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c" - integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ== - -"@next/swc-linux-arm64-musl@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0" - integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g== - "@next/swc-linux-x64-gnu@14.1.0": version "14.1.0" resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz" @@ -178,21 +163,6 @@ resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz" integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg== -"@next/swc-win32-arm64-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a" - integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ== - -"@next/swc-win32-ia32-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0" - integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw== - -"@next/swc-win32-x64-msvc@14.1.0": - version "14.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2" - integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -201,7 +171,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -272,7 +242,7 @@ dependencies: mongoose "*" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@^20": +"@types/node@*", "@types/node@^20", "@types/node@>=10.0.0": version "20.11.13" resolved "https://registry.npmjs.org/@types/node/-/node-20.11.13.tgz" integrity sha512-5G4zQwdiQBSWYTDAH1ctw2eidqdhMJaNsiIDKHFr55ihz5Trl2qqR8fdrT732yPBho5gkNxXm67OxWFBqX9aPg== @@ -393,7 +363,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: version "8.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -605,7 +575,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64id@2.0.0, base64id@~2.0.0: +base64id@~2.0.0, base64id@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== @@ -645,7 +615,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.22.2: +browserslist@^4.22.2, "browserslist@>= 4.21.0": version "4.22.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz" integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== @@ -773,7 +743,7 @@ cookie@~0.4.1: cors@^2.8.5: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -811,13 +781,6 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -debug@4, debug@4.x, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -825,6 +788,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@4, debug@4.x: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -1098,7 +1068,7 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.28.1: +eslint-plugin-import@*, eslint-plugin-import@^2.28.1: version "2.29.1" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== @@ -1183,7 +1153,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8: version "8.56.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz" integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== @@ -1361,11 +1331,6 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.1, function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -1440,7 +1405,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@10.3.10, glob@^10.3.10: +glob@^10.3.10, glob@10.3.10: version "10.3.10" resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== @@ -1586,7 +1551,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@^2.0.3, inherits@2: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1975,19 +1940,26 @@ mime-types@~2.1.34: dependencies: mime-db "1.52.0" -minimatch@9.0.3, minimatch@^9.0.1: +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1: version "9.0.3" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" @@ -2001,16 +1973,16 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": version "7.0.4" resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" @@ -2066,16 +2038,16 @@ mquery@5.0.0: dependencies: debug "4.x" +ms@^2.1.1, ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - mz@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" @@ -2115,7 +2087,7 @@ next-auth@^4.24.5: preact-render-to-string "^5.1.19" uuid "^8.3.2" -next@14.1.0: +"next@^12.2.5 || ^13 || ^14", next@14.1.0: version "14.1.0" resolved "https://registry.npmjs.org/next/-/next-14.1.0.tgz" integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q== @@ -2419,6 +2391,15 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^8, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: + version "8.4.33" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -2428,15 +2409,6 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.23: - version "8.4.33" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz" - integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" - preact-render-to-string@^5.1.19: version "5.2.6" resolved "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz" @@ -2444,7 +2416,7 @@ preact-render-to-string@^5.1.19: dependencies: pretty-format "^3.8.0" -preact@^10.6.3: +preact@^10.6.3, preact@>=10: version "10.19.3" resolved "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz" integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== @@ -2468,6 +2440,11 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +property-expr@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz" + integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA== + punycode@^2.1.0, punycode@^2.3.0: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" @@ -2485,7 +2462,7 @@ react-confetti@^6.1.0: dependencies: tween-functions "^1.2.0" -react-dom@^18: +"react-dom@^17.0.2 || ^18", react-dom@^18, react-dom@^18.2.0, react-dom@>=16: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -2493,10 +2470,10 @@ react-dom@^18: loose-envify "^1.1.0" scheduler "^0.23.0" -react-hook-form@^7.49.3: - version "7.49.3" - resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.3.tgz" - integrity sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ== +react-hook-form@^7.0.0, react-hook-form@^7.50.1: + version "7.50.1" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.50.1.tgz" + integrity sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ== react-is@^16.13.1: version "16.13.1" @@ -2510,7 +2487,7 @@ react-toastify@^10.0.4: dependencies: clsx "^2.1.0" -react@^18: +"react@^16.3.0 || ^17.0.1 || ^18.0.0", "react@^16.8.0 || ^17 || ^18", "react@^17.0.2 || ^18", react@^18, react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -2649,7 +2626,14 @@ semver@^6.0.0, semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.5, semver@^7.5.4: +semver@^7.3.5: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.4: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -2777,7 +2761,14 @@ streamsearch@^1.1.0: resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2786,7 +2777,25 @@ streamsearch@^1.1.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string-width@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -2837,14 +2846,14 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - safe-buffer "~5.2.0" + ansi-regex "^5.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -2964,6 +2973,11 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +tiny-case@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz" + integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -2971,6 +2985,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + tr46@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz" @@ -3025,6 +3044,11 @@ type-fest@^0.20.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" @@ -3064,7 +3088,7 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typescript@^5: +typescript@^5, typescript@>=3.3.1, typescript@>=4.2.0: version "5.3.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== @@ -3251,3 +3275,13 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yup@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/yup/-/yup-1.3.3.tgz" + integrity sha512-v8QwZSsHH2K3/G9WSkp6mZKO+hugKT1EmnMqLNUcfu51HU9MDyhlETT/JgtzprnrnQHPWsjc6MUDMBp/l9fNnw== + dependencies: + property-expr "^2.0.5" + tiny-case "^1.0.3" + toposort "^2.0.2" + type-fest "^2.19.0" From c6965b2a8f834f24e44ac00e8a04a22fdd834c6d Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 22 Feb 2024 10:05:02 +0530 Subject: [PATCH 36/56] fix: correct socket issue --- socker-server/.env.example | 1 + socker-server/.gitignore | 2 + socker-server/index.js | 50 +++ socker-server/package.json | 21 + socker-server/yarn.lock | 829 +++++++++++++++++++++++++++++++++++++ 5 files changed, 903 insertions(+) create mode 100644 socker-server/.env.example create mode 100644 socker-server/.gitignore create mode 100644 socker-server/index.js create mode 100644 socker-server/package.json create mode 100644 socker-server/yarn.lock diff --git a/socker-server/.env.example b/socker-server/.env.example new file mode 100644 index 0000000..2f304be --- /dev/null +++ b/socker-server/.env.example @@ -0,0 +1 @@ +PORT="" \ No newline at end of file diff --git a/socker-server/.gitignore b/socker-server/.gitignore new file mode 100644 index 0000000..94c74ef --- /dev/null +++ b/socker-server/.gitignore @@ -0,0 +1,2 @@ +/node_modules +/.env diff --git a/socker-server/index.js b/socker-server/index.js new file mode 100644 index 0000000..513dcb6 --- /dev/null +++ b/socker-server/index.js @@ -0,0 +1,50 @@ +import express from "express"; +import http from "http"; +import { Server } from "socket.io"; +import dotenv from 'dotenv' +dotenv.config() + +const PORT = process.env.PORT; +const app = express(); +const server = http.createServer(app); +const io = new Server(server, { + cors: { + origin: '*' + } + }); + + const socketConnections = new Map(); + + io.on("connection", (socket) => { + const socketId = socket.id; + + socketConnections.set(socketId, socket); + + socket.on("joinSocketChannel", (data) => { + socket.join(data); + }); + + socket.on("joinGame", (data) => { + console.log("Joined", data) + socket.to(data.roomCode).emit("recieveJoinGame", data); + }); + + socket.on("updateGame", (data) => { + console.log("Updated", {data}) + socket.to(data.roomCode).emit("recieveUpdateGameData",data); + }); + + socket.on("leaveGame", (data) => { + console.log({data}) + socket.to(data.roomCode).emit("recieveLeaveGame", data.message); + }); + + socket.on("disconnect", () => { + console.log("Disconnected") + socketConnections.delete(socketId); + }); + }); + + server.listen(8000, () => { + console.log("Server running on port: ", PORT); + }); \ No newline at end of file diff --git a/socker-server/package.json b/socker-server/package.json new file mode 100644 index 0000000..ebb28f3 --- /dev/null +++ b/socker-server/package.json @@ -0,0 +1,21 @@ +{ + "name": "socket", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "start": "nodemon index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "dotenv": "^16.4.4", + "express": "^4.18.2", + "nodemon": "^3.0.3", + "socket.io": "^4.7.4" + } +} diff --git a/socker-server/yarn.lock b/socker-server/yarn.lock new file mode 100644 index 0000000..5beaa43 --- /dev/null +++ b/socker-server/yarn.lock @@ -0,0 +1,829 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "20.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" + integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== + dependencies: + undici-types "~5.26.4" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +chokidar@^3.5.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@^2.8.5, cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +define-data-property@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +dotenv@^16.4.4: + version "16.4.4" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.4.tgz#a26e7bb95ebd36272ebb56edb80b826aecf224c1" + integrity sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== + +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-property-descriptors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" + integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== + dependencies: + function-bind "^1.1.2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +nodemon@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.3.tgz#244a62d1c690eece3f6165c6cdb0db03ebd80b76" + integrity sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.5.3: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-function-length@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== + dependencies: + define-data-property "^1.1.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" + integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +socket.io-adapter@~2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" + integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== + dependencies: + ws "~8.11.0" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.4.tgz#2401a2d7101e4bdc64da80b140d5d8b6a8c7738b" + integrity sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== From 7c5633fce7127572601bddfa1f5c6419f6e84108 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 22 Feb 2024 12:34:07 +0530 Subject: [PATCH 37/56] fix: refreshing socket issue --- src/components/squares/squares.tsx | 2 ++ src/modals/resultModal.tsx | 2 ++ src/utils/checkCurrentTurn.ts | 4 ++-- src/utils/handleGameState.ts | 4 ++++ src/utils/socket.ts | 4 ++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/squares/squares.tsx b/src/components/squares/squares.tsx index 11ee94a..a3ee770 100644 --- a/src/components/squares/squares.tsx +++ b/src/components/squares/squares.tsx @@ -19,6 +19,8 @@ function Square({ value, i, session }: Props) { const { game, setGame } = useContext(GameContext) as GameContextType; useEffect(()=>{ + socket.emit("joinSocketChannel", game.roomCode); + socket.on("recieveUpdateGameData", (data) => { setGame({ diff --git a/src/modals/resultModal.tsx b/src/modals/resultModal.tsx index 51518ca..07e5dcf 100644 --- a/src/modals/resultModal.tsx +++ b/src/modals/resultModal.tsx @@ -13,6 +13,8 @@ const ResultModal = ({ status }: { status: string }) => { const {game} = useContext(GameContext) as GameContextType; const router = useRouter(); const closeModal = () => { + socket.emit("joinSocketChannel", game.roomCode); + socket.emit("leaveGame", { roomCode: game.roomCode, message: "Opponent left game", diff --git a/src/utils/checkCurrentTurn.ts b/src/utils/checkCurrentTurn.ts index 1643f90..e286d45 100644 --- a/src/utils/checkCurrentTurn.ts +++ b/src/utils/checkCurrentTurn.ts @@ -10,7 +10,7 @@ export const checkTurn = ( game.status && game.board[i] === "" && game.turn === "X" && - (game.playerXId as UserData).email === session?.email + (game.playerXId as UserData)?.email === session?.email ) { return false; } else if ( @@ -18,7 +18,7 @@ export const checkTurn = ( game.status && game.board[i] === "" && game.turn === "O" && - (game.playerOId as UserData).email === session?.email + (game.playerOId as UserData)?.email === session?.email ) { return false; } else { diff --git a/src/utils/handleGameState.ts b/src/utils/handleGameState.ts index 13741a0..5428e21 100644 --- a/src/utils/handleGameState.ts +++ b/src/utils/handleGameState.ts @@ -9,10 +9,14 @@ export async function handleGameState( ) { setGame({ ...game, board: updatedBoard, turn: updatedTurn }); try { + socket.emit("joinSocketChannel", game.roomCode); + socket.emit("updateGame", { board: updatedBoard, turn: updatedTurn, roomCode: game.roomCode, + status: true, + winner: null, }); const res = await fetch(`${updateRoom}/${game?.roomCode}`, { diff --git a/src/utils/socket.ts b/src/utils/socket.ts index 96b68b0..4c1d28c 100644 --- a/src/utils/socket.ts +++ b/src/utils/socket.ts @@ -4,4 +4,8 @@ const url:string = process.env.NEXT_PUBLIC_SOCKET_SERVER_URL as string; const socket = io(url); +socket.on("connect", () => { + console.log("Socket connected"); + }); + export default socket; From 161f023cae5defb24c40777df1bdb9d33cb56b53 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 22 Feb 2024 12:36:05 +0530 Subject: [PATCH 38/56] refac: remove data from socket and add console for log on render to see it is working or not --- socker-server/index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/socker-server/index.js b/socker-server/index.js index 513dcb6..23170f3 100644 --- a/socker-server/index.js +++ b/socker-server/index.js @@ -21,21 +21,22 @@ const io = new Server(server, { socketConnections.set(socketId, socket); socket.on("joinSocketChannel", (data) => { - socket.join(data); + console.log("Join Socket Room") + socket.join(data); }); socket.on("joinGame", (data) => { - console.log("Joined", data) + console.log("Joined Game") socket.to(data.roomCode).emit("recieveJoinGame", data); }); socket.on("updateGame", (data) => { - console.log("Updated", {data}) + console.log("Update Game") socket.to(data.roomCode).emit("recieveUpdateGameData",data); }); socket.on("leaveGame", (data) => { - console.log({data}) + console.log("Leave Game") socket.to(data.roomCode).emit("recieveLeaveGame", data.message); }); From 361f375d9232b57823512998cc9d204cda3faa29 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 22 Feb 2024 12:41:58 +0530 Subject: [PATCH 39/56] refac: added port if env is null --- socker-server/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/socker-server/index.js b/socker-server/index.js index 23170f3..d33ed5b 100644 --- a/socker-server/index.js +++ b/socker-server/index.js @@ -4,7 +4,7 @@ import { Server } from "socket.io"; import dotenv from 'dotenv' dotenv.config() -const PORT = process.env.PORT; +const PORT = process.env.PORT || 8000; const app = express(); const server = http.createServer(app); const io = new Server(server, { From 668a7598941df59d76166e0b3b89365f813de902 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 22 Feb 2024 15:15:13 +0530 Subject: [PATCH 40/56] refac: add inputClass css as global as it is used in multiple placess --- src/app/globals.css | 5 +++++ src/components/login/login.tsx | 7 ++----- src/components/signup/signup.tsx | 10 ++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/app/globals.css b/src/app/globals.css index 20055d1..90b4c65 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -38,6 +38,11 @@ body { -webkit-text-fill-color: transparent; } +.inputClass{ + @apply rounded-md appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-purple-500 focus:border-purple-500 focus:z-10 sm:text-sm; +} + + .button{ @apply flex items-center justify-center text-lg font-bold text-gray-900 transition duration-300 ease-in ; } diff --git a/src/components/login/login.tsx b/src/components/login/login.tsx index 163d949..99dae34 100644 --- a/src/components/login/login.tsx +++ b/src/components/login/login.tsx @@ -7,9 +7,6 @@ import { useForm, SubmitHandler } from "react-hook-form"; import { yupResolver } from "@hookform/resolvers/yup"; import * as yup from "yup"; -const InputClass = - "rounded-md appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-purple-500 focus:border-purple-500 focus:z-10 sm:text-sm"; - interface LoginState { email: string; password: string; @@ -77,14 +74,14 @@ export default function Login() { - +

{errors.email?.message}

- +

{errors.password?.message}

diff --git a/src/components/signup/signup.tsx b/src/components/signup/signup.tsx index b5eee3e..8b209b6 100644 --- a/src/components/signup/signup.tsx +++ b/src/components/signup/signup.tsx @@ -6,8 +6,6 @@ import { useRouter } from "next/navigation"; import { useForm, SubmitHandler } from "react-hook-form"; import { yupResolver } from "@hookform/resolvers/yup"; import * as yup from "yup"; -const InputClass = - "rounded-md appearance-none relative block w-full px-3 py-2 border border-gray-300 placeholder-gray-500 text-gray-900 focus:outline-none focus:ring-purple-500 focus:border-purple-500 focus:z-10 sm:text-sm"; interface SignupState { name: string; @@ -93,14 +91,14 @@ const Signup = () => { - +

{errors.name?.message}

- +

{errors.email?.message}

@@ -109,7 +107,7 @@ const Signup = () => {

{errors.password?.message}

@@ -120,7 +118,7 @@ const Signup = () => {

{errors.confirmPassword?.message}

From e9f5deaa70f20c10ca6025b4df0c6716f740a9ce Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 22 Feb 2024 15:15:39 +0530 Subject: [PATCH 41/56] refac: add react-web-hook form --- src/components/startGame/startGame.tsx | 162 ++++++++++++++----------- 1 file changed, 91 insertions(+), 71 deletions(-) diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index 7fc29d2..f530000 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -2,40 +2,62 @@ import { useRouter } from "next/navigation"; import React, { useContext, useState } from "react"; import LoadingButton from "../loadingButton/loadingButton"; -import Input from "../input/input"; import { joinRoom, room } from "@/constants/apiUrl"; import { GameContext } from "@/context/gameContext"; import ToastConainer from "../toastConainer"; import { showErrorToast } from "../../utils/toast"; -import socket from "../../utils/socket" +import socket from "../../utils/socket"; +import { useForm, SubmitHandler, Resolver } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; + +interface JoinRoomState { + joinRoomCode: number; +} + +const schema = yup + .object() + .shape({ + joinRoomCode: yup + .number() + .typeError("Room code is required to join the room") + .test("is-6-digits", "Enter 6 digit room code", (value) => { + if (value) { + return value.toString().length === 6; + } + return true; + }), + }) + .required(); const StartGame = ({ userData }: { userData: UserResponseData }) => { const { game, setGame } = useContext(GameContext) as GameContextType; + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema) as Resolver, + }); const [loading, setLoading] = useState({ createRoom: false, joinRoom: false, }); - const [joinRoomCode, setJoinRoomCode] = useState(""); - const handleChange = ( - e: React.ChangeEvent - ) => { - setJoinRoomCode(e.target.value); - }; const router = useRouter(); const createRoom = async () => { setLoading({ ...loading, createRoom: true }); - + try { const customRoomCode = Math.random().toString().substring(2, 8); - + const newGame = { roomCode: customRoomCode, playerXId: userData.data._id, }; - + const res = await fetch(room, { method: "POST", headers: { @@ -43,10 +65,10 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { }, body: JSON.stringify({ game: newGame }), }); - + const data = await res.json(); if (res.ok) { - socket.emit("joinSocketChannel", customRoomCode) + socket.emit("joinSocketChannel", customRoomCode); router.push(`/room/${customRoomCode}`); } else { showErrorToast(data.message, "error"); @@ -59,51 +81,52 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { console.error("Error creating room:", error.message); } } - }; + }; + + const handleJoinRoom: SubmitHandler = async (room) => { + setLoading({ ...loading, joinRoom: true }); + + try { + const res = await fetch(`${joinRoom}/${room.joinRoomCode}`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + status: "true", + playerOId: userData.data._id, + }), + }); - const handleJoinRoom = async () => { - if (joinRoomCode && joinRoomCode.length === 6) { - setLoading({ ...loading, joinRoom: true }); + const data = await res.json(); + if (!res.ok) { + showErrorToast(data.message, "error"); + setLoading({ ...loading, joinRoom: false }); + return; + } setGame({ ...game, status: true, playerOId: userData.data._id, }); - try { - const res = await fetch(`${joinRoom}/${joinRoomCode}`, { - method: "PATCH", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - status: "true", - playerOId: userData.data._id, - }), - }); - - const data = await res.json(); - if (!res.ok) { - showErrorToast(data.message, "error"); - setLoading({ ...loading, joinRoom: false }); - return; - } - socket.emit("joinSocketChannel", joinRoomCode) - - socket.emit("joinGame", { - status: true, - playerOId: userData.data, - roomCode: joinRoomCode, - }); - router.push(`/room/${joinRoomCode}`); - } catch (error) { - setLoading({ ...loading, joinRoom: false }); - if (error instanceof Error) { - console.error(error.message); - } + socket.emit("joinSocketChannel", room.joinRoomCode); + + socket.emit("joinGame", { + status: true, + playerOId: userData.data, + roomCode: room.joinRoomCode, + }); + router.push(`/room/${room.joinRoomCode}`); + } catch (error) { + setLoading({ ...loading, joinRoom: false }); + if (error instanceof Error) { + console.error(error.message); } } }; + console.log(errors.joinRoomCode); + return ( <>
@@ -115,31 +138,28 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { {loading.createRoom ? : "Create Room"}
-
-
- -
+
+
+
+ +

{errors.joinRoomCode?.message}

+
-
- +
+ +
-
+
+ ); From 744f8e41f322387e9bc66fb271b82bc53fb8aee1 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 22 Feb 2024 18:24:58 +0530 Subject: [PATCH 42/56] refac: corrected middleware utilization --- src/app/page.tsx | 8 ++++---- src/components/startGame/startGame.tsx | 1 - middlleware.ts => src/middleware.ts | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) rename middlleware.ts => src/middleware.ts (68%) diff --git a/src/app/page.tsx b/src/app/page.tsx index 17b2c94..e30e7b5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -14,9 +14,9 @@ import ProfileModal from "@/modals/profileModal"; export default async function Dashboard() { const session: Session | null = await getServerSession(); - if (!session) { - redirect("/login"); - } + // if (!session) { + // redirect("/login"); + // } const res = await fetch(`${user}/${session?.user?.email}`); const resData = (await res.json()) as UserResponseData; @@ -30,7 +30,7 @@ export default async function Dashboard() {
- +
diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index f530000..9abaa50 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -125,7 +125,6 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { } }; - console.log(errors.joinRoomCode); return ( <> diff --git a/middlleware.ts b/src/middleware.ts similarity index 68% rename from middlleware.ts rename to src/middleware.ts index 1411c62..366358d 100644 --- a/middlleware.ts +++ b/src/middleware.ts @@ -1,4 +1,4 @@ export { default } from "next-auth/middleware"; export const config = { - matcher: ["/", "room/:code*"], + matcher: ["/", "/room/:code*"], }; From e6b1f5450f22eb1dcd3483f6fcc2b2632a70e918 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Thu, 22 Feb 2024 19:31:54 +0530 Subject: [PATCH 43/56] feat: add profile page, and required api --- assets/sortArrow.svg | 7 ++ src/app/(authentication)/loading.tsx | 2 +- src/app/api/getProfileResult/[id]/route.ts | 106 +++++++++++++++++++++ src/app/profile/[id]/page.tsx | 102 ++++++++++++++++++++ src/modals/profileModal.tsx | 13 ++- src/utils/authOptions.ts | 1 - 6 files changed, 227 insertions(+), 4 deletions(-) create mode 100644 assets/sortArrow.svg create mode 100644 src/app/api/getProfileResult/[id]/route.ts create mode 100644 src/app/profile/[id]/page.tsx diff --git a/assets/sortArrow.svg b/assets/sortArrow.svg new file mode 100644 index 0000000..dee5f39 --- /dev/null +++ b/assets/sortArrow.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/app/(authentication)/loading.tsx b/src/app/(authentication)/loading.tsx index e6cbc7f..6c1c415 100644 --- a/src/app/(authentication)/loading.tsx +++ b/src/app/(authentication)/loading.tsx @@ -2,7 +2,7 @@ import Image from "next/image"; import loaderIcon from '../../../assets/loaderIcon.svg' export default function Loading() { return ( -
+
{ + const { id } = params; + + const session: Session | null = await getServerSession(); + + const res = await fetch(`${user}/${session?.user?.email}`); + const resData = (await res.json()) as UserResponseData; + + return ( +
+
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ Player Name + + Sorting Arrow + +
+
+
Result
+
+
+ Date + + Sorting Arrow + +
+
+ Apple MacBook Pro 17" + SilverLaptop
+ Microsoft Surface Pro + WhiteLaptop PC
+ Magic Mouse 2 + BlackAccessories
+
+
+
+ ); +}; + +export default ProfilePage; diff --git a/src/modals/profileModal.tsx b/src/modals/profileModal.tsx index f54d6ff..48910b8 100644 --- a/src/modals/profileModal.tsx +++ b/src/modals/profileModal.tsx @@ -11,14 +11,20 @@ import whiteBgProfileIcon from "../../assets/whiteBgProfileIcon.svg"; import { signOut } from "next-auth/react"; import PortalProvider from "../components/portalProvider/portalProvider"; +import { useRouter } from "next/navigation"; const ProfileModal = ({ userName, + userId, }: { userName: string | null | undefined; + userId: string; }) => { const [openModal, setOpenModal] = useState(false); - + const router = useRouter(); + const handleProfile = (): void => { + router.push(`/profile/${userId}`); + }; return (
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
-
- Player Name - - Sorting Arrow - -
-
-
Result
-
-
- Date - - Sorting Arrow - -
-
- Apple MacBook Pro 17" - SilverLaptop
- Microsoft Surface Pro - WhiteLaptop PC
- Magic Mouse 2 - BlackAccessories
-
+
+ + ); diff --git a/src/components/pagination/pagination.tsx b/src/components/pagination/pagination.tsx new file mode 100644 index 0000000..9685107 --- /dev/null +++ b/src/components/pagination/pagination.tsx @@ -0,0 +1,13 @@ + //WIP +import React from "react"; + +const Pagination = () => { + + return ( + <> + + + ); +}; + +export default Pagination; diff --git a/src/components/table/table.tsx b/src/components/table/table.tsx new file mode 100644 index 0000000..3181e82 --- /dev/null +++ b/src/components/table/table.tsx @@ -0,0 +1,84 @@ +import Image from "next/image"; +import Link from "next/link"; +import React from "react"; +import sortArrow from "../../../assets/sortArrow.svg"; +import { getProfileResult } from "@/constants/apiUrl"; +const Table = async ({ userId }: { userId: string }) => { + const res = await fetch(`${getProfileResult}/${userId}`); + const resData = await res.json(); + + return ( +
+
+
+
+ + + + + + + + + + + {resData?.matchData?.map( + (element: MatchDataWithOpponentName, index: string) => { + return ( + + + + + + + ); + } + )} + +
+ # + +
+ Player Name + + Sorting Arrow + +
+
+ Result + +
+ Date + + Sorting Arrow + +
+
+ {index} + + {element?.opponentName} + + {element?.winner} + + {new Date(element.time).toLocaleDateString('en-GB')} +
+
+
+
+ ); +}; + +export default Table; diff --git a/src/constants/apiUrl.ts b/src/constants/apiUrl.ts index ad4be29..71a3b63 100644 --- a/src/constants/apiUrl.ts +++ b/src/constants/apiUrl.ts @@ -14,4 +14,6 @@ export const updateRoom = `${process.env.NEXT_PUBLIC_BASE_URL}/api/updateRoom` export const createResult = `${process.env.NEXT_PUBLIC_BASE_URL}/api/createResult` -export const getResult = `${process.env.NEXT_PUBLIC_BASE_URL}/api/getResult` \ No newline at end of file +export const getResult = `${process.env.NEXT_PUBLIC_BASE_URL}/api/getResult` + +export const getProfileResult = `${process.env.NEXT_PUBLIC_BASE_URL}/api/getProfileResult` \ No newline at end of file diff --git a/src/types/types.ts b/src/types/types.ts index f851312..f263f9d 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -137,10 +137,6 @@ interface WindowSize { interface ResultSchema { gameStatus: string; - player: { - x: string | null; - o: string | null; - }; winner: string | null; } @@ -178,4 +174,10 @@ interface ClientSideSession { name?: string | null | undefined; email?: string | null | undefined; image?: string | null | undefined; -} \ No newline at end of file +} + +interface MatchDataWithOpponentName { + time: string; + winner: string | null; + opponentName: string; +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0feee96..5cd3498 100644 --- a/yarn.lock +++ b/yarn.lock @@ -261,6 +261,13 @@ dependencies: "@types/react" "*" +"@types/react-paginate@^7.1.4": + version "7.1.4" + resolved "https://registry.npmjs.org/@types/react-paginate/-/react-paginate-7.1.4.tgz" + integrity sha512-6fqZvDzRJHubOGl6c7cGFC9ysgQSWYy0Gpus9HjORpydlcXgPnT8x+aKgqwCdtpZrRTwcBz2Q7JWAOYaRrsXGg== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^18": version "18.2.48" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz" @@ -2431,7 +2438,7 @@ pretty-format@^3.8.0: resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz" integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== -prop-types@^15.8.1: +prop-types@^15, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -2480,6 +2487,13 @@ react-is@^16.13.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-paginate@^8.2.0: + version "8.2.0" + resolved "https://registry.npmjs.org/react-paginate/-/react-paginate-8.2.0.tgz" + integrity sha512-sJCz1PW+9PNIjUSn919nlcRVuleN2YPoFBOvL+6TPgrH/3lwphqiSOgdrLafLdyLDxsgK+oSgviqacF4hxsDIw== + dependencies: + prop-types "^15" + react-toastify@^10.0.4: version "10.0.4" resolved "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.4.tgz" @@ -2487,7 +2501,7 @@ react-toastify@^10.0.4: dependencies: clsx "^2.1.0" -"react@^16.3.0 || ^17.0.1 || ^18.0.0", "react@^16.8.0 || ^17 || ^18", "react@^17.0.2 || ^18", react@^18, react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16: +"react@^16 || ^17 || ^18", "react@^16.3.0 || ^17.0.1 || ^18.0.0", "react@^16.8.0 || ^17 || ^18", "react@^17.0.2 || ^18", react@^18, react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== From 1f0c0b3883750f7bb2b1504684582f1e19276583 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Fri, 23 Feb 2024 16:52:32 +0530 Subject: [PATCH 46/56] refac: emit socket event at dashboard to start server early --- src/components/startGame/startGame.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/startGame/startGame.tsx b/src/components/startGame/startGame.tsx index 9abaa50..da2ca34 100644 --- a/src/components/startGame/startGame.tsx +++ b/src/components/startGame/startGame.tsx @@ -1,6 +1,6 @@ "use client"; import { useRouter } from "next/navigation"; -import React, { useContext, useState } from "react"; +import React, { useContext, useEffect, useState } from "react"; import LoadingButton from "../loadingButton/loadingButton"; import { joinRoom, room } from "@/constants/apiUrl"; import { GameContext } from "@/context/gameContext"; @@ -40,6 +40,10 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { resolver: yupResolver(schema) as Resolver, }); + useEffect(() => { + socket.emit("renderIssue"); + }, []); + const [loading, setLoading] = useState({ createRoom: false, joinRoom: false, @@ -125,7 +129,6 @@ const StartGame = ({ userData }: { userData: UserResponseData }) => { } }; - return ( <>
From f8a90fdc5b242c24360cc578cacf3ad4f9404d87 Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Fri, 23 Feb 2024 18:47:11 +0530 Subject: [PATCH 47/56] feat: add sorting feature in table --- src/app/profile/[id]/page.tsx | 14 +++- src/app/room/[roomCode]/page.tsx | 2 +- src/components/gameBoard/gameBoard.tsx | 1 - src/components/table/table.tsx | 103 +++++++++++++------------ src/modals/profileModal.tsx | 9 +-- 5 files changed, 69 insertions(+), 60 deletions(-) diff --git a/src/app/profile/[id]/page.tsx b/src/app/profile/[id]/page.tsx index 5dbd4ec..904180d 100644 --- a/src/app/profile/[id]/page.tsx +++ b/src/app/profile/[id]/page.tsx @@ -1,17 +1,25 @@ import DashboardHeader from "@/components/dashboardHeader/dashboardHeader"; -import { user } from "@/constants/apiUrl"; +import { getProfileResult, user } from "@/constants/apiUrl"; import ProfileModal from "@/modals/profileModal"; import { Session, getServerSession } from "next-auth"; import Table from "@/components/table/table"; import Pagination from "@/components/pagination/pagination"; +import { redirect } from "next/navigation"; const ProfilePage = async ({ params }: { params: { id: string } }) => { const { id } = params; const session: Session | null = await getServerSession(); + if (!session) { + redirect("/login"); + } + const res = await fetch(`${user}/${session?.user?.email}`); const resData = (await res.json()) as UserResponseData; + const result = await fetch(`${getProfileResult}/${id}`); + const resultData = await result.json(); + return (
@@ -19,12 +27,12 @@ const ProfilePage = async ({ params }: { params: { id: string } }) => {
- +
diff --git a/src/app/room/[roomCode]/page.tsx b/src/app/room/[roomCode]/page.tsx index efb2ca0..913c382 100644 --- a/src/app/room/[roomCode]/page.tsx +++ b/src/app/room/[roomCode]/page.tsx @@ -11,7 +11,7 @@ const Room = async ({ params }: { params: { roomCode: string } }) => { const session: Session | null = await getServerSession(); const { roomCode } = params; if (!session) { - redirect("/"); + redirect("/login"); } const room = await fetch(`${getRoom}/${roomCode}`); diff --git a/src/components/gameBoard/gameBoard.tsx b/src/components/gameBoard/gameBoard.tsx index ef34726..8bb8d9e 100644 --- a/src/components/gameBoard/gameBoard.tsx +++ b/src/components/gameBoard/gameBoard.tsx @@ -6,7 +6,6 @@ import { GameContext } from "@/context/gameContext"; const GameBoard = ({ roomData }: { roomData: Game }) => { const { setGame } = useContext(GameContext) as GameContextType; - useEffect(()=>{ setGame({ diff --git a/src/components/table/table.tsx b/src/components/table/table.tsx index 3181e82..181753a 100644 --- a/src/components/table/table.tsx +++ b/src/components/table/table.tsx @@ -1,78 +1,83 @@ +"use client" import Image from "next/image"; -import Link from "next/link"; -import React from "react"; +import React, { useState } from "react"; import sortArrow from "../../../assets/sortArrow.svg"; -import { getProfileResult } from "@/constants/apiUrl"; -const Table = async ({ userId }: { userId: string }) => { - const res = await fetch(`${getProfileResult}/${userId}`); - const resData = await res.json(); + +const Table = ({ result }: { result: any }) => { + const [sortConfig, setSortConfig] = useState<{ key: string; direction: string }>({ key: "", direction: "" }); + + const sortBy = (key: string) => { + let direction = "ascending"; + if (sortConfig.key === key && sortConfig.direction === "ascending") { + direction = "descending"; + } + setSortConfig({ key, direction }); + }; + + let sortedData = [...result]; + if (sortConfig.key) { + sortedData = [...result].sort((a, b) => { + if (sortConfig.direction === "ascending") { + return a[sortConfig.key].localeCompare(b[sortConfig.key]); + } else { + return b[sortConfig.key].localeCompare(a[sortConfig.key]); + } + }); + } return (
-
+
- - {resData?.matchData?.map( - (element: MatchDataWithOpponentName, index: string) => { - return ( - - - - - - - ); - } - )} + {sortedData.map((element: MatchDataWithOpponentName, index: number) => { + return ( + + + + + + + ); + })}
# -
+
sortBy("opponentName")}> Player Name - - Sorting Arrow - + Sorting Arrow
Result -
+
sortBy("time")}> Date - - Sorting Arrow - + Sorting Arrow
- {index} - - {element?.opponentName} - - {element?.winner} - - {new Date(element.time).toLocaleDateString('en-GB')} -
{index}{element?.opponentName}{element?.winner}{new Date(element.time).toLocaleDateString('en-GB')}
diff --git a/src/modals/profileModal.tsx b/src/modals/profileModal.tsx index 48910b8..70c5c79 100644 --- a/src/modals/profileModal.tsx +++ b/src/modals/profileModal.tsx @@ -1,15 +1,9 @@ "use client"; - import { useState } from "react"; - import Image from "next/image"; - import profileImage from "../../assets/profileIcon.svg"; - import whiteBgProfileIcon from "../../assets/whiteBgProfileIcon.svg"; - import { signOut } from "next-auth/react"; - import PortalProvider from "../components/portalProvider/portalProvider"; import { useRouter } from "next/navigation"; @@ -21,10 +15,13 @@ const ProfileModal = ({ userId: string; }) => { const [openModal, setOpenModal] = useState(false); + const router = useRouter(); + const handleProfile = (): void => { router.push(`/profile/${userId}`); }; + return (
+
+ ) +} \ No newline at end of file diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx new file mode 100644 index 0000000..02136c5 --- /dev/null +++ b/src/app/not-found.tsx @@ -0,0 +1,11 @@ +import Link from 'next/link' + +export default function NotFound() { + return ( +
+

Not Found

+

Could not find requested page

+ Return To Dashboard +
+ ) +} \ No newline at end of file From eed5c0d6f404c512e9b049bd0f8fd7a77aaca67a Mon Sep 17 00:00:00 2001 From: Md Kamran Date: Tue, 27 Feb 2024 13:58:03 +0530 Subject: [PATCH 56/56] refactor: remove any from authorize of next.js and Since User is reserved keywords in next-auth, hence have to change "user" model name to "userModel" --- models/userModel.ts | 4 ++-- src/app/api/getResult/[userId]/route.ts | 1 - src/app/api/signup/route.ts | 6 +++--- src/app/api/user/[email]/route.ts | 4 ++-- src/types/next-auth.d.ts | 13 +++++++++++++ src/utils/authOptions.ts | 17 ++++++----------- 6 files changed, 26 insertions(+), 19 deletions(-) create mode 100644 src/types/next-auth.d.ts diff --git a/models/userModel.ts b/models/userModel.ts index d32cee0..d319061 100644 --- a/models/userModel.ts +++ b/models/userModel.ts @@ -8,6 +8,6 @@ const userSchema: Schema = new Schema({ timestamps:true }); -const User = mongoose.models.User || mongoose.model("User", userSchema); +const UserModel = mongoose.models.User || mongoose.model("User", userSchema); -export default User; \ No newline at end of file +export default UserModel; \ No newline at end of file diff --git a/src/app/api/getResult/[userId]/route.ts b/src/app/api/getResult/[userId]/route.ts index 8eed217..682d506 100644 --- a/src/app/api/getResult/[userId]/route.ts +++ b/src/app/api/getResult/[userId]/route.ts @@ -1,6 +1,5 @@ import { NextResponse } from "next/server"; import connectMongoDb from "../../../../utils/dbConnection"; -import Result from "../../../../../models/resultModel"; import ResultModel from "../../../../../models/resultModel"; import mongoose from "mongoose"; diff --git a/src/app/api/signup/route.ts b/src/app/api/signup/route.ts index c512a3a..b5150cc 100644 --- a/src/app/api/signup/route.ts +++ b/src/app/api/signup/route.ts @@ -1,5 +1,5 @@ import connectMongoDb from "../../../utils/dbConnection"; -import User from "../../../../models/userModel"; +import UserModel from "../../../../models/userModel"; import { NextResponse } from "next/server"; import bcrypt from "bcrypt"; @@ -8,7 +8,7 @@ export async function POST(req: Request) { await connectMongoDb(); const { name, email, password } = await req.json(); - const userExist = await User.findOne({ $or: [{ email }] }); + const userExist = await UserModel.findOne({ $or: [{ email }] }); if (userExist) { return NextResponse.json( @@ -17,7 +17,7 @@ export async function POST(req: Request) { ); } const hashedPassword = await bcrypt.hash(password, 10); - await User.create({ name, email, password: hashedPassword }); + await UserModel.create({ name, email, password: hashedPassword }); return NextResponse.json( { message: "User Registered...!!", status: true }, { status: 201 } diff --git a/src/app/api/user/[email]/route.ts b/src/app/api/user/[email]/route.ts index dce8c1b..cdd62d7 100644 --- a/src/app/api/user/[email]/route.ts +++ b/src/app/api/user/[email]/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from "next/server"; -import User from "../../../../../models/userModel"; +import UserModel from "../../../../../models/userModel"; import connectMongoDb from "../../../../utils/dbConnection"; import { cookies } from "next/headers"; @@ -8,7 +8,7 @@ export async function GET( { params }: { params: { email: string } } ) { await connectMongoDb(); - const user = await User.findOne({ email: params?.email }); + const user = await UserModel.findOne({ email: params?.email }); const cookieStore = cookies(); const visited = cookieStore.get("visited"); diff --git a/src/types/next-auth.d.ts b/src/types/next-auth.d.ts new file mode 100644 index 0000000..9f60987 --- /dev/null +++ b/src/types/next-auth.d.ts @@ -0,0 +1,13 @@ +import NextAuth from "next-auth" + +declare module "next-auth" { + interface User { + _id: string; + name: string; + email: string; + password: string; + createdAt: string; + updatedAt: string; + __v: number; + } +} \ No newline at end of file diff --git a/src/utils/authOptions.ts b/src/utils/authOptions.ts index acb8575..5516a2e 100644 --- a/src/utils/authOptions.ts +++ b/src/utils/authOptions.ts @@ -1,19 +1,14 @@ import CredentialsProvider from "next-auth/providers/credentials"; import connectMongoDb from "./dbConnection"; -import User from "../../models/userModel"; +import UserModel from "../../models/userModel"; import bcrypt from "bcrypt"; -import { Document } from "mongoose"; +import { User } from "next-auth"; -interface user extends Document { - name: string; - email: string; - password: string; -} -async function login(credentials: Credentials): Promise { +async function login(credentials: Credentials):Promise { try { await connectMongoDb(); - const user = await User.findOne({ email: credentials?.email }); + const user = await UserModel.findOne({ email: credentials?.email }); if (!user) throw new Error("Invalid User Credentials"); const isCorrect = await bcrypt.compare( credentials?.password, @@ -39,9 +34,9 @@ export const authOptions = { id: "credentials", name: "credentials", credentials: {}, - async authorize(credentials: any) { + async authorize(credentials: Record | undefined) { try { - const user = await login(credentials); + const user = await login(credentials as Credentials) return user; } catch (error: unknown) { if (error instanceof Error) {