diff --git a/app/about/page.tsx b/app/about/page.tsx index 13a07105..c1e602f2 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -11,17 +11,18 @@ import CertificateDatabaseKeys from "@/database/Certificates/CertificateDatabase import companyDatabaseMap from "@/database/Companies/CompanyDatabaseMap"; import CourseDatabaseKeys from "@/database/Courses/CourseDatabaseKeys"; import courseDatabaseMap from "@/database/Courses/CourseDatabaseMap"; -import CourseInterface from "@/database/Courses/CourseInterface"; +import type CourseInterface from "@/database/Courses/CourseInterface"; import ProjectDatabaseKeys from "@/database/Projects/ProjectDatabaseKeys"; import RoleDatabaseKeys from "@/database/Roles/RoleDatabaseKeys"; import rolesDatabase from "@/database/Roles/RoleDatabaseMap"; -import RoleInterface from "@/database/Roles/RoleInterface"; +import type RoleInterface from "@/database/Roles/RoleInterface"; import type { Metadata } from "next"; import Image from "next/image"; import { notFound } from "next/navigation"; -const aboutContent: string | undefined = - getMarkdownFromFileSystem(`public/about/long.md`)?.content; +const aboutContent: string | undefined = getMarkdownFromFileSystem( + "public/about/long.md" +)?.content; export const metadata: Metadata = { title: `${developerName} - About Me`, diff --git a/database/Modules/ModuleDatabaseKeys.ts b/database/Modules/ModuleDatabaseKeys.ts index 8449cbc0..912b8a09 100644 --- a/database/Modules/ModuleDatabaseKeys.ts +++ b/database/Modules/ModuleDatabaseKeys.ts @@ -32,14 +32,14 @@ enum ModuleDatabaseKeys { RHUL_SecurityManagement = "IY3501", // King's College London - KCL_ArtificialIntelligenceReasoningAndDecisionMaking = "6CCS3AIN", + KCL_PatternRecognitionNeuralNetworksDeepLearning = "7CCSMPNN", KCL_MachineLearning = "6CCS3ML1", + KCL_DataMining = "7CCSMDM1", + KCL_OptimizationMethods = "7CCSMOME", + KCL_ArtificialIntelligenceReasoningAndDecisionMaking = "6CCS3AIN", KCL_AgentsAndMultiAgentSystems = "7CCSMAMS", KCL_ComputerVision = "7CCSMCVI", - KCL_DataMining = "7CCSMDM1", KCL_PhilosophyAndEthicsOfArtificialIntelligence = "7CCSMEAI", - KCL_OptimizationMethods = "7CCSMOME", - KCL_PatternRecognitionNeuralNetworksDeepLearning = "7CCSMPNN", KCL_IndividualProject = "7CCSMPRJ", } diff --git a/database/Modules/ModuleDatabaseMap.ts b/database/Modules/ModuleDatabaseMap.ts index f58ecc4b..a5dfd525 100644 --- a/database/Modules/ModuleDatabaseMap.ts +++ b/database/Modules/ModuleDatabaseMap.ts @@ -1050,6 +1050,7 @@ const modulesMap: Database = { "Implementing generative models like GANs to create synthetic data", "Applying transfer learning to leverage pretrained models for new tasks", ], + relatedMaterials: [ProjectDatabaseKeys.HandWrittenDigitClassifier], }, [ModuleDatabaseKeys.KCL_MachineLearning]: { name: "Machine Learning", @@ -1098,6 +1099,9 @@ const modulesMap: Database = { "Implementing learning from demonstration techniques", "Addressing challenges in machine learning such as overfitting and bias", ], + relatedMaterials: [ + ProjectDatabaseKeys.MachineLearningPacmanClassifierCoursework, + ], }, [ModuleDatabaseKeys.KCL_IndividualProject]: { name: "Individual Project", diff --git a/database/Projects/ProjectDatabaseKeys.ts b/database/Projects/ProjectDatabaseKeys.ts index 684dea33..cc12a450 100644 --- a/database/Projects/ProjectDatabaseKeys.ts +++ b/database/Projects/ProjectDatabaseKeys.ts @@ -7,6 +7,7 @@ * @see {@link projectMap} at `database/projects.ts` */ enum ProjectDatabaseKeys { + //^ Full Stack Projects CircusDiscussions = "circus-discussions", RingmasterMessaging = "ringmaster-messaging", MagicianAI = "magician-ai", @@ -15,6 +16,8 @@ enum ProjectDatabaseKeys { Quizmify = "quizmify", SideshowArticles = "sideshow-articles", Noodle = "noodle", + + //^ Backend Projects SymphonyTranslateBot = "symphony-translate-bot", SymphonyWebhookBot = "symphony-webhook-bot", SymphonyCobaGPTBot = "symphony-coba-gpt-bot", @@ -31,6 +34,10 @@ enum ProjectDatabaseKeys { DjangoAuthentication = "django-authentication", ClerkAuthentication = "clerk-authentication", Auth0Authentication = "auth0-authentication", + + //^ Artificial Intelligence Projects + MachineLearningPacmanClassifierCoursework = "machine-learning-pacman-classifier-coursework", + HandWrittenDigitClassifier = "hand-written-digit-classifier", MachineLearningAlgorithms = "machine-learning-algorithms", ArtificialIntelligenceReinforcementLearning = "artificial-intelligence-reinforcement-learning", AdultIncomePrediction = "adult-income-prediction", @@ -45,6 +52,7 @@ enum ProjectDatabaseKeys { ComputerVisionImageSegmentation = "computer-vision-image-segmentation-assignment", ComputerVisionQuizzes = "computer-vision-quizzes", OsmosGame = "osmos-game", + SearchingAndSortingAlgorithms = "searching-and-sorting-algorithms", AutomatedSetup = "automated-setup", Leetcode = "leetcode", diff --git a/database/Projects/ProjectDatabaseMap.ts b/database/Projects/ProjectDatabaseMap.ts index 4598ace1..00947e4d 100644 --- a/database/Projects/ProjectDatabaseMap.ts +++ b/database/Projects/ProjectDatabaseMap.ts @@ -9,7 +9,6 @@ import skillDatabaseMap from "../Skills/SkillDatabaseMap"; import SkillCategoriesEnum from "@/enums/Skill/SkillCategoriesEnum"; import ModuleDatabaseKeys from "@/database/Modules/ModuleDatabaseKeys"; import CertificateDatabaseKeys from "../Certificates/CertificateDatabaseKeys"; -import BlogDatabaseKeys from "../Blogs/BlogDatabaseKeys"; import RoleDatabaseKeys from "../Roles/RoleDatabaseKeys"; import ProjectTypeEnum from "@/enums/Project/ProjectTypeEnum"; @@ -372,7 +371,7 @@ const projectMap: Database = { type: ProjectTypeEnum.Academic, }, - //^ Symphony Bots + //^ Backend Web Development Projects [ProjectDatabaseKeys.SymphonyTranslateBot]: { name: `Symphony Translate Bot`, description: ` @@ -750,8 +749,6 @@ const projectMap: Database = { archived: true, type: ProjectTypeEnum.Professional, }, - - //^ Backend Web Development Projects [ProjectDatabaseKeys.FlaskForumBackend]: { name: `Flask Forum Backend`, description: ` @@ -923,6 +920,42 @@ const projectMap: Database = { }, //^ Artificial Intelligence Projects + [ProjectDatabaseKeys.HandWrittenDigitClassifier]: { + name: "Handwritten Digit Classifier", + description: ` + A handwritten digit classifier using built using a Convolutional Neural Network (CNN). + Used various techniques such as data augmentation, batch normalisation, and dropout to improve the model's performance. + `, + repositoryURL: + "https://github.com/mbeps/pattern-recognition-neural-network-coursework-1", + category: ProjectCategoriesEnum.ArtificialIntelligence, + type: ProjectTypeEnum.Academic, + relatedMaterials: [ + ModuleDatabaseKeys.KCL_PatternRecognitionNeuralNetworksDeepLearning, + ], + skills: [ + SkillDatabaseKeys.Python, + SkillDatabaseKeys.Keras, + SkillDatabaseKeys.TensorFlow, + SkillDatabaseKeys.Matplotlib, + SkillDatabaseKeys.Jupyter, + SkillDatabaseKeys.Git, + SkillDatabaseKeys.GitHub, + SkillDatabaseKeys.Poetry, + SkillDatabaseKeys.Black, + + SkillDatabaseKeys.ProblemSolving, + SkillDatabaseKeys.ProjectManagement, + SkillDatabaseKeys.CriticalThinking, + SkillDatabaseKeys.Creativity, + SkillDatabaseKeys.Adaptability, + SkillDatabaseKeys.ObjectOrientedProgramming, + SkillDatabaseKeys.Algorithms, + ], + thumbnailImage: addProjectThumbnail( + ProjectDatabaseKeys.HandWrittenDigitClassifier + ), + }, [ProjectDatabaseKeys.AdultIncomePrediction]: { name: "Adult Income Prediction", description: ` @@ -993,6 +1026,41 @@ const projectMap: Database = { ProjectDatabaseKeys.HousePricePrediction ), }, + [ProjectDatabaseKeys.MachineLearningPacmanClassifierCoursework]: { + name: "Pacman Neural Network Classifier", + description: ` + Built a neural network from scratch to detect Pacman's direction in the game. + Used various techniques such as batch normalisation, dropout, momentum, learning rate decay and more to improve the model's performance. + `, + repositoryURL: + "https://github.com/mbeps/machine-learning-pacman-classifier-coursework", + category: ProjectCategoriesEnum.ArtificialIntelligence, + type: ProjectTypeEnum.Academic, + relatedMaterials: [ModuleDatabaseKeys.KCL_MachineLearning], + skills: [ + SkillDatabaseKeys.Python, + SkillDatabaseKeys.Git, + SkillDatabaseKeys.GitHub, + SkillDatabaseKeys.Poetry, + SkillDatabaseKeys.Black, + + SkillDatabaseKeys.LinearAlgebra, + SkillDatabaseKeys.Probability, + SkillDatabaseKeys.Statistics, + SkillDatabaseKeys.Calculus, + + SkillDatabaseKeys.ProblemSolving, + SkillDatabaseKeys.ProjectManagement, + SkillDatabaseKeys.CriticalThinking, + SkillDatabaseKeys.Creativity, + SkillDatabaseKeys.Adaptability, + SkillDatabaseKeys.ObjectOrientedProgramming, + SkillDatabaseKeys.Algorithms, + ], + thumbnailImage: addProjectThumbnail( + ProjectDatabaseKeys.MachineLearningPacmanClassifierCoursework + ), + }, [ProjectDatabaseKeys.MachineLearningAlgorithms]: { name: "Machine Learning Algorithms", description: ` diff --git a/public/projects/hand-written-digit-classifier/cover.png b/public/projects/hand-written-digit-classifier/cover.png new file mode 100644 index 00000000..4ac9c7b3 Binary files /dev/null and b/public/projects/hand-written-digit-classifier/cover.png differ diff --git a/public/projects/hand-written-digit-classifier/features.md b/public/projects/hand-written-digit-classifier/features.md new file mode 100644 index 00000000..2d32f900 --- /dev/null +++ b/public/projects/hand-written-digit-classifier/features.md @@ -0,0 +1,66 @@ +## Network Architecture +The network follows a progressive deepening structure, with each block increasing in complexity to learn more sophisticated features. + +### Block 1 +- Two Conv2D layers (32 filters, 3×3 kernel) - Captures basic edges and shapes +- BatchNormalisation after each Conv2D - Stabilises training +- MaxPooling (2×2) - Reduces spatial dimensions and computational load +- SpatialDropout2D (20%) - Prevents feature map co-adaptation + +### Block 2 +- Two Conv2D layers (96 filters, 3×3 kernel) - Learns intermediate-level patterns +- BatchNormalisation after each Conv2D - Maintains consistent feature scaling +- MaxPooling (2×2) - Further dimension reduction +- SpatialDropout2D (20%) - Continues regularisation + +### Block 3 +- Two Conv2D layers (128 filters, 3×3 kernel, 'same' padding) - Identifies complex digit features +- BatchNormalisation after each Conv2D - Normalises deeper features +- MaxPooling (2×2) - Final spatial reduction +- SpatialDropout2D (20%) - Ensures robust feature learning + +### Dense Layers +- Flatten layer - Converts 2D features to 1D +- Dense layer (1050 units) with L2 regularisation - Rich feature combination +- BatchNormalisation - Stabilises deep network training +- Dropout (50%) - Prevents overfitting +- Output layer (10 units, softmax) - Produces digit probabilities + +## Data Augmentation + +### Static Augmentation (Albumentations) +- ElasticTransform - Simulates natural handwriting deformations +- GaussNoise - Adds resilience to image noise +- CoarseDropout - Improves robustness to missing parts +- RandomBrightnessContrast - Handles varying image qualities +- Image Inversion - Adapts to different digit colours + +### Real-time Augmentation (ImageDataGenerator) +- Rotation - Handles tilted handwriting +- Width/Height shifts - Accounts for different digit positions +- Zoom range - Manages varying digit sizes + +## Training Strategy + +### Optimisation +- Adam optimiser with gradient clipping - Prevents explosive gradients +- Initial learning rate: 1e-3 - Balanced between speed and stability +- Batch size: 384 - Provides stable gradient estimates + +### Training Callbacks +- Early Stopping - Prevents overfitting by monitoring validation loss +- Model Checkpoint - Preserves best model during training +- ReduceLROnPlateau - Adapts learning rate when progress plateaus + +### Regularisation Techniques +- BatchNormalisation - Stabilises training throughout the network +- SpatialDropout2D - Specifically designed for convolutional features +- Standard Dropout - Prevents dense layer overfitting +- L2 regularisation - Controls weight growth + +## Dataset Management +- Multiple dataset combination - Increases training diversity +- Image standardisation (28×28) - Ensures consistent input size +- Value normalisation [0,1] - Stabilises network training +- 90-10 split - Provides sufficient validation data +- Fixed random seed - Ensures reproducible results \ No newline at end of file diff --git a/public/projects/machine-learning-pacman-classifier-coursework/cover.png b/public/projects/machine-learning-pacman-classifier-coursework/cover.png new file mode 100644 index 00000000..7299fe3a Binary files /dev/null and b/public/projects/machine-learning-pacman-classifier-coursework/cover.png differ diff --git a/public/projects/machine-learning-pacman-classifier-coursework/features.md b/public/projects/machine-learning-pacman-classifier-coursework/features.md new file mode 100644 index 00000000..57b9ae01 --- /dev/null +++ b/public/projects/machine-learning-pacman-classifier-coursework/features.md @@ -0,0 +1,35 @@ +## Core Classification Architecture +- Feed-forward neural network with configurable hidden layers +- ReLU activation functions for hidden layers +- Softmax output layer for 4-class movement prediction +- He initialisation for weights + +## Optimisation Techniques +- Mini-batch gradient descent +- Momentum-based updates with velocity tracking +- Inverse scaling learning rate decay +- L2 regularisation +- Gradient clipping with norm thresholding + +## Regularisation Methods +- Batch Normalisation + - Running mean/variance tracking + - Learnable scale (gamma) and shift (beta) parameters + - Training/inference mode handling +- Dropout + - Inverted dropout scaling + - Configurable dropout rate + +## Training Management +- Early stopping with validation monitoring +- Automatic hyperparameter optimisation via grid search +- Train/validation/test split (80/10/10) +- Best model checkpointing + +## Implementation Features +- Type hints throughout codebase +- Numerical stability safeguards +- Comprehensive error handling +- Memory efficient operations +- Legal move validation and filtering +- Fallback strategies for edge cases \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index f6a04101..2886284d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,9 +8,9 @@ integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@babel/runtime@^7.13.10": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.7.tgz#f4e7fe527cd710f8dc0618610b61b4b060c3c341" - integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ== + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.9.tgz#aa4c6facc65b9cb3f87d75125ffd47781b475433" + integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg== dependencies: regenerator-runtime "^0.14.0" @@ -1185,9 +1185,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node@^22.8.4": - version "22.13.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.1.tgz#a2a3fefbdeb7ba6b89f40371842162fac0934f33" - integrity sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew== + version "22.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.4.tgz#3fe454d77cd4a2d73c214008b3e331bfaaf5038a" + integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== dependencies: undici-types "~6.20.0" @@ -1204,9 +1204,9 @@ "@types/react" "*" "@types/react@*": - version "19.0.8" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.8.tgz#7098e6159f2a61e4f4cef2c1223c044a9bec590e" - integrity sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw== + version "19.0.10" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.10.tgz#d0c66dafd862474190fe95ce11a68de69ed2b0eb" + integrity sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g== dependencies: csstype "^3.0.2" @@ -1219,61 +1219,61 @@ csstype "^3.0.2" "@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz#574a95d67660a1e4544ae131d672867a5b40abb3" - integrity sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ== + version "8.24.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz#d104c2a6212304c649105b18af2c110b4a1dd4ae" + integrity sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.24.0" - "@typescript-eslint/type-utils" "8.24.0" - "@typescript-eslint/utils" "8.24.0" - "@typescript-eslint/visitor-keys" "8.24.0" + "@typescript-eslint/scope-manager" "8.24.1" + "@typescript-eslint/type-utils" "8.24.1" + "@typescript-eslint/utils" "8.24.1" + "@typescript-eslint/visitor-keys" "8.24.1" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^2.0.1" "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.24.0.tgz#bba837f9ee125b78f459ad947ff9b61be8139085" - integrity sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA== - dependencies: - "@typescript-eslint/scope-manager" "8.24.0" - "@typescript-eslint/types" "8.24.0" - "@typescript-eslint/typescript-estree" "8.24.0" - "@typescript-eslint/visitor-keys" "8.24.0" + version "8.24.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.24.1.tgz#67965c2d2ddd7eadb2f094c395695db8334ef9a2" + integrity sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ== + dependencies: + "@typescript-eslint/scope-manager" "8.24.1" + "@typescript-eslint/types" "8.24.1" + "@typescript-eslint/typescript-estree" "8.24.1" + "@typescript-eslint/visitor-keys" "8.24.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.24.0": - version "8.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz#2e34b3eb2ce768f2ffb109474174ced5417002b1" - integrity sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw== +"@typescript-eslint/scope-manager@8.24.1": + version "8.24.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz#1e1e76ec4560aa85077ab36deb9b2bead4ae124e" + integrity sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q== dependencies: - "@typescript-eslint/types" "8.24.0" - "@typescript-eslint/visitor-keys" "8.24.0" + "@typescript-eslint/types" "8.24.1" + "@typescript-eslint/visitor-keys" "8.24.1" -"@typescript-eslint/type-utils@8.24.0": - version "8.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz#6ee3ec4db06f9e5e7b01ca6c2b5dd5843a9fd1e8" - integrity sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA== +"@typescript-eslint/type-utils@8.24.1": + version "8.24.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz#99113e1df63d1571309d87eef68967344c78dd65" + integrity sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw== dependencies: - "@typescript-eslint/typescript-estree" "8.24.0" - "@typescript-eslint/utils" "8.24.0" + "@typescript-eslint/typescript-estree" "8.24.1" + "@typescript-eslint/utils" "8.24.1" debug "^4.3.4" ts-api-utils "^2.0.1" -"@typescript-eslint/types@8.24.0": - version "8.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.24.0.tgz#694e7fb18d70506c317b816de9521300b0f72c8e" - integrity sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw== +"@typescript-eslint/types@8.24.1": + version "8.24.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.24.1.tgz#8777a024f3afc4ace5e48f9a804309c6dd38f95a" + integrity sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A== -"@typescript-eslint/typescript-estree@8.24.0": - version "8.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz#0487349be174097bb329a58273100a9629e03c6c" - integrity sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ== +"@typescript-eslint/typescript-estree@8.24.1": + version "8.24.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz#3bb479401f8bd471b3c6dd3db89e7256977c54db" + integrity sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg== dependencies: - "@typescript-eslint/types" "8.24.0" - "@typescript-eslint/visitor-keys" "8.24.0" + "@typescript-eslint/types" "8.24.1" + "@typescript-eslint/visitor-keys" "8.24.1" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -1281,22 +1281,22 @@ semver "^7.6.0" ts-api-utils "^2.0.1" -"@typescript-eslint/utils@8.24.0": - version "8.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.24.0.tgz#21cb1195ae79230af825bfeed59574f5cb70a749" - integrity sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ== +"@typescript-eslint/utils@8.24.1": + version "8.24.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.24.1.tgz#08d14eac33cfb3456feeee5a275b8ad3349e52ed" + integrity sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.24.0" - "@typescript-eslint/types" "8.24.0" - "@typescript-eslint/typescript-estree" "8.24.0" + "@typescript-eslint/scope-manager" "8.24.1" + "@typescript-eslint/types" "8.24.1" + "@typescript-eslint/typescript-estree" "8.24.1" -"@typescript-eslint/visitor-keys@8.24.0": - version "8.24.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz#36ecf0b9b1d819ad88a3bd4157ab7d594cb797c9" - integrity sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg== +"@typescript-eslint/visitor-keys@8.24.1": + version "8.24.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz#8bdfe47a89195344b34eb21ef61251562148202b" + integrity sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg== dependencies: - "@typescript-eslint/types" "8.24.0" + "@typescript-eslint/types" "8.24.1" eslint-visitor-keys "^4.2.0" "@vercel/analytics@^1.2.2": @@ -1627,9 +1627,9 @@ cacache@^19.0.0, cacache@^19.0.1: unique-filename "^4.0.0" call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" - integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" function-bind "^1.1.2" @@ -1663,9 +1663,9 @@ camelcase-css@^2.0.1: integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001688: - version "1.0.30001699" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz#a102cf330d153bf8c92bfb5be3cd44c0a89c8c12" - integrity sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w== + version "1.0.30001700" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz#26cd429cf09b4fd4e745daf4916039c794d720f6" + integrity sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ== chalk@^4.0.0: version "4.1.2" @@ -1711,9 +1711,9 @@ ci-info@^4.0.0, ci-info@^4.1.0: integrity sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A== cidr-regex@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-4.1.1.tgz#acbe7ba9f10d658710bddd25baa900509e90125a" - integrity sha512-ekKcVp+iRB9zlKFXyx7io7nINgb0oRjgRdXNEodp1OuxRui8FXr/CA40Tz1voWUp9DPPrMyQKy01vJhDo4N1lw== + version "4.1.3" + resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-4.1.3.tgz#df94af8ac16fc2e0791e2824693b957ff1ac4d3e" + integrity sha512-86M1y3ZeQvpZkZejQCcS+IaSWjlDUC+ORP0peScQ4uEUFCZ8bEQVz7NlJHqysoUb6w3zCjx4Mq/8/2RHhMwHYw== dependencies: ip-regex "^5.0.0" @@ -1938,9 +1938,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.5.73: - version "1.5.97" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz#5c4a4744c79e7c85b187adf5160264ac130c776f" - integrity sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ== + version "1.5.102" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz#81a452ace8e2c3fa7fba904ea4fed25052c53d3f" + integrity sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q== embla-carousel-react@^8.0.0-rc19: version "8.5.2" @@ -2102,11 +2102,11 @@ es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: hasown "^2.0.2" es-shim-unscopables@^1.0.2: - 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== + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" es-to-primitive@^1.3.0: version "1.3.0" @@ -2153,18 +2153,17 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-import-resolver-typescript@^3.5.2: - version "3.7.0" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz#e69925936a771a9cb2de418ccebc4cdf6c0818aa" - integrity sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow== + version "3.8.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.1.tgz#43aab1e51080eb157d4a35fb3db9d737ea79e2f6" + integrity sha512-qw5TPA12HTmb9CkcuiNrFtwhM1ae2FWysLeRrTbQ+/JKS///gbL3fQ5LRhAZnzkcqkScOvkB5Y5o+xgyQz1VVg== dependencies: "@nolyfill/is-core-module" "1.0.39" debug "^4.3.7" enhanced-resolve "^5.15.0" - fast-glob "^3.3.2" - get-tsconfig "^4.7.5" + get-tsconfig "^4.10.0" is-bun-module "^1.0.2" - is-glob "^4.0.3" stable-hash "^0.0.4" + tinyglobby "^0.2.10" eslint-module-utils@^2.12.0: version "2.12.0" @@ -2406,6 +2405,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fdir@^6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -2554,7 +2558,7 @@ get-symbol-description@^1.1.0: es-errors "^1.3.0" get-intrinsic "^1.2.6" -get-tsconfig@^4.7.5: +get-tsconfig@^4.10.0: version "4.10.0" resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== @@ -2661,7 +2665,7 @@ has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" -hasown@^2.0.0, hasown@^2.0.2: +hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -2843,9 +2847,9 @@ is-callable@^1.2.7: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-cidr@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-5.1.0.tgz#36f2d059f43f9b14f132745a2eec18c996df2f35" - integrity sha512-OkVS+Ht2ssF27d48gZdB+ho1yND1VbkJRKKS6Pc1/Cw7uqkd9IOJg8/bTwBDQL6tfBhSdguPRnlGiE8pU/X5NQ== + version "5.1.1" + resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-5.1.1.tgz#83ec462922c2b9209bc64794c4e3b2a890d23994" + integrity sha512-AwzRMjtJNTPOgm7xuYZ71715z99t+4yRnSnSzgK5err5+heYi4zMuvmpUadaJ28+KCXCQo8CjUrKQZRWSPmqTQ== dependencies: cidr-regex "^4.1.1" @@ -3329,9 +3333,9 @@ make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.2, ssri "^12.0.0" markdown-to-jsx@^7.2.1: - version "7.7.3" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.3.tgz#c75927252592696e9e8b2a9557628749d8ab023e" - integrity sha512-o35IhJDFP6Fv60zPy+hbvZSQMmgvSGdK5j8NRZ7FeZMY+Bgqw+dSg7SC1ZEzC26++CiOUCqkbq96/c3j/FfTEQ== + version "7.7.4" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.4.tgz#507d17c15af72ddf970fca84a95f0243244fcfa9" + integrity sha512-1bSfXyBKi+EYS3YY+e0Csuxf8oZ3decdfhOav/Z7Wrk89tjudyL5FOmwZQUoy0/qVXGUl+6Q3s2SWtpDEWITfQ== math-intrinsics@^1.1.0: version "1.1.0" @@ -3955,6 +3959,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -4852,6 +4861,14 @@ tiny-relative-date@^1.3.0: resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== +tinyglobby@^0.2.10: + version "0.2.11" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.11.tgz#9182cff655a0e272aad850d1a84c5e8e0f700426" + integrity sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g== + dependencies: + fdir "^6.4.3" + picomatch "^4.0.2" + 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"