Index: ockerignore
===================================================================
--- .dockerignore	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,14 +1,0 @@
-**/.vs
-**/.vscode
-**/bin
-**/obj
-**/.git
-**/.gitignore
-**/.dockerignore
-**/Dockerfile
-**/docker-compose.*
-**/*.md
-**/charts
-**/secrets.*.yaml
-**/.env
-**/appsettings.Development.json
Index: itattributes
===================================================================
--- .gitattributes	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,63 +1,0 @@
-###############################################################################
-# Set default behavior to automatically normalize line endings.
-###############################################################################
-* text=auto
-
-###############################################################################
-# Set default behavior for command prompt diff.
-#
-# This is need for earlier builds of msysgit that does not have it on by
-# default for csharp files.
-# Note: This is only used by command line
-###############################################################################
-#*.cs     diff=csharp
-
-###############################################################################
-# Set the merge driver for project and solution files
-#
-# Merging from the command prompt will add diff markers to the files if there
-# are conflicts (Merging from VS is not affected by the settings below, in VS
-# the diff markers are never inserted). Diff markers may cause the following 
-# file extensions to fail to load in VS. An alternative would be to treat
-# these files as binary and thus will always conflict and require user
-# intervention with every merge. To do so, just uncomment the entries below
-###############################################################################
-#*.sln       merge=binary
-#*.csproj    merge=binary
-#*.vbproj    merge=binary
-#*.vcxproj   merge=binary
-#*.vcproj    merge=binary
-#*.dbproj    merge=binary
-#*.fsproj    merge=binary
-#*.lsproj    merge=binary
-#*.wixproj   merge=binary
-#*.modelproj merge=binary
-#*.sqlproj   merge=binary
-#*.wwaproj   merge=binary
-
-###############################################################################
-# behavior for image files
-#
-# image files are treated as binary by default.
-###############################################################################
-#*.jpg   binary
-#*.png   binary
-#*.gif   binary
-
-###############################################################################
-# diff behavior for common document formats
-# 
-# Convert binary document formats to text before diffing them. This feature
-# is only available from the command line. Turn it on by uncommenting the 
-# entries below.
-###############################################################################
-#*.doc   diff=astextplain
-#*.DOC   diff=astextplain
-#*.docx  diff=astextplain
-#*.DOCX  diff=astextplain
-#*.dot   diff=astextplain
-#*.DOT   diff=astextplain
-#*.pdf   diff=astextplain
-#*.PDF   diff=astextplain
-#*.rtf   diff=astextplain
-#*.RTF   diff=astextplain
Index: .gitignore
===================================================================
--- .gitignore	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ .gitignore	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -1,365 +1,41 @@
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-##
-## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
 
-# User-specific files
-*.rsuser
-*.suo
-*.user
-*.userosscache
-*.sln.docstates
+# dependencies
+/node_modules
+/.pnp
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/versions
 
-# User-specific files (MonoDevelop/Xamarin Studio)
-*.userprefs
+# testing
+/coverage
 
-# Mono auto generated files
-mono_crash.*
+# next.js
+/.next/
+/out/
 
-# Build results
-[Dd]ebug/
-[Dd]ebugPublic/
-[Rr]elease/
-[Rr]eleases/
-x64/
-x86/
-[Ww][Ii][Nn]32/
-[Aa][Rr][Mm]/
-[Aa][Rr][Mm]64/
-bld/
-[Bb]in/
-[Oo]bj/
-[Oo]ut/
-[Ll]og/
-[Ll]ogs/
+# production
+/build
 
-# Visual Studio 2015/2017 cache/options directory
-.vs/
-# Uncomment if you have tasks that create the project's static files in wwwroot
-#wwwroot/
+# misc
+.DS_Store
+*.pem
 
-# Visual Studio 2017 auto generated files
-Generated\ Files/
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
 
-# MSTest test Results
-[Tt]est[Rr]esult*/
-[Bb]uild[Ll]og.*
+# env files (can opt-in for committing if needed)
+.env*
 
-# NUnit
-*.VisualState.xml
-TestResult.xml
-nunit-*.xml
+# vercel
+.vercel
 
-# Build Results of an ATL Project
-[Dd]ebugPS/
-[Rr]eleasePS/
-dlldata.c
-
-# Benchmark Results
-BenchmarkDotNet.Artifacts/
-
-# .NET Core
-project.lock.json
-project.fragment.lock.json
-artifacts/
-
-# ASP.NET Scaffolding
-ScaffoldingReadMe.txt
-
-# StyleCop
-StyleCopReport.xml
-
-# Files built by Visual Studio
-*_i.c
-*_p.c
-*_h.h
-*.ilk
-*.meta
-*.obj
-*.iobj
-*.pch
-*.pdb
-*.ipdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.tmp_proj
-*_wpftmp.csproj
-*.log
-*.vspscc
-*.vssscc
-.builds
-*.pidb
-*.svclog
-*.scc
-
-# Chutzpah Test files
-_Chutzpah*
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-# Visual Studio profiler
-*.psess
-*.vsp
-*.vspx
-*.sap
-
-# Visual Studio Trace Files
-*.e2e
-
-# TFS 2012 Local Workspace
-$tf/
-
-# Guidance Automation Toolkit
-*.gpState
-
-# ReSharper is a .NET coding add-in
-_ReSharper*/
-*.[Rr]e[Ss]harper
-*.DotSettings.user
-
-# TeamCity is a build add-in
-_TeamCity*
-
-# DotCover is a Code Coverage Tool
-*.dotCover
-
-# AxoCover is a Code Coverage Tool
-.axoCover/*
-!.axoCover/settings.json
-
-# Coverlet is a free, cross platform Code Coverage Tool
-coverage*.json
-coverage*.xml
-coverage*.info
-
-# Visual Studio code coverage results
-*.coverage
-*.coveragexml
-
-# NCrunch
-_NCrunch_*
-.*crunch*.local.xml
-nCrunchTemp_*
-
-# MightyMoose
-*.mm.*
-AutoTest.Net/
-
-# Web workbench (sass)
-.sass-cache/
-
-# Installshield output folder
-[Ee]xpress/
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish/
-
-# Publish Web Output
-*.[Pp]ublish.xml
-*.azurePubxml
-# Note: Comment the next line if you want to checkin your web deploy settings,
-# but database connection strings (with potential passwords) will be unencrypted
-*.pubxml
-*.publishproj
-
-# Microsoft Azure Web App publish settings. Comment the next line if you want to
-# checkin your Azure Web App publish settings, but sensitive information contained
-# in these scripts will be unencrypted
-PublishScripts/
-
-# NuGet Packages
-*.nupkg
-# NuGet Symbol Packages
-*.snupkg
-# The packages folder can be ignored because of Package Restore
-**/[Pp]ackages/*
-# except build/, which is used as an MSBuild target.
-!**/[Pp]ackages/build/
-# Uncomment if necessary however generally it will be regenerated when needed
-#!**/[Pp]ackages/repositories.config
-# NuGet v3's project.json files produces more ignorable files
-*.nuget.props
-*.nuget.targets
-
-# Microsoft Azure Build Output
-csx/
-*.build.csdef
-
-# Microsoft Azure Emulator
-ecf/
-rcf/
-
-# Windows Store app package directories and files
-AppPackages/
-BundleArtifacts/
-Package.StoreAssociation.xml
-_pkginfo.txt
-*.appx
-*.appxbundle
-*.appxupload
-
-# Visual Studio cache files
-# files ending in .cache can be ignored
-*.[Cc]ache
-# but keep track of directories ending in .cache
-!?*.[Cc]ache/
-
-# Others
-ClientBin/
-~$*
-*~
-*.dbmdl
-*.dbproj.schemaview
-*.jfm
-*.pfx
-*.publishsettings
-orleans.codegen.cs
-
-# Including strong name files can present a security risk
-# (https://github.com/github/gitignore/pull/2483#issue-259490424)
-#*.snk
-
-# Since there are multiple workflows, uncomment next line to ignore bower_components
-# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
-#bower_components/
-
-# RIA/Silverlight projects
-Generated_Code/
-
-# Backup & report files from converting an old project file
-# to a newer Visual Studio version. Backup files are not needed,
-# because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-UpgradeLog*.htm
-ServiceFabricBackup/
-*.rptproj.bak
-
-# SQL Server files
-*.mdf
-*.ldf
-*.ndf
-
-# Business Intelligence projects
-*.rdl.data
-*.bim.layout
-*.bim_*.settings
-*.rptproj.rsuser
-*- [Bb]ackup.rdl
-*- [Bb]ackup ([0-9]).rdl
-*- [Bb]ackup ([0-9][0-9]).rdl
-
-# Microsoft Fakes
-FakesAssemblies/
-
-# GhostDoc plugin setting file
-*.GhostDoc.xml
-
-# Node.js Tools for Visual Studio
-.ntvs_analysis.dat
-node_modules/
-
-# Visual Studio 6 build log
-*.plg
-
-# Visual Studio 6 workspace options file
-*.opt
-
-# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
-*.vbw
-
-# Visual Studio LightSwitch build output
-**/*.HTMLClient/GeneratedArtifacts
-**/*.DesktopClient/GeneratedArtifacts
-**/*.DesktopClient/ModelManifest.xml
-**/*.Server/GeneratedArtifacts
-**/*.Server/ModelManifest.xml
-_Pvt_Extensions
-
-# Paket dependency manager
-.paket/paket.exe
-paket-files/
-
-# FAKE - F# Make
-.fake/
-
-# CodeRush personal settings
-.cr/personal
-
-# Python Tools for Visual Studio (PTVS)
-__pycache__/
-*.pyc
-
-# Cake - Uncomment if you are using it
-# tools/**
-# !tools/packages.config
-
-# Tabs Studio
-*.tss
-
-# Telerik's JustMock configuration file
-*.jmconfig
-
-# BizTalk build output
-*.btp.cs
-*.btm.cs
-*.odx.cs
-*.xsd.cs
-
-# OpenCover UI analysis results
-OpenCover/
-
-# Azure Stream Analytics local run output
-ASALocalRun/
-
-# MSBuild Binary and Structured Log
-*.binlog
-
-# NVidia Nsight GPU debugger configuration file
-*.nvuser
-
-# MFractors (Xamarin productivity tool) working folder
-.mfractor/
-
-# Local History for Visual Studio
-.localhistory/
-
-# BeatPulse healthcheck temp database
-healthchecksdb
-
-# Backup folder for Package Reference Convert tool in Visual Studio 2017
-MigrationBackup/
-
-# Ionide (cross platform F# VS Code tools) working folder
-.ionide/
-
-# Fody - auto-generated XML schema
-FodyWeavers.xsd
-# Local DB credentials (see appsettings.Development.json.example)
-appsettings.Development.json
+# typescript
+*.tsbuildinfo
+next-env.d.ts
Index: ckerfile
===================================================================
--- Dockerfile	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,27 +1,0 @@
-# Use the official .NET SDK image for building
-FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
-WORKDIR /src
-
-# Copy csproj and restore dependencies
-COPY ["iknow-api/iknow-api.csproj", "iknow-api/"]
-RUN dotnet restore "iknow-api/iknow-api.csproj"
-
-# Copy the rest of the files and build
-COPY . .
-WORKDIR "/src/iknow-api"
-RUN dotnet build "iknow-api.csproj" -c Release -o /app/build
-
-# Publish the application
-FROM build AS publish
-RUN dotnet publish "iknow-api.csproj" -c Release -o /app/publish /p:UseAppHost=false
-
-# Use the runtime image for the final stage
-FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS final
-WORKDIR /app
-EXPOSE 8080
-COPY --from=publish /app/publish .
-
-# Set environment variables
-ENV ASPNETCORE_URLS=http://+:8080
-
-ENTRYPOINT ["dotnet", "iknow-api.dll"]
Index: README.md
===================================================================
--- README.md	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ README.md	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,36 @@
+This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
+
+## Getting Started
+
+First, run the development server:
+
+```bash
+npm run dev
+# or
+yarn dev
+# or
+pnpm dev
+# or
+bun dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
+
+This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
+
+## Learn More
+
+To learn more about Next.js, take a look at the following resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
Index: eslint.config.mjs
===================================================================
--- eslint.config.mjs	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ eslint.config.mjs	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,25 @@
+import { dirname } from "path";
+import { fileURLToPath } from "url";
+import { FlatCompat } from "@eslint/eslintrc";
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const compat = new FlatCompat({
+  baseDirectory: __dirname,
+});
+
+const eslintConfig = [
+  ...compat.extends("next/core-web-vitals", "next/typescript"),
+  {
+    ignores: [
+      "node_modules/**",
+      ".next/**",
+      "out/**",
+      "build/**",
+      "next-env.d.ts",
+    ],
+  },
+];
+
+export default eslintConfig;
Index: now-api.sln
===================================================================
--- iknow-api.sln	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,25 +1,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.14.36518.9 d17.14
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iknow-api", "iknow-api\iknow-api.csproj", "{0812F190-420D-448B-9710-32E746C813B7}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{0812F190-420D-448B-9710-32E746C813B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{0812F190-420D-448B-9710-32E746C813B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{0812F190-420D-448B-9710-32E746C813B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{0812F190-420D-448B-9710-32E746C813B7}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {3E4D4C85-4096-402E-9FC3-19996D358FFE}
-	EndGlobalSection
-EndGlobal
Index: now-api/Controllers/AdminController.cs
===================================================================
--- iknow-api/Controllers/AdminController.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,119 +1,0 @@
-using System.Security.Claims;
-using iknow_api.DTOs;
-using iknow_api.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace iknow_api.Controllers
-{
-    /// <summary>
-    /// UC012 subjects, UC013 active semesters, UC014 professor assignments.
-    /// Every action requires the admin role, checked against the validated token.
-    /// </summary>
-    [ApiController]
-    [Route("api/[controller]")]
-    [Authorize]
-    public class AdminController : ControllerBase
-    {
-        private readonly IAdminService _adminService;
-
-        public AdminController(IAdminService adminService)
-        {
-            _adminService = adminService;
-        }
-
-        // ---------- UC012 ----------
-
-        [HttpGet("subjects")]
-        public async Task<IActionResult> GetSubjects() =>
-            RequireAdmin(out var error) ? Ok(await _adminService.GetSubjectsAsync()) : error;
-
-        [HttpPost("subjects")]
-        public async Task<IActionResult> CreateSubject([FromBody] SubjectWriteDto request) =>
-            RequireAdmin(out var error) ? Result(await _adminService.CreateSubjectAsync(request)) : error;
-
-        [HttpPut("subjects/{id:int}")]
-        public async Task<IActionResult> UpdateSubject(int id, [FromBody] SubjectWriteDto request) =>
-            RequireAdmin(out var error) ? Result(await _adminService.UpdateSubjectAsync(id, request)) : error;
-
-        [HttpDelete("subjects/{id:int}")]
-        public async Task<IActionResult> DeleteSubject(int id) =>
-            RequireAdmin(out var error) ? Result(await _adminService.DeleteSubjectAsync(id)) : error;
-
-        [HttpPost("subjects/{id:int}/majors")]
-        public async Task<IActionResult> LinkMajor(int id, [FromBody] MajorLinkDto request) =>
-            RequireAdmin(out var error) ? Result(await _adminService.LinkMajorAsync(id, request)) : error;
-
-        [HttpDelete("subjects/{id:int}/majors/{majorId:int}")]
-        public async Task<IActionResult> UnlinkMajor(int id, int majorId) =>
-            RequireAdmin(out var error) ? Result(await _adminService.UnlinkMajorAsync(id, majorId)) : error;
-
-        [HttpPost("subjects/{id:int}/prerequisites")]
-        public async Task<IActionResult> AddPrerequisite(int id, [FromBody] PrerequisiteDto request) =>
-            RequireAdmin(out var error) ? Result(await _adminService.AddPrerequisiteAsync(id, request)) : error;
-
-        [HttpDelete("subjects/{id:int}/prerequisites/{dependencyId:int}")]
-        public async Task<IActionResult> RemovePrerequisite(int id, int dependencyId) =>
-            RequireAdmin(out var error) ? Result(await _adminService.RemovePrerequisiteAsync(id, dependencyId)) : error;
-
-        // ---------- UC013 ----------
-
-        [HttpGet("semesters")]
-        public async Task<IActionResult> GetSemesters() =>
-            RequireAdmin(out var error) ? Ok(await _adminService.GetSemestersAsync()) : error;
-
-        [HttpPost("semesters")]
-        public async Task<IActionResult> CreateSemester([FromBody] SemesterWriteDto request) =>
-            RequireAdmin(out var error) ? Result(await _adminService.CreateSemesterAsync(request)) : error;
-
-        // ---------- UC014 ----------
-
-        [HttpGet("schedule/{semesterId:int}")]
-        public async Task<IActionResult> GetSchedule(int semesterId)
-        {
-            if (!RequireAdmin(out var error)) return error;
-
-            var schedule = await _adminService.GetScheduleAsync(semesterId);
-            return schedule is null
-                ? NotFound(new AdminResultDto { Ok = false, Message = "Semester not found." })
-                : Ok(schedule);
-        }
-
-        [HttpPost("schedule")]
-        public async Task<IActionResult> Assign([FromBody] ScheduleWriteDto request) =>
-            RequireAdmin(out var error) ? Result(await _adminService.AssignAsync(request)) : error;
-
-        [HttpDelete("schedule")]
-        public async Task<IActionResult> Unassign([FromBody] ScheduleWriteDto request) =>
-            RequireAdmin(out var error) ? Result(await _adminService.UnassignAsync(request)) : error;
-
-        // ---------- shared ----------
-
-        [HttpGet("majors")]
-        public async Task<IActionResult> GetMajors() =>
-            RequireAdmin(out var error) ? Ok(await _adminService.GetMajorsAsync()) : error;
-
-        private IActionResult Result(AdminResultDto result) =>
-            result.Ok ? Ok(result) : BadRequest(result);
-
-        /// <summary>
-        /// The role comes from the validated token, so it cannot be set by the caller.
-        /// </summary>
-        private bool RequireAdmin(out IActionResult error)
-        {
-            var role = User.FindFirst(ClaimTypes.Role)?.Value ?? User.FindFirst("role")?.Value;
-            if (!string.Equals(role, nameof(Models.UserRole.Admin), StringComparison.OrdinalIgnoreCase))
-            {
-                error = StatusCode(403, new AdminResultDto
-                {
-                    Ok = false,
-                    Message = "This endpoint is for administrators."
-                });
-                return false;
-            }
-
-            error = Ok();
-            return true;
-        }
-    }
-}
Index: now-api/Controllers/AuthController.cs
===================================================================
--- iknow-api/Controllers/AuthController.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,86 +1,0 @@
-﻿using iknow_api.DTOs;
-using iknow_api.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace iknow_api.Controllers
-{
-    [ApiController]
-    [Route("api/[controller]")]
-    public class AuthController : ControllerBase
-    {
-        private readonly IAuthService _authService;
-        private readonly IRefreshTokenService _refreshTokenService;
-
-        public AuthController(IAuthService authService, IRefreshTokenService refreshTokenService)
-        {
-            _authService = authService;
-            _refreshTokenService = refreshTokenService;
-        }
-
-        [HttpGet("testdb")]
-        public async Task<IActionResult> TestDb()
-        {
-            try
-            {
-                var count = await _authService.GetUsersCountAsync();
-                return Ok(new { message = "DB connection works!", usersCount = count });
-            }
-            catch (Exception ex)
-            {
-                return BadRequest(new { message = "DB connection failed", error = ex.Message });
-            }
-        }
-
-        [HttpPost("register")]
-        public async Task<IActionResult> Register([FromBody] RegisterDto request)
-        {
-            try
-            {
-                await _authService.RegisterAsync(request);
-                return Ok("User registered successfully");
-            }
-            catch (InvalidOperationException ex)
-            {
-                return BadRequest(new { message = ex.Message });
-            }
-            catch (Exception ex)
-            {
-                return StatusCode(500, new { message = "An error occurred during registration", error = ex.Message });
-            }
-        }
-
-        [HttpPost("login")]
-        public async Task<IActionResult> Login([FromBody] LoginDto request)
-        {
-            var result = await _authService.LoginAsync(request);
-            if (result == null) return Unauthorized("Invalid credentials");
-
-            return Ok(new
-            {
-                token = result.AccessToken,
-                refreshToken = result.RefreshToken,
-                role = result.Role
-            });
-        }
-
-        [Authorize]
-        [HttpGet("getstring")]
-        public IActionResult getstring()
-        {
-            return Ok(new { message = "You are authorized!" });
-        }
-
-        [HttpPost("verify-user-token")]
-        public async Task<IActionResult> VerifyToken([FromBody] VerifyRefreshTokenDto verifyRefreshToken)
-        {
-            if (await _refreshTokenService.VerifyRefreshToken(verifyRefreshToken))
-            {
-                return Ok(await _authService.GenerateNewJWT(verifyRefreshToken));
-            }
-
-            return BadRequest(new { message = "No token found!" });
-        }
-
-    }
-}
Index: now-api/Controllers/DbHealthController.cs
===================================================================
--- iknow-api/Controllers/DbHealthController.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,49 +1,0 @@
-using iknow_api.Data;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
-
-namespace iknow_api.Controllers;
-
-[ApiController]
-[Route("[controller]")]
-public class DbHealthController(AppDbContext db) : ControllerBase
-{
-    /// <summary>
-    /// Verifies that the SSH tunnel is up, the DB credentials work, and that
-    /// the entity mapping matches the schema created by sql/ddl.sql.
-    /// </summary>
-    [HttpGet]
-    public async Task<IActionResult> Get()
-    {
-        try
-        {
-            // EF projects SqlQuery onto a column named "Value", hence the alias.
-            var version = await db.Database
-                .SqlQuery<string>($"SELECT version() AS \"Value\"")
-                .SingleAsync();
-
-            return Ok(new
-            {
-                connected = true,
-                server = version,
-                counts = new
-                {
-                    users = await db.User.CountAsync(),
-                    subjects = await db.Subjects.CountAsync(),
-                    enrolledSemesters = await db.EnrolledSemesters.CountAsync(),
-                    semesterSubjects = await db.SemesterSubjects.CountAsync(),
-                    passedSubjects = await db.PassedSubjects.CountAsync(),
-                }
-            });
-        }
-        catch (Exception ex)
-        {
-            return StatusCode(503, new
-            {
-                connected = false,
-                error = ex.Message,
-                hint = "Is tunnel_scripta.cmd running and listening on localhost:9999?"
-            });
-        }
-    }
-}
Index: now-api/Controllers/EnrollmentController.cs
===================================================================
--- iknow-api/Controllers/EnrollmentController.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,78 +1,0 @@
-using System.Security.Claims;
-using iknow_api.DTOs;
-using iknow_api.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace iknow_api.Controllers
-{
-    [ApiController]
-    [Route("api/[controller]")]
-    [Authorize]
-    public class EnrollmentController : ControllerBase
-    {
-        private readonly IEnrollmentService _enrollmentService;
-
-        public EnrollmentController(IEnrollmentService enrollmentService)
-        {
-            _enrollmentService = enrollmentService;
-        }
-
-        [HttpGet("options")]
-        public async Task<IActionResult> GetOptions()
-        {
-            if (!TryGetStudentId(out var studentId, out var error))
-            {
-                return error;
-            }
-
-            return Ok(await _enrollmentService.GetOptionsAsync(studentId));
-        }
-
-        [HttpPost]
-        public async Task<IActionResult> Enroll([FromBody] EnrollSemesterRequestDto request)
-        {
-            if (!TryGetStudentId(out var studentId, out var error))
-            {
-                return error;
-            }
-
-            var result = await _enrollmentService.EnrollAsync(studentId, request);
-            return result.Ok ? Ok(result) : BadRequest(result);
-        }
-
-        /// <summary>
-        /// Reads the caller from the validated token, so a student can only ever
-        /// enrol themselves.
-        /// </summary>
-        private bool TryGetStudentId(out int studentId, out IActionResult error)
-        {
-            studentId = 0;
-            error = Forbid();
-
-            var role = User.FindFirst(ClaimTypes.Role)?.Value ?? User.FindFirst("role")?.Value;
-            if (!string.Equals(role, nameof(Models.UserRole.Student), StringComparison.OrdinalIgnoreCase))
-            {
-                error = StatusCode(403, new EnrollSemesterResultDto
-                {
-                    Ok = false,
-                    Message = "Only students can enrol in a semester."
-                });
-                return false;
-            }
-
-            var idClaim = User.FindFirst("id")?.Value;
-            if (!int.TryParse(idClaim, out studentId))
-            {
-                error = Unauthorized(new EnrollSemesterResultDto
-                {
-                    Ok = false,
-                    Message = "Token has no usable user id."
-                });
-                return false;
-            }
-
-            return true;
-        }
-    }
-}
Index: now-api/Controllers/ProfController.cs
===================================================================
--- iknow-api/Controllers/ProfController.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,93 +1,0 @@
-using System.Security.Claims;
-using iknow_api.DTOs;
-using iknow_api.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace iknow_api.Controllers
-{
-    [ApiController]
-    [Route("api/[controller]")]
-    [Authorize]
-    public class ProfController : ControllerBase
-    {
-        private readonly IProfService _profService;
-
-        public ProfController(IProfService profService)
-        {
-            _profService = profService;
-        }
-
-        /// <summary>
-        /// The subjects this professor teaches, each with the students enrolled
-        /// in it and their grade so far.
-        /// </summary>
-        [HttpGet("students")]
-        public async Task<IActionResult> GetStudents()
-        {
-            if (!TryGetProfessorId(out var professorId, out var error))
-            {
-                return error;
-            }
-
-            return Ok(await _profService.GetStudentsBySubjectAsync(professorId));
-        }
-
-        [HttpPost("grade/add")]
-        public Task<IActionResult> AddGrade([FromBody] GradeRequestDto request) =>
-            SetGrade(request, GradeAction.Add);
-
-        [HttpPost("grade/edit")]
-        public Task<IActionResult> EditGrade([FromBody] GradeRequestDto request) =>
-            SetGrade(request, GradeAction.Edit);
-
-        [HttpPost("grade/remove")]
-        public Task<IActionResult> RemoveGrade([FromBody] GradeRequestDto request) =>
-            SetGrade(request, GradeAction.Remove);
-
-        private async Task<IActionResult> SetGrade(GradeRequestDto request, GradeAction action)
-        {
-            if (!TryGetProfessorId(out var professorId, out var error))
-            {
-                return error;
-            }
-
-            var result = await _profService.SetGradeAsync(professorId, request, action);
-            return result.Ok ? Ok(result) : BadRequest(result);
-        }
-
-        /// <summary>
-        /// Reads the caller from the validated token and requires the professor
-        /// role, so one professor can never act on another one's subjects.
-        /// </summary>
-        private bool TryGetProfessorId(out int professorId, out IActionResult error)
-        {
-            professorId = 0;
-            error = Forbid();
-
-            var role = User.FindFirst(ClaimTypes.Role)?.Value ?? User.FindFirst("role")?.Value;
-            if (!string.Equals(role, nameof(Models.UserRole.Professor), StringComparison.OrdinalIgnoreCase))
-            {
-                error = StatusCode(403, new GradeResultDto
-                {
-                    Ok = false,
-                    Message = "This endpoint is for professors."
-                });
-                return false;
-            }
-
-            var idClaim = User.FindFirst("id")?.Value;
-            if (!int.TryParse(idClaim, out professorId))
-            {
-                error = Unauthorized(new GradeResultDto
-                {
-                    Ok = false,
-                    Message = "Token has no usable user id."
-                });
-                return false;
-            }
-
-            return true;
-        }
-    }
-}
Index: now-api/Controllers/UserController.cs
===================================================================
--- iknow-api/Controllers/UserController.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,348 +1,0 @@
-using iknow_api.DTOs;
-using iknow_api.Models;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using iknow_api.Services;
-
-namespace iknow_api.Controllers
-{
-    [ApiController]
-    [Route("api/[controller]")]
-    public class UserController : Controller
-    {
-        IUserService _userService;
-        public UserController(IUserService userService)
-        {
-            _userService = userService;
-        }
-
-        //  "birthInfo": {
-        //    "placeOfBirth": "Скопје",
-        //    "municipalityOfBirth": "Скопје",
-        //    "country": "Република Северна Македонија"
-        //  },
-        //  "previousEducation": {
-        //    "type": "Гимназиско образование",
-        //    "profession": "",
-        //    "average": "54,857",
-        //    "language": "Македонски",
-        //    "country": "",
-        //    "previousUniversity": "Гимназиско образование",
-        //    "previousFaculty": "",
-        //    "previousStudyMode": ""
-        //  },
-        //  "enrollmentInfo": {
-        //    "enrollmentYear": "2023",
-        //    "status": "Редовен",
-        //    "cycle": "Прв циклус",
-        //    "program": "Примена на информациски технологии",
-        //    "quota": "Кофинансирање-Редовен (2023, 24600)",
-        //    "secondaryEducationNumber": "",
-        //    "previousEducationCredits": ""
-        //  },
-        //  "contact": {
-        //    "placeOfResidence": "Скопје",
-        //    "municipalityOfResidence": "Кисела Вода - Скопје",
-        //    "country": "Република Северна Македонија",
-        //    "address": "Драчево",
-        //    "temporaryAddress": "",
-        //    "phone": "",
-        //    "mobilePhone": "075295582",
-        //    "passportNumber": "",
-        //    "passportExpiryDate": "",
-        //    "email": "stefansaveski19@gmail.com",
-        //    "microsoftEmail": "stefan.saveski@students.finki.ukim.mk"
-        //  }
-        //}
-        [Authorize]
-        [HttpGet("getUser")]
-        public async Task<IActionResult> getUser()
-        {
-            //{
-            //  "personalInfo": {
-            //    "index": "233149/2023",
-            //    "embg": "/////////////",
-            //    "lastName": "Савески",
-            //    "middleName": "Дејан",
-            //    "firstName": "Стефан",
-            //    "maidenName": "",
-            //    "dateOfBirth": "19.08.2004",
-            //    "gender": "машки",
-            //    "nationality": "Македонец",
-            //    "citizenship": "Република Северна Македонија",
-            //    "scholarship": "Користи",
-            //    "currentPlan": "2023",
-            //    "registryNumber": "",
-            //    "notes": "Систематски преглед Студира 3 години",
-            //    "studyGroup": ""
-            //  },
-            var authHeader = Request.Headers["Authorization"].ToString();
-            if (authHeader.StartsWith("Bearer "))
-            {
-                var token = authHeader.Substring("Bearer ".Length).Trim();
-                // token = your JWT
-                var userData = await _userService.GetUserData(token);
-                if (userData == null) return Ok(new { info = "can't get info" });
-
-                // The study programme comes from the student's most recent
-                // enrolment. Within an academic year winter precedes summer,
-                // so order by year first and put winter ahead of summer.
-                var currentEnrolment = userData.Enrolments?
-                    .Where(es => es.Semester != null)
-                    .OrderByDescending(es => es.Semester!.Year)
-                    .ThenByDescending(es => es.Semester!.Type == sType.summer)
-                    .FirstOrDefault();
-
-                var personalInfo = new
-                {
-                    index = userData.Index ?? "",
-                    embg = userData.EMBG ?? "",
-                    lastName = userData.Surname ?? "",
-                    middleName = "", // Not an attribute of Users in the ER model
-                    firstName = userData.Name ?? "",
-                    maidenName = "", // Property doesn't exist in User model
-                    dateOfBirth = userData.Bday?.ToString("dd.MM.yyyy") ?? "",
-                    gender = "", // Not an attribute of Users in the ER model
-                    nationality = "", // Not an attribute of Users in the ER model
-                    citizenship = "", // Not an attribute of Users in the ER model
-                    scholarship = "",
-                    currentPlan = userData.EnrollmentYear?.ToString() ?? "",
-                    registryNumber = "",
-                    notes = "",
-                    studyGroup = ""
-                };
-                var birthInfo = new
-                {
-                    placeOfBirth = userData.ContactInfo?.City ?? "",
-                    municipalityOfBirth = userData.ContactInfo?.Municipality ?? "",
-                    country = "" // Not an attribute of Users in the ER model
-                };
-                var previousEducation = new
-                {
-                    type = userData.HighSchool?.HighSchoolType.ToString() ?? "",
-                    profession = "",
-                    average = userData.HighSchool?.GPA.ToString() ?? "",
-                    language = "", // Not an attribute of HighSchool in the ER model
-                    country = "",
-                    previousUniversity = userData.HighSchool?.HighSchoolType.ToString() ?? "",
-                    previousFaculty = "", // Property doesn't exist in HighSchool model
-                    previousStudyMode = "" // Property doesn't exist in HighSchool model
-                };
-                var enrollmentInfo = new
-                {
-                    enrollmentYear = userData.EnrollmentYear?.ToString() ?? "",
-                    status = "", // Not an attribute of Users in the ER model
-                    cycle = "Прв циклус",
-                    program = currentEnrolment?.Major?.Name ?? "",
-                    quota = userData.Quota?.ToString() ?? "",
-                    secondaryEducationNumber = "",
-                    previousEducationCredits = ""
-                };
-                var contact = new
-                {
-                    placeOfResidence = userData.ContactInfo?.City ?? "",
-                    municipalityOfResidence = userData.ContactInfo?.Municipality ?? "",
-                    country = "", // Not an attribute of Users in the ER model
-                    address = userData.ContactInfo?.Address ?? "",
-                    temporaryAddress = "",
-                    phone = "",
-                    mobilePhone = userData.ContactInfo?.PhoneNumber ?? "",
-                    passportNumber = "",
-                    passportExpiryDate = "",
-                    email = userData.Email ?? "",
-                    microsoftEmail = userData.ContactInfo?.MicrosoftEmail ?? ""
-                };
-                return Ok(new { personalInfo = personalInfo, birthInfo = birthInfo, previousEducation = previousEducation, enrollmentInfo = enrollmentInfo, contact = contact });
-                //return Ok(new { User = userData });
-            }
-            return null;
-
-        }
-        [Authorize]
-        [HttpGet("getSemesters")]
-        public async Task<IActionResult> getSemesters()
-        {
-            var authHeader = Request.Headers["Authorization"].ToString();
-            if (authHeader.StartsWith("Bearer "))
-            {
-                var token = authHeader.Substring("Bearer ".Length).Trim();
-                // token = your JWT
-                var userData = await _userService.GetUserSemesters(token);
-                var results = new List<object>();
-
-                for (int i = 0; i < userData.Count; i++)
-                {
-                    var newResult = new
-                    {
-                        id = userData[i].Id,
-                        // sType declares summer first, so compare against the member
-                        // rather than the ordinal - == 0 meant summer, not winter.
-                        semester = (userData[i].Semester.Type == sType.winter ? "Зимски" : "Летен") + $"({userData[i].Semester.Year}/{userData[i].Semester.Year + 1})",
-                        direction = userData[i].Major?.Name ?? "",
-                        quota = userData[i].QuotaType.ToString(),
-                        note = userData[i].Note ?? "",
-                        studentCom = userData[i].StudentComment ?? "",
-                        sum = "0,00",
-                        paid = "0,00",
-                        ukim = "",
-                        createdOn = userData[i].CratedAt.ToString("dd.MM.yyyy"),
-                        dateChanged = userData[i].LastChange?.ToString("dd.MM.yyyy") ?? "",
-                        credits = "0,00",
-                        type = "Ред.",
-                        doc = "Не",
-                        doc1 = "Не",
-                        verified = "Не",
-                        taxes = "0,00",
-                        signatures = "0/5",
-                        status = "валиден",
-                        completed = userData[i].Verified.HasValue ? "Да" : "Не"
-                    };
-                    results.Add(newResult);
-                }
-                if (userData == null) return Ok(new { info = "can't get info" });
-                return Ok(new { semesters = results });
-            }
-            return null;
-        }
-
-        [Authorize]
-        [HttpGet("getSubjects")]
-        public async Task<IActionResult> getSubjects()
-        {
-            var authHeader = Request.Headers["Authorization"].ToString();
-            var token = authHeader.Substring("Bearer ".Length).Trim();
-            // token = your JWT
-            var userData = await _userService.GetUserSemesters(token);
-            var results = new List<object>();
-            var random = new Random();
-            for (int i = 0; i < userData.Count; i++)
-            {
-                var newResult = new
-                {
-                    id = userData[i].Id,
-                    name = (userData[i].Semester.Type == sType.winter ? "Зимски" : "Летен") + $"({userData[i].Semester.Year}/{userData[i].Semester.Year + 1})",
-                    status = "валиден",
-                    serviceNumber = 1000000 + random.Next(10000, 100000)
-                };
-                results.Add(newResult);
-            }
-                
-            
-            var subjectsBySemester = new Dictionary<string, List<object>>();
-
-            foreach (var enrollment in userData)
-            {
-                // Create semester key like "winter_2025_2026" or "summer_2025_2026"
-                var semesterType = enrollment.Semester.Type == sType.winter ? "winter" : "summer";
-                var semesterKey = $"{semesterType}_{enrollment.Semester.Year}_{enrollment.Semester.Year + 1}";
-
-                // Initialize list if this semester key doesn't exist
-                if (!subjectsBySemester.ContainsKey(semesterKey))
-                {
-                    subjectsBySemester[semesterKey] = new List<object>();
-                }
-
-                // Add subjects from this semester enrollment
-                if (enrollment.SemesterSubjects != null)
-                {
-                    foreach (var semesterSubject in enrollment.SemesterSubjects)
-                    {
-                        var subject = semesterSubject.Subject;
-                        if (subject != null)
-                        {
-                            var subjectData = new
-                            {
-                                id = subject.Id,
-                                code = subject.Code ?? "",
-                                hours = "2+4", // You may need to add this to your Subject model
-                                kojPat = 1, // You may need to add this field
-                                name = subject.Name ?? "",
-                                semester = 5, // You may need to calculate or add this field
-                                status = "Зад.", // Determine based on PassedSubject or other logic
-                                signature = semesterSubject.Signature ? "Да" : "Не",
-                                group = "", // You may need to add this field
-                                professor = semesterSubject.Professor?.Name + " " + semesterSubject.Professor?.Surname ?? "",
-                            };
-                            subjectsBySemester[semesterKey].Add(subjectData);
-                        }
-                    }
-                }
-                
-            }
-            var currentSemester = userData.FirstOrDefault(); // Get the most recent/current semester
-            var semesterTypeGlobal = currentSemester.Semester.Type == sType.winter ? "winter" : "summer";
-            var semesterData = new
-            {
-                id = $"{semesterTypeGlobal}_{currentSemester.Semester.Year}_{currentSemester.Semester.Year + 1}",
-                name = (currentSemester.Semester.Type == sType.winter ? "Зимски" : "Летен") + $" ({currentSemester.Semester.Year}/{currentSemester.Semester.Year + 1})",
-                status = "валиден",
-                serviceNumber = (1000000 + random.Next(10000, 100000)).ToString(),
-                ticketNumber = random.Next(100000, 1000000).ToString(),
-                debt = "0,00",
-                financialInfo = new
-                {
-                    sum = 1,
-                    paid = "0,00",
-                    due = "0,00",
-                    materialCosts = "Осигурување, Административна такса, Тетратки (испити), зимски семестар: 1000,00",
-                    credits = "30,00",
-                    totalCredits = "30,00",
-                    MKSA = "750,00",
-                    electronicRegistration = "100,00",
-                    eUKIM = "350,00",
-                    bankProvision = "25,00",
-                    total = "2226,00"
-                }
-            };
-            if (userData == null) return Ok(new { info = "can't get info" });
-            //return Ok(new { semester = userData });
-            return Ok(new { semesters = results, currentSemestar = semesterData, subjectsBySemester = subjectsBySemester });
-        }
-
-        [Authorize]
-        [HttpGet("getPassedSubjects")]
-        public async Task<IActionResult> getPassedSubjects()
-        {
-            var authHeader = Request.Headers["Authorization"].ToString();
-            if (!authHeader.StartsWith("Bearer "))
-                return Unauthorized();
-
-            var token = authHeader.Substring("Bearer ".Length).Trim();
-            var passedSubjects = await _userService.GetUserPassedSubjects(token);
-
-            if (passedSubjects == null || !passedSubjects.Any())
-                return Ok(new { info = "No passed subjects found", passedSubjects = new List<object>() });
-
-            var results = new List<object>();
-
-            foreach (var passed in passedSubjects)
-            {
-                if (passed.SemesterSubject?.Subject != null)
-                {
-                    var result = new
-                    {
-                        id = passed.Id,
-                        subjectId = passed.SemesterSubject.Subject.Id,
-                        code = passed.SemesterSubject.Subject.Code ?? "",
-                        subject = passed.SemesterSubject.Subject.Name ?? "",
-                        credits = passed.SemesterSubject.Subject.AwardedCredits ?? 0,
-                        grade = (int)passed.Grade,
-                        gradeText = passed.Grade.ToString(),
-                        date = passed.DatePassed.ToString("dd.MM.yyyy"),
-                        semester = passed.SemesterSubject.EnrolledSemester?.Semester != null
-                            ? (passed.SemesterSubject.EnrolledSemester.Semester.Type == sType.winter ? "Зимски" : "Летен") + 
-                              $" ({passed.SemesterSubject.EnrolledSemester.Semester.Year}/{passed.SemesterSubject.EnrolledSemester.Semester.Year + 1})"
-                            : "",
-                        professor = passed.SemesterSubject.Professor != null
-                            ? $"{passed.SemesterSubject.Professor.Name} {passed.SemesterSubject.Professor.Surname}".Trim()
-                            : ""
-                    };
-                    results.Add(result);
-                }
-            }
-
-            return Ok(new { passedSubjects = results });
-        }
-
-    }
-}
Index: now-api/DTOs/AdminDTO.cs
===================================================================
--- iknow-api/DTOs/AdminDTO.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,121 +1,0 @@
-namespace iknow_api.DTOs
-{
-    // ---------- UC012 subjects ----------
-
-    public class AdminSubjectDto
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public string? Code { get; set; }
-        public int AwardedCredits { get; set; }
-        public int? DependencyCredit { get; set; }
-        public List<SubjectMajorDto> Majors { get; set; } = new();
-        public List<SubjectRefDto> Prerequisites { get; set; } = new();
-        /// <summary>How many enrolments already contain this subject; it cannot be deleted while this is above zero.</summary>
-        public int EnrolledCount { get; set; }
-    }
-
-    public class SubjectMajorDto
-    {
-        public int MajorId { get; set; }
-        public string? MajorName { get; set; }
-        public int MandatorySemester { get; set; }
-    }
-
-    public class SubjectRefDto
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public string? Code { get; set; }
-    }
-
-    public class SubjectWriteDto
-    {
-        public string? Name { get; set; }
-        public string? Code { get; set; }
-        public int AwardedCredits { get; set; }
-        public int? DependencyCredit { get; set; }
-    }
-
-    public class MajorLinkDto
-    {
-        public int MajorId { get; set; }
-        public int MandatorySemester { get; set; }
-    }
-
-    public class PrerequisiteDto
-    {
-        public int DependencyId { get; set; }
-    }
-
-    // ---------- UC013 semesters ----------
-
-    public class AdminSemesterDto
-    {
-        public int Id { get; set; }
-        public int Year { get; set; }
-        public string? Type { get; set; }
-        public string? Name { get; set; }
-        public int EnrolmentCount { get; set; }
-        /// <summary>Subjects with no professor teaching them in this semester.</summary>
-        public List<SubjectRefDto> UncoveredSubjects { get; set; } = new();
-    }
-
-    public class SemesterWriteDto
-    {
-        public int Year { get; set; }
-        /// <summary>"winter" or "summer".</summary>
-        public string? Type { get; set; }
-    }
-
-    // ---------- UC014 schedule ----------
-
-    public class ScheduleDto
-    {
-        public int SemesterId { get; set; }
-        public string? SemesterName { get; set; }
-        public List<ScheduleRowDto> Assignments { get; set; } = new();
-        public List<ProfessorLoadDto> Load { get; set; } = new();
-        public List<SubjectRefDto> UncoveredSubjects { get; set; } = new();
-        public List<SubjectRefDto> AllSubjects { get; set; } = new();
-        public List<ProfessorRefDto> Professors { get; set; } = new();
-    }
-
-    public class ScheduleRowDto
-    {
-        public int SubjectId { get; set; }
-        public string? SubjectName { get; set; }
-        public string? SubjectCode { get; set; }
-        public int ProfessorId { get; set; }
-        public string? ProfessorName { get; set; }
-    }
-
-    public class ProfessorRefDto
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-    }
-
-    public class ProfessorLoadDto
-    {
-        public int ProfessorId { get; set; }
-        public string? ProfessorName { get; set; }
-        public int Subjects { get; set; }
-    }
-
-    public class ScheduleWriteDto
-    {
-        public int ProfessorId { get; set; }
-        public int SemesterId { get; set; }
-        public int SubjectId { get; set; }
-    }
-
-    // ---------- shared ----------
-
-    public class AdminResultDto
-    {
-        public bool Ok { get; set; }
-        public string? Message { get; set; }
-        public int? Id { get; set; }
-    }
-}
Index: now-api/DTOs/EnrollmentDTO.cs
===================================================================
--- iknow-api/DTOs/EnrollmentDTO.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,57 +1,0 @@
-namespace iknow_api.DTOs
-{
-    /// <summary>Everything the enrolment form needs to render.</summary>
-    public class EnrollmentOptionsDto
-    {
-        /// <summary>How many subjects an enrolment must contain.</summary>
-        public int RequiredSubjects { get; set; }
-
-        /// <summary>Semesters this student has not enrolled in yet.</summary>
-        public List<SemesterOptionDto> Semesters { get; set; } = new();
-
-        public List<MajorOptionDto> Majors { get; set; } = new();
-
-        /// <summary>The major from the most recent enrolment, if there is one.</summary>
-        public int? DefaultMajorId { get; set; }
-    }
-
-    public class SemesterOptionDto
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public int Year { get; set; }
-        public string? Type { get; set; }
-    }
-
-    public class MajorOptionDto
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public List<SubjectOptionDto> Subjects { get; set; } = new();
-    }
-
-    public class SubjectOptionDto
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public string? Code { get; set; }
-        public int Credits { get; set; }
-        public int MandatorySemester { get; set; }
-        /// <summary>True when the student already passed this subject.</summary>
-        public bool AlreadyPassed { get; set; }
-    }
-
-    public class EnrollSemesterRequestDto
-    {
-        public int SemesterId { get; set; }
-        public int MajorId { get; set; }
-        public List<int> SubjectIds { get; set; } = new();
-    }
-
-    public class EnrollSemesterResultDto
-    {
-        public bool Ok { get; set; }
-        public string? Message { get; set; }
-        public int? EnrolledSemesterId { get; set; }
-    }
-}
Index: now-api/DTOs/ProfDTO.cs
===================================================================
--- iknow-api/DTOs/ProfDTO.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,36 +1,0 @@
-namespace iknow_api.DTOs
-{
-    /// <summary>One subject a professor teaches, with the students enrolled in it.</summary>
-    public class SubjectStudentsDto
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public string? Code { get; set; }
-        public List<EnrolledStudentDto> Users { get; set; } = new();
-    }
-
-    public class EnrolledStudentDto
-    {
-        /// <summary>users.id - what the grading endpoints expect as StudentId.</summary>
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        /// <summary>users.index - the number a professor actually recognises.</summary>
-        public string? Index { get; set; }
-        /// <summary>0 when the subject has not been graded yet.</summary>
-        public int Grade { get; set; }
-        public string? Semester { get; set; }
-    }
-
-    public class GradeRequestDto
-    {
-        public int StudentId { get; set; }
-        public int SubjectId { get; set; }
-        public int Grade { get; set; }
-    }
-
-    public class GradeResultDto
-    {
-        public bool Ok { get; set; }
-        public string? Message { get; set; }
-    }
-}
Index: now-api/DTOs/RefreshTokenDTO.cs
===================================================================
--- iknow-api/DTOs/RefreshTokenDTO.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,14 +1,0 @@
-namespace iknow_api.DTOs
-{
-    public class VerifyRefreshTokenDto
-    {
-        public string token { get; set; } = string.Empty;
-    }
-
-    public class AuthResultDto
-    {
-        public string AccessToken { get; set; } = string.Empty;
-        public string? RefreshToken { get; set; }
-        public string Role { get; set; } = string.Empty;
-    }
-}
Index: now-api/DTOs/UserDTO.cs
===================================================================
--- iknow-api/DTOs/UserDTO.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,74 +1,0 @@
-﻿using System.Text.Json.Serialization;
-
-namespace iknow_api.DTOs
-{
-    // Login DTO
-    public class LoginDto
-    {
-        public string Email { get; set; } = string.Empty;
-        public string Password { get; set; } = string.Empty;
-        public bool GenerateRefreshToken { get; set; }
-    }
-    public class GetUserDataDto
-    {
-        public string? JWT { get; set; }
-    }
-
-    // Registration DTO
-    public class RegisterDto
-    {
-        public string Name { get; set; } = string.Empty;
-        public string? MiddleName { get; set; }
-        public string Surname { get; set; } = string.Empty;
-        public string EMBG { get; set; } = string.Empty;
-        public string? Index { get; set; }
-        public string Email { get; set; } = string.Empty;
-        public string Password { get; set; } = string.Empty;
-        public DateTime Bday { get; set; }
-        public UserRole Role { get; set; }
-        public float gpa { get; set; }
-        public HighSchoolType tip { get; set; }
-        public string city { get; set; } = string.Empty;
-        public string address { get; set; } = string.Empty;
-        public string municipality { get; set; } = string.Empty;
-        public string phoneNumber { get; set; } = string.Empty;
-        public string microsoftEmail { get; set; } = string.Empty;
-        public int enrollmentYear { get; set; }
-        public Quota quotaType { get; set; }
-        public int majorType { get; set; }
-        public string? gender { get; set; }
-        public string? nationality { get; set; }
-        public string? citizenship { get; set; }
-        public string? studyType { get; set; }
-        public string? studyStatus { get; set; }
-    }
-
-    // User response DTO (for returning user data without password)
-    public class UserResponseDto
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public string? Surname { get; set; }
-        public string? Index { get; set; }
-        public string? Email { get; set; }
-        public DateTime Bday { get; set; }
-        public DateTime CreatedAt { get; set; }
-        public UserRole Role { get; set; }
-    }
-
-    // User role enum
-    public enum UserRole
-    {
-        Admin,
-        Professor,
-        Student
-    }
-    public enum HighSchoolType
-    {
-        strucen, gimnazija
-    }
-    public enum Quota
-    {
-        drzavna, privatna, stipendija
-    }
-}
Index: now-api/Data/AppDbContext.cs
===================================================================
--- iknow-api/Data/AppDbContext.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,378 +1,0 @@
-using Microsoft.EntityFrameworkCore;
-using iknow_api.Models;
-
-namespace iknow_api.Data
-{
-    /// <summary>
-    /// The schema is owned by sql/ddl.sql, not by EF migrations. Every entity
-    /// below is mapped explicitly onto the table and column names in that
-    /// script; nothing here may rely on EF naming conventions.
-    /// </summary>
-    public class AppDbContext : DbContext
-    {
-        /// <summary>
-        /// The schema created by sql/schema_creation.sql. Every table and enum
-        /// type is qualified with it, so nothing depends on search_path.
-        /// </summary>
-        public const string ProjectSchema = "project";
-
-        public AppDbContext(DbContextOptions<AppDbContext> options)
-            : base(options) { }
-
-        public DbSet<User> User { get; set; }
-        public DbSet<ContactInfo> ContactInfo { get; set; }
-        public DbSet<HighSchool> HighSchool { get; set; }
-        public DbSet<RefreshToken> RefreshToken { get; set; }
-        public DbSet<Subject> Subjects { get; set; }
-        public DbSet<DependencySubject> DependencySubjects { get; set; }
-        public DbSet<Major> Majors { get; set; }
-        public DbSet<PassedSubject> PassedSubjects { get; set; }
-        public DbSet<EnrolledSemesters> EnrolledSemesters { get; set; }
-        public DbSet<ActiveSemesters> ActiveSemesters { get; set; }
-        public DbSet<SemesterSubject> SemesterSubjects { get; set; }
-        public DbSet<MajorSubjects> MajorSubjects { get; set; }
-        public DbSet<UserDocuments> UserDocuments { get; set; }
-        public DbSet<Documents> Documents { get; set; }
-        public DbSet<Payment> Payments { get; set; }
-        public DbSet<ProfessorSubjects> ProfessorSubjects { get; set; }
-
-        protected override void OnModelCreating(ModelBuilder modelBuilder)
-        {
-            base.OnModelCreating(modelBuilder);
-
-            // The enum types themselves are declared in ddl.sql; this tells EF
-            // they exist so it does not try to treat the columns as text.
-            modelBuilder.HasPostgresEnum<UserRole>(ProjectSchema, "user_role");
-            modelBuilder.HasPostgresEnum<HighSchoolType>(ProjectSchema, "hs_type");
-            modelBuilder.HasPostgresEnum<Quota>(ProjectSchema, "quota_type");
-            modelBuilder.HasPostgresEnum<sType>(ProjectSchema, "semester_type");
-            modelBuilder.HasPostgresEnum<Grade>(ProjectSchema, "grade_type");
-
-            // -------------------------
-            // users
-            // -------------------------
-            modelBuilder.Entity<User>(e =>
-            {
-                e.ToTable("users", ProjectSchema);
-                e.HasKey(u => u.Id);
-                e.Property(u => u.Id).HasColumnName("id");
-                e.Property(u => u.Name).HasColumnName("name");
-                e.Property(u => u.EMBG).HasColumnName("embg");
-                e.Property(u => u.Surname).HasColumnName("surname");
-                e.Property(u => u.Index).HasColumnName("index");
-                e.Property(u => u.Bday).HasColumnName("bday").HasColumnType("timestamp without time zone");
-                e.Property(u => u.Email).HasColumnName("email");
-                e.Property(u => u.PasswordHash).HasColumnName("password");
-                e.Property(u => u.Role).HasColumnName("role");
-                e.Property(u => u.Quota).HasColumnName("quota");
-                e.Property(u => u.EnrollmentYear).HasColumnName("enrollment_year");
-                e.Property(u => u.CreatedAt).HasColumnName("created_at").HasColumnType("timestamp without time zone");
-                e.HasIndex(u => u.Email).IsUnique();
-            });
-
-            // -------------------------
-            // high_school
-            // -------------------------
-            modelBuilder.Entity<HighSchool>(e =>
-            {
-                e.ToTable("high_school", ProjectSchema);
-                e.HasKey(h => h.Id);
-                e.Property(h => h.Id).HasColumnName("id");
-                e.Property(h => h.UserId).HasColumnName("user_id");
-                e.Property(h => h.GPA).HasColumnName("gpa");
-                e.Property(h => h.HighSchoolType).HasColumnName("type");
-                e.HasOne(h => h.User)
-                 .WithOne(u => u.HighSchool)
-                 .HasForeignKey<HighSchool>(h => h.UserId)
-                 .OnDelete(DeleteBehavior.Restrict);
-            });
-
-            // -------------------------
-            // contact
-            // -------------------------
-            modelBuilder.Entity<ContactInfo>(e =>
-            {
-                e.ToTable("contact", ProjectSchema);
-                e.HasKey(c => c.Id);
-                e.Property(c => c.Id).HasColumnName("id");
-                e.Property(c => c.UserId).HasColumnName("user_id");
-                e.Property(c => c.City).HasColumnName("city");
-                e.Property(c => c.Municipality).HasColumnName("municipality");
-                e.Property(c => c.Address).HasColumnName("address");
-                e.Property(c => c.PhoneNumber).HasColumnName("number");
-                e.Property(c => c.MicrosoftEmail).HasColumnName("microsoft_email");
-                e.HasOne(c => c.User)
-                 .WithOne(u => u.ContactInfo)
-                 .HasForeignKey<ContactInfo>(c => c.UserId)
-                 .OnDelete(DeleteBehavior.Restrict);
-            });
-
-            // -------------------------
-            // major
-            // -------------------------
-            modelBuilder.Entity<Major>(e =>
-            {
-                e.ToTable("major", ProjectSchema);
-                e.HasKey(m => m.Id);
-                e.Property(m => m.Id).HasColumnName("id");
-                e.Property(m => m.Name).HasColumnName("name");
-            });
-
-            // -------------------------
-            // active_semesters
-            // -------------------------
-            modelBuilder.Entity<ActiveSemesters>(e =>
-            {
-                e.ToTable("active_semesters", ProjectSchema);
-                e.HasKey(a => a.Id);
-                e.Property(a => a.Id).HasColumnName("id");
-                e.Property(a => a.Year).HasColumnName("year");
-                e.Property(a => a.Type).HasColumnName("type");
-            });
-
-            // -------------------------
-            // subjects
-            // -------------------------
-            modelBuilder.Entity<Subject>(e =>
-            {
-                e.ToTable("subjects", ProjectSchema);
-                e.HasKey(s => s.Id);
-                e.Property(s => s.Id).HasColumnName("id");
-                e.Property(s => s.Name).HasColumnName("name");
-                e.Property(s => s.Code).HasColumnName("code");
-                e.Property(s => s.AwardedCredits).HasColumnName("awarded_credits");
-                e.Property(s => s.DependencyCredit).HasColumnName("dependency_credit");
-            });
-
-            // -------------------------
-            // enrolled_semesters
-            // -------------------------
-            modelBuilder.Entity<EnrolledSemesters>(e =>
-            {
-                e.ToTable("enrolled_semesters", ProjectSchema);
-                e.HasKey(es => es.Id);
-                e.Property(es => es.Id).HasColumnName("id");
-                e.Property(es => es.UserId).HasColumnName("user_id");
-                e.Property(es => es.QuotaType).HasColumnName("quota");
-                e.Property(es => es.MajorId).HasColumnName("major_id");
-                e.Property(es => es.Note).HasColumnName("note");
-                e.Property(es => es.StudentComment).HasColumnName("student_comment");
-                e.Property(es => es.CratedAt).HasColumnName("created_at").HasColumnType("timestamp without time zone");
-                e.Property(es => es.LastChange).HasColumnName("last_change").HasColumnType("timestamp without time zone");
-                e.Property(es => es.Verified).HasColumnName("completed").HasColumnType("timestamp without time zone");
-                e.Property(es => es.SemesterId).HasColumnName("semester_id");
-
-                e.HasOne(es => es.User)
-                 .WithMany(u => u.Enrolments)
-                 .HasForeignKey(es => es.UserId)
-                 .OnDelete(DeleteBehavior.Restrict);
-
-                // Note: this deliberately keys off SemesterId. An earlier version
-                // pointed the foreign key at es.Id, which silently tied every
-                // enrolment to the semester that happened to share its id.
-                e.HasOne(es => es.Semester)
-                 .WithMany(a => a.EnrolledSemesters)
-                 .HasForeignKey(es => es.SemesterId)
-                 .OnDelete(DeleteBehavior.Restrict);
-
-                e.HasOne(es => es.Major)
-                 .WithMany()
-                 .HasForeignKey(es => es.MajorId)
-                 .OnDelete(DeleteBehavior.Restrict);
-            });
-
-            // -------------------------
-            // semesters_subjects
-            // -------------------------
-            modelBuilder.Entity<SemesterSubject>(e =>
-            {
-                e.ToTable("semesters_subjects", ProjectSchema);
-                e.HasKey(ss => ss.Id);
-                e.Property(ss => ss.Id).HasColumnName("id");
-                e.Property(ss => ss.EnrolledSemesterId).HasColumnName("enrolled_semesters_id");
-                e.Property(ss => ss.SubjectId).HasColumnName("subjects_id");
-                e.Property(ss => ss.ProfessorId).HasColumnName("professor_id");
-                e.Property(ss => ss.Signature).HasColumnName("signature");
-
-                e.HasOne(ss => ss.Professor)
-                 .WithMany(u => u.TeachingSubjects)
-                 .HasForeignKey(ss => ss.ProfessorId)
-                 .OnDelete(DeleteBehavior.Restrict);
-
-                e.HasOne(ss => ss.Subject)
-                 .WithMany(s => s.SemesterSubjects)
-                 .HasForeignKey(ss => ss.SubjectId)
-                 .OnDelete(DeleteBehavior.Restrict);
-
-                e.HasOne(ss => ss.EnrolledSemester)
-                 .WithMany(es => es.SemesterSubjects)
-                 .HasForeignKey(ss => ss.EnrolledSemesterId)
-                 .OnDelete(DeleteBehavior.Restrict);
-            });
-
-            // -------------------------
-            // passed_subjects
-            // -------------------------
-            modelBuilder.Entity<PassedSubject>(e =>
-            {
-                e.ToTable("passed_subjects", ProjectSchema);
-                e.HasKey(ps => ps.Id);
-                e.Property(ps => ps.Id).HasColumnName("id");
-                e.Property(ps => ps.SemesterSubjectId).HasColumnName("enrolled_id");
-                e.Property(ps => ps.Grade).HasColumnName("grade");
-                e.Property(ps => ps.DatePassed).HasColumnName("date_passed").HasColumnType("timestamp without time zone");
-
-                e.HasOne(ps => ps.SemesterSubject)
-                 .WithOne(ss => ss.PassedSubject)
-                 .HasForeignKey<PassedSubject>(ps => ps.SemesterSubjectId)
-                 .OnDelete(DeleteBehavior.Cascade);
-            });
-
-            // -------------------------
-            // documents
-            // -------------------------
-            modelBuilder.Entity<Documents>(e =>
-            {
-                e.ToTable("documents", ProjectSchema);
-                e.HasKey(d => d.Id);
-                e.Property(d => d.Id).HasColumnName("id");
-                e.Property(d => d.Name).HasColumnName("type");
-                e.Property(d => d.Body).HasColumnName("body");
-                e.Property(d => d.Cost).HasColumnName("cost");
-            });
-
-            // -------------------------
-            // user_documents
-            // -------------------------
-            modelBuilder.Entity<UserDocuments>(e =>
-            {
-                e.ToTable("user_documents", ProjectSchema);
-                e.HasKey(ud => new { ud.UserId, ud.DocumentId });
-                e.Property(ud => ud.UserId).HasColumnName("user_id");
-                e.Property(ud => ud.DocumentId).HasColumnName("document_id");
-
-                e.HasOne(ud => ud.User)
-                 .WithMany(u => u.Documents)
-                 .HasForeignKey(ud => ud.UserId)
-                 .OnDelete(DeleteBehavior.Cascade);
-
-                e.HasOne(ud => ud.Documents)
-                 .WithMany(d => d.User)
-                 .HasForeignKey(ud => ud.DocumentId)
-                 .OnDelete(DeleteBehavior.Cascade);
-            });
-
-            // -------------------------
-            // token
-            // -------------------------
-            modelBuilder.Entity<RefreshToken>(e =>
-            {
-                e.ToTable("token", ProjectSchema);
-                e.HasKey(t => t.Id);
-                e.Property(t => t.Id).HasColumnName("id");
-                e.Property(t => t.UserId).HasColumnName("user_id");
-                e.Property(t => t.Token).HasColumnName("token");
-                e.Property(t => t.ExpiresAt).HasColumnName("expires_at").HasColumnType("timestamp without time zone");
-                e.Property(t => t.IsValid).HasColumnName("is_valid");
-
-                e.HasOne(t => t.User)
-                 .WithMany()
-                 .HasForeignKey(t => t.UserId)
-                 .OnDelete(DeleteBehavior.Cascade);
-            });
-
-            // -------------------------
-            // payment
-            // -------------------------
-            modelBuilder.Entity<Payment>(e =>
-            {
-                e.ToTable("payment", ProjectSchema);
-                e.HasKey(p => p.Id);
-                e.Property(p => p.Id).HasColumnName("id");
-                e.Property(p => p.UserId).HasColumnName("user_id");
-                e.Property(p => p.EnrollmentInfoId).HasColumnName("enrollment_id");
-                e.Property(p => p.Amount).HasColumnName("amount");
-
-                e.HasOne(p => p.User)
-                 .WithMany(u => u.Payments)
-                 .HasForeignKey(p => p.UserId)
-                 .OnDelete(DeleteBehavior.Cascade);
-
-                e.HasOne(p => p.EnrolledSemesters)
-                 .WithMany(es => es.Users)
-                 .HasForeignKey(p => p.EnrollmentInfoId)
-                 .OnDelete(DeleteBehavior.Cascade);
-            });
-
-            // -------------------------
-            // major_subjects
-            // -------------------------
-            modelBuilder.Entity<MajorSubjects>(e =>
-            {
-                e.ToTable("major_subjects", ProjectSchema);
-                e.HasKey(ms => new { ms.MajorId, ms.SubjectId });
-                e.Property(ms => ms.MajorId).HasColumnName("major_id");
-                e.Property(ms => ms.SubjectId).HasColumnName("subject_id");
-                e.Property(ms => ms.MandatorySemester).HasColumnName("mandatory_semester");
-
-                e.HasOne(ms => ms.Majors)
-                 .WithMany(m => m.Subjects)
-                 .HasForeignKey(ms => ms.MajorId)
-                 .OnDelete(DeleteBehavior.Cascade);
-
-                e.HasOne(ms => ms.Subjects)
-                 .WithMany(s => s.Majors)
-                 .HasForeignKey(ms => ms.SubjectId)
-                 .OnDelete(DeleteBehavior.Cascade);
-            });
-
-            // -------------------------
-            // dependency_subject
-            // -------------------------
-            modelBuilder.Entity<DependencySubject>(e =>
-            {
-                e.ToTable("dependency_subject", ProjectSchema);
-                e.HasKey(ds => new { ds.SubjectId, ds.DependencyId });
-                e.Property(ds => ds.SubjectId).HasColumnName("subject_id");
-                e.Property(ds => ds.DependencyId).HasColumnName("dependency_id");
-
-                e.HasOne(ds => ds.Subject)
-                 .WithMany(s => s.Dependencies)
-                 .HasForeignKey(ds => ds.SubjectId)
-                 .OnDelete(DeleteBehavior.Restrict);
-
-                e.HasOne(ds => ds.Dependency)
-                 .WithMany(s => s.Dependents)
-                 .HasForeignKey(ds => ds.DependencyId)
-                 .OnDelete(DeleteBehavior.Restrict);
-            });
-
-            // -------------------------
-            // professour_subjects  (spelling matches the table in ddl.sql)
-            // -------------------------
-            modelBuilder.Entity<ProfessorSubjects>(e =>
-            {
-                e.ToTable("professour_subjects", ProjectSchema);
-                e.HasKey(ps => new { ps.ProfessorId, ps.SemesterId, ps.SubjectId });
-                e.Property(ps => ps.ProfessorId).HasColumnName("prof_id");
-                e.Property(ps => ps.SemesterId).HasColumnName("active_semester_id");
-                e.Property(ps => ps.SubjectId).HasColumnName("subject_id");
-
-                e.HasOne(ps => ps.Professor)
-                 .WithMany()
-                 .HasForeignKey(ps => ps.ProfessorId)
-                 .OnDelete(DeleteBehavior.Cascade);
-
-                e.HasOne(ps => ps.Semester)
-                 .WithMany()
-                 .HasForeignKey(ps => ps.SemesterId)
-                 .OnDelete(DeleteBehavior.Cascade);
-
-                e.HasOne(ps => ps.Subject)
-                 .WithMany()
-                 .HasForeignKey(ps => ps.SubjectId)
-                 .OnDelete(DeleteBehavior.Cascade);
-            });
-        }
-    }
-}
Index: now-api/Data/PgEnumLabels.cs
===================================================================
--- iknow-api/Data/PgEnumLabels.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,49 +1,0 @@
-using iknow_api.Models;
-using Npgsql;
-
-namespace iknow_api.Data
-{
-    /// <summary>
-    /// Maps CLR enum member names onto the labels declared in sql/ddl.sql.
-    /// Most labels are just the lowercased member name; the ones that are not
-    /// (UserRole.Professor -> 'prof', Grade.Ten -> '10') are listed explicitly.
-    ///
-    /// The instances are static on purpose. EF Core caches its internal service
-    /// provider against the DbContext options, and a fresh translator instance
-    /// on every resolution makes each set of options look different - EF then
-    /// builds a new provider per resolution and throws
-    /// ManyServiceProvidersCreatedWarning once it has built twenty.
-    /// </summary>
-    public sealed class PgEnumLabels : INpgsqlNameTranslator
-    {
-        public static readonly PgEnumLabels UserRole = new(
-            new Dictionary<string, string>
-            {
-                [nameof(Models.UserRole.Admin)] = "admin",
-                [nameof(Models.UserRole.Professor)] = "prof",
-                [nameof(Models.UserRole.Student)] = "student",
-            });
-
-        public static readonly PgEnumLabels Grade = new(
-            new Dictionary<string, string>
-            {
-                [nameof(Models.Grade.Six)] = "6",
-                [nameof(Models.Grade.Seven)] = "7",
-                [nameof(Models.Grade.Eight)] = "8",
-                [nameof(Models.Grade.Nine)] = "9",
-                [nameof(Models.Grade.Ten)] = "10",
-            });
-
-        /// <summary>Lowercases the member name, which is all the other enums need.</summary>
-        public static readonly PgEnumLabels Lowercase = new(new Dictionary<string, string>());
-
-        private readonly IReadOnlyDictionary<string, string> _labels;
-
-        private PgEnumLabels(IReadOnlyDictionary<string, string> labels) => _labels = labels;
-
-        public string TranslateTypeName(string clrName) => clrName;
-
-        public string TranslateMemberName(string clrName) =>
-            _labels.TryGetValue(clrName, out var label) ? label : clrName.ToLowerInvariant();
-    }
-}
Index: now-api/Models/ActiveSemester.cs
===================================================================
--- iknow-api/Models/ActiveSemester.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,18 +1,0 @@
-
-
-
-
-namespace iknow_api.Models
-{
-    public enum sType
-    {
-        summer,winter
-    }
-    public class ActiveSemesters
-    {
-        public int Id { get; set; }
-        public int Year { get; set; }
-        public sType Type { get; set; }
-        public ICollection<EnrolledSemesters>? EnrolledSemesters { get; set; }
-    }
-}
Index: now-api/Models/ContactInfo.cs
===================================================================
--- iknow-api/Models/ContactInfo.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,17 +1,0 @@
-﻿using System.ComponentModel.DataAnnotations.Schema;
-
-namespace iknow_api.Models
-{
-    public class ContactInfo
-    {
-        public int Id { get; set; }
-        public string? City { get; set; }
-        public string? Address { get; set; }
-        public string? Municipality { get; set; }
-        public string? PhoneNumber { get; set; }
-        public string? MicrosoftEmail { get; set; }
-        
-        public int UserId { get; set; }
-        public User? User { get; set; }
-    }
-}
Index: now-api/Models/DependencySubject.cs
===================================================================
--- iknow-api/Models/DependencySubject.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,10 +1,0 @@
-namespace iknow_api.Models
-{
-    public class DependencySubject
-    {
-        public int SubjectId { get; set; }
-        public int DependencyId { get; set; }
-        public Subject? Subject { get; set; }
-        public Subject? Dependency { get; set; }
-    }
-}
Index: now-api/Models/Documents.cs
===================================================================
--- iknow-api/Models/Documents.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,11 +1,0 @@
-namespace iknow_api.Models
-{
-    public class Documents
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public string? Body { get; set; }
-        public int Cost { get; set; }
-        public ICollection<UserDocuments>? User { get; set; }
-    }
-}
Index: now-api/Models/EnrolledSemesters.cs
===================================================================
--- iknow-api/Models/EnrolledSemesters.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,24 +1,0 @@
-using System.ComponentModel.DataAnnotations.Schema;
-
-namespace iknow_api.Models
-{
-    public class EnrolledSemesters
-    {
-        //Add type of semester winter/summer
-        public int Id { get; set; }
-        public int UserId { get; set; }
-        public User? User { get; set; }
-        public Quota QuotaType { get; set; }
-        public int MajorId { get; set; }
-        public string? StudentComment { get; set; }
-        public string? Note { get; set; }
-        public DateTime CratedAt { get; set; }
-        public DateTime? LastChange { get; set; }
-        public DateTime? Verified { get; set; }
-        public int SemesterId { get; set; }
-        public ActiveSemesters? Semester { get; set; }
-        public Major? Major { get; set; }
-        public ICollection<Payment>? Users { get; set; }
-        public ICollection<SemesterSubject>? SemesterSubjects { get; set; }
-    }
-}
Index: now-api/Models/HighSchool.cs
===================================================================
--- iknow-api/Models/HighSchool.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,16 +1,0 @@
-namespace iknow_api.Models
-{
-    public enum HighSchoolType
-    {
-        Strucen, Gimnazija
-    }
-
-    public class HighSchool
-    {
-        public int Id { get; set; }
-        public float GPA { get; set; }
-        public HighSchoolType HighSchoolType { get; set; }
-        public int UserId { get; set; }
-        public User? User { get; set; }
-    }
-}
Index: now-api/Models/Major.cs
===================================================================
--- iknow-api/Models/Major.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,12 +1,0 @@
-using System.ComponentModel.DataAnnotations.Schema;
-
-namespace iknow_api.Models
-{
-    public class Major
-    {
-        public int Id { get; set; }
-
-        public string? Name { get; set; }
-        public ICollection<MajorSubjects>? Subjects { get; set; }
-    }
-}
Index: now-api/Models/MajorSubjects.cs
===================================================================
--- iknow-api/Models/MajorSubjects.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,11 +1,0 @@
-namespace iknow_api.Models
-{
-    public class MajorSubjects
-    {
-        public int MajorId { get; set; }
-        public int SubjectId { get; set; }
-        public int MandatorySemester { get; set; }
-        public Major? Majors { get; set; }
-        public Subject? Subjects { get; set; }
-    }
-}
Index: now-api/Models/PassedSubject.cs
===================================================================
--- iknow-api/Models/PassedSubject.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,20 +1,0 @@
-namespace iknow_api.Models
-{
-    public enum Grade
-    {
-        Six = 6,
-        Seven = 7,
-        Eight = 8,
-        Nine = 9,
-        Ten = 10
-    }
-
-    public class PassedSubject
-    {
-        public int Id { get; set; }
-        public int SemesterSubjectId { get; set; }
-        public SemesterSubject? SemesterSubject { get; set; }
-        public Grade Grade { get; set; }
-        public DateTime DatePassed { get; set; }
-    }
-}
Index: now-api/Models/Payment.cs
===================================================================
--- iknow-api/Models/Payment.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,16 +1,0 @@
-using System.ComponentModel.DataAnnotations.Schema;
-
-namespace iknow_api.Models
-{
-    public class Payment
-    {
-        public int Id { get; set; }
-
-        public int UserId { get; set; }
-        public User? User { get; set; }
-        public int EnrollmentInfoId { get; set; }
-        public int Amount { get; set; }
-        public EnrolledSemesters? EnrolledSemesters { get; set; }
-
-    }
-}
Index: now-api/Models/ProfessorSubjects.cs
===================================================================
--- iknow-api/Models/ProfessorSubjects.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,14 +1,0 @@
-﻿
-namespace iknow_api.Models
-{
-    public class ProfessorSubjects
-    {
-        public int ProfessorId { get; set; }
-        public User? Professor { get; set; }
-        public int SemesterId { get; set; }
-        public ActiveSemesters? Semester { get; set; }
-        public int SubjectId { get; set; }
-        public Subject? Subject { get; set; }
-    }
-}
-
Index: now-api/Models/Quota.cs
===================================================================
--- iknow-api/Models/Quota.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,7 +1,0 @@
-namespace iknow_api.Models
-{
-    public enum Quota
-    {
-        drzavna, privatna, stipendija
-    }
-}
Index: now-api/Models/RefreshToken.cs
===================================================================
--- iknow-api/Models/RefreshToken.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,14 +1,0 @@
-using iknow_api.Models;
-
-namespace iknow_api.Models
-{
-    public class RefreshToken
-    {
-        public int Id { get; set; }
-        public int UserId { get; set; }
-        public User? User { get; set; } 
-        public string? Token { get; set; }
-        public DateTime ExpiresAt { get; set; }
-        public bool IsValid { get; set; }
-    }
-}
Index: now-api/Models/SemesterSubjects.cs
===================================================================
--- iknow-api/Models/SemesterSubjects.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,19 +1,0 @@
-namespace iknow_api.Models
-{
-    // The student is reached through EnrolledSemester.UserId; the ER model
-    // links SemestersSubjects to Users only through the professor.
-    public class SemesterSubject
-    {
-        public int Id { get; set; }
-
-        public int EnrolledSemesterId { get; set; }
-        public int SubjectId { get; set; }
-        public int ProfessorId { get; set; }
-        public bool Signature { get; set; }
-
-        public EnrolledSemesters? EnrolledSemester { get; set; }
-        public Subject? Subject { get; set; }
-        public User? Professor { get; set; }
-        public PassedSubject? PassedSubject { get; set; }
-    }
-}
Index: now-api/Models/Subjects.cs
===================================================================
--- iknow-api/Models/Subjects.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,16 +1,0 @@
-namespace iknow_api.Models
-{
-    public class Subject
-    {
-        public int Id { get; set; }                       
-        public string? Name { get; set; }                 
-        public string? Code { get; set; }                  
-        public int? AwardedCredits { get; set; } 
-        public int? DependencyCredit { get; set; }
-        public ICollection<DependencySubject>? Dependencies { get; set; }   
-        public ICollection<DependencySubject>? Dependents { get; set; }
-        public ICollection<MajorSubjects>? Majors { get; set; }
-        public ICollection<SemesterSubject>? SemesterSubjects { get; set; }
-        
-    }
-}
Index: now-api/Models/User.cs
===================================================================
--- iknow-api/Models/User.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,39 +1,0 @@
-namespace iknow_api.Models
-{
-    public enum UserRole
-    {
-        Admin,
-        Professor,
-        Student
-    }
-
-    // Attributes follow the Users entity in the ER model exactly.
-    public class User
-    {
-        public int Id { get; set; }
-        public string? Name { get; set; }
-        public string? EMBG { get; set; }
-        public string? Surname { get; set; }
-        public string? Index { get; set; }
-        public string? Email { get; set; }
-        public string? PasswordHash { get; set; }
-        public DateTime? Bday { get; set; }
-        public DateTime CreatedAt { get; set; }
-        public UserRole Role { get; set; }
-        public Quota? Quota { get; set; }
-        public int? EnrollmentYear { get; set; }
-
-        public HighSchool? HighSchool { get; set; }
-        public ContactInfo? ContactInfo { get; set; }
-        public ICollection<UserDocuments>? Documents { get; set; }
-
-        // Named for the relationship it carries: Users 1 --pays-- N Payment.
-        public ICollection<Payment>? Payments { get; set; }
-
-        // Users 1 --submits-- N EnrolledSemesters
-        public ICollection<EnrolledSemesters>? Enrolments { get; set; }
-
-        // Users 1 --teaches-- N SemestersSubjects
-        public ICollection<SemesterSubject>? TeachingSubjects { get; set; }
-    }
-}
Index: now-api/Models/UserDocuments.cs
===================================================================
--- iknow-api/Models/UserDocuments.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,10 +1,0 @@
-namespace iknow_api.Models
-{
-    public class UserDocuments
-    {
-        public int UserId { get; set; }
-        public int DocumentId { get; set; }
-        public User? User{ get; set; }
-        public Documents? Documents{ get; set; }
-    }
-}
Index: now-api/Program.cs
===================================================================
--- iknow-api/Program.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,109 +1,0 @@
-using System.Text;
-using System.Text.Json.Serialization;
-using iknow_api.Data;
-using iknow_api.Models;
-using iknow_api.Repositories;
-using iknow_api.Services;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.IdentityModel.Tokens;
-
-var builder = WebApplication.CreateBuilder(args);
-
-// Add CORS policy
-builder.Services.AddCors(options =>
-{
-    options.AddPolicy("AllowFrontend", policy =>
-    {
-        var allowedOrigins = builder.Configuration.GetSection("AllowedOrigins").Get<string[]>() 
-            ?? new[] { "http://localhost:3000" };
-        
-        policy.WithOrigins(allowedOrigins) // Your frontend URL(s)
-              .AllowAnyHeader()
-              .AllowAnyMethod()
-              .AllowCredentials();
-    });
-});
-
-builder.Services.AddAuthentication(options =>
-{
-    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
-    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
-})
-.AddJwtBearer(options =>
-{
-    options.RequireHttpsMetadata = false; // only for development
-    options.SaveToken = true;
-    options.TokenValidationParameters = new TokenValidationParameters
-    {
-        ValidateIssuer = true,
-        ValidIssuer = "iknow-api",
-
-        ValidateAudience = true,
-        ValidAudience = "iknow-api",
-
-        ValidateLifetime = true,
-
-        ValidateIssuerSigningKey = true,
-        IssuerSigningKey = new SymmetricSecurityKey(
-            Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
-    };
-});
-// Add services to the container.
-builder.Services.AddControllers()
-    .AddJsonOptions(options =>
-    {
-        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
-        options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
-        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
-    });
-builder.Services.AddOpenApi();
-
-// Register DbContext.
-// The database lives behind the SSH tunnel: tunnel_scripta.cmd maps
-// localhost:9999 to the faculty Postgres server. Start it before the API.
-// The enum labels come from sql/ddl.sql, so each CLR enum is mapped onto its
-// Postgres type by name; PgEnumLabels covers the members whose label is not
-// simply the lowercased member name.
-builder.Services.AddDbContext<AppDbContext>(options =>
-    options.UseNpgsql(
-        builder.Configuration.GetConnectionString("DefaultConnection"),
-        npgsql =>
-        {
-            npgsql.MapEnum<UserRole>("user_role", AppDbContext.ProjectSchema, PgEnumLabels.UserRole);
-            npgsql.MapEnum<HighSchoolType>("hs_type", AppDbContext.ProjectSchema, PgEnumLabels.Lowercase);
-            npgsql.MapEnum<Quota>("quota_type", AppDbContext.ProjectSchema, PgEnumLabels.Lowercase);
-            npgsql.MapEnum<sType>("semester_type", AppDbContext.ProjectSchema, PgEnumLabels.Lowercase);
-            npgsql.MapEnum<Grade>("grade_type", AppDbContext.ProjectSchema, PgEnumLabels.Grade);
-        }));
-
-// Register your services
-builder.Services.AddScoped<IAuthService, AuthService>();
-builder.Services.AddScoped<IUserRepository, UserRepository>(); // You'll need to add the UserRepository implementation
-builder.Services.AddScoped<IUserService, UserService>();
-
-builder.Services.AddScoped<IRefreshTokenService, RefreshTokenService>();
-builder.Services.AddScoped<IUserRepository, UserRepository>(); 
-builder.Services.AddScoped<IRefreshTokenRepository, RefreshTokenRepository>(); 
-builder.Services.AddScoped<IProfRepository, ProfRepository>();
-builder.Services.AddScoped<IProfService, ProfService>();
-builder.Services.AddScoped<IEnrollmentService, EnrollmentService>();
-builder.Services.AddScoped<IAdminService, AdminService>();
-builder.Services.AddAuthorization();
-var app = builder.Build();
-
-// Configure the HTTP request pipeline.
-if (app.Environment.IsDevelopment())
-{
-    app.MapOpenApi();
-}
-
-// Enable CORS - must be called before UseAuthentication and UseAuthorization
-app.UseCors("AllowFrontend");
-
-app.UseHttpsRedirection();
-app.UseAuthentication(); // <-- must come BEFORE UseAuthorization
-app.UseAuthorization();
-app.MapControllers();
-
-app.Run();
Index: now-api/Properties/launchSettings.json
===================================================================
--- iknow-api/Properties/launchSettings.json	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,23 +1,0 @@
-﻿{
-  "$schema": "https://json.schemastore.org/launchsettings.json",
-  "profiles": {
-    "http": {
-      "commandName": "Project",
-      "dotnetRunMessages": true,
-      "launchBrowser": false,
-      "applicationUrl": "http://localhost:5147",
-      "environmentVariables": {
-        "ASPNETCORE_ENVIRONMENT": "Development"
-      }
-    },
-    "https": {
-      "commandName": "Project",
-      "dotnetRunMessages": true,
-      "launchBrowser": false,
-      "applicationUrl": "https://localhost:7248;http://localhost:5147",
-      "environmentVariables": {
-        "ASPNETCORE_ENVIRONMENT": "Development"
-      }
-    }
-  }
-}
Index: now-api/Repository/Implementations/ProfRepository.cs
===================================================================
--- iknow-api/Repository/Implementations/ProfRepository.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,77 +1,0 @@
-using iknow_api.Data;
-using iknow_api.Models;
-using Microsoft.EntityFrameworkCore;
-
-namespace iknow_api.Repositories
-{
-    public class ProfRepository : IProfRepository
-    {
-        private readonly AppDbContext _context;
-
-        public ProfRepository(AppDbContext context)
-        {
-            _context = context;
-        }
-
-        /// <summary>
-        /// A professor teaches a subject for a given enrolment, so the students
-        /// are reached through semesters_subjects.professor_id and the student
-        /// through the enrolment - matching the ER model, which does not link
-        /// SemestersSubjects to a student directly.
-        /// </summary>
-        private IQueryable<SemesterSubject> TaughtBy(int professorId) =>
-            _context.SemesterSubjects
-                .Where(ss => ss.ProfessorId == professorId)
-                .Include(ss => ss.Subject)
-                .Include(ss => ss.PassedSubject)
-                .Include(ss => ss.EnrolledSemester!)
-                    .ThenInclude(es => es.User)
-                .Include(ss => ss.EnrolledSemester!)
-                    .ThenInclude(es => es.Semester);
-
-        public async Task<List<SemesterSubject>> GetTaughtSemesterSubjectsAsync(int professorId) =>
-            await TaughtBy(professorId)
-                .AsNoTracking()
-                .AsSplitQuery()
-                .ToListAsync();
-
-        public async Task<SemesterSubject?> FindTaughtSemesterSubjectAsync(
-            int professorId, int studentId, int subjectId)
-        {
-            var candidates = await TaughtBy(professorId)
-                .Where(ss => ss.SubjectId == subjectId
-                          && ss.EnrolledSemester!.UserId == studentId)
-                .AsSplitQuery()
-                .ToListAsync();
-
-            // Most recent enrolment first. Semesters are labelled Year/Year+1
-            // throughout the app, so within one year summer follows winter.
-            return candidates
-                .OrderByDescending(ss => ss.EnrolledSemester!.Semester!.Year)
-                .ThenByDescending(ss => ss.EnrolledSemester!.Semester!.Type == sType.summer)
-                .FirstOrDefault();
-        }
-
-        public async Task<PassedSubject?> GetPassedSubjectAsync(int semesterSubjectId) =>
-            await _context.PassedSubjects
-                .FirstOrDefaultAsync(ps => ps.SemesterSubjectId == semesterSubjectId);
-
-        public async Task AddPassedSubjectAsync(PassedSubject passed)
-        {
-            _context.PassedSubjects.Add(passed);
-            await _context.SaveChangesAsync();
-        }
-
-        public async Task UpdatePassedSubjectAsync(PassedSubject passed)
-        {
-            _context.PassedSubjects.Update(passed);
-            await _context.SaveChangesAsync();
-        }
-
-        public async Task RemovePassedSubjectAsync(PassedSubject passed)
-        {
-            _context.PassedSubjects.Remove(passed);
-            await _context.SaveChangesAsync();
-        }
-    }
-}
Index: now-api/Repository/Implementations/RefreshTokenRepository.cs
===================================================================
--- iknow-api/Repository/Implementations/RefreshTokenRepository.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,49 +1,0 @@
-using iknow_api.Models;
-using iknow_api.Data;
-using iknow_api.Models;
-using Microsoft.EntityFrameworkCore;
-using iknow_api.Services;
-using iknow_api.DTOs;
-using System.Runtime.CompilerServices;
-
-namespace iknow_api.Repositories
-{
-    public class RefreshTokenRepository : IRefreshTokenRepository
-    {
-        private readonly AppDbContext _context;
-
-        public RefreshTokenRepository(AppDbContext context)
-        {
-            _context = context;
-        }
-        
-        public async Task AddTokenAsync(RefreshToken refreshToken)
-        {
-             _context.RefreshToken.Add(refreshToken);
-            await _context.SaveChangesAsync();
-        }
-
-        public Task<bool> DeleteTokenAsync(string refreshTokenDto)
-        {
-            throw new NotImplementedException();
-        }
-
-        public async Task<int?> GetUserId(string refreshTokenDto)
-        {
-            var token = await _context.RefreshToken.FirstOrDefaultAsync(u => u.Token == refreshTokenDto);
-            return token?.UserId ;
-        }
-
-        public async Task<bool> VerifyTokenAsync(VerifyRefreshTokenDto refreshTokenDto)
-        {
-            var token = await _context.RefreshToken
-                .FirstOrDefaultAsync(rt =>
-                    rt.Token == refreshTokenDto.token &&
-                    rt.IsValid &&
-                    rt.ExpiresAt > DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified));
-
-            return token != null;
-        }
-
-    }
-}
Index: now-api/Repository/Implementations/UserRepository.cs
===================================================================
--- iknow-api/Repository/Implementations/UserRepository.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,99 +1,0 @@
-using iknow_api.Models;
-using iknow_api.Data;
-using Microsoft.EntityFrameworkCore;
-
-namespace iknow_api.Repositories
-{
-    public class UserRepository : IUserRepository
-    {
-        private readonly AppDbContext _context;
-
-        public UserRepository(AppDbContext context)
-        {
-            _context = context;
-        }
-
-        public async Task<bool> UserExistsAsync(string username)
-        {
-            return await _context.User.AnyAsync(u => u.Email == username);
-        }
-
-        public async Task<User?> GetUserByUsernameAsync(string username)
-        {
-            return await _context.User.FirstOrDefaultAsync(u => u.Email == username);
-        }
-        
-        public async Task<User?> GetUserByIdAsync(int id)
-        {
-            return await _context.User
-                .Include(u => u.ContactInfo)
-                .Include(u => u.HighSchool)
-                // The study programme is reached through the enrolment, since
-                // Major hangs off EnrolledSemesters rather than off Users.
-                .Include(u => u.Enrolments!)
-                    .ThenInclude(es => es.Major)
-                .Include(u => u.Enrolments!)
-                    .ThenInclude(es => es.Semester)
-                .AsSplitQuery()
-                .FirstOrDefaultAsync(u => u.Id == id);
-        }
-
-
-        public async Task<User?> GetOnlyUserByIdAsync(int id)
-        {
-            return await _context.User.FirstOrDefaultAsync(u => u.Id == id);
-        }
-        public async Task AddUserAsync(User user)
-        {
-            _context.User.Add(user);
-            await _context.SaveChangesAsync();
-        }
-        public async Task AddContactAsync(ContactInfo contactInfo)
-        {
-            _context.ContactInfo.Add(contactInfo);
-            await _context.SaveChangesAsync();
-        }
-        public async Task AddHighSchoolAsync(HighSchool highSchool)
-        {
-            _context.HighSchool.Add(highSchool);
-            await _context.SaveChangesAsync();
-        }       
-
-        public async Task<int> GetUsersCountAsync()
-        {
-            return await _context.User.CountAsync();
-        }
-        public async Task<List<EnrolledSemesters>> GetUserSemestersAsync(int id)
-        {
-            return await _context.EnrolledSemesters
-                .AsNoTracking()
-                .Include(es => es.Major)
-                .Include(es => es.Semester)
-                .Include(es => es.SemesterSubjects)
-                    .ThenInclude(ss => ss.Subject)
-                .Include(es => es.SemesterSubjects)
-                    .ThenInclude(ss => ss.Professor)
-                .Where(es => es.UserId == id)
-                .AsSplitQuery() // This helps avoid cartesian explosion
-                .ToListAsync();
-        }
-
-        public async Task<List<PassedSubject>> GetUserPassedSubjectsAsync(int id)
-        {
-            return await _context.PassedSubjects
-                .AsNoTracking()
-                .Include(ps => ps.SemesterSubject)
-                    .ThenInclude(ss => ss.Subject)
-                .Include(ps => ps.SemesterSubject)
-                    .ThenInclude(ss => ss.EnrolledSemester)
-                        .ThenInclude(es => es.Semester)
-                .Include(ps => ps.SemesterSubject)
-                    .ThenInclude(ss => ss.Professor)
-                // The ER model reaches the student through the enrolment,
-                // not through a user_id on semesters_subjects.
-                .Where(ps => ps.SemesterSubject.EnrolledSemester.UserId == id)
-                .ToListAsync();
-        }
-
-    }
-}
Index: now-api/Repository/Interface/IProfRepository.cs
===================================================================
--- iknow-api/Repository/Interface/IProfRepository.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,26 +1,0 @@
-using iknow_api.Models;
-
-namespace iknow_api.Repositories
-{
-    public interface IProfRepository
-    {
-        /// <summary>
-        /// Every semester-subject row taught by this professor, with the
-        /// enrolment, student, subject, semester and grade loaded.
-        /// </summary>
-        Task<List<SemesterSubject>> GetTaughtSemesterSubjectsAsync(int professorId);
-
-        /// <summary>
-        /// The semester-subject row this professor teaches for one student and
-        /// subject. When a student has taken the subject more than once, the
-        /// most recent enrolment wins. Null when the professor does not teach
-        /// that student in that subject.
-        /// </summary>
-        Task<SemesterSubject?> FindTaughtSemesterSubjectAsync(int professorId, int studentId, int subjectId);
-
-        Task<PassedSubject?> GetPassedSubjectAsync(int semesterSubjectId);
-        Task AddPassedSubjectAsync(PassedSubject passed);
-        Task UpdatePassedSubjectAsync(PassedSubject passed);
-        Task RemovePassedSubjectAsync(PassedSubject passed);
-    }
-}
Index: now-api/Repository/Interface/IRefreshTokenRepository.cs
===================================================================
--- iknow-api/Repository/Interface/IRefreshTokenRepository.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,12 +1,0 @@
-using iknow_api.DTOs;
-using iknow_api.Models;
-namespace iknow_api.Repositories{
-    public interface IRefreshTokenRepository
-    {
-        Task AddTokenAsync(RefreshToken refreshToken);
-        Task<bool> VerifyTokenAsync(VerifyRefreshTokenDto refreshTokenDto);
-        Task<bool> DeleteTokenAsync(string refreshTokenDto);
-        Task<int?> GetUserId(string refreshTokenDto);
-        
-    }
-}
Index: now-api/Repository/Interface/IUserRepository.cs
===================================================================
--- iknow-api/Repository/Interface/IUserRepository.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,17 +1,0 @@
-using iknow_api.Models;
-namespace iknow_api.Repositories
-{
-    public interface IUserRepository
-    {
-        Task<bool> UserExistsAsync(string username);
-        Task<User?> GetUserByUsernameAsync(string username);
-        Task AddUserAsync(User user);
-        Task AddContactAsync(ContactInfo contactInfo);
-        Task AddHighSchoolAsync(HighSchool highSchool);
-        Task<int> GetUsersCountAsync();
-        Task<User?> GetUserByIdAsync(int id);
-        Task<List<EnrolledSemesters>?> GetUserSemestersAsync(int id);
-        Task<User?> GetOnlyUserByIdAsync(int id);
-        Task<List<PassedSubject>> GetUserPassedSubjectsAsync(int id);
-    }
-}
Index: now-api/Services/Implementations/AdminService.cs
===================================================================
--- iknow-api/Services/Implementations/AdminService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,445 +1,0 @@
-using iknow_api.Data;
-using iknow_api.DTOs;
-using iknow_api.Models;
-using Microsoft.EntityFrameworkCore;
-
-namespace iknow_api.Services
-{
-    /// <summary>
-    /// Backs UC012 (subjects), UC013 (active semesters) and UC014 (professor
-    /// assignments). Every method reports constraint problems as a sentence
-    /// rather than letting a database exception reach the controller.
-    /// </summary>
-    public class AdminService : IAdminService
-    {
-        private readonly AppDbContext _context;
-
-        public AdminService(AppDbContext context)
-        {
-            _context = context;
-        }
-
-        private static string SemesterName(ActiveSemesters s) =>
-            $"{(s.Type == sType.winter ? "Зимски" : "Летен")}({s.Year}/{s.Year + 1})";
-
-        // ============================================================
-        //  UC012 - subjects
-        // ============================================================
-
-        public async Task<List<AdminSubjectDto>> GetSubjectsAsync()
-        {
-            var subjects = await _context.Subjects.AsNoTracking().ToListAsync();
-
-            var majorLinks = await _context.MajorSubjects.AsNoTracking()
-                .Include(ms => ms.Majors).ToListAsync();
-
-            var prerequisites = await _context.DependencySubjects.AsNoTracking().ToListAsync();
-
-            // A subject that students already took cannot be deleted.
-            var enrolledCounts = await _context.SemesterSubjects.AsNoTracking()
-                .GroupBy(ss => ss.SubjectId)
-                .Select(g => new { SubjectId = g.Key, Count = g.Count() })
-                .ToDictionaryAsync(x => x.SubjectId, x => x.Count);
-
-            var byId = subjects.ToDictionary(s => s.Id);
-
-            return subjects
-                .OrderBy(s => s.Code)
-                .Select(s => new AdminSubjectDto
-                {
-                    Id = s.Id,
-                    Name = s.Name,
-                    Code = s.Code,
-                    AwardedCredits = s.AwardedCredits ?? 0,
-                    DependencyCredit = s.DependencyCredit,
-                    EnrolledCount = enrolledCounts.TryGetValue(s.Id, out var c) ? c : 0,
-                    Majors = majorLinks
-                        .Where(ms => ms.SubjectId == s.Id)
-                        .Select(ms => new SubjectMajorDto
-                        {
-                            MajorId = ms.MajorId,
-                            MajorName = ms.Majors?.Name,
-                            MandatorySemester = ms.MandatorySemester
-                        })
-                        .OrderBy(m => m.MajorName)
-                        .ToList(),
-                    Prerequisites = prerequisites
-                        .Where(d => d.SubjectId == s.Id && byId.ContainsKey(d.DependencyId))
-                        .Select(d => new SubjectRefDto
-                        {
-                            Id = d.DependencyId,
-                            Name = byId[d.DependencyId].Name,
-                            Code = byId[d.DependencyId].Code
-                        })
-                        .OrderBy(p => p.Code)
-                        .ToList()
-                })
-                .ToList();
-        }
-
-        public async Task<AdminResultDto> CreateSubjectAsync(SubjectWriteDto request)
-        {
-            if (string.IsNullOrWhiteSpace(request.Name) || string.IsNullOrWhiteSpace(request.Code))
-            {
-                return Fail("Name and code are required.");
-            }
-            if (request.AwardedCredits <= 0)
-            {
-                return Fail("Awarded credits must be greater than zero.");
-            }
-            // subjects.name and subjects.code are both UNIQUE.
-            if (await _context.Subjects.AnyAsync(s => s.Name == request.Name))
-            {
-                return Fail($"A subject named '{request.Name}' already exists.");
-            }
-            if (await _context.Subjects.AnyAsync(s => s.Code == request.Code))
-            {
-                return Fail($"Subject code '{request.Code}' is already taken.");
-            }
-
-            var subject = new Subject
-            {
-                Name = request.Name,
-                Code = request.Code,
-                AwardedCredits = request.AwardedCredits,
-                DependencyCredit = request.DependencyCredit
-            };
-            _context.Subjects.Add(subject);
-            await _context.SaveChangesAsync();
-
-            return Ok($"Subject '{subject.Name}' created.", subject.Id);
-        }
-
-        public async Task<AdminResultDto> UpdateSubjectAsync(int subjectId, SubjectWriteDto request)
-        {
-            var subject = await _context.Subjects.FirstOrDefaultAsync(s => s.Id == subjectId);
-            if (subject is null) return Fail("Subject not found.");
-
-            if (string.IsNullOrWhiteSpace(request.Name) || string.IsNullOrWhiteSpace(request.Code))
-            {
-                return Fail("Name and code are required.");
-            }
-            if (request.AwardedCredits <= 0)
-            {
-                return Fail("Awarded credits must be greater than zero.");
-            }
-            if (await _context.Subjects.AnyAsync(s => s.Name == request.Name && s.Id != subjectId))
-            {
-                return Fail($"Another subject is already named '{request.Name}'.");
-            }
-            if (await _context.Subjects.AnyAsync(s => s.Code == request.Code && s.Id != subjectId))
-            {
-                return Fail($"Subject code '{request.Code}' is already taken.");
-            }
-
-            subject.Name = request.Name;
-            subject.Code = request.Code;
-            subject.AwardedCredits = request.AwardedCredits;
-            subject.DependencyCredit = request.DependencyCredit;
-            await _context.SaveChangesAsync();
-
-            return Ok($"Subject '{subject.Name}' updated.", subject.Id);
-        }
-
-        public async Task<AdminResultDto> DeleteSubjectAsync(int subjectId)
-        {
-            var subject = await _context.Subjects.FirstOrDefaultAsync(s => s.Id == subjectId);
-            if (subject is null) return Fail("Subject not found.");
-
-            // semesters_subjects references subjects, so a taken subject cannot go.
-            var taken = await _context.SemesterSubjects.CountAsync(ss => ss.SubjectId == subjectId);
-            if (taken > 0)
-            {
-                return Fail($"Cannot delete: {taken} enrolment(s) already contain this subject.");
-            }
-
-            await using var transaction = await _context.Database.BeginTransactionAsync();
-            try
-            {
-                // The mapping rows must go first; their foreign keys would block the delete.
-                var prereqs = await _context.DependencySubjects
-                    .Where(d => d.SubjectId == subjectId || d.DependencyId == subjectId)
-                    .ToListAsync();
-                _context.DependencySubjects.RemoveRange(prereqs);
-
-                var majors = await _context.MajorSubjects
-                    .Where(ms => ms.SubjectId == subjectId).ToListAsync();
-                _context.MajorSubjects.RemoveRange(majors);
-
-                var teaching = await _context.ProfessorSubjects
-                    .Where(ps => ps.SubjectId == subjectId).ToListAsync();
-                _context.ProfessorSubjects.RemoveRange(teaching);
-
-                _context.Subjects.Remove(subject);
-                await _context.SaveChangesAsync();
-                await transaction.CommitAsync();
-
-                return Ok($"Subject '{subject.Name}' deleted.");
-            }
-            catch
-            {
-                await transaction.RollbackAsync();
-                throw;
-            }
-        }
-
-        public async Task<AdminResultDto> LinkMajorAsync(int subjectId, MajorLinkDto request)
-        {
-            if (!await _context.Subjects.AnyAsync(s => s.Id == subjectId))
-                return Fail("Subject not found.");
-            if (!await _context.Majors.AnyAsync(m => m.Id == request.MajorId))
-                return Fail("Study programme not found.");
-            if (request.MandatorySemester < 1)
-                return Fail("Semester must be 1 or greater.");
-
-            var existing = await _context.MajorSubjects
-                .FirstOrDefaultAsync(ms => ms.SubjectId == subjectId && ms.MajorId == request.MajorId);
-
-            if (existing is not null)
-            {
-                existing.MandatorySemester = request.MandatorySemester;
-                await _context.SaveChangesAsync();
-                return Ok("Study programme mapping updated.");
-            }
-
-            _context.MajorSubjects.Add(new MajorSubjects
-            {
-                SubjectId = subjectId,
-                MajorId = request.MajorId,
-                MandatorySemester = request.MandatorySemester
-            });
-            await _context.SaveChangesAsync();
-            return Ok("Subject added to the study programme.");
-        }
-
-        public async Task<AdminResultDto> UnlinkMajorAsync(int subjectId, int majorId)
-        {
-            var row = await _context.MajorSubjects
-                .FirstOrDefaultAsync(ms => ms.SubjectId == subjectId && ms.MajorId == majorId);
-            if (row is null) return Fail("That subject is not in that study programme.");
-
-            _context.MajorSubjects.Remove(row);
-            await _context.SaveChangesAsync();
-            return Ok("Subject removed from the study programme.");
-        }
-
-        public async Task<AdminResultDto> AddPrerequisiteAsync(int subjectId, PrerequisiteDto request)
-        {
-            if (subjectId == request.DependencyId)
-            {
-                // Mirrors CHECK (subject_id <> dependency_id).
-                return Fail("A subject cannot be its own prerequisite.");
-            }
-            if (!await _context.Subjects.AnyAsync(s => s.Id == subjectId))
-                return Fail("Subject not found.");
-            if (!await _context.Subjects.AnyAsync(s => s.Id == request.DependencyId))
-                return Fail("Prerequisite subject not found.");
-            if (await _context.DependencySubjects.AnyAsync(
-                    d => d.SubjectId == subjectId && d.DependencyId == request.DependencyId))
-                return Fail("That prerequisite is already set.");
-
-            // Refuse a direct cycle: A requires B while B already requires A.
-            if (await _context.DependencySubjects.AnyAsync(
-                    d => d.SubjectId == request.DependencyId && d.DependencyId == subjectId))
-                return Fail("That would create a circular prerequisite.");
-
-            _context.DependencySubjects.Add(new DependencySubject
-            {
-                SubjectId = subjectId,
-                DependencyId = request.DependencyId
-            });
-            await _context.SaveChangesAsync();
-            return Ok("Prerequisite added.");
-        }
-
-        public async Task<AdminResultDto> RemovePrerequisiteAsync(int subjectId, int dependencyId)
-        {
-            var row = await _context.DependencySubjects
-                .FirstOrDefaultAsync(d => d.SubjectId == subjectId && d.DependencyId == dependencyId);
-            if (row is null) return Fail("That prerequisite is not set.");
-
-            _context.DependencySubjects.Remove(row);
-            await _context.SaveChangesAsync();
-            return Ok("Prerequisite removed.");
-        }
-
-        // ============================================================
-        //  UC013 - active semesters
-        // ============================================================
-
-        public async Task<List<AdminSemesterDto>> GetSemestersAsync()
-        {
-            var semesters = await _context.ActiveSemesters.AsNoTracking().ToListAsync();
-            var subjects = await _context.Subjects.AsNoTracking().ToListAsync();
-            var teaching = await _context.ProfessorSubjects.AsNoTracking().ToListAsync();
-
-            var enrolments = await _context.EnrolledSemesters.AsNoTracking()
-                .GroupBy(es => es.SemesterId)
-                .Select(g => new { SemesterId = g.Key, Count = g.Count() })
-                .ToDictionaryAsync(x => x.SemesterId, x => x.Count);
-
-            return semesters
-                .OrderByDescending(s => s.Year)
-                .ThenByDescending(s => s.Type == sType.summer)
-                .Select(s =>
-                {
-                    var covered = teaching
-                        .Where(t => t.SemesterId == s.Id)
-                        .Select(t => t.SubjectId)
-                        .ToHashSet();
-
-                    return new AdminSemesterDto
-                    {
-                        Id = s.Id,
-                        Year = s.Year,
-                        Type = s.Type.ToString(),
-                        Name = SemesterName(s),
-                        EnrolmentCount = enrolments.TryGetValue(s.Id, out var c) ? c : 0,
-                        UncoveredSubjects = subjects
-                            .Where(sub => !covered.Contains(sub.Id))
-                            .OrderBy(sub => sub.Code)
-                            .Select(sub => new SubjectRefDto { Id = sub.Id, Name = sub.Name, Code = sub.Code })
-                            .ToList()
-                    };
-                })
-                .ToList();
-        }
-
-        public async Task<AdminResultDto> CreateSemesterAsync(SemesterWriteDto request)
-        {
-            if (!Enum.TryParse<sType>(request.Type, ignoreCase: true, out var type))
-            {
-                return Fail("Semester type must be 'winter' or 'summer'.");
-            }
-            if (request.Year < 2000 || request.Year > 2100)
-            {
-                return Fail("Year looks wrong; expected something between 2000 and 2100.");
-            }
-            // active_semesters has UNIQUE (year, type).
-            if (await _context.ActiveSemesters.AnyAsync(a => a.Year == request.Year && a.Type == type))
-            {
-                return Fail("That semester is already open.");
-            }
-
-            var semester = new ActiveSemesters { Year = request.Year, Type = type };
-            _context.ActiveSemesters.Add(semester);
-            await _context.SaveChangesAsync();
-
-            return Ok($"Semester {SemesterName(semester)} opened.", semester.Id);
-        }
-
-        // ============================================================
-        //  UC014 - professor assignments
-        // ============================================================
-
-        public async Task<ScheduleDto?> GetScheduleAsync(int semesterId)
-        {
-            var semester = await _context.ActiveSemesters.AsNoTracking()
-                .FirstOrDefaultAsync(a => a.Id == semesterId);
-            if (semester is null) return null;
-
-            var subjects = await _context.Subjects.AsNoTracking().ToListAsync();
-            var professors = await _context.User.AsNoTracking()
-                .Where(u => u.Role == Models.UserRole.Professor).ToListAsync();
-            var assignments = await _context.ProfessorSubjects.AsNoTracking()
-                .Where(ps => ps.SemesterId == semesterId).ToListAsync();
-
-            var subjectById = subjects.ToDictionary(s => s.Id);
-            var profById = professors.ToDictionary(p => p.Id);
-            var covered = assignments.Select(a => a.SubjectId).ToHashSet();
-
-            return new ScheduleDto
-            {
-                SemesterId = semester.Id,
-                SemesterName = SemesterName(semester),
-                Assignments = assignments
-                    .Where(a => subjectById.ContainsKey(a.SubjectId) && profById.ContainsKey(a.ProfessorId))
-                    .Select(a => new ScheduleRowDto
-                    {
-                        SubjectId = a.SubjectId,
-                        SubjectName = subjectById[a.SubjectId].Name,
-                        SubjectCode = subjectById[a.SubjectId].Code,
-                        ProfessorId = a.ProfessorId,
-                        ProfessorName = $"{profById[a.ProfessorId].Name} {profById[a.ProfessorId].Surname}".Trim()
-                    })
-                    .OrderBy(r => r.SubjectCode)
-                    .ToList(),
-                Load = professors
-                    .Select(p => new ProfessorLoadDto
-                    {
-                        ProfessorId = p.Id,
-                        ProfessorName = $"{p.Name} {p.Surname}".Trim(),
-                        Subjects = assignments.Count(a => a.ProfessorId == p.Id)
-                    })
-                    .OrderByDescending(l => l.Subjects).ThenBy(l => l.ProfessorName)
-                    .ToList(),
-                UncoveredSubjects = subjects
-                    .Where(s => !covered.Contains(s.Id))
-                    .OrderBy(s => s.Code)
-                    .Select(s => new SubjectRefDto { Id = s.Id, Name = s.Name, Code = s.Code })
-                    .ToList(),
-                AllSubjects = subjects
-                    .OrderBy(s => s.Code)
-                    .Select(s => new SubjectRefDto { Id = s.Id, Name = s.Name, Code = s.Code })
-                    .ToList(),
-                Professors = professors
-                    .OrderBy(p => p.Surname)
-                    .Select(p => new ProfessorRefDto { Id = p.Id, Name = $"{p.Name} {p.Surname}".Trim() })
-                    .ToList()
-            };
-        }
-
-        public async Task<AdminResultDto> AssignAsync(ScheduleWriteDto request)
-        {
-            var professor = await _context.User
-                .FirstOrDefaultAsync(u => u.Id == request.ProfessorId);
-            if (professor is null) return Fail("Professor not found.");
-            if (professor.Role != Models.UserRole.Professor)
-                return Fail("That user is not a professor.");
-            if (!await _context.ActiveSemesters.AnyAsync(a => a.Id == request.SemesterId))
-                return Fail("Semester not found.");
-            if (!await _context.Subjects.AnyAsync(s => s.Id == request.SubjectId))
-                return Fail("Subject not found.");
-
-            var exists = await _context.ProfessorSubjects.AnyAsync(
-                ps => ps.ProfessorId == request.ProfessorId
-                   && ps.SemesterId == request.SemesterId
-                   && ps.SubjectId == request.SubjectId);
-            if (exists) return Ok("That assignment already exists.");
-
-            _context.ProfessorSubjects.Add(new ProfessorSubjects
-            {
-                ProfessorId = request.ProfessorId,
-                SemesterId = request.SemesterId,
-                SubjectId = request.SubjectId
-            });
-            await _context.SaveChangesAsync();
-            return Ok("Professor assigned to the subject.");
-        }
-
-        public async Task<AdminResultDto> UnassignAsync(ScheduleWriteDto request)
-        {
-            var row = await _context.ProfessorSubjects.FirstOrDefaultAsync(
-                ps => ps.ProfessorId == request.ProfessorId
-                   && ps.SemesterId == request.SemesterId
-                   && ps.SubjectId == request.SubjectId);
-            if (row is null) return Fail("That assignment does not exist.");
-
-            _context.ProfessorSubjects.Remove(row);
-            await _context.SaveChangesAsync();
-            return Ok("Assignment removed.");
-        }
-
-        public async Task<List<SubjectRefDto>> GetMajorsAsync() =>
-            await _context.Majors.AsNoTracking()
-                .OrderBy(m => m.Name)
-                .Select(m => new SubjectRefDto { Id = m.Id, Name = m.Name, Code = null })
-                .ToListAsync();
-
-        private static AdminResultDto Ok(string message, int? id = null) =>
-            new() { Ok = true, Message = message, Id = id };
-
-        private static AdminResultDto Fail(string message) =>
-            new() { Ok = false, Message = message };
-    }
-}
Index: now-api/Services/Implementations/AuthService.cs
===================================================================
--- iknow-api/Services/Implementations/AuthService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,175 +1,0 @@
-using System.IdentityModel.Tokens.Jwt;
-using System.Security.Claims;
-using System.Text;
-using BCrypt.Net;
-using iknow_api.Models;
-using iknow_api.DTOs;
-using iknow_api.Repositories;
-using Microsoft.IdentityModel.Tokens;
-using iknow_api.Data;
-
-namespace iknow_api.Services
-{
-    public class AuthService : IAuthService
-    {
-        private readonly IUserRepository _userRepository;
-        private readonly IRefreshTokenRepository _refreshTokenRepository;
-        private readonly IRefreshTokenService _refreshTokenService;
-        private readonly IConfiguration _configuration;
-        private readonly AppDbContext _context;
-
-        public AuthService(IUserRepository userRepository, IConfiguration configuration,
-                            IRefreshTokenService refreshTokenService, IRefreshTokenRepository refreshTokenRepository,
-                            AppDbContext context)
-        {
-            _userRepository = userRepository;
-            _configuration = configuration;
-            _refreshTokenService = refreshTokenService;
-            _refreshTokenRepository = refreshTokenRepository;
-            _context = context;
-        }
-
-        public async Task<bool> RegisterAsync(RegisterDto registerDto)
-        {
-            // Debug: Log all incoming DTO values
-            Console.WriteLine("=== RegisterDto Debug Info ===");
-            Console.WriteLine($"Name: {registerDto.Name}");
-            Console.WriteLine($"Email: {registerDto.Email}");
-            Console.WriteLine($"majorType: {registerDto.majorType}");
-            Console.WriteLine($"enrollmentYear: {registerDto.enrollmentYear}");
-            Console.WriteLine($"quotaType: {registerDto.quotaType}");
-            Console.WriteLine($"Role: {registerDto.Role}");
-            Console.WriteLine($"tip: {registerDto.tip}");
-            Console.WriteLine("==============================");
-
-            // Check if user already exists
-            if (await _userRepository.UserExistsAsync(registerDto.Email))
-                throw new InvalidOperationException("User with this email already exists");
-
-            // Use a transaction to ensure all entities are saved together
-            using var transaction = await _context.Database.BeginTransactionAsync();
-            try
-            {
-                // quota and enrollment_year are attributes of Users in the ER
-                // model, so they are set here rather than on a separate entity.
-                var user = new User
-                {
-                    Name = registerDto.Name,
-                    Surname = registerDto.Surname,
-                    Index = registerDto.Index,
-                    Email = registerDto.Email,
-                    PasswordHash = BCrypt.Net.BCrypt.HashPassword(registerDto.Password),
-                    Bday = DateTime.SpecifyKind(registerDto.Bday, DateTimeKind.Unspecified),
-                    CreatedAt = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified),
-                    Role = (Models.UserRole)registerDto.Role,
-                    EMBG = registerDto.EMBG,
-                    Quota = (Models.Quota)registerDto.quotaType,
-                    EnrollmentYear = registerDto.enrollmentYear
-                };
-
-                _context.User.Add(user);
-                await _context.SaveChangesAsync();
-                
-                int userId = user.Id;
-                
-                var contactInfo = new ContactInfo
-                {
-                    UserId = userId,
-                    City = registerDto.city,
-                    Address = registerDto.address,
-                    Municipality = registerDto.municipality,
-                    PhoneNumber = registerDto.phoneNumber,
-                    MicrosoftEmail = registerDto.microsoftEmail
-                };
-                
-                var highSchool = new HighSchool
-                {
-                    UserId = userId,
-                    GPA = registerDto.gpa,
-                    HighSchoolType = (Models.HighSchoolType)registerDto.tip
-                };
-
-                _context.ContactInfo.Add(contactInfo);
-                _context.HighSchool.Add(highSchool);
-                
-                // Save all related entities in a single transaction
-                await _context.SaveChangesAsync();
-                await transaction.CommitAsync();
-                
-                return true;
-            }
-            catch
-            {
-                await transaction.RollbackAsync();
-                throw;
-            }
-        }
-
-        public async Task<AuthResultDto?> LoginAsync(LoginDto loginDto)
-        {
-            var user = await _userRepository.GetUserByUsernameAsync(loginDto.Email);
-            if (user == null || !BCrypt.Net.BCrypt.Verify(loginDto.Password, user.PasswordHash))
-                return null;
-
-            var result = new AuthResultDto
-            {
-                AccessToken = CreateToken(user),
-                Role = user.Role.ToString()
-            };
-
-            if (loginDto.GenerateRefreshToken)
-            {
-                result.RefreshToken = await _refreshTokenService.GenerateRefreshToken(user.Id);
-            }
-
-            return result;
-        }
-
-        public async Task<int> GetUsersCountAsync()
-        {
-            return await _userRepository.GetUsersCountAsync();
-        }
-
-        public async Task<AuthResultDto> GenerateNewJWT(VerifyRefreshTokenDto token)
-        {
-            int userid = await _refreshTokenRepository.GetUserId(token.token) ?? 0;
-            User? user = await _userRepository.GetOnlyUserByIdAsync(userid);
-
-            if (user == null)
-                throw new InvalidOperationException("User not found for provided refresh token.");
-
-            return new AuthResultDto
-            {
-                AccessToken = CreateToken(user),
-                Role = user.Role.ToString()
-            };
-        }
-
-        private string CreateToken(User user)
-        {
-            var claims = new[]
-            {
-                new Claim("id", user.Id.ToString()),
-                new Claim("email", user.Email ?? string.Empty),
-                new Claim("role", user.Role.ToString())
-            };
-
-            var keyString = _configuration["Jwt:Key"];
-            if (string.IsNullOrEmpty(keyString))
-                throw new Exception("JWT Key is missing in configuration!");
-
-            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keyString));
-            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
-
-            var jwt = new JwtSecurityToken(
-                issuer: "iknow-api",
-                audience: "iknow-api",
-                claims: claims,
-                expires: DateTime.UtcNow.AddHours(1),
-                signingCredentials: creds
-            );
-
-            return new JwtSecurityTokenHandler().WriteToken(jwt);
-        }
-    }
-}
Index: now-api/Services/Implementations/EnrollmentService.cs
===================================================================
--- iknow-api/Services/Implementations/EnrollmentService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,232 +1,0 @@
-using iknow_api.Data;
-using iknow_api.DTOs;
-using iknow_api.Models;
-using Microsoft.EntityFrameworkCore;
-
-namespace iknow_api.Services
-{
-    public class EnrollmentService : IEnrollmentService
-    {
-        /// <summary>An enrolment is exactly this many subjects.</summary>
-        public const int RequiredSubjects = 5;
-
-        private readonly AppDbContext _context;
-
-        public EnrollmentService(AppDbContext context)
-        {
-            _context = context;
-        }
-
-        public async Task<EnrollmentOptionsDto> GetOptionsAsync(int studentId)
-        {
-            var enrolments = await _context.EnrolledSemesters
-                .AsNoTracking()
-                .Include(es => es.Semester)
-                .Where(es => es.UserId == studentId)
-                .ToListAsync();
-
-            var takenSemesterIds = enrolments.Select(es => es.SemesterId).ToHashSet();
-
-            var available = await _context.ActiveSemesters
-                .AsNoTracking()
-                .Where(a => !takenSemesterIds.Contains(a.Id))
-                .ToListAsync();
-
-            // Semesters are labelled Year/Year+1, so within a year winter comes first.
-            var semesters = available
-                .OrderBy(a => a.Year)
-                .ThenBy(a => a.Type == sType.summer)
-                .Select(a => new SemesterOptionDto
-                {
-                    Id = a.Id,
-                    Year = a.Year,
-                    Type = a.Type.ToString(),
-                    Name = $"{(a.Type == sType.winter ? "Зимски" : "Летен")}({a.Year}/{a.Year + 1})"
-                })
-                .ToList();
-
-            var passedSubjectIds = await _context.PassedSubjects
-                .AsNoTracking()
-                .Where(ps => ps.SemesterSubject!.EnrolledSemester!.UserId == studentId)
-                .Select(ps => ps.SemesterSubject!.SubjectId)
-                .ToListAsync();
-            var passed = passedSubjectIds.ToHashSet();
-
-            var majorRows = await _context.MajorSubjects
-                .AsNoTracking()
-                .Include(ms => ms.Majors)
-                .Include(ms => ms.Subjects)
-                .ToListAsync();
-
-            var majors = majorRows
-                .Where(ms => ms.Majors != null && ms.Subjects != null)
-                .GroupBy(ms => ms.Majors!.Id)
-                .Select(g => new MajorOptionDto
-                {
-                    Id = g.Key,
-                    Name = g.First().Majors!.Name,
-                    Subjects = g
-                        .Select(ms => new SubjectOptionDto
-                        {
-                            Id = ms.Subjects!.Id,
-                            Name = ms.Subjects.Name,
-                            Code = ms.Subjects.Code,
-                            Credits = ms.Subjects.AwardedCredits ?? 0,
-                            MandatorySemester = ms.MandatorySemester,
-                            AlreadyPassed = passed.Contains(ms.Subjects.Id)
-                        })
-                        .OrderBy(x => x.MandatorySemester)
-                        .ThenBy(x => x.Name)
-                        .ToList()
-                })
-                .OrderBy(m => m.Name)
-                .ToList();
-
-            var latest = enrolments
-                .Where(es => es.Semester != null)
-                .OrderByDescending(es => es.Semester!.Year)
-                .ThenByDescending(es => es.Semester!.Type == sType.summer)
-                .FirstOrDefault();
-
-            return new EnrollmentOptionsDto
-            {
-                RequiredSubjects = RequiredSubjects,
-                Semesters = semesters,
-                Majors = majors,
-                DefaultMajorId = latest?.MajorId
-            };
-        }
-
-        public async Task<EnrollSemesterResultDto> EnrollAsync(
-            int studentId, EnrollSemesterRequestDto request)
-        {
-            var subjectIds = request.SubjectIds?.Distinct().ToList() ?? new List<int>();
-
-            if (subjectIds.Count != RequiredSubjects)
-            {
-                return Fail($"Pick exactly {RequiredSubjects} different subjects; got {subjectIds.Count}.");
-            }
-
-            if (!await _context.ActiveSemesters.AnyAsync(a => a.Id == request.SemesterId))
-            {
-                return Fail("That semester does not exist.");
-            }
-
-            // enrolled_semesters has UNIQUE (user_id, semester_id); check first so
-            // the student gets a sentence rather than a constraint violation.
-            if (await _context.EnrolledSemesters.AnyAsync(
-                    es => es.UserId == studentId && es.SemesterId == request.SemesterId))
-            {
-                return Fail("You are already enrolled in that semester.");
-            }
-
-            if (!await _context.Majors.AnyAsync(m => m.Id == request.MajorId))
-            {
-                return Fail("That study programme does not exist.");
-            }
-
-            var offered = await _context.MajorSubjects
-                .Where(ms => ms.MajorId == request.MajorId)
-                .Select(ms => ms.SubjectId)
-                .ToListAsync();
-
-            var notOffered = subjectIds.Except(offered).ToList();
-            if (notOffered.Count > 0)
-            {
-                return Fail($"Subject(s) {string.Join(", ", notOffered)} are not offered by that study programme.");
-            }
-
-            // semesters_subjects.professor_id is NOT NULL, so every chosen subject
-            // needs somebody teaching it that semester.
-            var teachers = await _context.ProfessorSubjects
-                .Where(ps => ps.SemesterId == request.SemesterId && subjectIds.Contains(ps.SubjectId))
-                .ToListAsync();
-
-            // A subject can be taught by more than one professor in the same
-            // semester. Spread students over them instead of always taking the
-            // lowest id, which would leave the other professor with nobody.
-            var currentLoad = await _context.SemesterSubjects
-                .Where(ss => subjectIds.Contains(ss.SubjectId)
-                          && ss.EnrolledSemester!.SemesterId == request.SemesterId)
-                .GroupBy(ss => new { ss.SubjectId, ss.ProfessorId })
-                .Select(g => new { g.Key.SubjectId, g.Key.ProfessorId, Count = g.Count() })
-                .ToListAsync();
-
-            var loadLookup = currentLoad.ToDictionary(
-                x => (x.SubjectId, x.ProfessorId), x => x.Count);
-
-            var professorBySubject = teachers
-                .GroupBy(ps => ps.SubjectId)
-                .ToDictionary(
-                    g => g.Key,
-                    // Fewest students first; professor id only breaks ties, so
-                    // the choice stays deterministic and testable.
-                    g => g.OrderBy(ps => loadLookup.TryGetValue((ps.SubjectId, ps.ProfessorId), out var n) ? n : 0)
-                          .ThenBy(ps => ps.ProfessorId)
-                          .First().ProfessorId);
-
-            var untaught = subjectIds.Where(id => !professorBySubject.ContainsKey(id)).ToList();
-            if (untaught.Count > 0)
-            {
-                return Fail($"Subject(s) {string.Join(", ", untaught)} are not taught in that semester.");
-            }
-
-            var student = await _context.User.FirstOrDefaultAsync(u => u.Id == studentId);
-            if (student is null)
-            {
-                return Fail("Student not found.");
-            }
-
-            var now = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified);
-
-            await using var transaction = await _context.Database.BeginTransactionAsync();
-            try
-            {
-                var enrolment = new EnrolledSemesters
-                {
-                    UserId = studentId,
-                    SemesterId = request.SemesterId,
-                    MajorId = request.MajorId,
-                    // enrolled_semesters.quota is NOT NULL; fall back to the
-                    // state quota when the student record has none.
-                    QuotaType = student.Quota ?? Models.Quota.drzavna,
-                    CratedAt = now,
-                    LastChange = now,
-                    Verified = null
-                };
-
-                _context.EnrolledSemesters.Add(enrolment);
-                await _context.SaveChangesAsync();
-
-                foreach (var subjectId in subjectIds)
-                {
-                    _context.SemesterSubjects.Add(new SemesterSubject
-                    {
-                        EnrolledSemesterId = enrolment.Id,
-                        SubjectId = subjectId,
-                        ProfessorId = professorBySubject[subjectId],
-                        Signature = false
-                    });
-                }
-
-                await _context.SaveChangesAsync();
-                await transaction.CommitAsync();
-
-                return new EnrollSemesterResultDto
-                {
-                    Ok = true,
-                    Message = $"Enrolled with {subjectIds.Count} subjects.",
-                    EnrolledSemesterId = enrolment.Id
-                };
-            }
-            catch
-            {
-                await transaction.RollbackAsync();
-                throw;
-            }
-        }
-
-        private static EnrollSemesterResultDto Fail(string message) =>
-            new() { Ok = false, Message = message };
-    }
-}
Index: now-api/Services/Implementations/ProfService.cs
===================================================================
--- iknow-api/Services/Implementations/ProfService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,122 +1,0 @@
-using iknow_api.DTOs;
-using iknow_api.Models;
-using iknow_api.Repositories;
-
-namespace iknow_api.Services
-{
-    public class ProfService : IProfService
-    {
-        private readonly IProfRepository _profRepository;
-
-        public ProfService(IProfRepository profRepository)
-        {
-            _profRepository = profRepository;
-        }
-
-        public async Task<List<SubjectStudentsDto>> GetStudentsBySubjectAsync(int professorId)
-        {
-            var taught = await _profRepository.GetTaughtSemesterSubjectsAsync(professorId);
-
-            return taught
-                .Where(ss => ss.Subject != null && ss.EnrolledSemester?.User != null)
-                .GroupBy(ss => ss.Subject!.Id)
-                .Select(group =>
-                {
-                    var subject = group.First().Subject!;
-                    return new SubjectStudentsDto
-                    {
-                        Id = subject.Id,
-                        Name = subject.Name,
-                        Code = subject.Code,
-                        Users = group
-                            .Select(ss =>
-                            {
-                                var student = ss.EnrolledSemester!.User!;
-                                var semester = ss.EnrolledSemester.Semester;
-                                return new EnrolledStudentDto
-                                {
-                                    Id = student.Id,
-                                    Name = $"{student.Name} {student.Surname}".Trim(),
-                                    Index = student.Index,
-                                    // 0 means "not graded yet"; the enum starts at 6.
-                                    Grade = ss.PassedSubject is null ? 0 : (int)ss.PassedSubject.Grade,
-                                    Semester = semester is null
-                                        ? null
-                                        : $"{(semester.Type == sType.winter ? "Зимски" : "Летен")}({semester.Year}/{semester.Year + 1})"
-                                };
-                            })
-                            .OrderBy(u => u.Name)
-                            .ToList()
-                    };
-                })
-                .OrderBy(s => s.Name)
-                .ToList();
-        }
-
-        public async Task<GradeResultDto> SetGradeAsync(
-            int professorId, GradeRequestDto request, GradeAction action)
-        {
-            // grade_type only declares 6..10, so anything else cannot be stored.
-            if (action != GradeAction.Remove && !Enum.IsDefined(typeof(Grade), request.Grade))
-            {
-                return Fail($"Grade must be between 6 and 10; got {request.Grade}.");
-            }
-
-            // This also enforces authorisation: the lookup is scoped to the
-            // subjects this professor actually teaches.
-            var semesterSubject = await _profRepository.FindTaughtSemesterSubjectAsync(
-                professorId, request.StudentId, request.SubjectId);
-
-            if (semesterSubject is null)
-            {
-                return Fail("You do not teach this student in this subject.");
-            }
-
-            var existing = await _profRepository.GetPassedSubjectAsync(semesterSubject.Id);
-
-            switch (action)
-            {
-                case GradeAction.Add:
-                    if (existing is not null)
-                    {
-                        return Fail("This subject is already graded. Use edit to change the grade.");
-                    }
-                    await _profRepository.AddPassedSubjectAsync(new PassedSubject
-                    {
-                        SemesterSubjectId = semesterSubject.Id,
-                        Grade = (Grade)request.Grade,
-                        // date_passed is `timestamp without time zone`.
-                        DatePassed = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified)
-                    });
-                    return Ok($"Grade {request.Grade} added.");
-
-                case GradeAction.Edit:
-                    if (existing is null)
-                    {
-                        return Fail("This subject has no grade yet. Use add first.");
-                    }
-                    existing.Grade = (Grade)request.Grade;
-                    existing.DatePassed = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Unspecified);
-                    await _profRepository.UpdatePassedSubjectAsync(existing);
-                    return Ok($"Grade changed to {request.Grade}.");
-
-                case GradeAction.Remove:
-                    if (existing is null)
-                    {
-                        return Fail("This subject has no grade to remove.");
-                    }
-                    await _profRepository.RemovePassedSubjectAsync(existing);
-                    return Ok("Grade removed.");
-
-                default:
-                    return Fail("Unknown action.");
-            }
-        }
-
-        private static GradeResultDto Ok(string message) =>
-            new() { Ok = true, Message = message };
-
-        private static GradeResultDto Fail(string message) =>
-            new() { Ok = false, Message = message };
-    }
-}
Index: now-api/Services/Implementations/RefreshTokenService.cs
===================================================================
--- iknow-api/Services/Implementations/RefreshTokenService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,50 +1,0 @@
-using iknow_api.DTOs;
-using iknow_api.Services;
-using System.Security.Cryptography;
-using iknow_api.Models;
-using iknow_api.Models;
-using iknow_api.Repositories;
-
-namespace iknow_api.Services
-{
-    public class RefreshTokenService : IRefreshTokenService
-    {
-        private readonly IRefreshTokenRepository _refreshTokenRepository;
-        public RefreshTokenService(IRefreshTokenRepository refreshTokenRepository)
-        {
-            _refreshTokenRepository = refreshTokenRepository;
-        }
-
-        public async Task<string> GenerateRefreshToken(int userid)
-        {
-            var randomNumber = new byte[32];
-
-            using (var rng = RandomNumberGenerator.Create())
-            {
-                rng.GetBytes(randomNumber);
-            }
-
-            var refreshToken = Convert.ToBase64String(randomNumber);
-
-            RefreshToken refreshTokenModel = new RefreshToken
-            {
-                Token = refreshToken,
-                UserId = userid,
-                ExpiresAt = DateTime.SpecifyKind(DateTime.UtcNow.AddMonths(1), DateTimeKind.Unspecified),
-                IsValid = true
-            };
-
-            await _refreshTokenRepository.AddTokenAsync(refreshTokenModel);
-
-            return refreshToken;
-        }
-
-        public async Task<bool> VerifyRefreshToken(VerifyRefreshTokenDto refreshTokenDto)
-        {
-
-            return await _refreshTokenRepository.VerifyTokenAsync(refreshTokenDto);
-        }
-
-        
-    }
-}
Index: now-api/Services/Implementations/UserService.cs
===================================================================
--- iknow-api/Services/Implementations/UserService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,105 +1,0 @@
-﻿using iknow_api.Repositories;
-using iknow_api.Services;
-using iknow_api.DTOs;
-using Microsoft.AspNetCore.Http.HttpResults;
-using System.IdentityModel.Tokens.Jwt;
-using System.Security.Claims;
-using System.Text;
-using Microsoft.IdentityModel.Tokens;
-using iknow_api.Models;
-
-namespace iknow_api.Services
-{
-    public class UserService : IUserService
-    {
-
-        private readonly IUserRepository _userRepository;
-        private readonly IConfiguration _configuration;
-        public UserService(IUserRepository userRepository, IConfiguration configuration)
-        {
-            _userRepository = userRepository;
-            _configuration = configuration;
-        }
-        public async Task<User> GetUserData(string JWT)
-        {
-            var userId = ExtractUserIdFromJwt(JWT);
-            if (userId == null)
-                return null;
-
-            // Now you can use userId to fetch user data
-            var user = await _userRepository.GetUserByIdAsync(userId.Value);
-            if(user == null)
-                return null;
-            else
-                return user;
-        }
-        public async Task<List<EnrolledSemesters>> GetUserSemesters(string JWT)
-        {
-            var userId = ExtractUserIdFromJwt(JWT);
-            if (userId == null)
-                return null;
-
-            // Now you can use userId to fetch user data
-            var semesters = await _userRepository.GetUserSemestersAsync(userId.Value);
-            if (semesters == null)
-                return null;
-            else
-                return semesters;
-        }
-
-        public async Task<List<PassedSubject>> GetUserPassedSubjects(string JWT)
-        {
-            var userId = ExtractUserIdFromJwt(JWT);
-            if (userId == null)
-                return null;
-
-            var passedSubjects = await _userRepository.GetUserPassedSubjectsAsync(userId.Value);
-            if (passedSubjects == null)
-                return null;
-            else
-                return passedSubjects;
-        }
-
-        private int? ExtractUserIdFromJwt(string token)
-        {
-            try
-            {
-                var tokenHandler = new JwtSecurityTokenHandler();
-                var keyString = _configuration["Jwt:Key"];
-                
-                if (string.IsNullOrEmpty(keyString))
-                    return null;
-
-                var key = Encoding.UTF8.GetBytes(keyString);
-
-                var validationParameters = new TokenValidationParameters
-                {
-                    ValidateIssuerSigningKey = true,
-                    IssuerSigningKey = new SymmetricSecurityKey(key),
-                    ValidateIssuer = true,
-                    ValidIssuer = "iknow-api",
-                    ValidateAudience = true,
-                    ValidAudience = "iknow-api",
-                    ValidateLifetime = true,
-                    ClockSkew = TimeSpan.Zero
-                };
-
-                var principal = tokenHandler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);
-                
-                // Extract the "id" claim that was set in AuthService.CreateToken
-                var userIdClaim = principal.FindFirst("id");
-                
-                if (userIdClaim != null && int.TryParse(userIdClaim.Value, out int userId))
-                {
-                    return userId;
-                }
-
-                return null;
-            }
-            catch
-            {
-                return null;
-            }
-        }
-    }
-}
Index: now-api/Services/Interfaces/IAdminService.cs
===================================================================
--- iknow-api/Services/Interfaces/IAdminService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,28 +1,0 @@
-using iknow_api.DTOs;
-
-namespace iknow_api.Services
-{
-    public interface IAdminService
-    {
-        // UC012 - subjects
-        Task<List<AdminSubjectDto>> GetSubjectsAsync();
-        Task<AdminResultDto> CreateSubjectAsync(SubjectWriteDto request);
-        Task<AdminResultDto> UpdateSubjectAsync(int subjectId, SubjectWriteDto request);
-        Task<AdminResultDto> DeleteSubjectAsync(int subjectId);
-        Task<AdminResultDto> LinkMajorAsync(int subjectId, MajorLinkDto request);
-        Task<AdminResultDto> UnlinkMajorAsync(int subjectId, int majorId);
-        Task<AdminResultDto> AddPrerequisiteAsync(int subjectId, PrerequisiteDto request);
-        Task<AdminResultDto> RemovePrerequisiteAsync(int subjectId, int dependencyId);
-
-        // UC013 - active semesters
-        Task<List<AdminSemesterDto>> GetSemestersAsync();
-        Task<AdminResultDto> CreateSemesterAsync(SemesterWriteDto request);
-
-        // UC014 - professor assignments
-        Task<ScheduleDto?> GetScheduleAsync(int semesterId);
-        Task<AdminResultDto> AssignAsync(ScheduleWriteDto request);
-        Task<AdminResultDto> UnassignAsync(ScheduleWriteDto request);
-
-        Task<List<SubjectRefDto>> GetMajorsAsync();
-    }
-}
Index: now-api/Services/Interfaces/IAuthService.cs
===================================================================
--- iknow-api/Services/Interfaces/IAuthService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,13 +1,0 @@
-﻿using iknow_api.DTOs;
-using iknow_api.Models;
-namespace iknow_api.Services
-{
-    public interface IAuthService
-    {
-        Task<bool> RegisterAsync(RegisterDto registerDto);
-        Task<AuthResultDto?> LoginAsync(LoginDto loginDto);
-        Task<int> GetUsersCountAsync();
-        Task<AuthResultDto> GenerateNewJWT(VerifyRefreshTokenDto token);
-       
-    }
-}
Index: now-api/Services/Interfaces/IEnrollmentService.cs
===================================================================
--- iknow-api/Services/Interfaces/IEnrollmentService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,16 +1,0 @@
-using iknow_api.DTOs;
-
-namespace iknow_api.Services
-{
-    public interface IEnrollmentService
-    {
-        /// <summary>The semesters, majors and subjects this student may enrol in.</summary>
-        Task<EnrollmentOptionsDto> GetOptionsAsync(int studentId);
-
-        /// <summary>
-        /// Creates one enrolled_semesters row and its semesters_subjects rows,
-        /// or returns why it could not.
-        /// </summary>
-        Task<EnrollSemesterResultDto> EnrollAsync(int studentId, EnrollSemesterRequestDto request);
-    }
-}
Index: now-api/Services/Interfaces/IProfService.cs
===================================================================
--- iknow-api/Services/Interfaces/IProfService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,18 +1,0 @@
-using iknow_api.DTOs;
-
-namespace iknow_api.Services
-{
-    public enum GradeAction
-    {
-        Add,
-        Edit,
-        Remove
-    }
-
-    public interface IProfService
-    {
-        Task<List<SubjectStudentsDto>> GetStudentsBySubjectAsync(int professorId);
-
-        Task<GradeResultDto> SetGradeAsync(int professorId, GradeRequestDto request, GradeAction action);
-    }
-}
Index: now-api/Services/Interfaces/IRefreshTokenService.cs
===================================================================
--- iknow-api/Services/Interfaces/IRefreshTokenService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,10 +1,0 @@
-using iknow_api.DTOs;
-
-namespace iknow_api.Services
-{
-    public interface IRefreshTokenService
-    {
-        Task<bool> VerifyRefreshToken(VerifyRefreshTokenDto refreshTokenDto);
-        Task<string> GenerateRefreshToken(int userid);
-    }
-}
Index: now-api/Services/Interfaces/IUserService.cs
===================================================================
--- iknow-api/Services/Interfaces/IUserService.cs	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,11 +1,0 @@
-﻿using iknow_api.DTOs;
-using iknow_api.Models;
-namespace iknow_api.Services
-{
-    public interface IUserService
-    {
-        Task<User> GetUserData(string userId);
-        Task<List<EnrolledSemesters>> GetUserSemesters(string userId);
-        Task<List<PassedSubject>> GetUserPassedSubjects(string userId);
-    }
-}
Index: now-api/appsettings.Development.json.example
===================================================================
--- iknow-api/appsettings.Development.json.example	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,14 +1,0 @@
-{
-  "Logging": {
-    "LogLevel": {
-      "Default": "Information",
-      "Microsoft.AspNetCore": "Warning"
-    }
-  },
-  "ConnectionStrings": {
-    "DefaultConnection": "Host=localhost;Port=9999;Database=db_202526z_va_prj_know2026;Username=db_202526z_va_prj_iknow2026_owner;Password=YOUR_DB_PASSWORD_HERE;Search Path=project;Include Error Detail=true"
-  },
-  "Jwt": {
-    "Key": "ANY_LOCAL_SIGNING_KEY_AT_LEAST_32_CHARACTERS_LONG"
-  }
-}
Index: now-api/appsettings.json
===================================================================
--- iknow-api/appsettings.json	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,13 +1,0 @@
-{
-  "Logging": {
-    "LogLevel": {
-      "Default": "Information",
-      "Microsoft.AspNetCore": "Warning"
-    }
-  },
-  "AllowedOrigins": [
-    "http://localhost:3000",
-    "https://iknow-remaster.vercel.app"
-  ],
-  "AllowedHosts": "*"
-}
Index: now-api/iknow-api.csproj
===================================================================
--- iknow-api/iknow-api.csproj	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,22 +1,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
-  <PropertyGroup>
-    <TargetFramework>net9.0</TargetFramework>
-    <Nullable>enable</Nullable>
-    <ImplicitUsings>enable</ImplicitUsings>
-    <RootNamespace>iknow_api</RootNamespace>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.10" />
-    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.9" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.10">
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-      <PrivateAssets>all</PrivateAssets>
-    </PackageReference>
-    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
-    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.14.0" />
-  </ItemGroup>
-
-</Project>
Index: now-api/iknow-api.http
===================================================================
--- iknow-api/iknow-api.http	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,6 +1,0 @@
-@iknow_api_HostAddress = http://localhost:5147
-
-GET {{iknow_api_HostAddress}}/weatherforecast/
-Accept: application/json
-
-###
Index: next.config.ts
===================================================================
--- next.config.ts	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ next.config.ts	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,7 @@
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+  /* config options here */
+};
+
+export default nextConfig;
Index: package-lock.json
===================================================================
--- package-lock.json	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ package-lock.json	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,6090 @@
+{
+  "name": "iknow-remaster",
+  "version": "0.1.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "iknow-remaster",
+      "version": "0.1.0",
+      "dependencies": {
+        "next": "15.5.4",
+        "react": "19.1.0",
+        "react-dom": "19.1.0"
+      },
+      "devDependencies": {
+        "@eslint/eslintrc": "^3",
+        "@tailwindcss/postcss": "^4",
+        "@types/node": "^20",
+        "@types/react": "^19",
+        "@types/react-dom": "^19",
+        "eslint": "^9",
+        "eslint-config-next": "15.5.4",
+        "tailwindcss": "^4",
+        "typescript": "^5"
+      }
+    },
+    "node_modules/@alloc/quick-lru": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+      "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@emnapi/core": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz",
+      "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/wasi-threads": "1.1.0",
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/runtime": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
+      "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/wasi-threads": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+      "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.9.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+      "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eslint-visitor-keys": "^3.4.3"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@eslint/config-array": {
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+      "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/object-schema": "^2.1.6",
+        "debug": "^4.3.1",
+        "minimatch": "^3.1.2"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/config-helpers": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
+      "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/core": {
+      "version": "0.15.2",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+      "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+      "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^10.0.1",
+        "globals": "^14.0.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint/js": {
+      "version": "9.36.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz",
+      "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
+      }
+    },
+    "node_modules/@eslint/object-schema": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+      "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/plugin-kit": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+      "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/core": "^0.15.2",
+        "levn": "^0.4.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@humanfs/core": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+      "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
+    "node_modules/@humanfs/node": {
+      "version": "0.16.7",
+      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+      "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@humanfs/core": "^0.19.1",
+        "@humanwhocodes/retry": "^0.4.0"
+      },
+      "engines": {
+        "node": ">=18.18.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,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/retry": {
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+      "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@img/colour": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
+      "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@img/sharp-darwin-arm64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz",
+      "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-darwin-arm64": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-darwin-x64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz",
+      "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-darwin-x64": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-libvips-darwin-arm64": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz",
+      "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-darwin-x64": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz",
+      "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-arm": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz",
+      "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-arm64": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz",
+      "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-ppc64": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz",
+      "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-s390x": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz",
+      "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==",
+      "cpu": [
+        "s390x"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linux-x64": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz",
+      "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz",
+      "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz",
+      "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-linux-arm": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz",
+      "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==",
+      "cpu": [
+        "arm"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-arm": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-arm64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz",
+      "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-arm64": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-ppc64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz",
+      "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-ppc64": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-s390x": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz",
+      "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==",
+      "cpu": [
+        "s390x"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-s390x": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-linux-x64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz",
+      "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linux-x64": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-linuxmusl-arm64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz",
+      "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linuxmusl-arm64": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-linuxmusl-x64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz",
+      "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-libvips-linuxmusl-x64": "1.2.3"
+      }
+    },
+    "node_modules/@img/sharp-wasm32": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz",
+      "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==",
+      "cpu": [
+        "wasm32"
+      ],
+      "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/runtime": "^1.5.0"
+      },
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-win32-arm64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz",
+      "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-win32-ia32": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz",
+      "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==",
+      "cpu": [
+        "ia32"
+      ],
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@img/sharp-win32-x64": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz",
+      "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "Apache-2.0 AND LGPL-3.0-or-later",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      }
+    },
+    "node_modules/@isaacs/fs-minipass": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^7.0.4"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.13",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+      "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/remapping": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+      "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+      "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.31",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+      "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@napi-rs/wasm-runtime": {
+      "version": "0.2.12",
+      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+      "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^1.4.3",
+        "@emnapi/runtime": "^1.4.3",
+        "@tybys/wasm-util": "^0.10.0"
+      }
+    },
+    "node_modules/@next/env": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.4.tgz",
+      "integrity": "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A==",
+      "license": "MIT"
+    },
+    "node_modules/@next/eslint-plugin-next": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.4.tgz",
+      "integrity": "sha512-SR1vhXNNg16T4zffhJ4TS7Xn7eq4NfKfcOsRwea7RIAHrjRpI9ALYbamqIJqkAhowLlERffiwk0FMvTLNdnVtw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-glob": "3.3.1"
+      }
+    },
+    "node_modules/@next/swc-darwin-arm64": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.4.tgz",
+      "integrity": "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-darwin-x64": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.4.tgz",
+      "integrity": "sha512-QOTCFq8b09ghfjRJKfb68kU9k2K+2wsC4A67psOiMn849K9ZXgCSRQr0oVHfmKnoqCbEmQWG1f2h1T2vtJJ9mA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-gnu": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.4.tgz",
+      "integrity": "sha512-eRD5zkts6jS3VfE/J0Kt1VxdFqTnMc3QgO5lFE5GKN3KDI/uUpSyK3CjQHmfEkYR4wCOl0R0XrsjpxfWEA++XA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-musl": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.4.tgz",
+      "integrity": "sha512-TOK7iTxmXFc45UrtKqWdZ1shfxuL4tnVAOuuJK4S88rX3oyVV4ZkLjtMT85wQkfBrOOvU55aLty+MV8xmcJR8A==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-gnu": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.4.tgz",
+      "integrity": "sha512-7HKolaj+481FSW/5lL0BcTkA4Ueam9SPYWyN/ib/WGAFZf0DGAN8frNpNZYFHtM4ZstrHZS3LY3vrwlIQfsiMA==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-musl": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.4.tgz",
+      "integrity": "sha512-nlQQ6nfgN0nCO/KuyEUwwOdwQIGjOs4WNMjEUtpIQJPR2NUfmGpW2wkJln1d4nJ7oUzd1g4GivH5GoEPBgfsdw==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-arm64-msvc": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.4.tgz",
+      "integrity": "sha512-PcR2bN7FlM32XM6eumklmyWLLbu2vs+D7nJX8OAIoWy69Kef8mfiN4e8TUv2KohprwifdpFKPzIP1njuCjD0YA==",
+      "cpu": [
+        "arm64"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-x64-msvc": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.4.tgz",
+      "integrity": "sha512-1ur2tSHZj8Px/KMAthmuI9FMp/YFusMMGoRNJaRZMOlSkgvLjzosSdQI0cJAKogdHl3qXUQKL9MGaYvKwA7DXg==",
+      "cpu": [
+        "x64"
+      ],
+      "license": "MIT",
+      "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,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nolyfill/is-core-module": {
+      "version": "1.0.39",
+      "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+      "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.4.0"
+      }
+    },
+    "node_modules/@rtsao/scc": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+      "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@rushstack/eslint-patch": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz",
+      "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@swc/helpers": {
+      "version": "0.5.15",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+      "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "^2.8.0"
+      }
+    },
+    "node_modules/@tailwindcss/node": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz",
+      "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/remapping": "^2.3.4",
+        "enhanced-resolve": "^5.18.3",
+        "jiti": "^2.5.1",
+        "lightningcss": "1.30.1",
+        "magic-string": "^0.30.18",
+        "source-map-js": "^1.2.1",
+        "tailwindcss": "4.1.13"
+      }
+    },
+    "node_modules/@tailwindcss/oxide": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz",
+      "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "dependencies": {
+        "detect-libc": "^2.0.4",
+        "tar": "^7.4.3"
+      },
+      "engines": {
+        "node": ">= 10"
+      },
+      "optionalDependencies": {
+        "@tailwindcss/oxide-android-arm64": "4.1.13",
+        "@tailwindcss/oxide-darwin-arm64": "4.1.13",
+        "@tailwindcss/oxide-darwin-x64": "4.1.13",
+        "@tailwindcss/oxide-freebsd-x64": "4.1.13",
+        "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13",
+        "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13",
+        "@tailwindcss/oxide-linux-arm64-musl": "4.1.13",
+        "@tailwindcss/oxide-linux-x64-gnu": "4.1.13",
+        "@tailwindcss/oxide-linux-x64-musl": "4.1.13",
+        "@tailwindcss/oxide-wasm32-wasi": "4.1.13",
+        "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13",
+        "@tailwindcss/oxide-win32-x64-msvc": "4.1.13"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-android-arm64": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz",
+      "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-darwin-arm64": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz",
+      "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-darwin-x64": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz",
+      "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-freebsd-x64": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz",
+      "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz",
+      "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz",
+      "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz",
+      "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz",
+      "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz",
+      "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz",
+      "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==",
+      "bundleDependencies": [
+        "@napi-rs/wasm-runtime",
+        "@emnapi/core",
+        "@emnapi/runtime",
+        "@tybys/wasm-util",
+        "@emnapi/wasi-threads",
+        "tslib"
+      ],
+      "cpu": [
+        "wasm32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^1.4.5",
+        "@emnapi/runtime": "^1.4.5",
+        "@emnapi/wasi-threads": "^1.0.4",
+        "@napi-rs/wasm-runtime": "^0.2.12",
+        "@tybys/wasm-util": "^0.10.0",
+        "tslib": "^2.8.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz",
+      "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz",
+      "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@tailwindcss/postcss": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.13.tgz",
+      "integrity": "sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@alloc/quick-lru": "^5.2.0",
+        "@tailwindcss/node": "4.1.13",
+        "@tailwindcss/oxide": "4.1.13",
+        "postcss": "^8.4.41",
+        "tailwindcss": "4.1.13"
+      }
+    },
+    "node_modules/@tybys/wasm-util": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+      "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.15",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@types/node": {
+      "version": "20.19.17",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.17.tgz",
+      "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~6.21.0"
+      }
+    },
+    "node_modules/@types/react": {
+      "version": "19.1.13",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz",
+      "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@types/react-dom": {
+      "version": "19.1.9",
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz",
+      "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "@types/react": "^19.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz",
+      "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/regexpp": "^4.10.0",
+        "@typescript-eslint/scope-manager": "8.44.1",
+        "@typescript-eslint/type-utils": "8.44.1",
+        "@typescript-eslint/utils": "8.44.1",
+        "@typescript-eslint/visitor-keys": "8.44.1",
+        "graphemer": "^1.4.0",
+        "ignore": "^7.0.0",
+        "natural-compare": "^1.4.0",
+        "ts-api-utils": "^2.1.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "@typescript-eslint/parser": "^8.44.1",
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+      "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/@typescript-eslint/parser": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz",
+      "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/scope-manager": "8.44.1",
+        "@typescript-eslint/types": "8.44.1",
+        "@typescript-eslint/typescript-estree": "8.44.1",
+        "@typescript-eslint/visitor-keys": "8.44.1",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/project-service": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz",
+      "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/tsconfig-utils": "^8.44.1",
+        "@typescript-eslint/types": "^8.44.1",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz",
+      "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.44.1",
+        "@typescript-eslint/visitor-keys": "8.44.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/tsconfig-utils": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz",
+      "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/type-utils": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz",
+      "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.44.1",
+        "@typescript-eslint/typescript-estree": "8.44.1",
+        "@typescript-eslint/utils": "8.44.1",
+        "debug": "^4.3.4",
+        "ts-api-utils": "^2.1.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/types": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz",
+      "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz",
+      "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/project-service": "8.44.1",
+        "@typescript-eslint/tsconfig-utils": "8.44.1",
+        "@typescript-eslint/types": "8.44.1",
+        "@typescript-eslint/visitor-keys": "8.44.1",
+        "debug": "^4.3.4",
+        "fast-glob": "^3.3.2",
+        "is-glob": "^4.0.3",
+        "minimatch": "^9.0.4",
+        "semver": "^7.6.0",
+        "ts-api-utils": "^2.1.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.8"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@typescript-eslint/utils": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz",
+      "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.7.0",
+        "@typescript-eslint/scope-manager": "8.44.1",
+        "@typescript-eslint/types": "8.44.1",
+        "@typescript-eslint/typescript-estree": "8.44.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0",
+        "typescript": ">=4.8.4 <6.0.0"
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "8.44.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz",
+      "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/types": "8.44.1",
+        "eslint-visitor-keys": "^4.2.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
+      "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-android-arm64": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
+      "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-darwin-arm64": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
+      "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-darwin-x64": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
+      "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-freebsd-x64": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
+      "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
+      "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
+      "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
+      "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
+      "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
+      "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
+      "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
+      "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
+      "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
+      "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
+      "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
+      "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
+      "cpu": [
+        "wasm32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@napi-rs/wasm-runtime": "^0.2.11"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
+      "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
+      "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
+      "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/acorn": {
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/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,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true,
+      "license": "Python-2.0"
+    },
+    "node_modules/aria-query": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+      "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/array-buffer-byte-length": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+      "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "is-array-buffer": "^3.0.5"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array-includes": {
+      "version": "3.1.9",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+      "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.24.0",
+        "es-object-atoms": "^1.1.1",
+        "get-intrinsic": "^1.3.0",
+        "is-string": "^1.1.1",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.findlast": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+      "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.findlastindex": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+      "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.9",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "es-shim-unscopables": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.flat": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+      "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.flatmap": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+      "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.tosorted": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+      "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.3",
+        "es-errors": "^1.3.0",
+        "es-shim-unscopables": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/arraybuffer.prototype.slice": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+      "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.1",
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "is-array-buffer": "^3.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/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,
+      "license": "MIT"
+    },
+    "node_modules/async-function": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+      "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/available-typed-arrays": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "possible-typed-array-names": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/axe-core": {
+      "version": "4.10.3",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz",
+      "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/axobject-query": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+      "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "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,
+      "license": "MIT"
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001743",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz",
+      "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "CC-BY-4.0"
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/chownr": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "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==",
+      "license": "MIT"
+    },
+    "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,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "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,
+      "license": "MIT"
+    },
+    "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,
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/data-view-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+      "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-length": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+      "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/inspect-js"
+      }
+    },
+    "node_modules/data-view-byte-offset": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+      "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "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,
+      "license": "MIT"
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/define-properties": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.0.1",
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz",
+      "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==",
+      "devOptional": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "5.18.3",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
+      "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/es-abstract": {
+      "version": "1.24.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
+      "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.2",
+        "arraybuffer.prototype.slice": "^1.0.4",
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
+        "data-view-buffer": "^1.0.2",
+        "data-view-byte-length": "^1.0.2",
+        "data-view-byte-offset": "^1.0.1",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "es-set-tostringtag": "^2.1.0",
+        "es-to-primitive": "^1.3.0",
+        "function.prototype.name": "^1.1.8",
+        "get-intrinsic": "^1.3.0",
+        "get-proto": "^1.0.1",
+        "get-symbol-description": "^1.1.0",
+        "globalthis": "^1.0.4",
+        "gopd": "^1.2.0",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "internal-slot": "^1.1.0",
+        "is-array-buffer": "^3.0.5",
+        "is-callable": "^1.2.7",
+        "is-data-view": "^1.0.2",
+        "is-negative-zero": "^2.0.3",
+        "is-regex": "^1.2.1",
+        "is-set": "^2.0.3",
+        "is-shared-array-buffer": "^1.0.4",
+        "is-string": "^1.1.1",
+        "is-typed-array": "^1.1.15",
+        "is-weakref": "^1.1.1",
+        "math-intrinsics": "^1.1.0",
+        "object-inspect": "^1.13.4",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.7",
+        "own-keys": "^1.0.1",
+        "regexp.prototype.flags": "^1.5.4",
+        "safe-array-concat": "^1.1.3",
+        "safe-push-apply": "^1.0.0",
+        "safe-regex-test": "^1.1.0",
+        "set-proto": "^1.0.0",
+        "stop-iteration-iterator": "^1.1.0",
+        "string.prototype.trim": "^1.2.10",
+        "string.prototype.trimend": "^1.0.9",
+        "string.prototype.trimstart": "^1.0.8",
+        "typed-array-buffer": "^1.0.3",
+        "typed-array-byte-length": "^1.0.3",
+        "typed-array-byte-offset": "^1.0.4",
+        "typed-array-length": "^1.0.7",
+        "unbox-primitive": "^1.1.0",
+        "which-typed-array": "^1.1.19"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-iterator-helpers": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
+      "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.6",
+        "es-errors": "^1.3.0",
+        "es-set-tostringtag": "^2.0.3",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.6",
+        "globalthis": "^1.0.4",
+        "gopd": "^1.2.0",
+        "has-property-descriptors": "^1.0.2",
+        "has-proto": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "internal-slot": "^1.1.0",
+        "iterator.prototype": "^1.1.4",
+        "safe-array-concat": "^1.1.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-shim-unscopables": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+      "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-to-primitive": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+      "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-callable": "^1.2.7",
+        "is-date-object": "^1.0.5",
+        "is-symbol": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/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,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "9.36.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz",
+      "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.8.0",
+        "@eslint-community/regexpp": "^4.12.1",
+        "@eslint/config-array": "^0.21.0",
+        "@eslint/config-helpers": "^0.3.1",
+        "@eslint/core": "^0.15.2",
+        "@eslint/eslintrc": "^3.3.1",
+        "@eslint/js": "9.36.0",
+        "@eslint/plugin-kit": "^0.3.5",
+        "@humanfs/node": "^0.16.6",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@humanwhocodes/retry": "^0.4.2",
+        "@types/estree": "^1.0.6",
+        "@types/json-schema": "^7.0.15",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.6",
+        "debug": "^4.3.2",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
+        "esquery": "^1.5.0",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^8.0.0",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://eslint.org/donate"
+      },
+      "peerDependencies": {
+        "jiti": "*"
+      },
+      "peerDependenciesMeta": {
+        "jiti": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-config-next": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.4.tgz",
+      "integrity": "sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@next/eslint-plugin-next": "15.5.4",
+        "@rushstack/eslint-patch": "^1.10.3",
+        "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+        "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+        "eslint-import-resolver-node": "^0.3.6",
+        "eslint-import-resolver-typescript": "^3.5.2",
+        "eslint-plugin-import": "^2.31.0",
+        "eslint-plugin-jsx-a11y": "^6.10.0",
+        "eslint-plugin-react": "^7.37.0",
+        "eslint-plugin-react-hooks": "^5.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^7.23.0 || ^8.0.0 || ^9.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,
+      "license": "MIT",
+      "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,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-import-resolver-typescript": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz",
+      "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "@nolyfill/is-core-module": "1.0.39",
+        "debug": "^4.4.0",
+        "get-tsconfig": "^4.10.0",
+        "is-bun-module": "^2.0.0",
+        "stable-hash": "^0.0.5",
+        "tinyglobby": "^0.2.13",
+        "unrs-resolver": "^1.6.2"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint-import-resolver-typescript"
+      },
+      "peerDependencies": {
+        "eslint": "*",
+        "eslint-plugin-import": "*",
+        "eslint-plugin-import-x": "*"
+      },
+      "peerDependenciesMeta": {
+        "eslint-plugin-import": {
+          "optional": true
+        },
+        "eslint-plugin-import-x": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-module-utils": {
+      "version": "2.12.1",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+      "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
+      "dev": true,
+      "license": "MIT",
+      "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,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-plugin-import": {
+      "version": "2.32.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+      "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@rtsao/scc": "^1.1.0",
+        "array-includes": "^3.1.9",
+        "array.prototype.findlastindex": "^1.2.6",
+        "array.prototype.flat": "^1.3.3",
+        "array.prototype.flatmap": "^1.3.3",
+        "debug": "^3.2.7",
+        "doctrine": "^2.1.0",
+        "eslint-import-resolver-node": "^0.3.9",
+        "eslint-module-utils": "^2.12.1",
+        "hasown": "^2.0.2",
+        "is-core-module": "^2.16.1",
+        "is-glob": "^4.0.3",
+        "minimatch": "^3.1.2",
+        "object.fromentries": "^2.0.8",
+        "object.groupby": "^1.0.3",
+        "object.values": "^1.2.1",
+        "semver": "^6.3.1",
+        "string.prototype.trimend": "^1.0.9",
+        "tsconfig-paths": "^3.15.0"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+      }
+    },
+    "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,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "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,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/eslint-plugin-jsx-a11y": {
+      "version": "6.10.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+      "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "aria-query": "^5.3.2",
+        "array-includes": "^3.1.8",
+        "array.prototype.flatmap": "^1.3.2",
+        "ast-types-flow": "^0.0.8",
+        "axe-core": "^4.10.0",
+        "axobject-query": "^4.1.0",
+        "damerau-levenshtein": "^1.0.8",
+        "emoji-regex": "^9.2.2",
+        "hasown": "^2.0.2",
+        "jsx-ast-utils": "^3.3.5",
+        "language-tags": "^1.0.9",
+        "minimatch": "^3.1.2",
+        "object.fromentries": "^2.0.8",
+        "safe-regex-test": "^1.0.3",
+        "string.prototype.includes": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependencies": {
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+      }
+    },
+    "node_modules/eslint-plugin-react": {
+      "version": "7.37.5",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
+      "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "array-includes": "^3.1.8",
+        "array.prototype.findlast": "^1.2.5",
+        "array.prototype.flatmap": "^1.3.3",
+        "array.prototype.tosorted": "^1.1.4",
+        "doctrine": "^2.1.0",
+        "es-iterator-helpers": "^1.2.1",
+        "estraverse": "^5.3.0",
+        "hasown": "^2.0.2",
+        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+        "minimatch": "^3.1.2",
+        "object.entries": "^1.1.9",
+        "object.fromentries": "^2.0.8",
+        "object.values": "^1.2.1",
+        "prop-types": "^15.8.1",
+        "resolve": "^2.0.0-next.5",
+        "semver": "^6.3.1",
+        "string.prototype.matchall": "^4.0.12",
+        "string.prototype.repeat": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+      }
+    },
+    "node_modules/eslint-plugin-react-hooks": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+      "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-react/node_modules/resolve": {
+      "version": "2.0.0-next.5",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+      "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/eslint-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,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/espree": {
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.15.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^4.2.1"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/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,
+      "license": "MIT"
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+      "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.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,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fastq": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flat-cache": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=16.0.0"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+      "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.4"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/for-each": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+      "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-callable": "^1.2.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/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,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/function.prototype.name": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+      "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "functions-have-names": "^1.2.3",
+        "hasown": "^2.0.2",
+        "is-callable": "^1.2.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/get-symbol-description": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+      "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-tsconfig": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
+      "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "resolve-pkg-maps": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/globals": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+      "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/globalthis": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.2.1",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/has-bigints": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+      "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+      "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/ignore": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/internal-slot": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+      "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "hasown": "^2.0.2",
+        "side-channel": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-array-buffer": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+      "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "get-intrinsic": "^1.2.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-async-function": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+      "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "async-function": "^1.0.0",
+        "call-bound": "^1.0.3",
+        "get-proto": "^1.0.1",
+        "has-tostringtag": "^1.0.2",
+        "safe-regex-test": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-bigint": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+      "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "has-bigints": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-boolean-object": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+      "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-bun-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+      "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "semver": "^7.7.1"
+      }
+    },
+    "node_modules/is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.16.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+      "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-data-view": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+      "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "get-intrinsic": "^1.2.6",
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-date-object": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+      "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-finalizationregistry": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+      "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-generator-function": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
+      "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "get-proto": "^1.0.0",
+        "has-tostringtag": "^1.0.2",
+        "safe-regex-test": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-map": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+      "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-negative-zero": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-number-object": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+      "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-regex": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+      "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-set": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+      "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-shared-array-buffer": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+      "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-string": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+      "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-symbol": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+      "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "has-symbols": "^1.1.0",
+        "safe-regex-test": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-typed-array": {
+      "version": "1.1.15",
+      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+      "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "which-typed-array": "^1.1.16"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakmap": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+      "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakref": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+      "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakset": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+      "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "get-intrinsic": "^1.2.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/iterator.prototype": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
+      "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.6",
+        "get-proto": "^1.0.0",
+        "has-symbols": "^1.1.0",
+        "set-function-name": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/jiti": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.0.tgz",
+      "integrity": "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jiti": "lib/jiti-cli.mjs"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json5": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+      "dev": true,
+      "license": "MIT",
+      "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,
+      "license": "MIT",
+      "dependencies": {
+        "array-includes": "^3.1.6",
+        "array.prototype.flat": "^1.3.1",
+        "object.assign": "^4.1.4",
+        "object.values": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/language-subtag-registry": {
+      "version": "0.3.23",
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+      "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+      "dev": true,
+      "license": "CC0-1.0"
+    },
+    "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,
+      "license": "MIT",
+      "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,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/lightningcss": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
+      "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "dependencies": {
+        "detect-libc": "^2.0.3"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "lightningcss-darwin-arm64": "1.30.1",
+        "lightningcss-darwin-x64": "1.30.1",
+        "lightningcss-freebsd-x64": "1.30.1",
+        "lightningcss-linux-arm-gnueabihf": "1.30.1",
+        "lightningcss-linux-arm64-gnu": "1.30.1",
+        "lightningcss-linux-arm64-musl": "1.30.1",
+        "lightningcss-linux-x64-gnu": "1.30.1",
+        "lightningcss-linux-x64-musl": "1.30.1",
+        "lightningcss-win32-arm64-msvc": "1.30.1",
+        "lightningcss-win32-x64-msvc": "1.30.1"
+      }
+    },
+    "node_modules/lightningcss-darwin-arm64": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
+      "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-darwin-x64": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
+      "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-freebsd-x64": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
+      "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm-gnueabihf": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
+      "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm64-gnu": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
+      "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm64-musl": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
+      "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-x64-gnu": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
+      "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-x64-musl": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
+      "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-win32-arm64-msvc": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
+      "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-win32-x64-msvc": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
+      "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/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==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.19",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
+      "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.5"
+      }
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "license": "ISC",
+      "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,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/minipass": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
+    "node_modules/minizlib": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+      "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "minipass": "^7.1.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "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==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.11",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/napi-postinstall": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz",
+      "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "napi-postinstall": "lib/cli.js"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/napi-postinstall"
+      }
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/next": {
+      "version": "15.5.4",
+      "resolved": "https://registry.npmjs.org/next/-/next-15.5.4.tgz",
+      "integrity": "sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA==",
+      "license": "MIT",
+      "dependencies": {
+        "@next/env": "15.5.4",
+        "@swc/helpers": "0.5.15",
+        "caniuse-lite": "^1.0.30001579",
+        "postcss": "8.4.31",
+        "styled-jsx": "5.1.6"
+      },
+      "bin": {
+        "next": "dist/bin/next"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+      },
+      "optionalDependencies": {
+        "@next/swc-darwin-arm64": "15.5.4",
+        "@next/swc-darwin-x64": "15.5.4",
+        "@next/swc-linux-arm64-gnu": "15.5.4",
+        "@next/swc-linux-arm64-musl": "15.5.4",
+        "@next/swc-linux-x64-gnu": "15.5.4",
+        "@next/swc-linux-x64-musl": "15.5.4",
+        "@next/swc-win32-arm64-msvc": "15.5.4",
+        "@next/swc-win32-x64-msvc": "15.5.4",
+        "sharp": "^0.34.3"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.1.0",
+        "@playwright/test": "^1.51.1",
+        "babel-plugin-react-compiler": "*",
+        "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+        "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+        "sass": "^1.3.0"
+      },
+      "peerDependenciesMeta": {
+        "@opentelemetry/api": {
+          "optional": true
+        },
+        "@playwright/test": {
+          "optional": true
+        },
+        "babel-plugin-react-compiler": {
+          "optional": true
+        },
+        "sass": {
+          "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"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.6",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "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==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.4",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.7",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+      "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0",
+        "has-symbols": "^1.1.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.entries": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+      "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.fromentries": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+      "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.groupby": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+      "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.values": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+      "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0",
+        "word-wrap": "^1.2.5"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/own-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+      "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "get-intrinsic": "^1.2.6",
+        "object-keys": "^1.1.1",
+        "safe-push-apply": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/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,
+      "license": "MIT",
+      "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,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "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,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "license": "ISC"
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/possible-typed-array-names": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+      "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.5.6",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.11",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/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,
+      "license": "MIT",
+      "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==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/react": {
+      "version": "19.1.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+      "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "19.1.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+      "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+      "license": "MIT",
+      "dependencies": {
+        "scheduler": "^0.26.0"
+      },
+      "peerDependencies": {
+        "react": "^19.1.0"
+      }
+    },
+    "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,
+      "license": "MIT"
+    },
+    "node_modules/reflect.getprototypeof": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+      "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.9",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.7",
+        "get-proto": "^1.0.1",
+        "which-builtin-type": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+      "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "define-properties": "^1.2.1",
+        "es-errors": "^1.3.0",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "set-function-name": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.22.10",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+      "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-core-module": "^2.16.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-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,
+      "license": "MIT",
+      "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,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/safe-array-concat": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+      "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
+        "get-intrinsic": "^1.2.6",
+        "has-symbols": "^1.1.0",
+        "isarray": "^2.0.5"
+      },
+      "engines": {
+        "node": ">=0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safe-push-apply": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+      "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "isarray": "^2.0.5"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/safe-regex-test": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+      "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "is-regex": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/scheduler": {
+      "version": "0.26.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+      "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+      "license": "MIT"
+    },
+    "node_modules/semver": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+      "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+      "devOptional": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-function-name": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "functions-have-names": "^1.2.3",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/set-proto": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+      "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/sharp": {
+      "version": "0.34.4",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz",
+      "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==",
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "dependencies": {
+        "@img/colour": "^1.0.0",
+        "detect-libc": "^2.1.0",
+        "semver": "^7.7.2"
+      },
+      "engines": {
+        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/libvips"
+      },
+      "optionalDependencies": {
+        "@img/sharp-darwin-arm64": "0.34.4",
+        "@img/sharp-darwin-x64": "0.34.4",
+        "@img/sharp-libvips-darwin-arm64": "1.2.3",
+        "@img/sharp-libvips-darwin-x64": "1.2.3",
+        "@img/sharp-libvips-linux-arm": "1.2.3",
+        "@img/sharp-libvips-linux-arm64": "1.2.3",
+        "@img/sharp-libvips-linux-ppc64": "1.2.3",
+        "@img/sharp-libvips-linux-s390x": "1.2.3",
+        "@img/sharp-libvips-linux-x64": "1.2.3",
+        "@img/sharp-libvips-linuxmusl-arm64": "1.2.3",
+        "@img/sharp-libvips-linuxmusl-x64": "1.2.3",
+        "@img/sharp-linux-arm": "0.34.4",
+        "@img/sharp-linux-arm64": "0.34.4",
+        "@img/sharp-linux-ppc64": "0.34.4",
+        "@img/sharp-linux-s390x": "0.34.4",
+        "@img/sharp-linux-x64": "0.34.4",
+        "@img/sharp-linuxmusl-arm64": "0.34.4",
+        "@img/sharp-linuxmusl-x64": "0.34.4",
+        "@img/sharp-wasm32": "0.34.4",
+        "@img/sharp-win32-arm64": "0.34.4",
+        "@img/sharp-win32-ia32": "0.34.4",
+        "@img/sharp-win32-x64": "0.34.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,
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3",
+        "side-channel-list": "^1.0.0",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-list": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/stable-hash": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
+      "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/stop-iteration-iterator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+      "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "internal-slot": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/string.prototype.includes": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+      "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/string.prototype.matchall": {
+      "version": "4.0.12",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz",
+      "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.3",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.6",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
+        "get-intrinsic": "^1.2.6",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "internal-slot": "^1.1.0",
+        "regexp.prototype.flags": "^1.5.3",
+        "set-function-name": "^2.0.2",
+        "side-channel": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.repeat": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+      "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "node_modules/string.prototype.trim": {
+      "version": "1.2.10",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+      "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
+        "define-data-property": "^1.1.4",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.5",
+        "es-object-atoms": "^1.0.0",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimend": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+      "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.2",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimstart": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/strip-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,
+      "license": "MIT",
+      "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,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/styled-jsx": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+      "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+      "license": "MIT",
+      "dependencies": {
+        "client-only": "0.0.1"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "babel-plugin-macros": {
+          "optional": true
+        }
+      }
+    },
+    "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,
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/tailwindcss": {
+      "version": "4.1.13",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz",
+      "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/tapable": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz",
+      "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/tar": {
+      "version": "7.5.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz",
+      "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "@isaacs/fs-minipass": "^4.0.0",
+        "chownr": "^3.0.0",
+        "minipass": "^7.1.2",
+        "minizlib": "^3.1.0",
+        "yallist": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.15",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+      "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/tinyglobby/node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tinyglobby/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/ts-api-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+      "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.12"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.8.4"
+      }
+    },
+    "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,
+      "license": "MIT",
+      "dependencies": {
+        "@types/json5": "^0.0.29",
+        "json5": "^1.0.2",
+        "minimist": "^1.2.6",
+        "strip-bom": "^3.0.0"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "license": "0BSD"
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/typed-array-buffer": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+      "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "es-errors": "^1.3.0",
+        "is-typed-array": "^1.1.14"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/typed-array-byte-length": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+      "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.8",
+        "for-each": "^0.3.3",
+        "gopd": "^1.2.0",
+        "has-proto": "^1.2.0",
+        "is-typed-array": "^1.1.14"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-byte-offset": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+      "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "for-each": "^0.3.3",
+        "gopd": "^1.2.0",
+        "has-proto": "^1.2.0",
+        "is-typed-array": "^1.1.15",
+        "reflect.getprototypeof": "^1.0.9"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-length": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+      "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "for-each": "^0.3.3",
+        "gopd": "^1.0.1",
+        "is-typed-array": "^1.1.13",
+        "possible-typed-array-names": "^1.0.0",
+        "reflect.getprototypeof": "^1.0.6"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "5.9.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
+      "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/unbox-primitive": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+      "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.3",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.1.0",
+        "which-boxed-primitive": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "6.21.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/unrs-resolver": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
+      "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "dependencies": {
+        "napi-postinstall": "^0.3.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/unrs-resolver"
+      },
+      "optionalDependencies": {
+        "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
+        "@unrs/resolver-binding-android-arm64": "1.11.1",
+        "@unrs/resolver-binding-darwin-arm64": "1.11.1",
+        "@unrs/resolver-binding-darwin-x64": "1.11.1",
+        "@unrs/resolver-binding-freebsd-x64": "1.11.1",
+        "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
+        "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
+        "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
+        "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
+        "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
+        "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
+        "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
+        "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
+        "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
+        "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
+        "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
+        "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
+        "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
+        "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
+      }
+    },
+    "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,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "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,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/which-boxed-primitive": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+      "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-bigint": "^1.1.0",
+        "is-boolean-object": "^1.2.1",
+        "is-number-object": "^1.1.1",
+        "is-string": "^1.1.1",
+        "is-symbol": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-builtin-type": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+      "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "function.prototype.name": "^1.1.6",
+        "has-tostringtag": "^1.0.2",
+        "is-async-function": "^2.0.0",
+        "is-date-object": "^1.1.0",
+        "is-finalizationregistry": "^1.1.0",
+        "is-generator-function": "^1.0.10",
+        "is-regex": "^1.2.1",
+        "is-weakref": "^1.0.2",
+        "isarray": "^2.0.5",
+        "which-boxed-primitive": "^1.1.0",
+        "which-collection": "^1.0.2",
+        "which-typed-array": "^1.1.16"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-collection": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+      "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-map": "^2.0.3",
+        "is-set": "^2.0.3",
+        "is-weakmap": "^2.0.2",
+        "is-weakset": "^2.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-typed-array": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+      "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "available-typed-arrays": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
+        "for-each": "^0.3.5",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-tostringtag": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+      "dev": true,
+      "license": "BlueOak-1.0.0",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    }
+  }
+}
Index: package.json
===================================================================
--- package.json	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ package.json	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,27 @@
+{
+  "name": "iknow-remaster",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "dev": "next dev",
+    "build": "next build",
+    "start": "next start",
+    "lint": "eslint"
+  },
+  "dependencies": {
+    "react": "19.1.0",
+    "react-dom": "19.1.0",
+    "next": "15.5.4"
+  },
+  "devDependencies": {
+    "typescript": "^5",
+    "@types/node": "^20",
+    "@types/react": "^19",
+    "@types/react-dom": "^19",
+    "@tailwindcss/postcss": "^4",
+    "tailwindcss": "^4",
+    "eslint": "^9",
+    "eslint-config-next": "15.5.4",
+    "@eslint/eslintrc": "^3"
+  }
+}
Index: postcss.config.mjs
===================================================================
--- postcss.config.mjs	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ postcss.config.mjs	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,5 @@
+const config = {
+  plugins: ["@tailwindcss/postcss"],
+};
+
+export default config;
Index: public/file.svg
===================================================================
--- public/file.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ public/file.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,1 @@
+<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
Index: public/globe.svg
===================================================================
--- public/globe.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ public/globe.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,1 @@
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
Index: public/next.svg
===================================================================
--- public/next.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ public/next.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
Index: public/vercel.svg
===================================================================
--- public/vercel.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ public/vercel.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,1 @@
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
Index: public/window.svg
===================================================================
--- public/window.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ public/window.svg	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,1 @@
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
Index: nder.yaml
===================================================================
--- render.yaml	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,18 +1,0 @@
-services:
-  - type: web
-    name: iknow-api
-    env: docker
-    region: frankfurt
-    plan: free
-    dockerfilePath: ./Dockerfile
-    dockerContext: .
-    envVars:
-      - key: ASPNETCORE_ENVIRONMENT
-        value: Production
-      - key: AllowedOrigins__0
-        value: https://your-frontend-domain.com
-      - key: ConnectionStrings__DefaultConnection
-        sync: false
-      - key: Jwt__Key
-        generateValue: true
-        sync: false
Index: l/data_load.sql
===================================================================
--- sql/data_load.sql	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,164 +1,0 @@
-SET search_path TO project;
-
-TRUNCATE TABLE
-    professour_subjects,
-    dependency_subject,
-    major_subjects,
-    payment,
-    token,
-    user_documents,
-    documents,
-    passed_subjects,
-    semesters_subjects,
-    enrolled_semesters,
-    subjects,
-    active_semesters,
-    major,
-    contact,
-    high_school,
-    users
-RESTART IDENTITY CASCADE;
-
-INSERT INTO users (id, name, embg, surname, "index", bday, email, password, role, quota, enrollment_year) VALUES
-(1, 'Stefan',  '0101999450001', 'Saveski',     '233149', '1999-01-01', 'stefan.saveski@students.finki.ukim.mk',    '$2a$11$S9QIoRlV/rmkif7CKBjryuHwfLo1wTsXckX9oTduqrdyNWInCqR0S', 'student', 'drzavna',  2023),
-(2, 'Boris',   '0202999450002', 'Gjorgjievski','233188', '1999-02-02', 'boris.gjorgjievski@students.finki.ukim.mk','$2a$11$S9QIoRlV/rmkif7CKBjryuHwfLo1wTsXckX9oTduqrdyNWInCqR0S', 'student', 'privatna', 2023),
-(3, 'Ana',     '0303000450003', 'Petrova',     '233200', '2000-03-03', 'ana.petrova@students.finki.ukim.mk',       '$2a$11$S9QIoRlV/rmkif7CKBjryuHwfLo1wTsXckX9oTduqrdyNWInCqR0S', 'student', 'drzavna',  2023);
-
-INSERT INTO users (id, name, embg, surname, "index", bday, email, password, role, quota, enrollment_year) VALUES
-(4, 'Vangel',  '0404198045004', 'Ajanovski',   NULL,     '1980-04-04', 'vangel.ajanovski@finki.ukim.mk',           '$2a$11$S9QIoRlV/rmkif7CKBjryuHwfLo1wTsXckX9oTduqrdyNWInCqR0S', 'prof',    NULL, NULL),
-(5, 'Marija',  '0505198545005', 'Ilievska',    NULL,     '1985-05-05', 'marija.ilievska@finki.ukim.mk',            '$2a$11$S9QIoRlV/rmkif7CKBjryuHwfLo1wTsXckX9oTduqrdyNWInCqR0S', 'prof',    NULL, NULL);
-
-INSERT INTO users (id, name, embg, surname, "index", bday, email, password, role, quota, enrollment_year) VALUES
-(6, 'Igor',    '0606197545006', 'Adminovski',  NULL,     '1975-06-06', 'igor.adminovski@finki.ukim.mk',            '$2a$11$S9QIoRlV/rmkif7CKBjryuHwfLo1wTsXckX9oTduqrdyNWInCqR0S', 'admin',   NULL, NULL);
-
-INSERT INTO users (id, name, embg, surname, "index", bday, email, password, role, quota, enrollment_year) VALUES
-(7, 'Riste',   '0707197845007', 'Stojanov',    NULL,     '1978-07-07', 'riste.stojanov@finki.ukim.mk',             '$2a$11$S9QIoRlV/rmkif7CKBjryuHwfLo1wTsXckX9oTduqrdyNWInCqR0S', 'prof',    NULL, NULL),
-(8, 'Katerina','0808198245008', 'Zdravkova',   NULL,     '1982-08-08', 'katerina.zdravkova@finki.ukim.mk',         '$2a$11$S9QIoRlV/rmkif7CKBjryuHwfLo1wTsXckX9oTduqrdyNWInCqR0S', 'prof',    NULL, NULL);
-
-INSERT INTO high_school (id, user_id, gpa, type) VALUES
-(1, 1, 4.85, 'gimnazija'),
-(2, 2, 4.60, 'strucen'),
-(3, 3, 4.95, 'gimnazija');
-
-INSERT INTO contact (id, user_id, city, municipality, address, number, microsoft_email) VALUES
-(1, 1, 'Skopje', 'Centar', 'Bul. Partizanski Odredi 15', '070111111', 'stefan.saveski@live.finki.ukim.mk'),
-(2, 2, 'Skopje', 'Karpos', 'Ul. Ivan Milutinovic 22',    '071222222', 'boris.gjorgjievski@live.finki.ukim.mk'),
-(3, 3, 'Tetovo', 'Tetovo', 'Ul. Ilindenska 5',           '072333333', NULL);
-
-INSERT INTO major (id, name) VALUES
-(1, 'Software Engineering and Information Systems'),
-(2, 'Computer Science and Engineering');
-
-INSERT INTO active_semesters (id, year, type) VALUES
-(1, 2024, 'winter'),
-(2, 2025, 'summer'),
-(3, 2025, 'winter'),
-(4, 2026, 'summer'),
-(5, 2026, 'winter');
-
-INSERT INTO subjects (id, name, code, awarded_credits, dependency_credit) VALUES
-(1,  'Structured Programming',         'F18L1S001', 6, 0),
-(2,  'Object Oriented Programming',    'F18L1S002', 6, 6),
-(3,  'Databases',                      'F18L2S010', 6, 6),
-(4,  'Operating Systems',              'F18L2S011', 6, 0),
-(5,  'Web Programming',                'F18L3S020', 6, 12),
-(6,  'Algorithms and Data Structures', 'F18L2S012', 6, 6),
-(7,  'Computer Networks',              'F18L2S013', 6, 6),
-(8,  'Software Engineering',           'F18L3S021', 6, 12),
-(9,  'Discrete Mathematics',           'F18L1S003', 6, 0),
-(10, 'Calculus',                       'F18L1S004', 6, 0),
-(11, 'Linear Algebra',                 'F18L1S005', 6, 0),
-(12, 'Computer Architecture',          'F18L1S006', 6, 0),
-(13, 'Artificial Intelligence',        'F18L3S022', 6, 12),
-(14, 'Machine Learning',               'F18L4S030', 6, 18),
-(15, 'Information Security',           'F18L3S023', 6, 12),
-(16, 'Mobile Platforms',               'F18L3S024', 6, 12),
-(17, 'Distributed Systems',            'F18L4S031', 6, 18),
-(18, 'Human-Computer Interaction',     'F18L2S014', 6, 6),
-(19, 'Probability and Statistics',     'F18L2S015', 6, 6),
-(20, 'Compiler Design',                'F18L4S032', 6, 18);
-
-INSERT INTO enrolled_semesters (id, user_id, quota, major_id, note, student_comment, last_change, completed, semester_id) VALUES
-(1, 1, 'drzavna',  1, NULL, 'prva godina',  '2024-10-01 10:00:00', '2025-02-01 12:00:00', 1),
-(2, 1, 'drzavna',  1, NULL, NULL,           '2025-03-01 10:00:00', NULL,                  2),
-(3, 2, 'privatna', 1, NULL, NULL,           '2024-10-05 09:30:00', '2025-02-03 11:00:00', 1),
-(4, 3, 'drzavna',  2, NULL, NULL,           '2024-10-02 08:15:00', NULL,                  1);
-
-INSERT INTO semesters_subjects (id, enrolled_semesters_id, subjects_id, professor_id, signature) VALUES
-(1, 1, 1, 4, TRUE),
-(2, 1, 4, 5, TRUE),
-(3, 2, 2, 4, FALSE),
-(4, 3, 1, 4, TRUE),
-(5, 4, 1, 4, TRUE),
-(6, 4, 3, 5, FALSE);
-
-INSERT INTO passed_subjects (id, enrolled_id, grade, date_passed) VALUES
-(1, 1, '10', '2025-01-25 14:00:00'),
-(2, 2, '8',  '2025-01-30 11:30:00'),
-(3, 4, '9',  '2025-01-28 09:45:00'),
-(4, 5, '7',  '2025-01-29 13:15:00');
-
-INSERT INTO documents (id, type, body, cost) VALUES
-(1, 'Uverenie za polozeni ispiti', 'Sodrzina na uverenie za polozeni ispiti...', 100),
-(2, 'Potvrda za redoven student',  'Sodrzina na potvrda za redoven student...', 50),
-(3, 'Diploma',                     'Sodrzina na diploma...',                     500);
-
-INSERT INTO user_documents (user_id, document_id) VALUES
-(1, 1),
-(1, 2),
-(2, 2),
-(3, 1);
-
-INSERT INTO token (id, user_id, token, expires_at, is_valid) VALUES
-(1, 1, 'tok_abc123_stefan', '2026-08-01 00:00:00', TRUE),
-(2, 2, 'tok_def456_boris',  '2026-08-01 00:00:00', TRUE),
-(3, 1, 'tok_old789_stefan', '2026-01-01 00:00:00', FALSE);
-
-INSERT INTO payment (id, user_id, enrollment_id, amount) VALUES
-(1, 1, 1, 200),
-(2, 1, 2, 200),
-(3, 2, 3, 400),
-(4, 3, 4, 200);
-
-INSERT INTO major_subjects (major_id, subject_id, mandatory_semester) VALUES
-(1, 1, 1), (1, 9, 1), (1, 10, 1), (1, 11, 1), (1, 12, 1),
-(1, 2, 2), (1, 6, 2), (1, 18, 2), (1, 19, 2),
-(1, 3, 3), (1, 4, 3), (1, 7, 3),
-(1, 5, 4), (1, 8, 4), (1, 13, 4), (1, 15, 4), (1, 16, 4),
-(1, 14, 5), (1, 17, 5),
-(2, 1, 1), (2, 9, 1), (2, 10, 1), (2, 11, 1), (2, 12, 1),
-(2, 2, 2), (2, 6, 2), (2, 19, 2),
-(2, 3, 3), (2, 4, 3), (2, 7, 3), (2, 18, 3),
-(2, 5, 4), (2, 13, 4), (2, 15, 4),
-(2, 14, 5), (2, 17, 5), (2, 20, 5);
-
-INSERT INTO dependency_subject (subject_id, dependency_id) VALUES
-(2, 1),
-(5, 2),
-(3, 1);
-
-INSERT INTO professour_subjects (prof_id, active_semester_id, subject_id)
-SELECT teacher.id, sem.id, subj.id
-FROM subjects subj
-CROSS JOIN active_semesters sem
-CROSS JOIN LATERAL (
-    SELECT u.id
-    FROM users u
-    WHERE u.role = 'prof'
-    ORDER BY u.id
-    OFFSET subj.id % (SELECT count(*) FROM users WHERE role = 'prof')
-    LIMIT 1
-) AS teacher;
-
-SELECT setval(pg_get_serial_sequence('users',              'id'), (SELECT max(id) FROM users));
-SELECT setval(pg_get_serial_sequence('high_school',        'id'), (SELECT max(id) FROM high_school));
-SELECT setval(pg_get_serial_sequence('contact',            'id'), (SELECT max(id) FROM contact));
-SELECT setval(pg_get_serial_sequence('major',              'id'), (SELECT max(id) FROM major));
-SELECT setval(pg_get_serial_sequence('active_semesters',   'id'), (SELECT max(id) FROM active_semesters));
-SELECT setval(pg_get_serial_sequence('subjects',           'id'), (SELECT max(id) FROM subjects));
-SELECT setval(pg_get_serial_sequence('enrolled_semesters', 'id'), (SELECT max(id) FROM enrolled_semesters));
-SELECT setval(pg_get_serial_sequence('semesters_subjects', 'id'), (SELECT max(id) FROM semesters_subjects));
-SELECT setval(pg_get_serial_sequence('passed_subjects',    'id'), (SELECT max(id) FROM passed_subjects));
-SELECT setval(pg_get_serial_sequence('documents',          'id'), (SELECT max(id) FROM documents));
-SELECT setval(pg_get_serial_sequence('token',              'id'), (SELECT max(id) FROM token));
-SELECT setval(pg_get_serial_sequence('payment',            'id'), (SELECT max(id) FROM payment));
Index: l/iknow.dbml
===================================================================
--- sql/iknow.dbml	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,207 +1,0 @@
-// IKnow / FINKI - dbdiagram.io (DBML) source
-// Generated from schema_creation.sql, which is the source of truth.
-// Paste into https://dbdiagram.io to render the relational diagram.
-
-Enum project.user_role {
-  student
-  prof
-  admin
-}
-
-Enum project.hs_type {
-  strucen
-  gimnazija
-}
-
-Enum project.quota_type {
-  privatna
-  drzavna
-  stipendija
-}
-
-Enum project.semester_type {
-  summer
-  winter
-}
-
-Enum project.grade_type {
-  "6"
-  "7"
-  "8"
-  "9"
-  "10"
-}
-
-Table project.users {
-  id integer [pk, increment]
-  name varchar(100) [not null]
-  embg varchar(13)
-  surname varchar(100) [not null]
-  index varchar(20)
-  bday timestamp
-  email varchar(150) [not null, unique]
-  password varchar(255) [not null]
-  role project.user_role [not null]
-  quota project.quota_type
-  enrollment_year integer
-  created_at timestamp [not null, default: `now()`]
-}
-
-Table project.high_school {
-  id integer [pk, increment]
-  user_id integer [not null, unique]
-  gpa real [not null]
-  type project.hs_type [not null]
-}
-
-Table project.contact {
-  id integer [pk, increment]
-  user_id integer [not null, unique]
-  city varchar(100) [not null]
-  municipality varchar(100) [not null]
-  address varchar(150) [not null]
-  number varchar(20) [not null]
-  microsoft_email varchar(150)
-}
-
-Table project.major {
-  id integer [pk, increment]
-  name varchar(150) [not null]
-}
-
-Table project.active_semesters {
-  id integer [pk, increment]
-  year integer [not null]
-  type project.semester_type [not null]
-
-  indexes {
-    (year, type) [unique]
-  }
-}
-
-Table project.subjects {
-  id integer [pk, increment]
-  name varchar(150) [not null, unique]
-  code varchar(30) [not null, unique]
-  awarded_credits integer [not null]
-  dependency_credit integer
-}
-
-Table project.enrolled_semesters {
-  id integer [pk, increment]
-  user_id integer [not null]
-  quota project.quota_type [not null]
-  major_id integer [not null]
-  note varchar(255)
-  student_comment varchar(255)
-  created_at timestamp [not null, default: `now()`]
-  last_change timestamp
-  completed timestamp
-  semester_id integer [not null]
-
-  indexes {
-    (user_id, semester_id) [unique]
-  }
-}
-
-Table project.semesters_subjects {
-  id integer [pk, increment]
-  enrolled_semesters_id integer [not null]
-  subjects_id integer [not null]
-  professor_id integer [not null]
-  signature boolean [not null, default: false]
-
-  indexes {
-    (enrolled_semesters_id, subjects_id) [unique]
-  }
-}
-
-Table project.passed_subjects {
-  id integer [pk, increment]
-  enrolled_id integer [not null, unique]
-  grade project.grade_type [not null]
-  date_passed timestamp [not null]
-}
-
-Table project.documents {
-  id integer [pk, increment]
-  type varchar(100) [not null]
-  body text [not null]
-  cost integer [not null]
-}
-
-Table project.user_documents {
-  user_id integer [not null]
-  document_id integer [not null]
-
-  indexes {
-    (user_id, document_id) [pk]
-  }
-}
-
-Table project.token {
-  id integer [pk, increment]
-  user_id integer [not null]
-  token varchar(255) [not null]
-  expires_at timestamp [not null]
-  is_valid boolean [not null, default: true]
-}
-
-Table project.payment {
-  id integer [pk, increment]
-  user_id integer [not null]
-  enrollment_id integer [not null]
-  amount integer [not null]
-}
-
-Table project.major_subjects {
-  major_id integer [not null]
-  subject_id integer [not null]
-  mandatory_semester integer [not null]
-
-  indexes {
-    (major_id, subject_id) [pk]
-  }
-}
-
-Table project.dependency_subject {
-  subject_id integer [not null]
-  dependency_id integer [not null]
-
-  indexes {
-    (subject_id, dependency_id) [pk]
-  }
-}
-
-Table project.professour_subjects {
-  prof_id integer [not null]
-  active_semester_id integer [not null]
-  subject_id integer [not null]
-
-  indexes {
-    (prof_id, active_semester_id, subject_id) [pk]
-  }
-}
-
-// ---------- Relationships ----------
-Ref: project.high_school.user_id - project.users.id                  // has_hs (1:1)
-Ref: project.contact.user_id - project.users.id                      // has_contact (1:1)
-Ref: project.token.user_id > project.users.id                        // has_token
-Ref: project.payment.user_id > project.users.id                      // pays
-Ref: project.payment.enrollment_id > project.enrolled_semesters.id   // for_enrollment
-Ref: project.enrolled_semesters.user_id > project.users.id           // submits
-Ref: project.enrolled_semesters.major_id > project.major.id          // for_major
-Ref: project.enrolled_semesters.semester_id > project.active_semesters.id // during
-Ref: project.semesters_subjects.enrolled_semesters_id > project.enrolled_semesters.id // contains
-Ref: project.semesters_subjects.subjects_id > project.subjects.id    // taken_in
-Ref: project.semesters_subjects.professor_id > project.users.id      // teaches
-Ref: project.passed_subjects.enrolled_id - project.semesters_subjects.id // results_in (1:1)
-Ref: project.user_documents.user_id > project.users.id               // owns
-Ref: project.user_documents.document_id > project.documents.id       // owns
-Ref: project.major_subjects.major_id > project.major.id              // includes
-Ref: project.major_subjects.subject_id > project.subjects.id         // includes
-Ref: project.dependency_subject.subject_id > project.subjects.id     // requires (dependent)
-Ref: project.dependency_subject.dependency_id > project.subjects.id  // requires (prerequisite)
-Ref: project.professour_subjects.prof_id > project.users.id          // teaches_subject
-Ref: project.professour_subjects.active_semester_id > project.active_semesters.id // teaches_subject
-Ref: project.professour_subjects.subject_id > project.subjects.id    // teaches_subject
Index: l/schema.md
===================================================================
--- sql/schema.md	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,185 +1,0 @@
-# Schema diagram
-
-Generated from [`schema_creation.sql`](schema_creation.sql), which is the source of truth. If you change
-a table there, change it here too.
-
-Renders inline on GitHub and in the VS Code markdown preview (Ctrl+Shift+V) -
-no extension or tooling needed. Relationship labels use the names from the
-conceptual ER model.
-
-```mermaid
-erDiagram
-    users {
-        integer id PK
-        varchar name
-        varchar embg
-        varchar surname
-        varchar index
-        timestamp bday
-        varchar email UK
-        varchar password
-        user_role role
-        quota_type quota
-        integer enrollment_year
-        timestamp created_at
-    }
-
-    high_school {
-        integer id PK
-        integer user_id FK,UK
-        real gpa
-        hs_type type
-    }
-
-    contact {
-        integer id PK
-        integer user_id FK,UK
-        varchar city
-        varchar municipality
-        varchar address
-        varchar number
-        varchar microsoft_email
-    }
-
-    major {
-        integer id PK
-        varchar name
-    }
-
-    active_semesters {
-        integer id PK
-        integer year UK
-        semester_type type UK
-    }
-
-    subjects {
-        integer id PK
-        varchar name UK
-        varchar code UK
-        integer awarded_credits
-        integer dependency_credit
-    }
-
-    enrolled_semesters {
-        integer id PK
-        integer user_id FK,UK
-        quota_type quota
-        integer major_id FK
-        varchar note
-        varchar student_comment
-        timestamp created_at
-        timestamp last_change
-        timestamp completed
-        integer semester_id FK,UK
-    }
-
-    semesters_subjects {
-        integer id PK
-        integer enrolled_semesters_id FK,UK
-        integer subjects_id FK,UK
-        integer professor_id FK
-        boolean signature
-    }
-
-    passed_subjects {
-        integer id PK
-        integer enrolled_id FK,UK
-        grade_type grade
-        timestamp date_passed
-    }
-
-    documents {
-        integer id PK
-        varchar type
-        text body
-        integer cost
-    }
-
-    user_documents {
-        integer user_id PK,FK
-        integer document_id PK,FK
-    }
-
-    token {
-        integer id PK
-        integer user_id FK
-        varchar token
-        timestamp expires_at
-        boolean is_valid
-    }
-
-    payment {
-        integer id PK
-        integer user_id FK
-        integer enrollment_id FK
-        integer amount
-    }
-
-    major_subjects {
-        integer major_id PK,FK
-        integer subject_id PK,FK
-        integer mandatory_semester
-    }
-
-    dependency_subject {
-        integer subject_id PK,FK
-        integer dependency_id PK,FK
-    }
-
-    professour_subjects {
-        integer prof_id PK,FK
-        integer active_semester_id PK,FK
-        integer subject_id PK,FK
-    }
-
-    users               ||--o| high_school        : has_hs
-    users               ||--o| contact            : has_contact
-    users               ||--o{ token              : has_token
-    users               ||--o{ payment            : pays
-    users               ||--o{ enrolled_semesters : submits
-    users               ||--o{ user_documents     : owns
-    documents           ||--o{ user_documents     : owned_by
-    users               ||--o{ semesters_subjects : teaches
-    users               ||--o{ professour_subjects : teaches_subject
-
-    major               ||--o{ enrolled_semesters : for_major
-    active_semesters    ||--o{ enrolled_semesters : during
-    enrolled_semesters  ||--o{ semesters_subjects : contains
-    enrolled_semesters  ||--o{ payment            : for_enrollment
-
-    subjects            ||--o{ semesters_subjects : taken_in
-    semesters_subjects  ||--o| passed_subjects    : results_in
-
-    major               ||--o{ major_subjects     : includes
-    subjects            ||--o{ major_subjects     : included_in
-
-    subjects            ||--o{ dependency_subject : requires
-    subjects            ||--o{ dependency_subject : prerequisite_for
-
-    active_semesters    ||--o{ professour_subjects : taught_in
-    subjects            ||--o{ professour_subjects : taught_as
-```
-
-## Enum types
-
-| Type | Labels |
-|------|--------|
-| `user_role` | `student`, `prof`, `admin` |
-| `hs_type` | `strucen`, `gimnazija` |
-| `quota_type` | `privatna`, `drzavna`, `stipendija` |
-| `semester_type` | `summer`, `winter` |
-| `grade_type` | `6`, `7`, `8`, `9`, `10` |
-
-## Notes
-
-- `UK` on `enrolled_semesters.user_id` / `semester_id` is the composite
-  `UNIQUE (user_id, semester_id)` - one enrolment per student per semester.
-  Same for `semesters_subjects (enrolled_semesters_id, subjects_id)` and
-  `active_semesters (year, type)`.
-- `users` appears twice around `semesters_subjects`: once as the student, via
-  `enrolled_semesters.user_id`, and once as `professor_id`. The ER model links
-  the student through the enrolment, not directly.
-- `dependency_subject` is `subjects` related to itself: `subject_id` is the
-  dependent subject and `dependency_id` the prerequisite, with a `CHECK` that
-  they differ.
-- `professour_subjects` keeps the spelling used by the table in `schema_creation.sql`.
Index: l/schema_creation.sql
===================================================================
--- sql/schema_creation.sql	(revision 1b20b226a74790f84dc06dc488f4f761b510a3f2)
+++ 	(revision )
@@ -1,141 +1,0 @@
-DROP SCHEMA IF EXISTS project CASCADE;
-CREATE SCHEMA project;
-
-SET search_path TO project;
-
-CREATE TYPE user_role     AS ENUM ('student', 'prof', 'admin');
-CREATE TYPE hs_type       AS ENUM ('strucen', 'gimnazija');
-CREATE TYPE quota_type    AS ENUM ('privatna', 'drzavna', 'stipendija');
-CREATE TYPE semester_type AS ENUM ('summer', 'winter');
-CREATE TYPE grade_type    AS ENUM ('6', '7', '8', '9', '10');
-
-CREATE TABLE users (
-    id               INTEGER      GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
-    name             VARCHAR(100) NOT NULL,
-    embg             VARCHAR(13),
-    surname          VARCHAR(100) NOT NULL,
-    "index"          VARCHAR(20),
-    bday             TIMESTAMP,
-    email            VARCHAR(150) NOT NULL UNIQUE,
-    password         VARCHAR(255) NOT NULL,
-    role             user_role    NOT NULL,
-    quota            quota_type,
-    enrollment_year  INTEGER,
-    created_at       TIMESTAMP    NOT NULL DEFAULT now()
-);
-
-CREATE TABLE high_school (
-    id       INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    user_id  INTEGER NOT NULL UNIQUE REFERENCES users (id),
-    gpa      REAL    NOT NULL,
-    type     hs_type NOT NULL
-);
-
-CREATE TABLE contact (
-    id               INTEGER      PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    user_id          INTEGER      NOT NULL UNIQUE REFERENCES users (id),
-    city             VARCHAR(100) NOT NULL,
-    municipality     VARCHAR(100) NOT NULL,
-    address          VARCHAR(150) NOT NULL,
-    number           VARCHAR(20)  NOT NULL,
-    microsoft_email  VARCHAR(150)
-);
-
-CREATE TABLE major (
-    id    INTEGER      PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    name  VARCHAR(150) NOT NULL
-);
-
-CREATE TABLE active_semesters (
-    id     INTEGER       PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    year   INTEGER       NOT NULL,
-    type   semester_type NOT NULL,
-    UNIQUE (year, type)
-);
-
-CREATE TABLE subjects (
-    id                 INTEGER      PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    name               VARCHAR(150) NOT NULL UNIQUE,
-    code               VARCHAR(30)  NOT NULL UNIQUE,
-    awarded_credits    INTEGER      NOT NULL,
-    dependency_credit  INTEGER
-);
-
-CREATE TABLE enrolled_semesters (
-    id               INTEGER    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    user_id          INTEGER    NOT NULL REFERENCES users (id),
-    quota            quota_type NOT NULL,
-    major_id         INTEGER    NOT NULL REFERENCES major (id),
-    note             VARCHAR(255),
-    student_comment  VARCHAR(255),
-    created_at       TIMESTAMP  NOT NULL DEFAULT now(),
-    last_change      TIMESTAMP,
-    completed        TIMESTAMP,
-    semester_id      INTEGER    NOT NULL REFERENCES active_semesters (id),
-    UNIQUE (user_id, semester_id)
-);
-
-CREATE TABLE semesters_subjects (
-    id                     INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    enrolled_semesters_id  INTEGER NOT NULL REFERENCES enrolled_semesters (id),
-    subjects_id            INTEGER NOT NULL REFERENCES subjects (id),
-    professor_id           INTEGER NOT NULL REFERENCES users (id),
-    signature              BOOLEAN NOT NULL DEFAULT FALSE,
-    UNIQUE (enrolled_semesters_id, subjects_id)
-);
-
-CREATE TABLE passed_subjects (
-    id           INTEGER    PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    enrolled_id  INTEGER    NOT NULL UNIQUE REFERENCES semesters_subjects (id),
-    grade        grade_type NOT NULL,
-    date_passed  TIMESTAMP  NOT NULL
-);
-
-CREATE TABLE documents (
-    id     INTEGER      PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    type   VARCHAR(100) NOT NULL,
-    body   TEXT         NOT NULL,
-    cost   INTEGER      NOT NULL
-);
-
-CREATE TABLE user_documents (
-    user_id      INTEGER NOT NULL REFERENCES users (id),
-    document_id  INTEGER NOT NULL REFERENCES documents (id),
-    PRIMARY KEY (user_id, document_id)
-);
-
-CREATE TABLE token (
-    id          INTEGER      PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    user_id     INTEGER      NOT NULL REFERENCES users (id),
-    token       VARCHAR(255) NOT NULL,
-    expires_at  TIMESTAMP    NOT NULL,
-    is_valid    BOOLEAN      NOT NULL DEFAULT TRUE
-);
-
-CREATE TABLE payment (
-    id             INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
-    user_id        INTEGER NOT NULL REFERENCES users (id),
-    enrollment_id  INTEGER NOT NULL REFERENCES enrolled_semesters (id),
-    amount         INTEGER NOT NULL
-);
-
-CREATE TABLE major_subjects (
-    major_id            INTEGER NOT NULL REFERENCES major (id),
-    subject_id          INTEGER NOT NULL REFERENCES subjects (id),
-    mandatory_semester  INTEGER NOT NULL,
-    PRIMARY KEY (major_id, subject_id)
-);
-
-CREATE TABLE dependency_subject (
-    subject_id     INTEGER NOT NULL REFERENCES subjects (id),
-    dependency_id  INTEGER NOT NULL REFERENCES subjects (id),
-    PRIMARY KEY (subject_id, dependency_id),
-    CHECK (subject_id <> dependency_id)
-);
-
-CREATE TABLE professour_subjects (
-    prof_id            INTEGER NOT NULL REFERENCES users (id),
-    active_semester_id INTEGER NOT NULL REFERENCES active_semesters (id),
-    subject_id         INTEGER NOT NULL REFERENCES subjects (id),
-    PRIMARY KEY (prof_id, active_semester_id, subject_id)
-);
Index: src/app/globals.css
===================================================================
--- src/app/globals.css	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ src/app/globals.css	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,26 @@
+@import "tailwindcss";
+
+:root {
+  --background: #ffffff;
+  --foreground: #171717;
+}
+
+@theme inline {
+  --color-background: var(--background);
+  --color-foreground: var(--foreground);
+  --font-sans: var(--font-geist-sans);
+  --font-mono: var(--font-geist-mono);
+}
+
+@media (prefers-color-scheme: dark) {
+  :root {
+    --background: #0a0a0a;
+    --foreground: #ededed;
+  }
+}
+
+body {
+  background: var(--background);
+  color: var(--foreground);
+  font-family: Arial, Helvetica, sans-serif;
+}
Index: src/app/layout.tsx
===================================================================
--- src/app/layout.tsx	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ src/app/layout.tsx	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,34 @@
+import type { Metadata } from "next";
+import { Geist, Geist_Mono } from "next/font/google";
+import "./globals.css";
+
+const geistSans = Geist({
+  variable: "--font-geist-sans",
+  subsets: ["latin"],
+});
+
+const geistMono = Geist_Mono({
+  variable: "--font-geist-mono",
+  subsets: ["latin"],
+});
+
+export const metadata: Metadata = {
+  title: "Create Next App",
+  description: "Generated by create next app",
+};
+
+export default function RootLayout({
+  children,
+}: Readonly<{
+  children: React.ReactNode;
+}>) {
+  return (
+    <html lang="en">
+      <body
+        className={`${geistSans.variable} ${geistMono.variable} antialiased`}
+      >
+        {children}
+      </body>
+    </html>
+  );
+}
Index: src/app/page.tsx
===================================================================
--- src/app/page.tsx	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ src/app/page.tsx	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,103 @@
+import Image from "next/image";
+
+export default function Home() {
+  return (
+    <div className="font-sans grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20">
+      <main className="flex flex-col gap-[32px] row-start-2 items-center sm:items-start">
+        <Image
+          className="dark:invert"
+          src="/next.svg"
+          alt="Next.js logo"
+          width={180}
+          height={38}
+          priority
+        />
+        <ol className="font-mono list-inside list-decimal text-sm/6 text-center sm:text-left">
+          <li className="mb-2 tracking-[-.01em]">
+            Get started by editing{" "}
+            <code className="bg-black/[.05] dark:bg-white/[.06] font-mono font-semibold px-1 py-0.5 rounded">
+              src/app/page.tsx
+            </code>
+            .
+          </li>
+          <li className="tracking-[-.01em]">
+            Save and see your changes instantly.
+          </li>
+        </ol>
+
+        <div className="flex gap-4 items-center flex-col sm:flex-row">
+          <a
+            className="rounded-full border border-solid border-transparent transition-colors flex items-center justify-center bg-foreground text-background gap-2 hover:bg-[#383838] dark:hover:bg-[#ccc] font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 sm:w-auto"
+            href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
+            target="_blank"
+            rel="noopener noreferrer"
+          >
+            <Image
+              className="dark:invert"
+              src="/vercel.svg"
+              alt="Vercel logomark"
+              width={20}
+              height={20}
+            />
+            Deploy now
+          </a>
+          <a
+            className="rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 w-full sm:w-auto md:w-[158px]"
+            href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
+            target="_blank"
+            rel="noopener noreferrer"
+          >
+            Read our docs
+          </a>
+        </div>
+      </main>
+      <footer className="row-start-3 flex gap-[24px] flex-wrap items-center justify-center">
+        <a
+          className="flex items-center gap-2 hover:underline hover:underline-offset-4"
+          href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
+          target="_blank"
+          rel="noopener noreferrer"
+        >
+          <Image
+            aria-hidden
+            src="/file.svg"
+            alt="File icon"
+            width={16}
+            height={16}
+          />
+          Learn
+        </a>
+        <a
+          className="flex items-center gap-2 hover:underline hover:underline-offset-4"
+          href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
+          target="_blank"
+          rel="noopener noreferrer"
+        >
+          <Image
+            aria-hidden
+            src="/window.svg"
+            alt="Window icon"
+            width={16}
+            height={16}
+          />
+          Examples
+        </a>
+        <a
+          className="flex items-center gap-2 hover:underline hover:underline-offset-4"
+          href="https://nextjs.org?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
+          target="_blank"
+          rel="noopener noreferrer"
+        >
+          <Image
+            aria-hidden
+            src="/globe.svg"
+            alt="Globe icon"
+            width={16}
+            height={16}
+          />
+          Go to nextjs.org →
+        </a>
+      </footer>
+    </div>
+  );
+}
Index: tsconfig.json
===================================================================
--- tsconfig.json	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
+++ tsconfig.json	(revision 65f7b64a4488d0ab35cde03686d8f46e2980d28e)
@@ -0,0 +1,27 @@
+{
+  "compilerOptions": {
+    "target": "ES2017",
+    "lib": ["dom", "dom.iterable", "esnext"],
+    "allowJs": true,
+    "skipLibCheck": true,
+    "strict": true,
+    "noEmit": true,
+    "esModuleInterop": true,
+    "module": "esnext",
+    "moduleResolution": "bundler",
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "jsx": "preserve",
+    "incremental": true,
+    "plugins": [
+      {
+        "name": "next"
+      }
+    ],
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  },
+  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+  "exclude": ["node_modules"]
+}
