From e6b492a3356d1b0805542c3cef66ee190100062a Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:15:57 -0500 Subject: [PATCH 01/14] Add schedule data model and migration --- .../migration.sql | 53 + prisma/schema.prisma | 49 +- src/lib/generated/prisma/browser.ts | 15 + src/lib/generated/prisma/client.ts | 15 + src/lib/generated/prisma/internal/class.ts | 38 +- .../prisma/internal/prismaNamespace.ts | 265 ++- .../prisma/internal/prismaNamespaceBrowser.ts | 38 +- src/lib/generated/prisma/models.ts | 3 + src/lib/generated/prisma/models/Block.ts | 1571 +++++++++++++++++ .../prisma/models/BlockProclamations.ts | 1515 ++++++++++++++++ .../generated/prisma/models/Proclamation.ts | 130 ++ src/lib/generated/prisma/models/Schedule.ts | 1396 +++++++++++++++ src/lib/generated/prisma/models/User.ts | 148 ++ 13 files changed, 5228 insertions(+), 8 deletions(-) create mode 100644 prisma/migrations/20260911223043_add_schedule_blocks/migration.sql create mode 100644 src/lib/generated/prisma/models/Block.ts create mode 100644 src/lib/generated/prisma/models/BlockProclamations.ts create mode 100644 src/lib/generated/prisma/models/Schedule.ts diff --git a/prisma/migrations/20260911223043_add_schedule_blocks/migration.sql b/prisma/migrations/20260911223043_add_schedule_blocks/migration.sql new file mode 100644 index 0000000..31a09e4 --- /dev/null +++ b/prisma/migrations/20260911223043_add_schedule_blocks/migration.sql @@ -0,0 +1,53 @@ +-- CreateTable +CREATE TABLE "Schedule" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Schedule_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Block" ( + "id" TEXT NOT NULL, + "scheduleId" TEXT NOT NULL, + "startMinutes" INTEGER NOT NULL, + "endMinutes" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Block_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BlockProclamations" ( + "blockId" TEXT NOT NULL, + "proclamationId" TEXT NOT NULL, + "sortOrder" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "BlockProclamations_pkey" PRIMARY KEY ("blockId","proclamationId") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Schedule_userId_key" ON "Schedule"("userId"); + +-- CreateIndex +CREATE INDEX "Block_scheduleId_idx" ON "Block"("scheduleId"); + +-- CreateIndex +CREATE INDEX "BlockProclamations_proclamationId_idx" ON "BlockProclamations"("proclamationId"); + +-- AddForeignKey +ALTER TABLE "Schedule" ADD CONSTRAINT "Schedule_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Block" ADD CONSTRAINT "Block_scheduleId_fkey" FOREIGN KEY ("scheduleId") REFERENCES "Schedule"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BlockProclamations" ADD CONSTRAINT "BlockProclamations_blockId_fkey" FOREIGN KEY ("blockId") REFERENCES "Block"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BlockProclamations" ADD CONSTRAINT "BlockProclamations_proclamationId_fkey" FOREIGN KEY ("proclamationId") REFERENCES "Proclamation"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4c873ee..7563bd1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -28,6 +28,7 @@ model User { profiles Profile[] licenseKeys LicenseKey[] userProclamations UserProclamations[] + schedule Schedule? @@unique([email]) @@map("user") @@ -130,6 +131,7 @@ model Proclamation { groupId Int group ProclamationGroup @relation(fields: [groupId], references: [id]) userProclamations UserProclamations[] + blockProclamations BlockProclamations[] // Legacy subscription-level FK. Retained in the database but unmanaged; the // FK constraint is dropped and the value is left NULL. Hidden from the client. subscriptionLevelId Int? @ignore @@ -186,7 +188,7 @@ model ProclamationCategoryLegacy { // `@@ignore` so Prisma remains aware of the table but it is excluded from the // generated client and Prisma's own migrations. model ProclamationCategorySubscriptionLevelLegacy { - categoryId Int + categoryId Int subscriptionLevelId Int @@id([categoryId, subscriptionLevelId]) @@ -253,3 +255,48 @@ model AuditLog { @@index([page]) @@map("AuditLog") } + +// A user's daily listening schedule. Exactly one per user (enforced by the +// unique userId); contains 0-4 time Blocks. Times are wall-clock minutes from +// midnight (0-1440), interpreted by the kiosk in the user's configured +// timezone. The portal never stores a timezone. +model Schedule { + id String @id @default(uuid()) + userId String @unique + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + blocks Block[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +// A single non-overlapping time range within a Schedule, plus the ordered set +// of selected Proclamations to play during it. Overnight ranges are disallowed +// in v1, so startMinutes is always less than endMinutes. +model Block { + id String @id @default(uuid()) + scheduleId String + schedule Schedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade) + startMinutes Int + endMinutes Int + proclamations BlockProclamations[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([scheduleId]) +} + +// Join table: the Proclamations selected for a Block. Carries the Proclamation +// content for playback via the API; the portal UI only ever reads +// title/category/group. +model BlockProclamations { + blockId String + block Block @relation(fields: [blockId], references: [id], onDelete: Cascade) + proclamationId String + proclamation Proclamation @relation(fields: [proclamationId], references: [id]) + sortOrder Int @default(0) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@id([blockId, proclamationId]) + @@index([proclamationId]) +} diff --git a/src/lib/generated/prisma/browser.ts b/src/lib/generated/prisma/browser.ts index be9621c..fbb4d44 100644 --- a/src/lib/generated/prisma/browser.ts +++ b/src/lib/generated/prisma/browser.ts @@ -97,3 +97,18 @@ export type ColorPalette = Prisma.ColorPaletteModel * */ export type AuditLog = Prisma.AuditLogModel +/** + * Model Schedule + * + */ +export type Schedule = Prisma.ScheduleModel +/** + * Model Block + * + */ +export type Block = Prisma.BlockModel +/** + * Model BlockProclamations + * + */ +export type BlockProclamations = Prisma.BlockProclamationsModel diff --git a/src/lib/generated/prisma/client.ts b/src/lib/generated/prisma/client.ts index 6a41eca..a666863 100644 --- a/src/lib/generated/prisma/client.ts +++ b/src/lib/generated/prisma/client.ts @@ -121,3 +121,18 @@ export type ColorPalette = Prisma.ColorPaletteModel * */ export type AuditLog = Prisma.AuditLogModel +/** + * Model Schedule + * + */ +export type Schedule = Prisma.ScheduleModel +/** + * Model Block + * + */ +export type Block = Prisma.BlockModel +/** + * Model BlockProclamations + * + */ +export type BlockProclamations = Prisma.BlockProclamationsModel diff --git a/src/lib/generated/prisma/internal/class.ts b/src/lib/generated/prisma/internal/class.ts index 5c3e1ef..ee186df 100644 --- a/src/lib/generated/prisma/internal/class.ts +++ b/src/lib/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/lib/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n roleId Int? @default(4) // New users default to \"User\"\n role UserRole? @relation(fields: [roleId], references: [id])\n sessions Session[]\n accounts Account[]\n profiles Profile[]\n licenseKeys LicenseKey[]\n userProclamations UserProclamations[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\n// I chose to create a Profile table here because honestly, I didn't want to waste\n// a bunch of time trying to figure out how to customize the default Better-Auth model. \nmodel Profile {\n id String @id @default(uuid())\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n email String?\n firstName String\n lastName String\n phoneNumber String\n ghlContactId String? @map(\"ghl_contact_id\")\n addresses Address[]\n\n @@index([userId])\n @@index([email])\n}\n\nmodel Address {\n id String @id @default(uuid())\n profileId String\n profile Profile @relation(fields: [profileId], references: [id], onDelete: Cascade)\n street String\n city String\n state String\n postalCode String\n country String\n type String @default(\"Mailing\")\n isDefaultMailing Boolean @default(false)\n isDefaultBilling Boolean @default(false)\n isDefaultShipping Boolean @default(false)\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel UserRole {\n id Int @id @default(autoincrement())\n name String\n users User[]\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Proclamation {\n id String @id @default(uuid())\n name String @unique\n content String\n solfeggioFrequencyId Int\n solfeggioFrequency SolfeggioFrequency @relation(fields: [solfeggioFrequencyId], references: [id])\n categoryId Int\n category ProclamationCategory @relation(fields: [categoryId], references: [id])\n groupId Int\n group ProclamationGroup @relation(fields: [groupId], references: [id])\n userProclamations UserProclamations[]\n // Legacy subscription-level FK. Retained in the database but unmanaged; the\n // FK constraint is dropped and the value is left NULL. Hidden from the client.\n subscriptionLevelId Int? @ignore\n}\n\nmodel ProclamationGroup {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\nmodel UserProclamations {\n userId String\n user User @relation(fields: [userId], references: [id])\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([userId, proclamationId])\n}\n\nmodel SolfeggioFrequency {\n id Int @id @default(autoincrement())\n name String @unique\n value Int @unique\n proclamations Proclamation[]\n}\n\nmodel ProclamationCategory {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\n// Archive of the former child sub-categories removed when the\n// ProclamationCategory hierarchy was flattened. Kept for recovery/audit.\n// `@@ignore` keeps it out of the generated client while Prisma remains aware\n// of the table so `migrate dev` does not report it as an untracked table.\nmodel ProclamationCategoryLegacy {\n id Int @id\n name String\n parentId Int?\n sortOrder Int @default(0)\n\n @@map(\"ProclamationCategoryLegacy\")\n @@ignore\n}\n\n// Archive of the category->subscription-level mappings for the child\n// categories removed when the category hierarchy was flattened. Kept with\n// `@@ignore` so Prisma remains aware of the table but it is excluded from the\n// generated client and Prisma's own migrations.\nmodel ProclamationCategorySubscriptionLevelLegacy {\n categoryId Int\n subscriptionLevelId Int\n\n @@id([categoryId, subscriptionLevelId])\n @@map(\"ProclamationCategorySubscriptionLevelLegacy\")\n @@ignore\n}\n\nmodel LicenseKey {\n id String @id @default(uuid())\n key String @unique\n active Boolean\n createdAt DateTime @default(now())\n lastValidatedAt DateTime?\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n email String?\n // Legacy subscription level. Retained in the database but unmanaged; hidden\n // from the client and left NULL.\n level String? @ignore\n\n @@index([userId])\n @@index([email])\n}\n\nmodel ApiKey {\n id String @id @default(cuid())\n keyPrefix String\n keyHash String @unique\n createdAt DateTime @default(now())\n expiresAt DateTime?\n revokedAt DateTime?\n}\n\n// Portal-editable 7-color palette per canonical solfeggio frequency id (1-9).\n// `solfeggioFrequencyId` is the canonical id the kiosk uses (see\n// v2-serializers.ts), not the DB autoincrement id of `SolfeggioFrequency`.\nmodel ColorPalette {\n solfeggioFrequencyId Int @id\n colors Json // [\"#RRGGBB\", ... x7]\n\n @@map(\"ColorPalette\")\n}\n\n// Append-only audit trail of database mutations. Written centrally by the\n// Prisma extension in src/lib/db.ts; read by the admin Audit Log page.\nmodel AuditLog {\n id String @id @default(uuid())\n createdAt DateTime @default(now())\n userId String?\n email String?\n roleId Int?\n roleName String?\n page String\n action String\n entity String?\n entityId String?\n before Json?\n after Json?\n ip String?\n\n @@index([createdAt])\n @@index([roleId])\n @@index([action])\n @@index([page])\n @@map(\"AuditLog\")\n}\n", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/lib/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n roleId Int? @default(4) // New users default to \"User\"\n role UserRole? @relation(fields: [roleId], references: [id])\n sessions Session[]\n accounts Account[]\n profiles Profile[]\n licenseKeys LicenseKey[]\n userProclamations UserProclamations[]\n schedule Schedule?\n\n @@unique([email])\n @@map(\"user\")\n}\n\n// I chose to create a Profile table here because honestly, I didn't want to waste\n// a bunch of time trying to figure out how to customize the default Better-Auth model. \nmodel Profile {\n id String @id @default(uuid())\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n email String?\n firstName String\n lastName String\n phoneNumber String\n ghlContactId String? @map(\"ghl_contact_id\")\n addresses Address[]\n\n @@index([userId])\n @@index([email])\n}\n\nmodel Address {\n id String @id @default(uuid())\n profileId String\n profile Profile @relation(fields: [profileId], references: [id], onDelete: Cascade)\n street String\n city String\n state String\n postalCode String\n country String\n type String @default(\"Mailing\")\n isDefaultMailing Boolean @default(false)\n isDefaultBilling Boolean @default(false)\n isDefaultShipping Boolean @default(false)\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel UserRole {\n id Int @id @default(autoincrement())\n name String\n users User[]\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Proclamation {\n id String @id @default(uuid())\n name String @unique\n content String\n solfeggioFrequencyId Int\n solfeggioFrequency SolfeggioFrequency @relation(fields: [solfeggioFrequencyId], references: [id])\n categoryId Int\n category ProclamationCategory @relation(fields: [categoryId], references: [id])\n groupId Int\n group ProclamationGroup @relation(fields: [groupId], references: [id])\n userProclamations UserProclamations[]\n blockProclamations BlockProclamations[]\n // Legacy subscription-level FK. Retained in the database but unmanaged; the\n // FK constraint is dropped and the value is left NULL. Hidden from the client.\n subscriptionLevelId Int? @ignore\n}\n\nmodel ProclamationGroup {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\nmodel UserProclamations {\n userId String\n user User @relation(fields: [userId], references: [id])\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([userId, proclamationId])\n}\n\nmodel SolfeggioFrequency {\n id Int @id @default(autoincrement())\n name String @unique\n value Int @unique\n proclamations Proclamation[]\n}\n\nmodel ProclamationCategory {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\n// Archive of the former child sub-categories removed when the\n// ProclamationCategory hierarchy was flattened. Kept for recovery/audit.\n// `@@ignore` keeps it out of the generated client while Prisma remains aware\n// of the table so `migrate dev` does not report it as an untracked table.\nmodel ProclamationCategoryLegacy {\n id Int @id\n name String\n parentId Int?\n sortOrder Int @default(0)\n\n @@map(\"ProclamationCategoryLegacy\")\n @@ignore\n}\n\n// Archive of the category->subscription-level mappings for the child\n// categories removed when the category hierarchy was flattened. Kept with\n// `@@ignore` so Prisma remains aware of the table but it is excluded from the\n// generated client and Prisma's own migrations.\nmodel ProclamationCategorySubscriptionLevelLegacy {\n categoryId Int\n subscriptionLevelId Int\n\n @@id([categoryId, subscriptionLevelId])\n @@map(\"ProclamationCategorySubscriptionLevelLegacy\")\n @@ignore\n}\n\nmodel LicenseKey {\n id String @id @default(uuid())\n key String @unique\n active Boolean\n createdAt DateTime @default(now())\n lastValidatedAt DateTime?\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n email String?\n // Legacy subscription level. Retained in the database but unmanaged; hidden\n // from the client and left NULL.\n level String? @ignore\n\n @@index([userId])\n @@index([email])\n}\n\nmodel ApiKey {\n id String @id @default(cuid())\n keyPrefix String\n keyHash String @unique\n createdAt DateTime @default(now())\n expiresAt DateTime?\n revokedAt DateTime?\n}\n\n// Portal-editable 7-color palette per canonical solfeggio frequency id (1-9).\n// `solfeggioFrequencyId` is the canonical id the kiosk uses (see\n// v2-serializers.ts), not the DB autoincrement id of `SolfeggioFrequency`.\nmodel ColorPalette {\n solfeggioFrequencyId Int @id\n colors Json // [\"#RRGGBB\", ... x7]\n\n @@map(\"ColorPalette\")\n}\n\n// Append-only audit trail of database mutations. Written centrally by the\n// Prisma extension in src/lib/db.ts; read by the admin Audit Log page.\nmodel AuditLog {\n id String @id @default(uuid())\n createdAt DateTime @default(now())\n userId String?\n email String?\n roleId Int?\n roleName String?\n page String\n action String\n entity String?\n entityId String?\n before Json?\n after Json?\n ip String?\n\n @@index([createdAt])\n @@index([roleId])\n @@index([action])\n @@index([page])\n @@map(\"AuditLog\")\n}\n\n// A user's daily listening schedule. Exactly one per user (enforced by the\n// unique userId); contains 0-4 time Blocks. Times are wall-clock minutes from\n// midnight (0-1440), interpreted by the kiosk in the user's configured\n// timezone. The portal never stores a timezone.\nmodel Schedule {\n id String @id @default(uuid())\n userId String @unique\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n blocks Block[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// A single non-overlapping time range within a Schedule, plus the ordered set\n// of selected Proclamations to play during it. Overnight ranges are disallowed\n// in v1, so startMinutes is always less than endMinutes.\nmodel Block {\n id String @id @default(uuid())\n scheduleId String\n schedule Schedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade)\n startMinutes Int\n endMinutes Int\n proclamations BlockProclamations[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([scheduleId])\n}\n\n// Join table: the Proclamations selected for a Block. Carries the Proclamation\n// content for playback via the API; the portal UI only ever reads\n// title/category/group.\nmodel BlockProclamations {\n blockId String\n block Block @relation(fields: [blockId], references: [id], onDelete: Cascade)\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([blockId, proclamationId])\n @@index([proclamationId])\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"object\",\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"profiles\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"ProfileToUser\"},{\"name\":\"licenseKeys\",\"kind\":\"object\",\"type\":\"LicenseKey\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"UserToUserProclamations\"}],\"dbName\":\"user\"},\"Profile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProfileToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ghlContactId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"ghl_contact_id\"},{\"name\":\"addresses\",\"kind\":\"object\",\"type\":\"Address\",\"relationName\":\"AddressToProfile\"}],\"dbName\":null},\"Address\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profile\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"AddressToProfile\"},{\"name\":\"street\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDefaultMailing\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultBilling\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultShipping\",\"kind\":\"scalar\",\"type\":\"Boolean\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"session\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"account\"},\"UserRole\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserRole\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Proclamation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"solfeggioFrequency\",\"kind\":\"object\",\"type\":\"SolfeggioFrequency\",\"relationName\":\"ProclamationToSolfeggioFrequency\"},{\"name\":\"categoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"category\",\"kind\":\"object\",\"type\":\"ProclamationCategory\",\"relationName\":\"ProclamationToProclamationCategory\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"ProclamationGroup\",\"relationName\":\"ProclamationToProclamationGroup\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"ProclamationToUserProclamations\"}],\"dbName\":null},\"ProclamationGroup\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationGroup\"}],\"dbName\":null},\"UserProclamations\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SolfeggioFrequency\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToSolfeggioFrequency\"}],\"dbName\":null},\"ProclamationCategory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationCategory\"}],\"dbName\":null},\"LicenseKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"active\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastValidatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyPrefix\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ColorPalette\":{\"fields\":[{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":\"ColorPalette\"},\"AuditLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"page\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"action\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entity\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entityId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"before\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"after\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"ip\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"AuditLog\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"object\",\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"profiles\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"ProfileToUser\"},{\"name\":\"licenseKeys\",\"kind\":\"object\",\"type\":\"LicenseKey\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"schedule\",\"kind\":\"object\",\"type\":\"Schedule\",\"relationName\":\"ScheduleToUser\"}],\"dbName\":\"user\"},\"Profile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProfileToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ghlContactId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"ghl_contact_id\"},{\"name\":\"addresses\",\"kind\":\"object\",\"type\":\"Address\",\"relationName\":\"AddressToProfile\"}],\"dbName\":null},\"Address\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profile\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"AddressToProfile\"},{\"name\":\"street\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDefaultMailing\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultBilling\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultShipping\",\"kind\":\"scalar\",\"type\":\"Boolean\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"session\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"account\"},\"UserRole\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserRole\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Proclamation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"solfeggioFrequency\",\"kind\":\"object\",\"type\":\"SolfeggioFrequency\",\"relationName\":\"ProclamationToSolfeggioFrequency\"},{\"name\":\"categoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"category\",\"kind\":\"object\",\"type\":\"ProclamationCategory\",\"relationName\":\"ProclamationToProclamationCategory\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"ProclamationGroup\",\"relationName\":\"ProclamationToProclamationGroup\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"blockProclamations\",\"kind\":\"object\",\"type\":\"BlockProclamations\",\"relationName\":\"BlockProclamationsToProclamation\"}],\"dbName\":null},\"ProclamationGroup\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationGroup\"}],\"dbName\":null},\"UserProclamations\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SolfeggioFrequency\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToSolfeggioFrequency\"}],\"dbName\":null},\"ProclamationCategory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationCategory\"}],\"dbName\":null},\"LicenseKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"active\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastValidatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyPrefix\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ColorPalette\":{\"fields\":[{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":\"ColorPalette\"},\"AuditLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"page\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"action\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entity\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entityId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"before\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"after\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"ip\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"AuditLog\"},\"Schedule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ScheduleToUser\"},{\"name\":\"blocks\",\"kind\":\"object\",\"type\":\"Block\",\"relationName\":\"BlockToSchedule\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Block\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scheduleId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"schedule\",\"kind\":\"object\",\"type\":\"Schedule\",\"relationName\":\"BlockToSchedule\"},{\"name\":\"startMinutes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"endMinutes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"BlockProclamations\",\"relationName\":\"BlockToBlockProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"BlockProclamations\":{\"fields\":[{\"name\":\"blockId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"block\",\"kind\":\"object\",\"type\":\"Block\",\"relationName\":\"BlockToBlockProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"BlockProclamationsToProclamation\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"users\",\"_count\",\"role\",\"user\",\"sessions\",\"accounts\",\"profile\",\"addresses\",\"profiles\",\"licenseKeys\",\"proclamations\",\"solfeggioFrequency\",\"category\",\"group\",\"userProclamations\",\"proclamation\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Profile.findUnique\",\"Profile.findUniqueOrThrow\",\"Profile.findFirst\",\"Profile.findFirstOrThrow\",\"Profile.findMany\",\"Profile.createOne\",\"Profile.createMany\",\"Profile.createManyAndReturn\",\"Profile.updateOne\",\"Profile.updateMany\",\"Profile.updateManyAndReturn\",\"Profile.upsertOne\",\"Profile.deleteOne\",\"Profile.deleteMany\",\"Profile.groupBy\",\"Profile.aggregate\",\"Address.findUnique\",\"Address.findUniqueOrThrow\",\"Address.findFirst\",\"Address.findFirstOrThrow\",\"Address.findMany\",\"Address.createOne\",\"Address.createMany\",\"Address.createManyAndReturn\",\"Address.updateOne\",\"Address.updateMany\",\"Address.updateManyAndReturn\",\"Address.upsertOne\",\"Address.deleteOne\",\"Address.deleteMany\",\"Address.groupBy\",\"Address.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"UserRole.findUnique\",\"UserRole.findUniqueOrThrow\",\"UserRole.findFirst\",\"UserRole.findFirstOrThrow\",\"UserRole.findMany\",\"UserRole.createOne\",\"UserRole.createMany\",\"UserRole.createManyAndReturn\",\"UserRole.updateOne\",\"UserRole.updateMany\",\"UserRole.updateManyAndReturn\",\"UserRole.upsertOne\",\"UserRole.deleteOne\",\"UserRole.deleteMany\",\"UserRole.groupBy\",\"UserRole.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Proclamation.findUnique\",\"Proclamation.findUniqueOrThrow\",\"Proclamation.findFirst\",\"Proclamation.findFirstOrThrow\",\"Proclamation.findMany\",\"Proclamation.createOne\",\"Proclamation.createMany\",\"Proclamation.createManyAndReturn\",\"Proclamation.updateOne\",\"Proclamation.updateMany\",\"Proclamation.updateManyAndReturn\",\"Proclamation.upsertOne\",\"Proclamation.deleteOne\",\"Proclamation.deleteMany\",\"Proclamation.groupBy\",\"Proclamation.aggregate\",\"ProclamationGroup.findUnique\",\"ProclamationGroup.findUniqueOrThrow\",\"ProclamationGroup.findFirst\",\"ProclamationGroup.findFirstOrThrow\",\"ProclamationGroup.findMany\",\"ProclamationGroup.createOne\",\"ProclamationGroup.createMany\",\"ProclamationGroup.createManyAndReturn\",\"ProclamationGroup.updateOne\",\"ProclamationGroup.updateMany\",\"ProclamationGroup.updateManyAndReturn\",\"ProclamationGroup.upsertOne\",\"ProclamationGroup.deleteOne\",\"ProclamationGroup.deleteMany\",\"ProclamationGroup.groupBy\",\"ProclamationGroup.aggregate\",\"UserProclamations.findUnique\",\"UserProclamations.findUniqueOrThrow\",\"UserProclamations.findFirst\",\"UserProclamations.findFirstOrThrow\",\"UserProclamations.findMany\",\"UserProclamations.createOne\",\"UserProclamations.createMany\",\"UserProclamations.createManyAndReturn\",\"UserProclamations.updateOne\",\"UserProclamations.updateMany\",\"UserProclamations.updateManyAndReturn\",\"UserProclamations.upsertOne\",\"UserProclamations.deleteOne\",\"UserProclamations.deleteMany\",\"UserProclamations.groupBy\",\"UserProclamations.aggregate\",\"SolfeggioFrequency.findUnique\",\"SolfeggioFrequency.findUniqueOrThrow\",\"SolfeggioFrequency.findFirst\",\"SolfeggioFrequency.findFirstOrThrow\",\"SolfeggioFrequency.findMany\",\"SolfeggioFrequency.createOne\",\"SolfeggioFrequency.createMany\",\"SolfeggioFrequency.createManyAndReturn\",\"SolfeggioFrequency.updateOne\",\"SolfeggioFrequency.updateMany\",\"SolfeggioFrequency.updateManyAndReturn\",\"SolfeggioFrequency.upsertOne\",\"SolfeggioFrequency.deleteOne\",\"SolfeggioFrequency.deleteMany\",\"SolfeggioFrequency.groupBy\",\"SolfeggioFrequency.aggregate\",\"ProclamationCategory.findUnique\",\"ProclamationCategory.findUniqueOrThrow\",\"ProclamationCategory.findFirst\",\"ProclamationCategory.findFirstOrThrow\",\"ProclamationCategory.findMany\",\"ProclamationCategory.createOne\",\"ProclamationCategory.createMany\",\"ProclamationCategory.createManyAndReturn\",\"ProclamationCategory.updateOne\",\"ProclamationCategory.updateMany\",\"ProclamationCategory.updateManyAndReturn\",\"ProclamationCategory.upsertOne\",\"ProclamationCategory.deleteOne\",\"ProclamationCategory.deleteMany\",\"ProclamationCategory.groupBy\",\"ProclamationCategory.aggregate\",\"LicenseKey.findUnique\",\"LicenseKey.findUniqueOrThrow\",\"LicenseKey.findFirst\",\"LicenseKey.findFirstOrThrow\",\"LicenseKey.findMany\",\"LicenseKey.createOne\",\"LicenseKey.createMany\",\"LicenseKey.createManyAndReturn\",\"LicenseKey.updateOne\",\"LicenseKey.updateMany\",\"LicenseKey.updateManyAndReturn\",\"LicenseKey.upsertOne\",\"LicenseKey.deleteOne\",\"LicenseKey.deleteMany\",\"LicenseKey.groupBy\",\"LicenseKey.aggregate\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"ColorPalette.findUnique\",\"ColorPalette.findUniqueOrThrow\",\"ColorPalette.findFirst\",\"ColorPalette.findFirstOrThrow\",\"ColorPalette.findMany\",\"ColorPalette.createOne\",\"ColorPalette.createMany\",\"ColorPalette.createManyAndReturn\",\"ColorPalette.updateOne\",\"ColorPalette.updateMany\",\"ColorPalette.updateManyAndReturn\",\"ColorPalette.upsertOne\",\"ColorPalette.deleteOne\",\"ColorPalette.deleteMany\",\"ColorPalette.groupBy\",\"ColorPalette.aggregate\",\"AuditLog.findUnique\",\"AuditLog.findUniqueOrThrow\",\"AuditLog.findFirst\",\"AuditLog.findFirstOrThrow\",\"AuditLog.findMany\",\"AuditLog.createOne\",\"AuditLog.createMany\",\"AuditLog.createManyAndReturn\",\"AuditLog.updateOne\",\"AuditLog.updateMany\",\"AuditLog.updateManyAndReturn\",\"AuditLog.upsertOne\",\"AuditLog.deleteOne\",\"AuditLog.deleteMany\",\"AuditLog.groupBy\",\"AuditLog.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"createdAt\",\"userId\",\"email\",\"roleId\",\"roleName\",\"page\",\"action\",\"entity\",\"entityId\",\"before\",\"after\",\"ip\",\"equals\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"in\",\"notIn\",\"contains\",\"startsWith\",\"endsWith\",\"solfeggioFrequencyId\",\"colors\",\"keyPrefix\",\"keyHash\",\"expiresAt\",\"revokedAt\",\"key\",\"active\",\"lastValidatedAt\",\"name\",\"sortOrder\",\"every\",\"some\",\"none\",\"value\",\"proclamationId\",\"updatedAt\",\"content\",\"categoryId\",\"groupId\",\"identifier\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"profileId\",\"street\",\"city\",\"state\",\"postalCode\",\"country\",\"type\",\"isDefaultMailing\",\"isDefaultBilling\",\"isDefaultShipping\",\"firstName\",\"lastName\",\"phoneNumber\",\"ghlContactId\",\"emailVerified\",\"image\",\"userId_proclamationId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "xAaYAYACEQUAAIAEACAHAACBBAAgCAAAggQAIAsAAIMEACAMAACEBAAgEQAA8QMAIJsCAAD_AwAwnAIAAAUAEJ0CAAD_AwAwngIBAAAAAZ8CQADDAwAhoQIBAAAAAaICAgDFAwAhxQIBAMIDACHMAkAAwwMAIesCIAD3AwAh7AIBAMQDACEBAAAAAQAgBgMAAOcDACCbAgAA5gMAMJwCAAADABCdAgAA5gMAMJ4CAgDOAwAhxQIBAMIDACEBAAAAAwAgEQUAAIAEACAHAACBBAAgCAAAggQAIAsAAIMEACAMAACEBAAgEQAA8QMAIJsCAAD_AwAwnAIAAAUAEJ0CAAD_AwAwngIBAMIDACGfAkAAwwMAIaECAQDCAwAhogICAMUDACHFAgEAwgMAIcwCQADDAwAh6wIgAPcDACHsAgEAxAMAIQgFAAD-BQAgBwAA_wUAIAgAAIAGACALAACBBgAgDAAAggYAIBEAAPkFACCiAgAAhQQAIOwCAACFBAAgAwAAAAUAIAEAAAYAMAIAAAEAIAEAAAAFACAMBgAA9AMAIJsCAAD-AwAwnAIAAAkAEJ0CAAD-AwAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhwAJAAMMDACHMAkAAwwMAIdoCAQDCAwAh2wIBAMQDACHcAgEAxAMAIQMGAAD6BQAg2wIAAIUEACDcAgAAhQQAIAwGAAD0AwAgmwIAAP4DADCcAgAACQAQnQIAAP4DADCeAgEAAAABnwJAAMMDACGgAgEAwgMAIcACQADDAwAhzAJAAMMDACHaAgEAAAAB2wIBAMQDACHcAgEAxAMAIQMAAAAJACABAAAKADACAAALACARBgAA9AMAIJsCAAD9AwAwnAIAAA0AEJ0CAAD9AwAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhzAJAAMMDACHRAgEAwgMAIdICAQDCAwAh0wIBAMQDACHUAgEAxAMAIdUCAQDEAwAh1gJAANUDACHXAkAA1QMAIdgCAQDEAwAh2QIBAMQDACEIBgAA-gUAINMCAACFBAAg1AIAAIUEACDVAgAAhQQAINYCAACFBAAg1wIAAIUEACDYAgAAhQQAINkCAACFBAAgEQYAAPQDACCbAgAA_QMAMJwCAAANABCdAgAA_QMAMJ4CAQAAAAGfAkAAwwMAIaACAQDCAwAhzAJAAMMDACHRAgEAwgMAIdICAQDCAwAh0wIBAMQDACHUAgEAxAMAIdUCAQDEAwAh1gJAANUDACHXAkAA1QMAIdgCAQDEAwAh2QIBAMQDACEDAAAADQAgAQAADgAwAgAADwAgDAYAAPgDACAKAAD8AwAgmwIAAPsDADCcAgAAEQAQnQIAAPsDADCeAgEAwgMAIaACAQDEAwAhoQIBAMQDACHnAgEAwgMAIegCAQDCAwAh6QIBAMIDACHqAgEAxAMAIQUGAAD6BQAgCgAA_QUAIKACAACFBAAgoQIAAIUEACDqAgAAhQQAIAwGAAD4AwAgCgAA_AMAIJsCAAD7AwAwnAIAABEAEJ0CAAD7AwAwngIBAAAAAaACAQDEAwAhoQIBAMQDACHnAgEAwgMAIegCAQDCAwAh6QIBAMIDACHqAgEAxAMAIQMAAAARACABAAASADACAAATACABAAAABQAgDwkAAPoDACCbAgAA-QMAMJwCAAAWABCdAgAA-QMAMJ4CAQDCAwAh3QIBAMIDACHeAgEAwgMAId8CAQDCAwAh4AIBAMIDACHhAgEAwgMAIeICAQDCAwAh4wIBAMIDACHkAiAA9wMAIeUCIAD3AwAh5gIgAPcDACEBCQAA_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_gIAIAWbAgAAzQMAMJwCAACBAwAQnQIAAM0DADC8AgIAzgMAIb0CAADPAwAgAAMAAACBAwAgAQAAggMAMAIAAP4CACADAAAAgQMAIAEAAIIDADACAAD-AgAgAwAAAIEDACABAACCAwAwAgAA_gIAIAK8AgIAAAABvQKAAAAAAQEYAACGAwAgArwCAgAAAAG9AoAAAAABARgAAIgDADABGAAAiAMAMAK8AgIAlAQAIb0CgAAAAAECAAAA_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_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_AwAwnAIAAAUAEJ0CAAD_AwAwngIBAMIDACGfAkAAwwMAIaECAQDCAwAhogICAMUDACHFAgEAwgMAIcwCQADDAwAh6wIgAPcDACHsAgEAxAMAIe4CAAAFACDvAgAABQAgDw4AAO4DACAPAADvAwAgEAAA8AMAIBEAAPEDACCbAgAA7QMAMJwCAAAkABCdAgAA7QMAMJ4CAQDCAwAhvAICAM4DACHFAgEAwgMAIc0CAQDCAwAhzgICAM4DACHPAgIAzgMAIe4CAAAkACDvAgAAJAAgCwYAAPgDACCbAgAA9gMAMJwCAAAbABCdAgAA9gMAMJ4CAQDCAwAhnwJAAMMDACGgAgEAxAMAIaECAQDEAwAhwgIBAMIDACHDAiAA9wMAIcQCQADVAwAhAqsCIAAAAAG2AiAA2QMAIRMFAACABAAgBwAAgQQAIAgAAIIEACALAACDBAAgDAAAhAQAIBEAAPEDACCbAgAA_wMAMJwCAAAFABCdAgAA_wMAMJ4CAQDCAwAhnwJAAMMDACGhAgEAwgMAIaICAgDFAwAhxQIBAMIDACHMAkAAwwMAIesCIAD3AwAh7AIBAMQDACHuAgAABQAg7wIAAAUAIA8JAAD6AwAgmwIAAPkDADCcAgAAFgAQnQIAAPkDADCeAgEAwgMAId0CAQDCAwAh3gIBAMIDACHfAgEAwgMAIeACAQDCAwAh4QIBAMIDACHiAgEAwgMAIeMCAQDCAwAh5AIgAPcDACHlAiAA9wMAIeYCIAD3AwAhDgYAAPgDACAKAAD8AwAgmwIAAPsDADCcAgAAEQAQnQIAAPsDADCeAgEAwgMAIaACAQDEAwAhoQIBAMQDACHnAgEAwgMAIegCAQDCAwAh6QIBAMIDACHqAgEAxAMAIe4CAAARACDvAgAAEQAgDAYAAPgDACAKAAD8AwAgmwIAAPsDADCcAgAAEQAQnQIAAPsDADCeAgEAwgMAIaACAQDEAwAhoQIBAMQDACHnAgEAwgMAIegCAQDCAwAh6QIBAMIDACHqAgEAxAMAIQPHAgAAFgAgyAIAABYAIMkCAAAWACARBgAA9AMAIJsCAAD9AwAwnAIAAA0AEJ0CAAD9AwAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhzAJAAMMDACHRAgEAwgMAIdICAQDCAwAh0wIBAMQDACHUAgEAxAMAIdUCAQDEAwAh1gJAANUDACHXAkAA1QMAIdgCAQDEAwAh2QIBAMQDACEMBgAA9AMAIJsCAAD-AwAwnAIAAAkAEJ0CAAD-AwAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhwAJAAMMDACHMAkAAwwMAIdoCAQDCAwAh2wIBAMQDACHcAgEAxAMAIREFAACABAAgBwAAgQQAIAgAAIIEACALAACDBAAgDAAAhAQAIBEAAPEDACCbAgAA_wMAMJwCAAAFABCdAgAA_wMAMJ4CAQDCAwAhnwJAAMMDACGhAgEAwgMAIaICAgDFAwAhxQIBAMIDACHMAkAAwwMAIesCIAD3AwAh7AIBAMQDACEIAwAA5wMAIJsCAADmAwAwnAIAAAMAEJ0CAADmAwAwngICAM4DACHFAgEAwgMAIe4CAAADACDvAgAAAwAgA8cCAAAJACDIAgAACQAgyQIAAAkAIAPHAgAADQAgyAIAAA0AIMkCAAANACADxwIAABEAIMgCAAARACDJAgAAEQAgA8cCAAAbACDIAgAAGwAgyQIAABsAIAAAAAAAAAHzAgEAAAABAfMCQAAAAAEB8wIBAAAAAQXzAgIAAAAB-QICAAAAAfoCAgAAAAH7AgIAAAAB_AICAAAAAQAAAAAABfMCAgAAAAH5AgIAAAAB-gICAAAAAfsCAgAAAAH8AgIAAAABAAAAAfMCQAAAAAEAAAAB8wIgAAAAAQcfAADABgAgIAAAwwYAIPACAADBBgAg8QIAAMIGACD0AgAABQAg9QIAAAUAIPYCAAABACADHwAAwAYAIPACAADBBgAg9gIAAAEAIAAAAAAACx8AAKUEADAgAACqBAAw8AIAAKYEADDxAgAApwQAMPICAACoBAAg8wIAAKkEADD0AgAAqQQAMPUCAACpBAAw9gIAAKkEADD3AgAAqwQAMPgCAACsBAAwCA4AAMIEACAQAADDBAAgEQAAxAQAIJ4CAQAAAAG8AgIAAAABxQIBAAAAAc0CAQAAAAHPAgIAAAABAgAAACYAIB8AAMEEACADAAAAJgAgHwAAwQQAICAAAK8EACABGAAAvwYAMA0OAADuAwAgDwAA7wMAIBAAAPADACARAADxAwAgmwIAAO0DADCcAgAAJAAQnQIAAO0DADCeAgEAAAABvAICAM4DACHFAgEAAAABzQIBAMIDACHOAgIAzgMAIc8CAgDOAwAhAgAAACYAIBgAAK8EACACAAAArQQAIBgAAK4EACAJmwIAAKwEADCcAgAArQQAEJ0CAACsBAAwngIBAMIDACG8AgIAzgMAIcUCAQDCAwAhzQIBAMIDACHOAgIAzgMAIc8CAgDOAwAhCZsCAACsBAAwnAIAAK0EABCdAgAArAQAMJ4CAQDCAwAhvAICAM4DACHFAgEAwgMAIc0CAQDCAwAhzgICAM4DACHPAgIAzgMAIQWeAgEAiwQAIbwCAgCUBAAhxQIBAIsEACHNAgEAiwQAIc8CAgCUBAAhCA4AALAEACAQAACxBAAgEQAAsgQAIJ4CAQCLBAAhvAICAJQEACHFAgEAiwQAIc0CAQCLBAAhzwICAJQEACEFHwAAsQYAICAAAL0GACDwAgAAsgYAIPECAAC8BgAg9gIAAJsCACAFHwAArwYAICAAALoGACDwAgAAsAYAIPECAAC5BgAg9gIAAOwBACALHwAAswQAMCAAALgEADDwAgAAtAQAMPECAAC1BAAw8gIAALYEACDzAgAAtwQAMPQCAAC3BAAw9QIAALcEADD2AgAAtwQAMPcCAAC5BAAw-AIAALoEADAEBgAAwAQAIJ8CQAAAAAGgAgEAAAABzAJAAAAAAQIAAAAiACAfAAC_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_gQAMPICAAD_BAAg8wIAAIAFADD0AgAAgAUAMPUCAACABQAw9gIAAIAFADD3AgAAggUAMPgCAACDBQAwDAcAANQFACAIAADVBQAgCwAA1gUAIAwAANcFACARAADYBQAgngIBAAAAAZ8CQAAAAAGhAgEAAAABxQIBAAAAAcwCQAAAAAHrAiAAAAAB7AIBAAAAAQIAAAABACAfAADTBQAgAwAAAAEAIB8AANMFACAgAACGBQAgARgAAKIGADARBQAAgAQAIAcAAIEEACAIAACCBAAgCwAAgwQAIAwAAIQEACARAADxAwAgmwIAAP8DADCcAgAABQAQnQIAAP8DADCeAgEAAAABnwJAAMMDACGhAgEAAAABogICAMUDACHFAgEAwgMAIcwCQADDAwAh6wIgAPcDACHsAgEAxAMAIQIAAAABACAYAACGBQAgAgAAAIQFACAYAACFBQAgC5sCAACDBQAwnAIAAIQFABCdAgAAgwUAMJ4CAQDCAwAhnwJAAMMDACGhAgEAwgMAIaICAgDFAwAhxQIBAMIDACHMAkAAwwMAIesCIAD3AwAh7AIBAMQDACELmwIAAIMFADCcAgAAhAUAEJ0CAACDBQAwngIBAMIDACGfAkAAwwMAIaECAQDCAwAhogICAMUDACHFAgEAwgMAIcwCQADDAwAh6wIgAPcDACHsAgEAxAMAIQeeAgEAiwQAIZ8CQACMBAAhoQIBAIsEACHFAgEAiwQAIcwCQACMBAAh6wIgAJwEACHsAgEAjQQAIQwHAACHBQAgCAAAiAUAIAsAAIkFACAMAACKBQAgEQAAiwUAIJ4CAQCLBAAhnwJAAIwEACGhAgEAiwQAIcUCAQCLBAAhzAJAAIwEACHrAiAAnAQAIewCAQCNBAAhCx8AAMcFADAgAADMBQAw8AIAAMgFADDxAgAAyQUAMPICAADKBQAg8wIAAMsFADD0AgAAywUAMPUCAADLBQAw9gIAAMsFADD3AgAAzQUAMPgCAADOBQAwCx8AALsFADAgAADABQAw8AIAALwFADDxAgAAvQUAMPICAAC-BQAg8wIAAL8FADD0AgAAvwUAMPUCAAC_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_gMAMJwCAAAJABCdAgAA_gMAMJ4CAQAAAAGfAkAAwwMAIaACAQDCAwAhwAJAAMMDACHMAkAAwwMAIdoCAQAAAAHbAgEAxAMAIdwCAQDEAwAhAgAAAAsAIBgAANEFACACAAAAzwUAIBgAANAFACALmwIAAM4FADCcAgAAzwUAEJ0CAADOBQAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhwAJAAMMDACHMAkAAwwMAIdoCAQDCAwAh2wIBAMQDACHcAgEAxAMAIQubAgAAzgUAMJwCAADPBQAQnQIAAM4FADCeAgEAwgMAIZ8CQADDAwAhoAIBAMIDACHAAkAAwwMAIcwCQADDAwAh2gIBAMIDACHbAgEAxAMAIdwCAQDEAwAhB54CAQCLBAAhnwJAAIwEACHAAkAAjAQAIcwCQACMBAAh2gIBAIsEACHbAgEAjQQAIdwCAQCNBAAhB54CAQCLBAAhnwJAAIwEACHAAkAAjAQAIcwCQACMBAAh2gIBAIsEACHbAgEAjQQAIdwCAQCNBAAhB54CAQAAAAGfAkAAAAABwAJAAAAAAcwCQAAAAAHaAgEAAAAB2wIBAAAAAdwCAQAAAAEMBwAA1AUAIAgAANUFACALAADWBQAgDAAA1wUAIBEAANgFACCeAgEAAAABnwJAAAAAAaECAQAAAAHFAgEAAAABzAJAAAAAAesCIAAAAAHsAgEAAAABBB8AAMcFADDwAgAAyAUAMPICAADKBQAg9gIAAMsFADAEHwAAuwUAMPACAAC8BQAw8gIAAL4FACD2AgAAvwUAMAQfAAChBQAw8AIAAKIFADDyAgAApAUAIPYCAAClBQAwBB8AAJUFADDwAgAAlgUAMPICAACYBQAg9gIAAJkFADAEHwAAjAUAMPACAACNBQAw8gIAAI8FACD2AgAAtwQAMAQfAAD8BAAw8AIAAP0EADDyAgAA_wQAIPYCAACABQAwAAAAAAUfAACXBgAgIAAAmgYAIPACAACYBgAg8QIAAJkGACD2AgAAAQAgAx8AAJcGACDwAgAAmAYAIPYCAAABACAAAAAFHwAAkgYAICAAAJUGACDwAgAAkwYAIPECAACUBgAg9gIAAAEAIAMfAACSBgAg8AIAAJMGACD2AgAAAQAgAAAABR8AAI0GACAgAACQBgAg8AIAAI4GACDxAgAAjwYAIPYCAAATACADHwAAjQYAIPACAACOBgAg9gIAABMAIAAAAAcfAACIBgAgIAAAiwYAIPACAACJBgAg8QIAAIoGACD0AgAABQAg9QIAAAUAIPYCAAABACADHwAAiAYAIPACAACJBgAg9gIAAAEAIAAAAAAABx8AAIMGACAgAACGBgAg8AIAAIQGACDxAgAAhQYAIPQCAAADACD1AgAAAwAg9gIAAKUBACADHwAAgwYAIPACAACEBgAg9gIAAKUBACABDQAAxgQAIAENAADGBAAgAQ0AAMYEACAACAUAAP4FACAHAAD_BQAgCAAAgAYAIAsAAIEGACAMAACCBgAgEQAA-QUAIKICAACFBAAg7AIAAIUEACAEDgAA9gUAIA8AAPcFACAQAAD4BQAgEQAA-QUAIAUGAAD6BQAgCgAA_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_AR1BFB5CFiFEASJFASNGFClJFypKHStLBixMBi1NBi5OBi9PBjBRBjFTFDJUHjNXBjRZFDVaHzZcBjddBjheFDlhIDpiJDtjBzxkBz1lBz5mBz9nB0BpB0FrFEJsJUNuB0RwFEVxJkZyB0dzB0h0FEl3J0p4K0t5BEx6BE17BE58BE99BFB_BFGBARRSggEsU4QBBFSGARRVhwEtVogBBFeJAQRYigEUWY0BLlqOATJbjwEFXJABBV2RAQVekgEFX5MBBWCVAQVhlwEUYpgBM2OaAQVknAEUZZ0BNGaeAQVnnwEFaKABFGmjATVqpAE5a6YBAmynAQJtqQECbqoBAm-rAQJwrQECca8BFHKwATpzsgECdLQBFHW1ATt2tgECd7cBAni4ARR5uwE8erwBQnu-AUN8vwFDfcIBQ37DAUN_xAFDgAHGAUOBAcgBFIIByQFEgwHLAUOEAc0BFIUBzgFFhgHPAUOHAdABQ4gB0QEUiQHUAUaKAdUBSosB1gELjAHXAQuNAdgBC44B2QELjwHaAQuQAdwBC5EB3gEUkgHfAUuTAeEBC5QB4wEUlQHkAUyWAeUBC5cB5gELmAHnARSZAeoBTZoB6wFTmwHtARCcAe4BEJ0B8QEQngHyARCfAfMBEKAB9QEQoQH3ARSiAfgBVKMB-gEQpAH8ARSlAf0BVaYB_gEQpwH_ARCoAYACFKkBgwJWqgGEAlyrAYUCCqwBhgIKrQGHAgquAYgCCq8BiQIKsAGLAgqxAY0CFLIBjgJdswGQAgq0AZICFLUBkwJetgGUAgq3AZUCCrgBlgIUuQGZAl-6AZoCY7sBnAIMvAGdAgy9AaACDL4BoQIMvwGiAgzAAaQCDMEBpgIUwgGnAmTDAakCDMQBqwIUxQGsAmXGAa0CDMcBrgIMyAGvAhTJAbICZsoBswJsywG1Ag7MAbYCDs0BuQIOzgG6Ag7PAbsCDtABvQIO0QG_AhTSAcACbdMBwgIO1AHEAhTVAcUCbtYBxgIO1wHHAg7YAcgCFNkBywJv2gHMAnXbAc0CCdwBzgIJ3QHPAgneAdACCd8B0QIJ4AHTAgnhAdUCFOIB1gJ24wHZAgnkAdsCFOUB3AJ35gHeAgnnAd8CCegB4AIU6QHjAnjqAeQCfOsB5gJ97AHnAn3tAeoCfe4B6wJ97wHsAn3wAe4CffEB8AIU8gHxAn7zAfMCffQB9QIU9QH2An_2AfcCffcB-AJ9-AH5AhT5AfwCgAH6Af0ChAH7Af8ChQH8AYADhQH9AYMDhQH-AYQDhQH_AYUDhQGAAocDhQGBAokDFIICigOGAYMCjAOFAYQCjgMUhQKPA4cBhgKQA4UBhwKRA4UBiAKSAxSJApUDiAGKApYDjgGLApgDjwGMApkDjwGNApwDjwGOAp0DjwGPAp4DjwGQAqADjwGRAqIDFJICowOQAZMCpQOPAZQCpwMUlQKoA5EBlgKpA48BlwKqA48BmAKrAxSZAq4DkgGaAq8DmAE" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"users\",\"_count\",\"role\",\"user\",\"sessions\",\"accounts\",\"profile\",\"addresses\",\"profiles\",\"licenseKeys\",\"proclamations\",\"solfeggioFrequency\",\"category\",\"group\",\"userProclamations\",\"blocks\",\"schedule\",\"block\",\"proclamation\",\"blockProclamations\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Profile.findUnique\",\"Profile.findUniqueOrThrow\",\"Profile.findFirst\",\"Profile.findFirstOrThrow\",\"Profile.findMany\",\"Profile.createOne\",\"Profile.createMany\",\"Profile.createManyAndReturn\",\"Profile.updateOne\",\"Profile.updateMany\",\"Profile.updateManyAndReturn\",\"Profile.upsertOne\",\"Profile.deleteOne\",\"Profile.deleteMany\",\"Profile.groupBy\",\"Profile.aggregate\",\"Address.findUnique\",\"Address.findUniqueOrThrow\",\"Address.findFirst\",\"Address.findFirstOrThrow\",\"Address.findMany\",\"Address.createOne\",\"Address.createMany\",\"Address.createManyAndReturn\",\"Address.updateOne\",\"Address.updateMany\",\"Address.updateManyAndReturn\",\"Address.upsertOne\",\"Address.deleteOne\",\"Address.deleteMany\",\"Address.groupBy\",\"Address.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"UserRole.findUnique\",\"UserRole.findUniqueOrThrow\",\"UserRole.findFirst\",\"UserRole.findFirstOrThrow\",\"UserRole.findMany\",\"UserRole.createOne\",\"UserRole.createMany\",\"UserRole.createManyAndReturn\",\"UserRole.updateOne\",\"UserRole.updateMany\",\"UserRole.updateManyAndReturn\",\"UserRole.upsertOne\",\"UserRole.deleteOne\",\"UserRole.deleteMany\",\"UserRole.groupBy\",\"UserRole.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Proclamation.findUnique\",\"Proclamation.findUniqueOrThrow\",\"Proclamation.findFirst\",\"Proclamation.findFirstOrThrow\",\"Proclamation.findMany\",\"Proclamation.createOne\",\"Proclamation.createMany\",\"Proclamation.createManyAndReturn\",\"Proclamation.updateOne\",\"Proclamation.updateMany\",\"Proclamation.updateManyAndReturn\",\"Proclamation.upsertOne\",\"Proclamation.deleteOne\",\"Proclamation.deleteMany\",\"Proclamation.groupBy\",\"Proclamation.aggregate\",\"ProclamationGroup.findUnique\",\"ProclamationGroup.findUniqueOrThrow\",\"ProclamationGroup.findFirst\",\"ProclamationGroup.findFirstOrThrow\",\"ProclamationGroup.findMany\",\"ProclamationGroup.createOne\",\"ProclamationGroup.createMany\",\"ProclamationGroup.createManyAndReturn\",\"ProclamationGroup.updateOne\",\"ProclamationGroup.updateMany\",\"ProclamationGroup.updateManyAndReturn\",\"ProclamationGroup.upsertOne\",\"ProclamationGroup.deleteOne\",\"ProclamationGroup.deleteMany\",\"ProclamationGroup.groupBy\",\"ProclamationGroup.aggregate\",\"UserProclamations.findUnique\",\"UserProclamations.findUniqueOrThrow\",\"UserProclamations.findFirst\",\"UserProclamations.findFirstOrThrow\",\"UserProclamations.findMany\",\"UserProclamations.createOne\",\"UserProclamations.createMany\",\"UserProclamations.createManyAndReturn\",\"UserProclamations.updateOne\",\"UserProclamations.updateMany\",\"UserProclamations.updateManyAndReturn\",\"UserProclamations.upsertOne\",\"UserProclamations.deleteOne\",\"UserProclamations.deleteMany\",\"UserProclamations.groupBy\",\"UserProclamations.aggregate\",\"SolfeggioFrequency.findUnique\",\"SolfeggioFrequency.findUniqueOrThrow\",\"SolfeggioFrequency.findFirst\",\"SolfeggioFrequency.findFirstOrThrow\",\"SolfeggioFrequency.findMany\",\"SolfeggioFrequency.createOne\",\"SolfeggioFrequency.createMany\",\"SolfeggioFrequency.createManyAndReturn\",\"SolfeggioFrequency.updateOne\",\"SolfeggioFrequency.updateMany\",\"SolfeggioFrequency.updateManyAndReturn\",\"SolfeggioFrequency.upsertOne\",\"SolfeggioFrequency.deleteOne\",\"SolfeggioFrequency.deleteMany\",\"SolfeggioFrequency.groupBy\",\"SolfeggioFrequency.aggregate\",\"ProclamationCategory.findUnique\",\"ProclamationCategory.findUniqueOrThrow\",\"ProclamationCategory.findFirst\",\"ProclamationCategory.findFirstOrThrow\",\"ProclamationCategory.findMany\",\"ProclamationCategory.createOne\",\"ProclamationCategory.createMany\",\"ProclamationCategory.createManyAndReturn\",\"ProclamationCategory.updateOne\",\"ProclamationCategory.updateMany\",\"ProclamationCategory.updateManyAndReturn\",\"ProclamationCategory.upsertOne\",\"ProclamationCategory.deleteOne\",\"ProclamationCategory.deleteMany\",\"ProclamationCategory.groupBy\",\"ProclamationCategory.aggregate\",\"LicenseKey.findUnique\",\"LicenseKey.findUniqueOrThrow\",\"LicenseKey.findFirst\",\"LicenseKey.findFirstOrThrow\",\"LicenseKey.findMany\",\"LicenseKey.createOne\",\"LicenseKey.createMany\",\"LicenseKey.createManyAndReturn\",\"LicenseKey.updateOne\",\"LicenseKey.updateMany\",\"LicenseKey.updateManyAndReturn\",\"LicenseKey.upsertOne\",\"LicenseKey.deleteOne\",\"LicenseKey.deleteMany\",\"LicenseKey.groupBy\",\"LicenseKey.aggregate\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"ColorPalette.findUnique\",\"ColorPalette.findUniqueOrThrow\",\"ColorPalette.findFirst\",\"ColorPalette.findFirstOrThrow\",\"ColorPalette.findMany\",\"ColorPalette.createOne\",\"ColorPalette.createMany\",\"ColorPalette.createManyAndReturn\",\"ColorPalette.updateOne\",\"ColorPalette.updateMany\",\"ColorPalette.updateManyAndReturn\",\"ColorPalette.upsertOne\",\"ColorPalette.deleteOne\",\"ColorPalette.deleteMany\",\"ColorPalette.groupBy\",\"ColorPalette.aggregate\",\"AuditLog.findUnique\",\"AuditLog.findUniqueOrThrow\",\"AuditLog.findFirst\",\"AuditLog.findFirstOrThrow\",\"AuditLog.findMany\",\"AuditLog.createOne\",\"AuditLog.createMany\",\"AuditLog.createManyAndReturn\",\"AuditLog.updateOne\",\"AuditLog.updateMany\",\"AuditLog.updateManyAndReturn\",\"AuditLog.upsertOne\",\"AuditLog.deleteOne\",\"AuditLog.deleteMany\",\"AuditLog.groupBy\",\"AuditLog.aggregate\",\"Schedule.findUnique\",\"Schedule.findUniqueOrThrow\",\"Schedule.findFirst\",\"Schedule.findFirstOrThrow\",\"Schedule.findMany\",\"Schedule.createOne\",\"Schedule.createMany\",\"Schedule.createManyAndReturn\",\"Schedule.updateOne\",\"Schedule.updateMany\",\"Schedule.updateManyAndReturn\",\"Schedule.upsertOne\",\"Schedule.deleteOne\",\"Schedule.deleteMany\",\"Schedule.groupBy\",\"Schedule.aggregate\",\"Block.findUnique\",\"Block.findUniqueOrThrow\",\"Block.findFirst\",\"Block.findFirstOrThrow\",\"Block.findMany\",\"Block.createOne\",\"Block.createMany\",\"Block.createManyAndReturn\",\"Block.updateOne\",\"Block.updateMany\",\"Block.updateManyAndReturn\",\"Block.upsertOne\",\"Block.deleteOne\",\"Block.deleteMany\",\"Block.groupBy\",\"Block.aggregate\",\"BlockProclamations.findUnique\",\"BlockProclamations.findUniqueOrThrow\",\"BlockProclamations.findFirst\",\"BlockProclamations.findFirstOrThrow\",\"BlockProclamations.findMany\",\"BlockProclamations.createOne\",\"BlockProclamations.createMany\",\"BlockProclamations.createManyAndReturn\",\"BlockProclamations.updateOne\",\"BlockProclamations.updateMany\",\"BlockProclamations.updateManyAndReturn\",\"BlockProclamations.upsertOne\",\"BlockProclamations.deleteOne\",\"BlockProclamations.deleteMany\",\"BlockProclamations.groupBy\",\"BlockProclamations.aggregate\",\"AND\",\"OR\",\"NOT\",\"blockId\",\"proclamationId\",\"sortOrder\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"id\",\"scheduleId\",\"startMinutes\",\"endMinutes\",\"userId\",\"every\",\"some\",\"none\",\"email\",\"roleId\",\"roleName\",\"page\",\"action\",\"entity\",\"entityId\",\"before\",\"after\",\"ip\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"solfeggioFrequencyId\",\"colors\",\"keyPrefix\",\"keyHash\",\"expiresAt\",\"revokedAt\",\"key\",\"active\",\"lastValidatedAt\",\"name\",\"value\",\"content\",\"categoryId\",\"groupId\",\"identifier\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"profileId\",\"street\",\"city\",\"state\",\"postalCode\",\"country\",\"type\",\"isDefaultMailing\",\"isDefaultBilling\",\"isDefaultShipping\",\"firstName\",\"lastName\",\"phoneNumber\",\"ghlContactId\",\"emailVerified\",\"image\",\"blockId_proclamationId\",\"userId_proclamationId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "gAi2AbACEgUAAN0EACAHAADeBAAgCAAA3wQAIAsAAOAEACAMAADhBAAgEQAA0AQAIBMAAOIEACDPAgAA3AQAMNACAAAFABDRAgAA3AQAMNUCQACQBAAh1gJAAJAEACHiAgEAAAAB6gIBAAAAAesCAgCgBAAhgwMBAJ4EACGjAyAA1AQAIaQDAQCfBAAhAQAAAAEAIAYDAAC_BAAgzwIAAL4EADDQAgAAAwAQ0QIAAL4EADDiAgIApgQAIYMDAQCeBAAhAQAAAAMAIBIFAADdBAAgBwAA3gQAIAgAAN8EACALAADgBAAgDAAA4QQAIBEAANAEACATAADiBAAgzwIAANwEADDQAgAABQAQ0QIAANwEADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHqAgEAngQAIesCAgCgBAAhgwMBAJ4EACGjAyAA1AQAIaQDAQCfBAAhCQUAAKMHACAHAACkBwAgCAAApQcAIAsAAKYHACAMAACnBwAgEQAAoAcAIBMAAJkHACDrAgAAmQUAIKQDAACZBQAgAwAAAAUAIAEAAAYAMAIAAAEAIAEAAAAFACAMBgAAkQQAIM8CAADbBAAw0AIAAAkAENECAADbBAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh5gIBAJ4EACH-AkAAkAQAIZIDAQCeBAAhkwMBAJ8EACGUAwEAnwQAIQMGAACXBQAgkwMAAJkFACCUAwAAmQUAIAwGAACRBAAgzwIAANsEADDQAgAACQAQ0QIAANsEADDVAkAAkAQAIdYCQACQBAAh4gIBAAAAAeYCAQCeBAAh_gJAAJAEACGSAwEAAAABkwMBAJ8EACGUAwEAnwQAIQMAAAAJACABAAAKADACAAALACARBgAAkQQAIM8CAADaBAAw0AIAAA0AENECAADaBAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh5gIBAJ4EACGJAwEAngQAIYoDAQCeBAAhiwMBAJ8EACGMAwEAnwQAIY0DAQCfBAAhjgNAAK0EACGPA0AArQQAIZADAQCfBAAhkQMBAJ8EACEIBgAAlwUAIIsDAACZBQAgjAMAAJkFACCNAwAAmQUAII4DAACZBQAgjwMAAJkFACCQAwAAmQUAIJEDAACZBQAgEQYAAJEEACDPAgAA2gQAMNACAAANABDRAgAA2gQAMNUCQACQBAAh1gJAAJAEACHiAgEAAAAB5gIBAJ4EACGJAwEAngQAIYoDAQCeBAAhiwMBAJ8EACGMAwEAnwQAIY0DAQCfBAAhjgNAAK0EACGPA0AArQQAIZADAQCfBAAhkQMBAJ8EACEDAAAADQAgAQAADgAwAgAADwAgDAYAANUEACAKAADZBAAgzwIAANgEADDQAgAAEQAQ0QIAANgEADDiAgEAngQAIeYCAQCfBAAh6gIBAJ8EACGfAwEAngQAIaADAQCeBAAhoQMBAJ4EACGiAwEAnwQAIQUGAACXBQAgCgAAogcAIOYCAACZBQAg6gIAAJkFACCiAwAAmQUAIAwGAADVBAAgCgAA2QQAIM8CAADYBAAw0AIAABEAENECAADYBAAw4gIBAAAAAeYCAQCfBAAh6gIBAJ8EACGfAwEAngQAIaADAQCeBAAhoQMBAJ4EACGiAwEAnwQAIQMAAAARACABAAASADACAAATACABAAAABQAgDwkAANcEACDPAgAA1gQAMNACAAAWABDRAgAA1gQAMOICAQCeBAAhlQMBAJ4EACGWAwEAngQAIZcDAQCeBAAhmAMBAJ4EACGZAwEAngQAIZoDAQCeBAAhmwMBAJ4EACGcAyAA1AQAIZ0DIADUBAAhngMgANQEACEBCQAAoQcAIA8JAADXBAAgzwIAANYEADDQAgAAFgAQ0QIAANYEADDiAgEAAAABlQMBAJ4EACGWAwEAngQAIZcDAQCeBAAhmAMBAJ4EACGZAwEAngQAIZoDAQCeBAAhmwMBAJ4EACGcAyAA1AQAIZ0DIADUBAAhngMgANQEACEDAAAAFgAgAQAAFwAwAgAAGAAgAQAAABYAIAsGAADVBAAgzwIAANMEADDQAgAAGwAQ0QIAANMEADDVAkAAkAQAIeICAQCeBAAh5gIBAJ8EACHqAgEAnwQAIYADAQCeBAAhgQMgANQEACGCA0AArQQAIQQGAACXBQAg5gIAAJkFACDqAgAAmQUAIIIDAACZBQAgCwYAANUEACDPAgAA0wQAMNACAAAbABDRAgAA0wQAMNUCQACQBAAh4gIBAAAAAeYCAQCfBAAh6gIBAJ8EACGAAwEAAAABgQMgANQEACGCA0AArQQAIQMAAAAbACABAAAcADACAAAdACABAAAABQAgCQYAAJEEACAVAADLBAAgzwIAANIEADDQAgAAIAAQ0QIAANIEADDTAgEAngQAIdUCQACQBAAh1gJAAJAEACHmAgEAngQAIQIGAACXBQAgFQAAnAcAIAoGAACRBAAgFQAAywQAIM8CAADSBAAw0AIAACAAENECAADSBAAw0wIBAJ4EACHVAkAAkAQAIdYCQACQBAAh5gIBAJ4EACGmAwAA0QQAIAMAAAAgACABAAAhADACAAAiACAODgAAzQQAIA8AAM4EACAQAADPBAAgEQAA0AQAIBYAAMcEACDPAgAAzAQAMNACAAAkABDRAgAAzAQAMOICAQCeBAAh-gICAKYEACGDAwEAngQAIYUDAQCeBAAhhgMCAKYEACGHAwIApgQAIQUOAACdBwAgDwAAngcAIBAAAJ8HACARAACgBwAgFgAAmgcAIA4OAADNBAAgDwAAzgQAIBAAAM8EACARAADQBAAgFgAAxwQAIM8CAADMBAAw0AIAACQAENECAADMBAAw4gIBAAAAAfoCAgCmBAAhgwMBAAAAAYUDAQCeBAAhhgMCAKYEACGHAwIApgQAIQMAAAAkACABAAAlADACAAAmACABAAAAJAAgAwAAACQAIAEAACUAMAIAACYAIAEAAAAkACADAAAAJAAgAQAAJQAwAgAAJgAgAQAAACQAIAMAAAAgACABAAAhADACAAAiACAKFAAAygQAIBUAAMsEACDPAgAAyQQAMNACAAAuABDRAgAAyQQAMNICAQCeBAAh0wIBAJ4EACHUAgIApgQAIdUCQACQBAAh1gJAAJAEACECFAAAmwcAIBUAAJwHACALFAAAygQAIBUAAMsEACDPAgAAyQQAMNACAAAuABDRAgAAyQQAMNICAQCeBAAh0wIBAJ4EACHUAgIApgQAIdUCQACQBAAh1gJAAJAEACGlAwAAyAQAIAMAAAAuACABAAAvADACAAAwACALDQAAxwQAIBMAAMYEACDPAgAAxQQAMNACAAAyABDRAgAAxQQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeMCAQCeBAAh5AICAKYEACHlAgIApgQAIQINAACaBwAgEwAAmQcAIAsNAADHBAAgEwAAxgQAIM8CAADFBAAw0AIAADIAENECAADFBAAw1QJAAJAEACHWAkAAkAQAIeICAQAAAAHjAgEAngQAIeQCAgCmBAAh5QICAKYEACEDAAAAMgAgAQAAMwAwAgAANAAgAQAAADIAIAMAAAAuACABAAAvADACAAAwACABAAAALgAgAQAAACAAIAEAAAAuACAJBgAAkQQAIBIAAJIEACDPAgAAjwQAMNACAAA7ABDRAgAAjwQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAhAQAAADsAIAEAAAAJACABAAAADQAgAQAAABEAIAEAAAAbACABAAAAIAAgAQAAAAEAIAMAAAAFACABAAAGADACAAABACADAAAABQAgAQAABgAwAgAAAQAgAwAAAAUAIAEAAAYAMAIAAAEAIA8FAACYBwAgBwAA9gYAIAgAAPcGACALAAD4BgAgDAAA-QYAIBEAAPoGACATAAD7BgAg1QJAAAAAAdYCQAAAAAHiAgEAAAAB6gIBAAAAAesCAgAAAAGDAwEAAAABowMgAAAAAaQDAQAAAAEBHAAARgAgCNUCQAAAAAHWAkAAAAAB4gIBAAAAAeoCAQAAAAHrAgIAAAABgwMBAAAAAaMDIAAAAAGkAwEAAAABARwAAEgAMAEcAABIADABAAAAAwAgDwUAAJcHACAHAACjBgAgCAAApAYAIAsAAKUGACAMAACmBgAgEQAApwYAIBMAAKgGACDVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHqAgEA6gQAIesCAgCgBQAhgwMBAOoEACGjAyAArQUAIaQDAQCfBQAhAgAAAAEAIBwAAEwAIAjVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHqAgEA6gQAIesCAgCgBQAhgwMBAOoEACGjAyAArQUAIaQDAQCfBQAhAgAAAAUAIBwAAE4AIAIAAAAFACAcAABOACABAAAAAwAgAwAAAAEAICMAAEYAICQAAEwAIAEAAAABACABAAAABQAgBwQAAJIHACApAACTBwAgKgAAlgcAICsAAJUHACAsAACUBwAg6wIAAJkFACCkAwAAmQUAIAvPAgAAxAQAMNACAABWABDRAgAAxAQAMNUCQACFBAAh1gJAAIUEACHiAgEAgwQAIeoCAQCDBAAh6wICAJUEACGDAwEAgwQAIaMDIACvBAAhpAMBAJQEACEDAAAABQAgAQAAVQAwKAAAVgAgAwAAAAUAIAEAAAYAMAIAAAEAIAEAAAATACABAAAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACADAAAAEQAgAQAAEgAwAgAAEwAgCQYAAJEHACAKAADcBgAg4gIBAAAAAeYCAQAAAAHqAgEAAAABnwMBAAAAAaADAQAAAAGhAwEAAAABogMBAAAAAQEcAABeACAH4gIBAAAAAeYCAQAAAAHqAgEAAAABnwMBAAAAAaADAQAAAAGhAwEAAAABogMBAAAAAQEcAABgADABHAAAYAAwAQAAAAUAIAkGAACQBwAgCgAAzgYAIOICAQDqBAAh5gIBAJ8FACHqAgEAnwUAIZ8DAQDqBAAhoAMBAOoEACGhAwEA6gQAIaIDAQCfBQAhAgAAABMAIBwAAGQAIAfiAgEA6gQAIeYCAQCfBQAh6gIBAJ8FACGfAwEA6gQAIaADAQDqBAAhoQMBAOoEACGiAwEAnwUAIQIAAAARACAcAABmACACAAAAEQAgHAAAZgAgAQAAAAUAIAMAAAATACAjAABeACAkAABkACABAAAAEwAgAQAAABEAIAYEAACNBwAgKwAAjwcAICwAAI4HACDmAgAAmQUAIOoCAACZBQAgogMAAJkFACAKzwIAAMMEADDQAgAAbgAQ0QIAAMMEADDiAgEAgwQAIeYCAQCUBAAh6gIBAJQEACGfAwEAgwQAIaADAQCDBAAhoQMBAIMEACGiAwEAlAQAIQMAAAARACABAABtADAoAABuACADAAAAEQAgAQAAEgAwAgAAEwAgAQAAABgAIAEAAAAYACADAAAAFgAgAQAAFwAwAgAAGAAgAwAAABYAIAEAABcAMAIAABgAIAMAAAAWACABAAAXADACAAAYACAMCQAAjAcAIOICAQAAAAGVAwEAAAABlgMBAAAAAZcDAQAAAAGYAwEAAAABmQMBAAAAAZoDAQAAAAGbAwEAAAABnAMgAAAAAZ0DIAAAAAGeAyAAAAABARwAAHYAIAviAgEAAAABlQMBAAAAAZYDAQAAAAGXAwEAAAABmAMBAAAAAZkDAQAAAAGaAwEAAAABmwMBAAAAAZwDIAAAAAGdAyAAAAABngMgAAAAAQEcAAB4ADABHAAAeAAwDAkAAIsHACDiAgEA6gQAIZUDAQDqBAAhlgMBAOoEACGXAwEA6gQAIZgDAQDqBAAhmQMBAOoEACGaAwEA6gQAIZsDAQDqBAAhnAMgAK0FACGdAyAArQUAIZ4DIACtBQAhAgAAABgAIBwAAHsAIAviAgEA6gQAIZUDAQDqBAAhlgMBAOoEACGXAwEA6gQAIZgDAQDqBAAhmQMBAOoEACGaAwEA6gQAIZsDAQDqBAAhnAMgAK0FACGdAyAArQUAIZ4DIACtBQAhAgAAABYAIBwAAH0AIAIAAAAWACAcAAB9ACADAAAAGAAgIwAAdgAgJAAAewAgAQAAABgAIAEAAAAWACADBAAAiAcAICsAAIoHACAsAACJBwAgDs8CAADCBAAw0AIAAIQBABDRAgAAwgQAMOICAQCDBAAhlQMBAIMEACGWAwEAgwQAIZcDAQCDBAAhmAMBAIMEACGZAwEAgwQAIZoDAQCDBAAhmwMBAIMEACGcAyAArwQAIZ0DIACvBAAhngMgAK8EACEDAAAAFgAgAQAAgwEAMCgAAIQBACADAAAAFgAgAQAAFwAwAgAAGAAgAQAAAAsAIAEAAAALACADAAAACQAgAQAACgAwAgAACwAgAwAAAAkAIAEAAAoAMAIAAAsAIAMAAAAJACABAAAKADACAAALACAJBgAAhwcAINUCQAAAAAHWAkAAAAAB4gIBAAAAAeYCAQAAAAH-AkAAAAABkgMBAAAAAZMDAQAAAAGUAwEAAAABARwAAIwBACAI1QJAAAAAAdYCQAAAAAHiAgEAAAAB5gIBAAAAAf4CQAAAAAGSAwEAAAABkwMBAAAAAZQDAQAAAAEBHAAAjgEAMAEcAACOAQAwCQYAAIYHACDVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHmAgEA6gQAIf4CQADpBAAhkgMBAOoEACGTAwEAnwUAIZQDAQCfBQAhAgAAAAsAIBwAAJEBACAI1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5gIBAOoEACH-AkAA6QQAIZIDAQDqBAAhkwMBAJ8FACGUAwEAnwUAIQIAAAAJACAcAACTAQAgAgAAAAkAIBwAAJMBACADAAAACwAgIwAAjAEAICQAAJEBACABAAAACwAgAQAAAAkAIAUEAACDBwAgKwAAhQcAICwAAIQHACCTAwAAmQUAIJQDAACZBQAgC88CAADBBAAw0AIAAJoBABDRAgAAwQQAMNUCQACFBAAh1gJAAIUEACHiAgEAgwQAIeYCAQCDBAAh_gJAAIUEACGSAwEAgwQAIZMDAQCUBAAhlAMBAJQEACEDAAAACQAgAQAAmQEAMCgAAJoBACADAAAACQAgAQAACgAwAgAACwAgAQAAAA8AIAEAAAAPACADAAAADQAgAQAADgAwAgAADwAgAwAAAA0AIAEAAA4AMAIAAA8AIAMAAAANACABAAAOADACAAAPACAOBgAAggcAINUCQAAAAAHWAkAAAAAB4gIBAAAAAeYCAQAAAAGJAwEAAAABigMBAAAAAYsDAQAAAAGMAwEAAAABjQMBAAAAAY4DQAAAAAGPA0AAAAABkAMBAAAAAZEDAQAAAAEBHAAAogEAIA3VAkAAAAAB1gJAAAAAAeICAQAAAAHmAgEAAAABiQMBAAAAAYoDAQAAAAGLAwEAAAABjAMBAAAAAY0DAQAAAAGOA0AAAAABjwNAAAAAAZADAQAAAAGRAwEAAAABARwAAKQBADABHAAApAEAMA4GAACBBwAg1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5gIBAOoEACGJAwEA6gQAIYoDAQDqBAAhiwMBAJ8FACGMAwEAnwUAIY0DAQCfBQAhjgNAAKkFACGPA0AAqQUAIZADAQCfBQAhkQMBAJ8FACECAAAADwAgHAAApwEAIA3VAkAA6QQAIdYCQADpBAAh4gIBAOoEACHmAgEA6gQAIYkDAQDqBAAhigMBAOoEACGLAwEAnwUAIYwDAQCfBQAhjQMBAJ8FACGOA0AAqQUAIY8DQACpBQAhkAMBAJ8FACGRAwEAnwUAIQIAAAANACAcAACpAQAgAgAAAA0AIBwAAKkBACADAAAADwAgIwAAogEAICQAAKcBACABAAAADwAgAQAAAA0AIAoEAAD-BgAgKwAAgAcAICwAAP8GACCLAwAAmQUAIIwDAACZBQAgjQMAAJkFACCOAwAAmQUAII8DAACZBQAgkAMAAJkFACCRAwAAmQUAIBDPAgAAwAQAMNACAACwAQAQ0QIAAMAEADDVAkAAhQQAIdYCQACFBAAh4gIBAIMEACHmAgEAgwQAIYkDAQCDBAAhigMBAIMEACGLAwEAlAQAIYwDAQCUBAAhjQMBAJQEACGOA0AAqQQAIY8DQACpBAAhkAMBAJQEACGRAwEAlAQAIQMAAAANACABAACvAQAwKAAAsAEAIAMAAAANACABAAAOADACAAAPACAGAwAAvwQAIM8CAAC-BAAw0AIAAAMAENECAAC-BAAw4gICAAAAAYMDAQCeBAAhAQAAALMBACABAAAAswEAIAEDAAD9BgAgAwAAAAMAIAEAALYBADACAACzAQAgAwAAAAMAIAEAALYBADACAACzAQAgAwAAAAMAIAEAALYBADACAACzAQAgAwMAAPwGACDiAgIAAAABgwMBAAAAAQEcAAC6AQAgAuICAgAAAAGDAwEAAAABARwAALwBADABHAAAvAEAMAMDAACXBgAg4gICAOgEACGDAwEA6gQAIQIAAACzAQAgHAAAvwEAIALiAgIA6AQAIYMDAQDqBAAhAgAAAAMAIBwAAMEBACACAAAAAwAgHAAAwQEAIAMAAACzAQAgIwAAugEAICQAAL8BACABAAAAswEAIAEAAAADACAFBAAAkgYAICkAAJMGACAqAACWBgAgKwAAlQYAICwAAJQGACAFzwIAAL0EADDQAgAAyAEAENECAAC9BAAw4gICAIQEACGDAwEAgwQAIQMAAAADACABAADHAQAwKAAAyAEAIAMAAAADACABAAC2AQAwAgAAswEAIAnPAgAAvAQAMNACAADOAQAQ0QIAALwEADDVAkAAkAQAIdYCQACQBAAh4gIBAAAAAf4CQACQBAAhhAMBAJ4EACGIAwEAngQAIQEAAADLAQAgAQAAAMsBACAJzwIAALwEADDQAgAAzgEAENECAAC8BAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh_gJAAJAEACGEAwEAngQAIYgDAQCeBAAhAAMAAADOAQAgAQAAzwEAMAIAAMsBACADAAAAzgEAIAEAAM8BADACAADLAQAgAwAAAM4BACABAADPAQAwAgAAywEAIAbVAkAAAAAB1gJAAAAAAeICAQAAAAH-AkAAAAABhAMBAAAAAYgDAQAAAAEBHAAA0wEAIAbVAkAAAAAB1gJAAAAAAeICAQAAAAH-AkAAAAABhAMBAAAAAYgDAQAAAAEBHAAA1QEAMAEcAADVAQAwBtUCQADpBAAh1gJAAOkEACHiAgEA6gQAIf4CQADpBAAhhAMBAOoEACGIAwEA6gQAIQIAAADLAQAgHAAA2AEAIAbVAkAA6QQAIdYCQADpBAAh4gIBAOoEACH-AkAA6QQAIYQDAQDqBAAhiAMBAOoEACECAAAAzgEAIBwAANoBACACAAAAzgEAIBwAANoBACADAAAAywEAICMAANMBACAkAADYAQAgAQAAAMsBACABAAAAzgEAIAMEAACPBgAgKwAAkQYAICwAAJAGACAJzwIAALsEADDQAgAA4QEAENECAAC7BAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh_gJAAIUEACGEAwEAgwQAIYgDAQCDBAAhAwAAAM4BACABAADgAQAwKAAA4QEAIAMAAADOAQAgAQAAzwEAMAIAAMsBACABAAAAJgAgAQAAACYAIAMAAAAkACABAAAlADACAAAmACADAAAAJAAgAQAAJQAwAgAAJgAgAwAAACQAIAEAACUAMAIAACYAIAsOAADdBQAgDwAA8wUAIBAAAN4FACARAADfBQAgFgAA4AUAIOICAQAAAAH6AgIAAAABgwMBAAAAAYUDAQAAAAGGAwIAAAABhwMCAAAAAQEcAADpAQAgBuICAQAAAAH6AgIAAAABgwMBAAAAAYUDAQAAAAGGAwIAAAABhwMCAAAAAQEcAADrAQAwARwAAOsBADALDgAAwQUAIA8AAPEFACAQAADCBQAgEQAAwwUAIBYAAMQFACDiAgEA6gQAIfoCAgDoBAAhgwMBAOoEACGFAwEA6gQAIYYDAgDoBAAhhwMCAOgEACECAAAAJgAgHAAA7gEAIAbiAgEA6gQAIfoCAgDoBAAhgwMBAOoEACGFAwEA6gQAIYYDAgDoBAAhhwMCAOgEACECAAAAJAAgHAAA8AEAIAIAAAAkACAcAADwAQAgAwAAACYAICMAAOkBACAkAADuAQAgAQAAACYAIAEAAAAkACAFBAAAigYAICkAAIsGACAqAACOBgAgKwAAjQYAICwAAIwGACAJzwIAALoEADDQAgAA9wEAENECAAC6BAAw4gIBAIMEACH6AgIAhAQAIYMDAQCDBAAhhQMBAIMEACGGAwIAhAQAIYcDAgCEBAAhAwAAACQAIAEAAPYBADAoAAD3AQAgAwAAACQAIAEAACUAMAIAACYAIAcNAAC0BAAgzwIAALkEADDQAgAA_QEAENECAAC5BAAw1AICAKYEACHiAgIAAAABgwMBAAAAAQEAAAD6AQAgAQAAAPoBACAHDQAAtAQAIM8CAAC5BAAw0AIAAP0BABDRAgAAuQQAMNQCAgCmBAAh4gICAKYEACGDAwEAngQAIQENAADiBQAgAwAAAP0BACABAAD-AQAwAgAA-gEAIAMAAAD9AQAgAQAA_gEAMAIAAPoBACADAAAA_QEAIAEAAP4BADACAAD6AQAgBA0AAIkGACDUAgIAAAAB4gICAAAAAYMDAQAAAAEBHAAAggIAIAPUAgIAAAAB4gICAAAAAYMDAQAAAAEBHAAAhAIAMAEcAACEAgAwBA0AAP8FACDUAgIA6AQAIeICAgDoBAAhgwMBAOoEACECAAAA-gEAIBwAAIcCACAD1AICAOgEACHiAgIA6AQAIYMDAQDqBAAhAgAAAP0BACAcAACJAgAgAgAAAP0BACAcAACJAgAgAwAAAPoBACAjAACCAgAgJAAAhwIAIAEAAAD6AQAgAQAAAP0BACAFBAAA-gUAICkAAPsFACAqAAD-BQAgKwAA_QUAICwAAPwFACAGzwIAALgEADDQAgAAkAIAENECAAC4BAAw1AICAIQEACHiAgIAhAQAIYMDAQCDBAAhAwAAAP0BACABAACPAgAwKAAAkAIAIAMAAAD9AQAgAQAA_gEAMAIAAPoBACABAAAAIgAgAQAAACIAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgAwAAACAAIAEAACEAMAIAACIAIAYGAADbBQAgFQAA-QUAINMCAQAAAAHVAkAAAAAB1gJAAAAAAeYCAQAAAAEBHAAAmAIAIATTAgEAAAAB1QJAAAAAAdYCQAAAAAHmAgEAAAABARwAAJoCADABHAAAmgIAMAYGAADZBQAgFQAA-AUAINMCAQDqBAAh1QJAAOkEACHWAkAA6QQAIeYCAQDqBAAhAgAAACIAIBwAAJ0CACAE0wIBAOoEACHVAkAA6QQAIdYCQADpBAAh5gIBAOoEACECAAAAIAAgHAAAnwIAIAIAAAAgACAcAACfAgAgAwAAACIAICMAAJgCACAkAACdAgAgAQAAACIAIAEAAAAgACADBAAA9QUAICsAAPcFACAsAAD2BQAgB88CAAC3BAAw0AIAAKYCABDRAgAAtwQAMNMCAQCDBAAh1QJAAIUEACHWAkAAhQQAIeYCAQCDBAAhAwAAACAAIAEAAKUCADAoAACmAgAgAwAAACAAIAEAACEAMAIAACIAIAcNAAC0BAAgzwIAALYEADDQAgAArAIAENECAAC2BAAw4gICAAAAAYMDAQAAAAGEAwIAAAABAQAAAKkCACABAAAAqQIAIAcNAAC0BAAgzwIAALYEADDQAgAArAIAENECAAC2BAAw4gICAKYEACGDAwEAngQAIYQDAgCmBAAhAQ0AAOIFACADAAAArAIAIAEAAK0CADACAACpAgAgAwAAAKwCACABAACtAgAwAgAAqQIAIAMAAACsAgAgAQAArQIAMAIAAKkCACAEDQAA9AUAIOICAgAAAAGDAwEAAAABhAMCAAAAAQEcAACxAgAgA-ICAgAAAAGDAwEAAAABhAMCAAAAAQEcAACzAgAwARwAALMCADAEDQAA6AUAIOICAgDoBAAhgwMBAOoEACGEAwIA6AQAIQIAAACpAgAgHAAAtgIAIAPiAgIA6AQAIYMDAQDqBAAhhAMCAOgEACECAAAArAIAIBwAALgCACACAAAArAIAIBwAALgCACADAAAAqQIAICMAALECACAkAAC2AgAgAQAAAKkCACABAAAArAIAIAUEAADjBQAgKQAA5AUAICoAAOcFACArAADmBQAgLAAA5QUAIAbPAgAAtQQAMNACAAC_AgAQ0QIAALUEADDiAgIAhAQAIYMDAQCDBAAhhAMCAIQEACEDAAAArAIAIAEAAL4CADAoAAC_AgAgAwAAAKwCACABAACtAgAwAgAAqQIAIAcNAAC0BAAgzwIAALMEADDQAgAAxQIAENECAACzBAAw1AICAKYEACHiAgIAAAABgwMBAAAAAQEAAADCAgAgAQAAAMICACAHDQAAtAQAIM8CAACzBAAw0AIAAMUCABDRAgAAswQAMNQCAgCmBAAh4gICAKYEACGDAwEAngQAIQENAADiBQAgAwAAAMUCACABAADGAgAwAgAAwgIAIAMAAADFAgAgAQAAxgIAMAIAAMICACADAAAAxQIAIAEAAMYCADACAADCAgAgBA0AAOEFACDUAgIAAAAB4gICAAAAAYMDAQAAAAEBHAAAygIAIAPUAgIAAAAB4gICAAAAAYMDAQAAAAEBHAAAzAIAMAEcAADMAgAwBA0AALUFACDUAgIA6AQAIeICAgDoBAAhgwMBAOoEACECAAAAwgIAIBwAAM8CACAD1AICAOgEACHiAgIA6AQAIYMDAQDqBAAhAgAAAMUCACAcAADRAgAgAgAAAMUCACAcAADRAgAgAwAAAMICACAjAADKAgAgJAAAzwIAIAEAAADCAgAgAQAAAMUCACAFBAAAsAUAICkAALEFACAqAAC0BQAgKwAAswUAICwAALIFACAGzwIAALIEADDQAgAA2AIAENECAACyBAAw1AICAIQEACHiAgIAhAQAIYMDAQCDBAAhAwAAAMUCACABAADXAgAwKAAA2AIAIAMAAADFAgAgAQAAxgIAMAIAAMICACABAAAAHQAgAQAAAB0AIAMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAgGAACvBQAg1QJAAAAAAeICAQAAAAHmAgEAAAAB6gIBAAAAAYADAQAAAAGBAyAAAAABggNAAAAAAQEcAADgAgAgB9UCQAAAAAHiAgEAAAAB5gIBAAAAAeoCAQAAAAGAAwEAAAABgQMgAAAAAYIDQAAAAAEBHAAA4gIAMAEcAADiAgAwAQAAAAUAIAgGAACuBQAg1QJAAOkEACHiAgEA6gQAIeYCAQCfBQAh6gIBAJ8FACGAAwEA6gQAIYEDIACtBQAhggNAAKkFACECAAAAHQAgHAAA5gIAIAfVAkAA6QQAIeICAQDqBAAh5gIBAJ8FACHqAgEAnwUAIYADAQDqBAAhgQMgAK0FACGCA0AAqQUAIQIAAAAbACAcAADoAgAgAgAAABsAIBwAAOgCACABAAAABQAgAwAAAB0AICMAAOACACAkAADmAgAgAQAAAB0AIAEAAAAbACAGBAAAqgUAICsAAKwFACAsAACrBQAg5gIAAJkFACDqAgAAmQUAIIIDAACZBQAgCs8CAACuBAAw0AIAAPACABDRAgAArgQAMNUCQACFBAAh4gIBAIMEACHmAgEAlAQAIeoCAQCUBAAhgAMBAIMEACGBAyAArwQAIYIDQACpBAAhAwAAABsAIAEAAO8CADAoAADwAgAgAwAAABsAIAEAABwAMAIAAB0AIAnPAgAArAQAMNACAAD2AgAQ0QIAAKwEADDVAkAAkAQAIeICAQAAAAH8AgEAngQAIf0CAQAAAAH-AkAArQQAIf8CQACtBAAhAQAAAPMCACABAAAA8wIAIAnPAgAArAQAMNACAAD2AgAQ0QIAAKwEADDVAkAAkAQAIeICAQCeBAAh_AIBAJ4EACH9AgEAngQAIf4CQACtBAAh_wJAAK0EACEC_gIAAJkFACD_AgAAmQUAIAMAAAD2AgAgAQAA9wIAMAIAAPMCACADAAAA9gIAIAEAAPcCADACAADzAgAgAwAAAPYCACABAAD3AgAwAgAA8wIAIAbVAkAAAAAB4gIBAAAAAfwCAQAAAAH9AgEAAAAB_gJAAAAAAf8CQAAAAAEBHAAA-wIAIAbVAkAAAAAB4gIBAAAAAfwCAQAAAAH9AgEAAAAB_gJAAAAAAf8CQAAAAAEBHAAA_QIAMAEcAAD9AgAwBtUCQADpBAAh4gIBAOoEACH8AgEA6gQAIf0CAQDqBAAh_gJAAKkFACH_AkAAqQUAIQIAAADzAgAgHAAAgAMAIAbVAkAA6QQAIeICAQDqBAAh_AIBAOoEACH9AgEA6gQAIf4CQACpBQAh_wJAAKkFACECAAAA9gIAIBwAAIIDACACAAAA9gIAIBwAAIIDACADAAAA8wIAICMAAPsCACAkAACAAwAgAQAAAPMCACABAAAA9gIAIAUEAACmBQAgKwAAqAUAICwAAKcFACD-AgAAmQUAIP8CAACZBQAgCc8CAACoBAAw0AIAAIkDABDRAgAAqAQAMNUCQACFBAAh4gIBAIMEACH8AgEAgwQAIf0CAQCDBAAh_gJAAKkEACH_AkAAqQQAIQMAAAD2AgAgAQAAiAMAMCgAAIkDACADAAAA9gIAIAEAAPcCADACAADzAgAgBc8CAAClBAAw0AIAAI8DABDRAgAApQQAMPoCAgAAAAH7AgAApwQAIAEAAACMAwAgAQAAAIwDACAFzwIAAKUEADDQAgAAjwMAENECAAClBAAw-gICAKYEACH7AgAApwQAIAADAAAAjwMAIAEAAJADADACAACMAwAgAwAAAI8DACABAACQAwAwAgAAjAMAIAMAAACPAwAgAQAAkAMAMAIAAIwDACAC-gICAAAAAfsCgAAAAAEBHAAAlAMAIAL6AgIAAAAB-wKAAAAAAQEcAACWAwAwARwAAJYDADAC-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-AwAgAwAAADsAIAEAAMEDADACAAC-AwAgAwAAADsAIAEAAMEDADACAAC-AwAgBgYAAJUFACASAACWBQAg1QJAAAAAAdYCQAAAAAHiAgEAAAAB5gIBAAAAAQEcAADFAwAgBNUCQAAAAAHWAkAAAAAB4gIBAAAAAeYCAQAAAAEBHAAAxwMAMAEcAADHAwAwBgYAAIcFACASAACIBQAg1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5gIBAOoEACECAAAAvgMAIBwAAMoDACAE1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5gIBAOoEACECAAAAOwAgHAAAzAMAIAIAAAA7ACAcAADMAwAgAwAAAL4DACAjAADFAwAgJAAAygMAIAEAAAC-AwAgAQAAADsAIAMEAACEBQAgKwAAhgUAICwAAIUFACAHzwIAAI4EADDQAgAA0wMAENECAACOBAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh5gIBAIMEACEDAAAAOwAgAQAA0gMAMCgAANMDACADAAAAOwAgAQAAwQMAMAIAAL4DACABAAAANAAgAQAAADQAIAMAAAAyACABAAAzADACAAA0ACADAAAAMgAgAQAAMwAwAgAANAAgAwAAADIAIAEAADMAMAIAADQAIAgNAACDBQAgEwAAggUAINUCQAAAAAHWAkAAAAAB4gIBAAAAAeMCAQAAAAHkAgIAAAAB5QICAAAAAQEcAADbAwAgBtUCQAAAAAHWAkAAAAAB4gIBAAAAAeMCAQAAAAHkAgIAAAAB5QICAAAAAQEcAADdAwAwARwAAN0DADAIDQAA9QQAIBMAAPQEACDVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHjAgEA6gQAIeQCAgDoBAAh5QICAOgEACECAAAANAAgHAAA4AMAIAbVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHjAgEA6gQAIeQCAgDoBAAh5QICAOgEACECAAAAMgAgHAAA4gMAIAIAAAAyACAcAADiAwAgAwAAADQAICMAANsDACAkAADgAwAgAQAAADQAIAEAAAAyACAFBAAA7wQAICkAAPAEACAqAADzBAAgKwAA8gQAICwAAPEEACAJzwIAAI0EADDQAgAA6QMAENECAACNBAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh4wIBAIMEACHkAgIAhAQAIeUCAgCEBAAhAwAAADIAIAEAAOgDADAoAADpAwAgAwAAADIAIAEAADMAMAIAADQAIAEAAAAwACABAAAAMAAgAwAAAC4AIAEAAC8AMAIAADAAIAMAAAAuACABAAAvADACAAAwACADAAAALgAgAQAALwAwAgAAMAAgBxQAAO0EACAVAADuBAAg0gIBAAAAAdMCAQAAAAHUAgIAAAAB1QJAAAAAAdYCQAAAAAEBHAAA8QMAIAXSAgEAAAAB0wIBAAAAAdQCAgAAAAHVAkAAAAAB1gJAAAAAAQEcAADzAwAwARwAAPMDADAHFAAA6wQAIBUAAOwEACDSAgEA6gQAIdMCAQDqBAAh1AICAOgEACHVAkAA6QQAIdYCQADpBAAhAgAAADAAIBwAAPYDACAF0gIBAOoEACHTAgEA6gQAIdQCAgDoBAAh1QJAAOkEACHWAkAA6QQAIQIAAAAuACAcAAD4AwAgAgAAAC4AIBwAAPgDACADAAAAMAAgIwAA8QMAICQAAPYDACABAAAAMAAgAQAAAC4AIAUEAADjBAAgKQAA5AQAICoAAOcEACArAADmBAAgLAAA5QQAIAjPAgAAggQAMNACAAD_AwAQ0QIAAIIEADDSAgEAgwQAIdMCAQCDBAAh1AICAIQEACHVAkAAhQQAIdYCQACFBAAhAwAAAC4AIAEAAP4DADAoAAD_AwAgAwAAAC4AIAEAAC8AMAIAADAAIAjPAgAAggQAMNACAAD_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_QIBAIMEACH-AkAAqQQAIf8CQACpBAAhCwQAAJcEACArAACrBAAgLAAAqwQAINcCQAAAAAHYAkAAAAAF2QJAAAAABdoCQAAAAAHbAkAAAAAB3AJAAAAAAd0CQAAAAAHeAkAAqgQAIQsEAACXBAAgKwAAqwQAICwAAKsEACDXAkAAAAAB2AJAAAAABdkCQAAAAAXaAkAAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAAB3gJAAKoEACEI1wJAAAAAAdgCQAAAAAXZAkAAAAAF2gJAAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAd4CQACrBAAhCc8CAACsBAAw0AIAAPYCABDRAgAArAQAMNUCQACQBAAh4gIBAJ4EACH8AgEAngQAIf0CAQCeBAAh_gJAAK0EACH_AkAArQQAIQjXAkAAAAAB2AJAAAAABdkCQAAAAAXaAkAAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAAB3gJAAKsEACEKzwIAAK4EADDQAgAA8AIAENECAACuBAAw1QJAAIUEACHiAgEAgwQAIeYCAQCUBAAh6gIBAJQEACGAAwEAgwQAIYEDIACvBAAhggNAAKkEACEFBAAAhwQAICsAALEEACAsAACxBAAg1wIgAAAAAd4CIACwBAAhBQQAAIcEACArAACxBAAgLAAAsQQAINcCIAAAAAHeAiAAsAQAIQLXAiAAAAAB3gIgALEEACEGzwIAALIEADDQAgAA2AIAENECAACyBAAw1AICAIQEACHiAgIAhAQAIYMDAQCDBAAhBw0AALQEACDPAgAAswQAMNACAADFAgAQ0QIAALMEADDUAgIApgQAIeICAgCmBAAhgwMBAJ4EACED5wIAACQAIOgCAAAkACDpAgAAJAAgBs8CAAC1BAAw0AIAAL8CABDRAgAAtQQAMOICAgCEBAAhgwMBAIMEACGEAwIAhAQAIQcNAAC0BAAgzwIAALYEADDQAgAArAIAENECAAC2BAAw4gICAKYEACGDAwEAngQAIYQDAgCmBAAhB88CAAC3BAAw0AIAAKYCABDRAgAAtwQAMNMCAQCDBAAh1QJAAIUEACHWAkAAhQQAIeYCAQCDBAAhBs8CAAC4BAAw0AIAAJACABDRAgAAuAQAMNQCAgCEBAAh4gICAIQEACGDAwEAgwQAIQcNAAC0BAAgzwIAALkEADDQAgAA_QEAENECAAC5BAAw1AICAKYEACHiAgIApgQAIYMDAQCeBAAhCc8CAAC6BAAw0AIAAPcBABDRAgAAugQAMOICAQCDBAAh-gICAIQEACGDAwEAgwQAIYUDAQCDBAAhhgMCAIQEACGHAwIAhAQAIQnPAgAAuwQAMNACAADhAQAQ0QIAALsEADDVAkAAhQQAIdYCQACFBAAh4gIBAIMEACH-AkAAhQQAIYQDAQCDBAAhiAMBAIMEACEJzwIAALwEADDQAgAAzgEAENECAAC8BAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh_gJAAJAEACGEAwEAngQAIYgDAQCeBAAhBc8CAAC9BAAw0AIAAMgBABDRAgAAvQQAMOICAgCEBAAhgwMBAIMEACEGAwAAvwQAIM8CAAC-BAAw0AIAAAMAENECAAC-BAAw4gICAKYEACGDAwEAngQAIQPnAgAABQAg6AIAAAUAIOkCAAAFACAQzwIAAMAEADDQAgAAsAEAENECAADABAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh5gIBAIMEACGJAwEAgwQAIYoDAQCDBAAhiwMBAJQEACGMAwEAlAQAIY0DAQCUBAAhjgNAAKkEACGPA0AAqQQAIZADAQCUBAAhkQMBAJQEACELzwIAAMEEADDQAgAAmgEAENECAADBBAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh5gIBAIMEACH-AkAAhQQAIZIDAQCDBAAhkwMBAJQEACGUAwEAlAQAIQ7PAgAAwgQAMNACAACEAQAQ0QIAAMIEADDiAgEAgwQAIZUDAQCDBAAhlgMBAIMEACGXAwEAgwQAIZgDAQCDBAAhmQMBAIMEACGaAwEAgwQAIZsDAQCDBAAhnAMgAK8EACGdAyAArwQAIZ4DIACvBAAhCs8CAADDBAAw0AIAAG4AENECAADDBAAw4gIBAIMEACHmAgEAlAQAIeoCAQCUBAAhnwMBAIMEACGgAwEAgwQAIaEDAQCDBAAhogMBAJQEACELzwIAAMQEADDQAgAAVgAQ0QIAAMQEADDVAkAAhQQAIdYCQACFBAAh4gIBAIMEACHqAgEAgwQAIesCAgCVBAAhgwMBAIMEACGjAyAArwQAIaQDAQCUBAAhCw0AAMcEACATAADGBAAgzwIAAMUEADDQAgAAMgAQ0QIAAMUEADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHjAgEAngQAIeQCAgCmBAAh5QICAKYEACELBgAAkQQAIBIAAJIEACDPAgAAjwQAMNACAAA7ABDRAgAAjwQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAhpwMAADsAIKgDAAA7ACAD5wIAAC4AIOgCAAAuACDpAgAALgAgAtICAQAAAAHTAgEAAAABChQAAMoEACAVAADLBAAgzwIAAMkEADDQAgAALgAQ0QIAAMkEADDSAgEAngQAIdMCAQCeBAAh1AICAKYEACHVAkAAkAQAIdYCQACQBAAhDQ0AAMcEACATAADGBAAgzwIAAMUEADDQAgAAMgAQ0QIAAMUEADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHjAgEAngQAIeQCAgCmBAAh5QICAKYEACGnAwAAMgAgqAMAADIAIBAOAADNBAAgDwAAzgQAIBAAAM8EACARAADQBAAgFgAAxwQAIM8CAADMBAAw0AIAACQAENECAADMBAAw4gIBAJ4EACH6AgIApgQAIYMDAQCeBAAhhQMBAJ4EACGGAwIApgQAIYcDAgCmBAAhpwMAACQAIKgDAAAkACAODgAAzQQAIA8AAM4EACAQAADPBAAgEQAA0AQAIBYAAMcEACDPAgAAzAQAMNACAAAkABDRAgAAzAQAMOICAQCeBAAh-gICAKYEACGDAwEAngQAIYUDAQCeBAAhhgMCAKYEACGHAwIApgQAIQkNAAC0BAAgzwIAALYEADDQAgAArAIAENECAAC2BAAw4gICAKYEACGDAwEAngQAIYQDAgCmBAAhpwMAAKwCACCoAwAArAIAIAkNAAC0BAAgzwIAALMEADDQAgAAxQIAENECAACzBAAw1AICAKYEACHiAgIApgQAIYMDAQCeBAAhpwMAAMUCACCoAwAAxQIAIAkNAAC0BAAgzwIAALkEADDQAgAA_QEAENECAAC5BAAw1AICAKYEACHiAgIApgQAIYMDAQCeBAAhpwMAAP0BACCoAwAA_QEAIAPnAgAAIAAg6AIAACAAIOkCAAAgACAC0wIBAAAAAeYCAQAAAAEJBgAAkQQAIBUAAMsEACDPAgAA0gQAMNACAAAgABDRAgAA0gQAMNMCAQCeBAAh1QJAAJAEACHWAkAAkAQAIeYCAQCeBAAhCwYAANUEACDPAgAA0wQAMNACAAAbABDRAgAA0wQAMNUCQACQBAAh4gIBAJ4EACHmAgEAnwQAIeoCAQCfBAAhgAMBAJ4EACGBAyAA1AQAIYIDQACtBAAhAtcCIAAAAAHeAiAAsQQAIRQFAADdBAAgBwAA3gQAIAgAAN8EACALAADgBAAgDAAA4QQAIBEAANAEACATAADiBAAgzwIAANwEADDQAgAABQAQ0QIAANwEADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHqAgEAngQAIesCAgCgBAAhgwMBAJ4EACGjAyAA1AQAIaQDAQCfBAAhpwMAAAUAIKgDAAAFACAPCQAA1wQAIM8CAADWBAAw0AIAABYAENECAADWBAAw4gIBAJ4EACGVAwEAngQAIZYDAQCeBAAhlwMBAJ4EACGYAwEAngQAIZkDAQCeBAAhmgMBAJ4EACGbAwEAngQAIZwDIADUBAAhnQMgANQEACGeAyAA1AQAIQ4GAADVBAAgCgAA2QQAIM8CAADYBAAw0AIAABEAENECAADYBAAw4gIBAJ4EACHmAgEAnwQAIeoCAQCfBAAhnwMBAJ4EACGgAwEAngQAIaEDAQCeBAAhogMBAJ8EACGnAwAAEQAgqAMAABEAIAwGAADVBAAgCgAA2QQAIM8CAADYBAAw0AIAABEAENECAADYBAAw4gIBAJ4EACHmAgEAnwQAIeoCAQCfBAAhnwMBAJ4EACGgAwEAngQAIaEDAQCeBAAhogMBAJ8EACED5wIAABYAIOgCAAAWACDpAgAAFgAgEQYAAJEEACDPAgAA2gQAMNACAAANABDRAgAA2gQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAhiQMBAJ4EACGKAwEAngQAIYsDAQCfBAAhjAMBAJ8EACGNAwEAnwQAIY4DQACtBAAhjwNAAK0EACGQAwEAnwQAIZEDAQCfBAAhDAYAAJEEACDPAgAA2wQAMNACAAAJABDRAgAA2wQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAh_gJAAJAEACGSAwEAngQAIZMDAQCfBAAhlAMBAJ8EACESBQAA3QQAIAcAAN4EACAIAADfBAAgCwAA4AQAIAwAAOEEACARAADQBAAgEwAA4gQAIM8CAADcBAAw0AIAAAUAENECAADcBAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh6gIBAJ4EACHrAgIAoAQAIYMDAQCeBAAhowMgANQEACGkAwEAnwQAIQgDAAC_BAAgzwIAAL4EADDQAgAAAwAQ0QIAAL4EADDiAgIApgQAIYMDAQCeBAAhpwMAAAMAIKgDAAADACAD5wIAAAkAIOgCAAAJACDpAgAACQAgA-cCAAANACDoAgAADQAg6QIAAA0AIAPnAgAAEQAg6AIAABEAIOkCAAARACAD5wIAABsAIOgCAAAbACDpAgAAGwAgCwYAAJEEACASAACSBAAgzwIAAI8EADDQAgAAOwAQ0QIAAI8EADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHmAgEAngQAIacDAAA7ACCoAwAAOwAgAAAAAAAFrAMCAAAAAbIDAgAAAAGzAwIAAAABtAMCAAAAAbUDAgAAAAEBrANAAAAAAQGsAwEAAAABBSMAAPkHACAkAAD_BwAgqQMAAPoHACCqAwAA_gcAIK8DAAA0ACAFIwAA9wcAICQAAPwHACCpAwAA-AcAIKoDAAD7BwAgrwMAACYAIAMjAAD5BwAgqQMAAPoHACCvAwAANAAgAyMAAPcHACCpAwAA-AcAIK8DAAAmACAAAAAAAAUjAADxBwAgJAAA9QcAIKkDAADyBwAgqgMAAPQHACCvAwAAvgMAIAsjAAD2BAAwJAAA-wQAMKkDAAD3BAAwqgMAAPgEADCrAwAA-QQAIKwDAAD6BAAwrQMAAPoEADCuAwAA-gQAMK8DAAD6BAAwsAMAAPwEADCxAwAA_QQAMAUVAADuBAAg0wIBAAAAAdQCAgAAAAHVAkAAAAAB1gJAAAAAAQIAAAAwACAjAACBBQAgAwAAADAAICMAAIEFACAkAACABQAgARwAAPMHADALFAAAygQAIBUAAMsEACDPAgAAyQQAMNACAAAuABDRAgAAyQQAMNICAQCeBAAh0wIBAJ4EACHUAgIApgQAIdUCQACQBAAh1gJAAJAEACGlAwAAyAQAIAIAAAAwACAcAACABQAgAgAAAP4EACAcAAD_BAAgCM8CAAD9BAAw0AIAAP4EABDRAgAA_QQAMNICAQCeBAAh0wIBAJ4EACHUAgIApgQAIdUCQACQBAAh1gJAAJAEACEIzwIAAP0EADDQAgAA_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_gJAAAAAAZIDAQAAAAGTAwEAAAABlAMBAAAAAQIAAAALACAjAAD0BgAgAwAAAAsAICMAAPQGACAkAADzBgAgARwAAMEHADAMBgAAkQQAIM8CAADbBAAw0AIAAAkAENECAADbBAAw1QJAAJAEACHWAkAAkAQAIeICAQAAAAHmAgEAngQAIf4CQACQBAAhkgMBAAAAAZMDAQCfBAAhlAMBAJ8EACECAAAACwAgHAAA8wYAIAIAAADxBgAgHAAA8gYAIAvPAgAA8AYAMNACAADxBgAQ0QIAAPAGADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHmAgEAngQAIf4CQACQBAAhkgMBAJ4EACGTAwEAnwQAIZQDAQCfBAAhC88CAADwBgAw0AIAAPEGABDRAgAA8AYAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAh_gJAAJAEACGSAwEAngQAIZMDAQCfBAAhlAMBAJ8EACEH1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh_gJAAOkEACGSAwEA6gQAIZMDAQCfBQAhlAMBAJ8FACEH1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh_gJAAOkEACGSAwEA6gQAIZMDAQCfBQAhlAMBAJ8FACEH1QJAAAAAAdYCQAAAAAHiAgEAAAAB_gJAAAAAAZIDAQAAAAGTAwEAAAABlAMBAAAAAQ0HAAD2BgAgCAAA9wYAIAsAAPgGACAMAAD5BgAgEQAA-gYAIBMAAPsGACDVAkAAAAAB1gJAAAAAAeICAQAAAAHqAgEAAAABgwMBAAAAAaMDIAAAAAGkAwEAAAABBCMAAOkGADCpAwAA6gYAMKsDAADsBgAgrwMAAO0GADAEIwAA3QYAMKkDAADeBgAwqwMAAOAGACCvAwAA4QYAMAQjAADDBgAwqQMAAMQGADCrAwAAxgYAIK8DAADHBgAwBCMAALcGADCpAwAAuAYAMKsDAAC6BgAgrwMAALsGADAEIwAArgYAMKkDAACvBgAwqwMAALEGACCvAwAA0gUAMAMjAACpBgAgqQMAAKoGACCvAwAAvgMAIAQjAACYBgAwqQMAAJkGADCrAwAAmwYAIK8DAACcBgAwAAAAAAUjAAC8BwAgJAAAvwcAIKkDAAC9BwAgqgMAAL4HACCvAwAAAQAgAyMAALwHACCpAwAAvQcAIK8DAAABACAAAAAFIwAAtwcAICQAALoHACCpAwAAuAcAIKoDAAC5BwAgrwMAAAEAIAMjAAC3BwAgqQMAALgHACCvAwAAAQAgAAAABSMAALIHACAkAAC1BwAgqQMAALMHACCqAwAAtAcAIK8DAAATACADIwAAsgcAIKkDAACzBwAgrwMAABMAIAAAAAcjAACtBwAgJAAAsAcAIKkDAACuBwAgqgMAAK8HACCtAwAABQAgrgMAAAUAIK8DAAABACADIwAArQcAIKkDAACuBwAgrwMAAAEAIAAAAAAAByMAAKgHACAkAACrBwAgqQMAAKkHACCqAwAAqgcAIK0DAAADACCuAwAAAwAgrwMAALMBACADIwAAqAcAIKkDAACpBwAgrwMAALMBACACBgAAlwUAIBIAAJgFACAAAg0AAJoHACATAACZBwAgBQ4AAJ0HACAPAACeBwAgEAAAnwcAIBEAAKAHACAWAACaBwAgAQ0AAOIFACABDQAA4gUAIAENAADiBQAgAAUGAACXBQAgCgAAogcAIOYCAACZBQAg6gIAAJkFACCiAwAAmQUAIAABAwAA_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_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-KwB_LACAAQAAAAMEAIYBKwCHASwAiAEAAAADBACGASsAhwEsAIgBAAAABQQAjgEpAI8BKgCQASsAkQEsAJIBAAAAAAAFBACOASkAjwEqAJABKwCRASwAkgEAAAAFBACYASkAmQEqAJoBKwCbASwAnAEAAAAAAAUEAJgBKQCZASoAmgErAJsBLACcAQEGAAEBBgABAwQAoQErAKIBLACjAQAAAAMEAKEBKwCiASwAowEBEwAUARMAFAUEAKgBKQCpASoAqgErAKsBLACsAQAAAAAABQQAqAEpAKkBKgCqASsAqwEsAKwBAhQAExUACwIUABMVAAsFBACxASkAsgEqALMBKwC0ASwAtQEAAAAAAAUEALEBKQCyASoAswErALQBLAC1ARcCARhCARlDARpEARtFAR1HAR5JGR9KGiBNASFPGSJQGyVSASZTASdUGS1XHC5YIi9ZBjBaBjFbBjJcBjNdBjRfBjVhGTZiIzdlBjhnGTloJDpqBjtrBjxsGT1vJT5wKT9xB0ByB0FzB0J0B0N1B0R3B0V5GUZ6Kkd8B0h-GUl_K0qAAQdLgQEHTIIBGU2FASxOhgEwT4cBBFCIAQRRiQEEUooBBFOLAQRUjQEEVY8BGVaQATFXkgEEWJQBGVmVATJalgEEW5cBBFyYARldmwEzXpwBN1-dAQVgngEFYZ8BBWKgAQVjoQEFZKMBBWWlARlmpgE4Z6gBBWiqARlpqwE5aqwBBWutAQVsrgEZbbEBOm6yAT5vtAECcLUBAnG3AQJyuAECc7kBAnS7AQJ1vQEZdr4BP3fAAQJ4wgEZecMBQHrEAQJ7xQECfMYBGX3JAUF-ygFHf8wBSIABzQFIgQHQAUiCAdEBSIMB0gFIhAHUAUiFAdYBGYYB1wFJhwHZAUiIAdsBGYkB3AFKigHdAUiLAd4BSIwB3wEZjQHiAUuOAeMBT48B5AELkAHlAQuRAeYBC5IB5wELkwHoAQuUAeoBC5UB7AEZlgHtAVCXAe8BC5gB8QEZmQHyAVGaAfMBC5sB9AELnAH1ARmdAfgBUp4B-QFYnwH7ARCgAfwBEKEB_wEQogGAAhCjAYECEKQBgwIQpQGFAhmmAYYCWacBiAIQqAGKAhmpAYsCWqoBjAIQqwGNAhCsAY4CGa0BkQJbrgGSAmGvAZMCCrABlAIKsQGVAgqyAZYCCrMBlwIKtAGZAgq1AZsCGbYBnAJitwGeAgq4AaACGbkBoQJjugGiAgq7AaMCCrwBpAIZvQGnAmS-AagCaL8BqgIMwAGrAgzBAa4CDMIBrwIMwwGwAgzEAbICDMUBtAIZxgG1AmnHAbcCDMgBuQIZyQG6AmrKAbsCDMsBvAIMzAG9AhnNAcACa84BwQJxzwHDAg7QAcQCDtEBxwIO0gHIAg7TAckCDtQBywIO1QHNAhnWAc4CctcB0AIO2AHSAhnZAdMCc9oB1AIO2wHVAg7cAdYCGd0B2QJ03gHaAnrfAdsCCeAB3AIJ4QHdAgniAd4CCeMB3wIJ5AHhAgnlAeMCGeYB5AJ75wHnAgnoAekCGekB6gJ86gHsAgnrAe0CCewB7gIZ7QHxAn3uAfICgQHvAfQCggHwAfUCggHxAfgCggHyAfkCggHzAfoCggH0AfwCggH1Af4CGfYB_wKDAfcBgQOCAfgBgwMZ-QGEA4QB-gGFA4IB-wGGA4IB_AGHAxn9AYoDhQH-AYsDiQH_AY0DigGAAo4DigGBApEDigGCApIDigGDApMDigGEApUDigGFApcDGYYCmAOLAYcCmgOKAYgCnAMZiQKdA4wBigKeA4oBiwKfA4oBjAKgAxmNAqMDjQGOAqQDkwGPAqYDlAGQAqcDlAGRAqoDlAGSAqsDlAGTAqwDlAGUAq4DlAGVArADGZYCsQOVAZcCswOUAZgCtQMZmQK2A5YBmgK3A5QBmwK4A5QBnAK5AxmdArwDlwGeAr0DnQGfAr8DFKACwAMUoQLCAxSiAsMDFKMCxAMUpALGAxSlAsgDGaYCyQOeAacCywMUqALNAxmpAs4DnwGqAs8DFKsC0AMUrALRAxmtAtQDoAGuAtUDpAGvAtYDE7AC1wMTsQLYAxOyAtkDE7MC2gMTtALcAxO1At4DGbYC3wOlAbcC4QMTuALjAxm5AuQDpgG6AuUDE7sC5gMTvALnAxm9AuoDpwG-AusDrQG_AuwDEsAC7QMSwQLuAxLCAu8DEsMC8AMSxALyAxLFAvQDGcYC9QOuAccC9wMSyAL5AxnJAvoDrwHKAvsDEssC_AMSzAL9AxnNAoAEsAHOAoEEtgE" } async function decodeBase64AsWasm(wasmBase64: string): Promise { @@ -347,6 +347,36 @@ export interface PrismaClient< * ``` */ get auditLog(): Prisma.AuditLogDelegate; + + /** + * `prisma.schedule`: Exposes CRUD operations for the **Schedule** model. + * Example usage: + * ```ts + * // Fetch zero or more Schedules + * const schedules = await prisma.schedule.findMany() + * ``` + */ + get schedule(): Prisma.ScheduleDelegate; + + /** + * `prisma.block`: Exposes CRUD operations for the **Block** model. + * Example usage: + * ```ts + * // Fetch zero or more Blocks + * const blocks = await prisma.block.findMany() + * ``` + */ + get block(): Prisma.BlockDelegate; + + /** + * `prisma.blockProclamations`: Exposes CRUD operations for the **BlockProclamations** model. + * Example usage: + * ```ts + * // Fetch zero or more BlockProclamations + * const blockProclamations = await prisma.blockProclamations.findMany() + * ``` + */ + get blockProclamations(): Prisma.BlockProclamationsDelegate; } export function getPrismaClientClass(): PrismaClientConstructor { diff --git a/src/lib/generated/prisma/internal/prismaNamespace.ts b/src/lib/generated/prisma/internal/prismaNamespace.ts index 6985888..f2e5525 100644 --- a/src/lib/generated/prisma/internal/prismaNamespace.ts +++ b/src/lib/generated/prisma/internal/prismaNamespace.ts @@ -399,7 +399,10 @@ export const ModelName = { LicenseKey: 'LicenseKey', ApiKey: 'ApiKey', ColorPalette: 'ColorPalette', - AuditLog: 'AuditLog' + AuditLog: 'AuditLog', + Schedule: 'Schedule', + Block: 'Block', + BlockProclamations: 'BlockProclamations' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -415,7 +418,7 @@ export type TypeMap + fields: Prisma.ScheduleFieldRefs + operations: { + findUnique: { + args: Prisma.ScheduleFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.ScheduleFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.ScheduleFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.ScheduleFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.ScheduleFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.ScheduleCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.ScheduleCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.ScheduleCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.ScheduleDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.ScheduleUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.ScheduleDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.ScheduleUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.ScheduleUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.ScheduleUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.ScheduleAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.ScheduleGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.ScheduleCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + Block: { + payload: Prisma.$BlockPayload + fields: Prisma.BlockFieldRefs + operations: { + findUnique: { + args: Prisma.BlockFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.BlockFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.BlockFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.BlockFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.BlockFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.BlockCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.BlockCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.BlockCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.BlockDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.BlockUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.BlockDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.BlockUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.BlockUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.BlockUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.BlockAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.BlockGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.BlockCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + BlockProclamations: { + payload: Prisma.$BlockProclamationsPayload + fields: Prisma.BlockProclamationsFieldRefs + operations: { + findUnique: { + args: Prisma.BlockProclamationsFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.BlockProclamationsFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.BlockProclamationsFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.BlockProclamationsFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.BlockProclamationsFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.BlockProclamationsCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.BlockProclamationsCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.BlockProclamationsCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.BlockProclamationsDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.BlockProclamationsUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.BlockProclamationsDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.BlockProclamationsUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.BlockProclamationsUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.BlockProclamationsUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.BlockProclamationsAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.BlockProclamationsGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.BlockProclamationsCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } } } & { other: { @@ -1840,6 +2065,39 @@ export const AuditLogScalarFieldEnum = { export type AuditLogScalarFieldEnum = (typeof AuditLogScalarFieldEnum)[keyof typeof AuditLogScalarFieldEnum] +export const ScheduleScalarFieldEnum = { + id: 'id', + userId: 'userId', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type ScheduleScalarFieldEnum = (typeof ScheduleScalarFieldEnum)[keyof typeof ScheduleScalarFieldEnum] + + +export const BlockScalarFieldEnum = { + id: 'id', + scheduleId: 'scheduleId', + startMinutes: 'startMinutes', + endMinutes: 'endMinutes', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type BlockScalarFieldEnum = (typeof BlockScalarFieldEnum)[keyof typeof BlockScalarFieldEnum] + + +export const BlockProclamationsScalarFieldEnum = { + blockId: 'blockId', + proclamationId: 'proclamationId', + sortOrder: 'sortOrder', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type BlockProclamationsScalarFieldEnum = (typeof BlockProclamationsScalarFieldEnum)[keyof typeof BlockProclamationsScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' @@ -2096,6 +2354,9 @@ export type GlobalOmitConfig = { apiKey?: Prisma.ApiKeyOmit colorPalette?: Prisma.ColorPaletteOmit auditLog?: Prisma.AuditLogOmit + schedule?: Prisma.ScheduleOmit + block?: Prisma.BlockOmit + blockProclamations?: Prisma.BlockProclamationsOmit } /* Types for Logging */ diff --git a/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts b/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts index ec0de97..a44f1fa 100644 --- a/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -66,7 +66,10 @@ export const ModelName = { LicenseKey: 'LicenseKey', ApiKey: 'ApiKey', ColorPalette: 'ColorPalette', - AuditLog: 'AuditLog' + AuditLog: 'AuditLog', + Schedule: 'Schedule', + Block: 'Block', + BlockProclamations: 'BlockProclamations' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -283,6 +286,39 @@ export const AuditLogScalarFieldEnum = { export type AuditLogScalarFieldEnum = (typeof AuditLogScalarFieldEnum)[keyof typeof AuditLogScalarFieldEnum] +export const ScheduleScalarFieldEnum = { + id: 'id', + userId: 'userId', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type ScheduleScalarFieldEnum = (typeof ScheduleScalarFieldEnum)[keyof typeof ScheduleScalarFieldEnum] + + +export const BlockScalarFieldEnum = { + id: 'id', + scheduleId: 'scheduleId', + startMinutes: 'startMinutes', + endMinutes: 'endMinutes', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type BlockScalarFieldEnum = (typeof BlockScalarFieldEnum)[keyof typeof BlockScalarFieldEnum] + + +export const BlockProclamationsScalarFieldEnum = { + blockId: 'blockId', + proclamationId: 'proclamationId', + sortOrder: 'sortOrder', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type BlockProclamationsScalarFieldEnum = (typeof BlockProclamationsScalarFieldEnum)[keyof typeof BlockProclamationsScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' diff --git a/src/lib/generated/prisma/models.ts b/src/lib/generated/prisma/models.ts index 73bf210..64cd13f 100644 --- a/src/lib/generated/prisma/models.ts +++ b/src/lib/generated/prisma/models.ts @@ -24,4 +24,7 @@ export type * from './models/LicenseKey.ts' export type * from './models/ApiKey.ts' export type * from './models/ColorPalette.ts' export type * from './models/AuditLog.ts' +export type * from './models/Schedule.ts' +export type * from './models/Block.ts' +export type * from './models/BlockProclamations.ts' export type * from './commonInputTypes.ts' \ No newline at end of file diff --git a/src/lib/generated/prisma/models/Block.ts b/src/lib/generated/prisma/models/Block.ts new file mode 100644 index 0000000..e922b49 --- /dev/null +++ b/src/lib/generated/prisma/models/Block.ts @@ -0,0 +1,1571 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `Block` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model Block + * + */ +export type BlockModel = runtime.Types.Result.DefaultSelection + +export type AggregateBlock = { + _count: BlockCountAggregateOutputType | null + _avg: BlockAvgAggregateOutputType | null + _sum: BlockSumAggregateOutputType | null + _min: BlockMinAggregateOutputType | null + _max: BlockMaxAggregateOutputType | null +} + +export type BlockAvgAggregateOutputType = { + startMinutes: number | null + endMinutes: number | null +} + +export type BlockSumAggregateOutputType = { + startMinutes: number | null + endMinutes: number | null +} + +export type BlockMinAggregateOutputType = { + id: string | null + scheduleId: string | null + startMinutes: number | null + endMinutes: number | null + createdAt: Date | null + updatedAt: Date | null +} + +export type BlockMaxAggregateOutputType = { + id: string | null + scheduleId: string | null + startMinutes: number | null + endMinutes: number | null + createdAt: Date | null + updatedAt: Date | null +} + +export type BlockCountAggregateOutputType = { + id: number + scheduleId: number + startMinutes: number + endMinutes: number + createdAt: number + updatedAt: number + _all: number +} + + +export type BlockAvgAggregateInputType = { + startMinutes?: true + endMinutes?: true +} + +export type BlockSumAggregateInputType = { + startMinutes?: true + endMinutes?: true +} + +export type BlockMinAggregateInputType = { + id?: true + scheduleId?: true + startMinutes?: true + endMinutes?: true + createdAt?: true + updatedAt?: true +} + +export type BlockMaxAggregateInputType = { + id?: true + scheduleId?: true + startMinutes?: true + endMinutes?: true + createdAt?: true + updatedAt?: true +} + +export type BlockCountAggregateInputType = { + id?: true + scheduleId?: true + startMinutes?: true + endMinutes?: true + createdAt?: true + updatedAt?: true + _all?: true +} + +export type BlockAggregateArgs = { + /** + * Filter which Block to aggregate. + */ + where?: Prisma.BlockWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Blocks to fetch. + */ + orderBy?: Prisma.BlockOrderByWithRelationInput | Prisma.BlockOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.BlockWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Blocks from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Blocks. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned Blocks + **/ + _count?: true | BlockCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: BlockAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: BlockSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: BlockMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: BlockMaxAggregateInputType +} + +export type GetBlockAggregateType = { + [P in keyof T & keyof AggregateBlock]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type BlockGroupByArgs = { + where?: Prisma.BlockWhereInput + orderBy?: Prisma.BlockOrderByWithAggregationInput | Prisma.BlockOrderByWithAggregationInput[] + by: Prisma.BlockScalarFieldEnum[] | Prisma.BlockScalarFieldEnum + having?: Prisma.BlockScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: BlockCountAggregateInputType | true + _avg?: BlockAvgAggregateInputType + _sum?: BlockSumAggregateInputType + _min?: BlockMinAggregateInputType + _max?: BlockMaxAggregateInputType +} + +export type BlockGroupByOutputType = { + id: string + scheduleId: string + startMinutes: number + endMinutes: number + createdAt: Date + updatedAt: Date + _count: BlockCountAggregateOutputType | null + _avg: BlockAvgAggregateOutputType | null + _sum: BlockSumAggregateOutputType | null + _min: BlockMinAggregateOutputType | null + _max: BlockMaxAggregateOutputType | null +} + +export type GetBlockGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof BlockGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type BlockWhereInput = { + AND?: Prisma.BlockWhereInput | Prisma.BlockWhereInput[] + OR?: Prisma.BlockWhereInput[] + NOT?: Prisma.BlockWhereInput | Prisma.BlockWhereInput[] + id?: Prisma.StringFilter<"Block"> | string + scheduleId?: Prisma.StringFilter<"Block"> | string + startMinutes?: Prisma.IntFilter<"Block"> | number + endMinutes?: Prisma.IntFilter<"Block"> | number + createdAt?: Prisma.DateTimeFilter<"Block"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"Block"> | Date | string + schedule?: Prisma.XOR + proclamations?: Prisma.BlockProclamationsListRelationFilter +} + +export type BlockOrderByWithRelationInput = { + id?: Prisma.SortOrder + scheduleId?: Prisma.SortOrder + startMinutes?: Prisma.SortOrder + endMinutes?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + schedule?: Prisma.ScheduleOrderByWithRelationInput + proclamations?: Prisma.BlockProclamationsOrderByRelationAggregateInput +} + +export type BlockWhereUniqueInput = Prisma.AtLeast<{ + id?: string + AND?: Prisma.BlockWhereInput | Prisma.BlockWhereInput[] + OR?: Prisma.BlockWhereInput[] + NOT?: Prisma.BlockWhereInput | Prisma.BlockWhereInput[] + scheduleId?: Prisma.StringFilter<"Block"> | string + startMinutes?: Prisma.IntFilter<"Block"> | number + endMinutes?: Prisma.IntFilter<"Block"> | number + createdAt?: Prisma.DateTimeFilter<"Block"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"Block"> | Date | string + schedule?: Prisma.XOR + proclamations?: Prisma.BlockProclamationsListRelationFilter +}, "id"> + +export type BlockOrderByWithAggregationInput = { + id?: Prisma.SortOrder + scheduleId?: Prisma.SortOrder + startMinutes?: Prisma.SortOrder + endMinutes?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _count?: Prisma.BlockCountOrderByAggregateInput + _avg?: Prisma.BlockAvgOrderByAggregateInput + _max?: Prisma.BlockMaxOrderByAggregateInput + _min?: Prisma.BlockMinOrderByAggregateInput + _sum?: Prisma.BlockSumOrderByAggregateInput +} + +export type BlockScalarWhereWithAggregatesInput = { + AND?: Prisma.BlockScalarWhereWithAggregatesInput | Prisma.BlockScalarWhereWithAggregatesInput[] + OR?: Prisma.BlockScalarWhereWithAggregatesInput[] + NOT?: Prisma.BlockScalarWhereWithAggregatesInput | Prisma.BlockScalarWhereWithAggregatesInput[] + id?: Prisma.StringWithAggregatesFilter<"Block"> | string + scheduleId?: Prisma.StringWithAggregatesFilter<"Block"> | string + startMinutes?: Prisma.IntWithAggregatesFilter<"Block"> | number + endMinutes?: Prisma.IntWithAggregatesFilter<"Block"> | number + createdAt?: Prisma.DateTimeWithAggregatesFilter<"Block"> | Date | string + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Block"> | Date | string +} + +export type BlockCreateInput = { + id?: string + startMinutes: number + endMinutes: number + createdAt?: Date | string + updatedAt?: Date | string + schedule: Prisma.ScheduleCreateNestedOneWithoutBlocksInput + proclamations?: Prisma.BlockProclamationsCreateNestedManyWithoutBlockInput +} + +export type BlockUncheckedCreateInput = { + id?: string + scheduleId: string + startMinutes: number + endMinutes: number + createdAt?: Date | string + updatedAt?: Date | string + proclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutBlockInput +} + +export type BlockUpdateInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + schedule?: Prisma.ScheduleUpdateOneRequiredWithoutBlocksNestedInput + proclamations?: Prisma.BlockProclamationsUpdateManyWithoutBlockNestedInput +} + +export type BlockUncheckedUpdateInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + scheduleId?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + proclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutBlockNestedInput +} + +export type BlockCreateManyInput = { + id?: string + scheduleId: string + startMinutes: number + endMinutes: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockUpdateManyMutationInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockUncheckedUpdateManyInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + scheduleId?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockListRelationFilter = { + every?: Prisma.BlockWhereInput + some?: Prisma.BlockWhereInput + none?: Prisma.BlockWhereInput +} + +export type BlockOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type BlockCountOrderByAggregateInput = { + id?: Prisma.SortOrder + scheduleId?: Prisma.SortOrder + startMinutes?: Prisma.SortOrder + endMinutes?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type BlockAvgOrderByAggregateInput = { + startMinutes?: Prisma.SortOrder + endMinutes?: Prisma.SortOrder +} + +export type BlockMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + scheduleId?: Prisma.SortOrder + startMinutes?: Prisma.SortOrder + endMinutes?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type BlockMinOrderByAggregateInput = { + id?: Prisma.SortOrder + scheduleId?: Prisma.SortOrder + startMinutes?: Prisma.SortOrder + endMinutes?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type BlockSumOrderByAggregateInput = { + startMinutes?: Prisma.SortOrder + endMinutes?: Prisma.SortOrder +} + +export type BlockScalarRelationFilter = { + is?: Prisma.BlockWhereInput + isNot?: Prisma.BlockWhereInput +} + +export type BlockCreateNestedManyWithoutScheduleInput = { + create?: Prisma.XOR | Prisma.BlockCreateWithoutScheduleInput[] | Prisma.BlockUncheckedCreateWithoutScheduleInput[] + connectOrCreate?: Prisma.BlockCreateOrConnectWithoutScheduleInput | Prisma.BlockCreateOrConnectWithoutScheduleInput[] + createMany?: Prisma.BlockCreateManyScheduleInputEnvelope + connect?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] +} + +export type BlockUncheckedCreateNestedManyWithoutScheduleInput = { + create?: Prisma.XOR | Prisma.BlockCreateWithoutScheduleInput[] | Prisma.BlockUncheckedCreateWithoutScheduleInput[] + connectOrCreate?: Prisma.BlockCreateOrConnectWithoutScheduleInput | Prisma.BlockCreateOrConnectWithoutScheduleInput[] + createMany?: Prisma.BlockCreateManyScheduleInputEnvelope + connect?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] +} + +export type BlockUpdateManyWithoutScheduleNestedInput = { + create?: Prisma.XOR | Prisma.BlockCreateWithoutScheduleInput[] | Prisma.BlockUncheckedCreateWithoutScheduleInput[] + connectOrCreate?: Prisma.BlockCreateOrConnectWithoutScheduleInput | Prisma.BlockCreateOrConnectWithoutScheduleInput[] + upsert?: Prisma.BlockUpsertWithWhereUniqueWithoutScheduleInput | Prisma.BlockUpsertWithWhereUniqueWithoutScheduleInput[] + createMany?: Prisma.BlockCreateManyScheduleInputEnvelope + set?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] + disconnect?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] + delete?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] + connect?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] + update?: Prisma.BlockUpdateWithWhereUniqueWithoutScheduleInput | Prisma.BlockUpdateWithWhereUniqueWithoutScheduleInput[] + updateMany?: Prisma.BlockUpdateManyWithWhereWithoutScheduleInput | Prisma.BlockUpdateManyWithWhereWithoutScheduleInput[] + deleteMany?: Prisma.BlockScalarWhereInput | Prisma.BlockScalarWhereInput[] +} + +export type BlockUncheckedUpdateManyWithoutScheduleNestedInput = { + create?: Prisma.XOR | Prisma.BlockCreateWithoutScheduleInput[] | Prisma.BlockUncheckedCreateWithoutScheduleInput[] + connectOrCreate?: Prisma.BlockCreateOrConnectWithoutScheduleInput | Prisma.BlockCreateOrConnectWithoutScheduleInput[] + upsert?: Prisma.BlockUpsertWithWhereUniqueWithoutScheduleInput | Prisma.BlockUpsertWithWhereUniqueWithoutScheduleInput[] + createMany?: Prisma.BlockCreateManyScheduleInputEnvelope + set?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] + disconnect?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] + delete?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] + connect?: Prisma.BlockWhereUniqueInput | Prisma.BlockWhereUniqueInput[] + update?: Prisma.BlockUpdateWithWhereUniqueWithoutScheduleInput | Prisma.BlockUpdateWithWhereUniqueWithoutScheduleInput[] + updateMany?: Prisma.BlockUpdateManyWithWhereWithoutScheduleInput | Prisma.BlockUpdateManyWithWhereWithoutScheduleInput[] + deleteMany?: Prisma.BlockScalarWhereInput | Prisma.BlockScalarWhereInput[] +} + +export type BlockCreateNestedOneWithoutProclamationsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.BlockCreateOrConnectWithoutProclamationsInput + connect?: Prisma.BlockWhereUniqueInput +} + +export type BlockUpdateOneRequiredWithoutProclamationsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.BlockCreateOrConnectWithoutProclamationsInput + upsert?: Prisma.BlockUpsertWithoutProclamationsInput + connect?: Prisma.BlockWhereUniqueInput + update?: Prisma.XOR, Prisma.BlockUncheckedUpdateWithoutProclamationsInput> +} + +export type BlockCreateWithoutScheduleInput = { + id?: string + startMinutes: number + endMinutes: number + createdAt?: Date | string + updatedAt?: Date | string + proclamations?: Prisma.BlockProclamationsCreateNestedManyWithoutBlockInput +} + +export type BlockUncheckedCreateWithoutScheduleInput = { + id?: string + startMinutes: number + endMinutes: number + createdAt?: Date | string + updatedAt?: Date | string + proclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutBlockInput +} + +export type BlockCreateOrConnectWithoutScheduleInput = { + where: Prisma.BlockWhereUniqueInput + create: Prisma.XOR +} + +export type BlockCreateManyScheduleInputEnvelope = { + data: Prisma.BlockCreateManyScheduleInput | Prisma.BlockCreateManyScheduleInput[] + skipDuplicates?: boolean +} + +export type BlockUpsertWithWhereUniqueWithoutScheduleInput = { + where: Prisma.BlockWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type BlockUpdateWithWhereUniqueWithoutScheduleInput = { + where: Prisma.BlockWhereUniqueInput + data: Prisma.XOR +} + +export type BlockUpdateManyWithWhereWithoutScheduleInput = { + where: Prisma.BlockScalarWhereInput + data: Prisma.XOR +} + +export type BlockScalarWhereInput = { + AND?: Prisma.BlockScalarWhereInput | Prisma.BlockScalarWhereInput[] + OR?: Prisma.BlockScalarWhereInput[] + NOT?: Prisma.BlockScalarWhereInput | Prisma.BlockScalarWhereInput[] + id?: Prisma.StringFilter<"Block"> | string + scheduleId?: Prisma.StringFilter<"Block"> | string + startMinutes?: Prisma.IntFilter<"Block"> | number + endMinutes?: Prisma.IntFilter<"Block"> | number + createdAt?: Prisma.DateTimeFilter<"Block"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"Block"> | Date | string +} + +export type BlockCreateWithoutProclamationsInput = { + id?: string + startMinutes: number + endMinutes: number + createdAt?: Date | string + updatedAt?: Date | string + schedule: Prisma.ScheduleCreateNestedOneWithoutBlocksInput +} + +export type BlockUncheckedCreateWithoutProclamationsInput = { + id?: string + scheduleId: string + startMinutes: number + endMinutes: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockCreateOrConnectWithoutProclamationsInput = { + where: Prisma.BlockWhereUniqueInput + create: Prisma.XOR +} + +export type BlockUpsertWithoutProclamationsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.BlockWhereInput +} + +export type BlockUpdateToOneWithWhereWithoutProclamationsInput = { + where?: Prisma.BlockWhereInput + data: Prisma.XOR +} + +export type BlockUpdateWithoutProclamationsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + schedule?: Prisma.ScheduleUpdateOneRequiredWithoutBlocksNestedInput +} + +export type BlockUncheckedUpdateWithoutProclamationsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + scheduleId?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockCreateManyScheduleInput = { + id?: string + startMinutes: number + endMinutes: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockUpdateWithoutScheduleInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + proclamations?: Prisma.BlockProclamationsUpdateManyWithoutBlockNestedInput +} + +export type BlockUncheckedUpdateWithoutScheduleInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + proclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutBlockNestedInput +} + +export type BlockUncheckedUpdateManyWithoutScheduleInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + startMinutes?: Prisma.IntFieldUpdateOperationsInput | number + endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + +/** + * Count Type BlockCountOutputType + */ + +export type BlockCountOutputType = { + proclamations: number +} + +export type BlockCountOutputTypeSelect = { + proclamations?: boolean | BlockCountOutputTypeCountProclamationsArgs +} + +/** + * BlockCountOutputType without action + */ +export type BlockCountOutputTypeDefaultArgs = { + /** + * Select specific fields to fetch from the BlockCountOutputType + */ + select?: Prisma.BlockCountOutputTypeSelect | null +} + +/** + * BlockCountOutputType without action + */ +export type BlockCountOutputTypeCountProclamationsArgs = { + where?: Prisma.BlockProclamationsWhereInput +} + + +export type BlockSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + scheduleId?: boolean + startMinutes?: boolean + endMinutes?: boolean + createdAt?: boolean + updatedAt?: boolean + schedule?: boolean | Prisma.ScheduleDefaultArgs + proclamations?: boolean | Prisma.Block$proclamationsArgs + _count?: boolean | Prisma.BlockCountOutputTypeDefaultArgs +}, ExtArgs["result"]["block"]> + +export type BlockSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + scheduleId?: boolean + startMinutes?: boolean + endMinutes?: boolean + createdAt?: boolean + updatedAt?: boolean + schedule?: boolean | Prisma.ScheduleDefaultArgs +}, ExtArgs["result"]["block"]> + +export type BlockSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + scheduleId?: boolean + startMinutes?: boolean + endMinutes?: boolean + createdAt?: boolean + updatedAt?: boolean + schedule?: boolean | Prisma.ScheduleDefaultArgs +}, ExtArgs["result"]["block"]> + +export type BlockSelectScalar = { + id?: boolean + scheduleId?: boolean + startMinutes?: boolean + endMinutes?: boolean + createdAt?: boolean + updatedAt?: boolean +} + +export type BlockOmit = runtime.Types.Extensions.GetOmit<"id" | "scheduleId" | "startMinutes" | "endMinutes" | "createdAt" | "updatedAt", ExtArgs["result"]["block"]> +export type BlockInclude = { + schedule?: boolean | Prisma.ScheduleDefaultArgs + proclamations?: boolean | Prisma.Block$proclamationsArgs + _count?: boolean | Prisma.BlockCountOutputTypeDefaultArgs +} +export type BlockIncludeCreateManyAndReturn = { + schedule?: boolean | Prisma.ScheduleDefaultArgs +} +export type BlockIncludeUpdateManyAndReturn = { + schedule?: boolean | Prisma.ScheduleDefaultArgs +} + +export type $BlockPayload = { + name: "Block" + objects: { + schedule: Prisma.$SchedulePayload + proclamations: Prisma.$BlockProclamationsPayload[] + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: string + scheduleId: string + startMinutes: number + endMinutes: number + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["block"]> + composites: {} +} + +export type BlockGetPayload = runtime.Types.Result.GetResult + +export type BlockCountArgs = + Omit & { + select?: BlockCountAggregateInputType | true + } + +export interface BlockDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['Block'], meta: { name: 'Block' } } + /** + * Find zero or one Block that matches the filter. + * @param {BlockFindUniqueArgs} args - Arguments to find a Block + * @example + * // Get one Block + * const block = await prisma.block.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__BlockClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one Block that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {BlockFindUniqueOrThrowArgs} args - Arguments to find a Block + * @example + * // Get one Block + * const block = await prisma.block.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__BlockClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first Block that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockFindFirstArgs} args - Arguments to find a Block + * @example + * // Get one Block + * const block = await prisma.block.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__BlockClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first Block that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockFindFirstOrThrowArgs} args - Arguments to find a Block + * @example + * // Get one Block + * const block = await prisma.block.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__BlockClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more Blocks that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all Blocks + * const blocks = await prisma.block.findMany() + * + * // Get first 10 Blocks + * const blocks = await prisma.block.findMany({ take: 10 }) + * + * // Only select the `id` + * const blockWithIdOnly = await prisma.block.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a Block. + * @param {BlockCreateArgs} args - Arguments to create a Block. + * @example + * // Create one Block + * const Block = await prisma.block.create({ + * data: { + * // ... data to create a Block + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__BlockClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many Blocks. + * @param {BlockCreateManyArgs} args - Arguments to create many Blocks. + * @example + * // Create many Blocks + * const block = await prisma.block.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create many Blocks and returns the data saved in the database. + * @param {BlockCreateManyAndReturnArgs} args - Arguments to create many Blocks. + * @example + * // Create many Blocks + * const block = await prisma.block.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Blocks and only return the `id` + * const blockWithIdOnly = await prisma.block.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + + /** + * Delete a Block. + * @param {BlockDeleteArgs} args - Arguments to delete one Block. + * @example + * // Delete one Block + * const Block = await prisma.block.delete({ + * where: { + * // ... filter to delete one Block + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__BlockClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one Block. + * @param {BlockUpdateArgs} args - Arguments to update one Block. + * @example + * // Update one Block + * const block = await prisma.block.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__BlockClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more Blocks. + * @param {BlockDeleteManyArgs} args - Arguments to filter Blocks to delete. + * @example + * // Delete a few Blocks + * const { count } = await prisma.block.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more Blocks. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many Blocks + * const block = await prisma.block.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more Blocks and returns the data updated in the database. + * @param {BlockUpdateManyAndReturnArgs} args - Arguments to update many Blocks. + * @example + * // Update many Blocks + * const block = await prisma.block.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Blocks and only return the `id` + * const blockWithIdOnly = await prisma.block.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + + /** + * Create or update one Block. + * @param {BlockUpsertArgs} args - Arguments to update or create a Block. + * @example + * // Update or create a Block + * const block = await prisma.block.upsert({ + * create: { + * // ... data to create a Block + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the Block we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__BlockClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of Blocks. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockCountArgs} args - Arguments to filter Blocks to count. + * @example + * // Count the number of Blocks + * const count = await prisma.block.count({ + * where: { + * // ... the filter for the Blocks we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a Block. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by Block. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends BlockGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: BlockGroupByArgs['orderBy'] } + : { orderBy?: BlockGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetBlockGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the Block model + */ +readonly fields: BlockFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for Block. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__BlockClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + schedule = {}>(args?: Prisma.Subset>): Prisma.Prisma__ScheduleClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + proclamations = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the Block model + */ +export interface BlockFieldRefs { + readonly id: Prisma.FieldRef<"Block", 'String'> + readonly scheduleId: Prisma.FieldRef<"Block", 'String'> + readonly startMinutes: Prisma.FieldRef<"Block", 'Int'> + readonly endMinutes: Prisma.FieldRef<"Block", 'Int'> + readonly createdAt: Prisma.FieldRef<"Block", 'DateTime'> + readonly updatedAt: Prisma.FieldRef<"Block", 'DateTime'> +} + + +// Custom InputTypes +/** + * Block findUnique + */ +export type BlockFindUniqueArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * Filter, which Block to fetch. + */ + where: Prisma.BlockWhereUniqueInput +} + +/** + * Block findUniqueOrThrow + */ +export type BlockFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * Filter, which Block to fetch. + */ + where: Prisma.BlockWhereUniqueInput +} + +/** + * Block findFirst + */ +export type BlockFindFirstArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * Filter, which Block to fetch. + */ + where?: Prisma.BlockWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Blocks to fetch. + */ + orderBy?: Prisma.BlockOrderByWithRelationInput | Prisma.BlockOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for Blocks. + */ + cursor?: Prisma.BlockWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Blocks from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Blocks. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Blocks. + */ + distinct?: Prisma.BlockScalarFieldEnum | Prisma.BlockScalarFieldEnum[] +} + +/** + * Block findFirstOrThrow + */ +export type BlockFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * Filter, which Block to fetch. + */ + where?: Prisma.BlockWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Blocks to fetch. + */ + orderBy?: Prisma.BlockOrderByWithRelationInput | Prisma.BlockOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for Blocks. + */ + cursor?: Prisma.BlockWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Blocks from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Blocks. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Blocks. + */ + distinct?: Prisma.BlockScalarFieldEnum | Prisma.BlockScalarFieldEnum[] +} + +/** + * Block findMany + */ +export type BlockFindManyArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * Filter, which Blocks to fetch. + */ + where?: Prisma.BlockWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Blocks to fetch. + */ + orderBy?: Prisma.BlockOrderByWithRelationInput | Prisma.BlockOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing Blocks. + */ + cursor?: Prisma.BlockWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Blocks from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Blocks. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Blocks. + */ + distinct?: Prisma.BlockScalarFieldEnum | Prisma.BlockScalarFieldEnum[] +} + +/** + * Block create + */ +export type BlockCreateArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * The data needed to create a Block. + */ + data: Prisma.XOR +} + +/** + * Block createMany + */ +export type BlockCreateManyArgs = { + /** + * The data used to create many Blocks. + */ + data: Prisma.BlockCreateManyInput | Prisma.BlockCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * Block createManyAndReturn + */ +export type BlockCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * The data used to create many Blocks. + */ + data: Prisma.BlockCreateManyInput | Prisma.BlockCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockIncludeCreateManyAndReturn | null +} + +/** + * Block update + */ +export type BlockUpdateArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * The data needed to update a Block. + */ + data: Prisma.XOR + /** + * Choose, which Block to update. + */ + where: Prisma.BlockWhereUniqueInput +} + +/** + * Block updateMany + */ +export type BlockUpdateManyArgs = { + /** + * The data used to update Blocks. + */ + data: Prisma.XOR + /** + * Filter which Blocks to update + */ + where?: Prisma.BlockWhereInput + /** + * Limit how many Blocks to update. + */ + limit?: number +} + +/** + * Block updateManyAndReturn + */ +export type BlockUpdateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * The data used to update Blocks. + */ + data: Prisma.XOR + /** + * Filter which Blocks to update + */ + where?: Prisma.BlockWhereInput + /** + * Limit how many Blocks to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockIncludeUpdateManyAndReturn | null +} + +/** + * Block upsert + */ +export type BlockUpsertArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * The filter to search for the Block to update in case it exists. + */ + where: Prisma.BlockWhereUniqueInput + /** + * In case the Block found by the `where` argument doesn't exist, create a new Block with this data. + */ + create: Prisma.XOR + /** + * In case the Block was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * Block delete + */ +export type BlockDeleteArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + /** + * Filter which Block to delete. + */ + where: Prisma.BlockWhereUniqueInput +} + +/** + * Block deleteMany + */ +export type BlockDeleteManyArgs = { + /** + * Filter which Blocks to delete + */ + where?: Prisma.BlockWhereInput + /** + * Limit how many Blocks to delete. + */ + limit?: number +} + +/** + * Block.proclamations + */ +export type Block$proclamationsArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + where?: Prisma.BlockProclamationsWhereInput + orderBy?: Prisma.BlockProclamationsOrderByWithRelationInput | Prisma.BlockProclamationsOrderByWithRelationInput[] + cursor?: Prisma.BlockProclamationsWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.BlockProclamationsScalarFieldEnum | Prisma.BlockProclamationsScalarFieldEnum[] +} + +/** + * Block without action + */ +export type BlockDefaultArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null +} diff --git a/src/lib/generated/prisma/models/BlockProclamations.ts b/src/lib/generated/prisma/models/BlockProclamations.ts new file mode 100644 index 0000000..b200fc7 --- /dev/null +++ b/src/lib/generated/prisma/models/BlockProclamations.ts @@ -0,0 +1,1515 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `BlockProclamations` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model BlockProclamations + * + */ +export type BlockProclamationsModel = runtime.Types.Result.DefaultSelection + +export type AggregateBlockProclamations = { + _count: BlockProclamationsCountAggregateOutputType | null + _avg: BlockProclamationsAvgAggregateOutputType | null + _sum: BlockProclamationsSumAggregateOutputType | null + _min: BlockProclamationsMinAggregateOutputType | null + _max: BlockProclamationsMaxAggregateOutputType | null +} + +export type BlockProclamationsAvgAggregateOutputType = { + sortOrder: number | null +} + +export type BlockProclamationsSumAggregateOutputType = { + sortOrder: number | null +} + +export type BlockProclamationsMinAggregateOutputType = { + blockId: string | null + proclamationId: string | null + sortOrder: number | null + createdAt: Date | null + updatedAt: Date | null +} + +export type BlockProclamationsMaxAggregateOutputType = { + blockId: string | null + proclamationId: string | null + sortOrder: number | null + createdAt: Date | null + updatedAt: Date | null +} + +export type BlockProclamationsCountAggregateOutputType = { + blockId: number + proclamationId: number + sortOrder: number + createdAt: number + updatedAt: number + _all: number +} + + +export type BlockProclamationsAvgAggregateInputType = { + sortOrder?: true +} + +export type BlockProclamationsSumAggregateInputType = { + sortOrder?: true +} + +export type BlockProclamationsMinAggregateInputType = { + blockId?: true + proclamationId?: true + sortOrder?: true + createdAt?: true + updatedAt?: true +} + +export type BlockProclamationsMaxAggregateInputType = { + blockId?: true + proclamationId?: true + sortOrder?: true + createdAt?: true + updatedAt?: true +} + +export type BlockProclamationsCountAggregateInputType = { + blockId?: true + proclamationId?: true + sortOrder?: true + createdAt?: true + updatedAt?: true + _all?: true +} + +export type BlockProclamationsAggregateArgs = { + /** + * Filter which BlockProclamations to aggregate. + */ + where?: Prisma.BlockProclamationsWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of BlockProclamations to fetch. + */ + orderBy?: Prisma.BlockProclamationsOrderByWithRelationInput | Prisma.BlockProclamationsOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.BlockProclamationsWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` BlockProclamations from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` BlockProclamations. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned BlockProclamations + **/ + _count?: true | BlockProclamationsCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: BlockProclamationsAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: BlockProclamationsSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: BlockProclamationsMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: BlockProclamationsMaxAggregateInputType +} + +export type GetBlockProclamationsAggregateType = { + [P in keyof T & keyof AggregateBlockProclamations]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type BlockProclamationsGroupByArgs = { + where?: Prisma.BlockProclamationsWhereInput + orderBy?: Prisma.BlockProclamationsOrderByWithAggregationInput | Prisma.BlockProclamationsOrderByWithAggregationInput[] + by: Prisma.BlockProclamationsScalarFieldEnum[] | Prisma.BlockProclamationsScalarFieldEnum + having?: Prisma.BlockProclamationsScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: BlockProclamationsCountAggregateInputType | true + _avg?: BlockProclamationsAvgAggregateInputType + _sum?: BlockProclamationsSumAggregateInputType + _min?: BlockProclamationsMinAggregateInputType + _max?: BlockProclamationsMaxAggregateInputType +} + +export type BlockProclamationsGroupByOutputType = { + blockId: string + proclamationId: string + sortOrder: number + createdAt: Date + updatedAt: Date + _count: BlockProclamationsCountAggregateOutputType | null + _avg: BlockProclamationsAvgAggregateOutputType | null + _sum: BlockProclamationsSumAggregateOutputType | null + _min: BlockProclamationsMinAggregateOutputType | null + _max: BlockProclamationsMaxAggregateOutputType | null +} + +export type GetBlockProclamationsGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof BlockProclamationsGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type BlockProclamationsWhereInput = { + AND?: Prisma.BlockProclamationsWhereInput | Prisma.BlockProclamationsWhereInput[] + OR?: Prisma.BlockProclamationsWhereInput[] + NOT?: Prisma.BlockProclamationsWhereInput | Prisma.BlockProclamationsWhereInput[] + blockId?: Prisma.StringFilter<"BlockProclamations"> | string + proclamationId?: Prisma.StringFilter<"BlockProclamations"> | string + sortOrder?: Prisma.IntFilter<"BlockProclamations"> | number + createdAt?: Prisma.DateTimeFilter<"BlockProclamations"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"BlockProclamations"> | Date | string + block?: Prisma.XOR + proclamation?: Prisma.XOR +} + +export type BlockProclamationsOrderByWithRelationInput = { + blockId?: Prisma.SortOrder + proclamationId?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + block?: Prisma.BlockOrderByWithRelationInput + proclamation?: Prisma.ProclamationOrderByWithRelationInput +} + +export type BlockProclamationsWhereUniqueInput = Prisma.AtLeast<{ + blockId_proclamationId?: Prisma.BlockProclamationsBlockIdProclamationIdCompoundUniqueInput + AND?: Prisma.BlockProclamationsWhereInput | Prisma.BlockProclamationsWhereInput[] + OR?: Prisma.BlockProclamationsWhereInput[] + NOT?: Prisma.BlockProclamationsWhereInput | Prisma.BlockProclamationsWhereInput[] + blockId?: Prisma.StringFilter<"BlockProclamations"> | string + proclamationId?: Prisma.StringFilter<"BlockProclamations"> | string + sortOrder?: Prisma.IntFilter<"BlockProclamations"> | number + createdAt?: Prisma.DateTimeFilter<"BlockProclamations"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"BlockProclamations"> | Date | string + block?: Prisma.XOR + proclamation?: Prisma.XOR +}, "blockId_proclamationId"> + +export type BlockProclamationsOrderByWithAggregationInput = { + blockId?: Prisma.SortOrder + proclamationId?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _count?: Prisma.BlockProclamationsCountOrderByAggregateInput + _avg?: Prisma.BlockProclamationsAvgOrderByAggregateInput + _max?: Prisma.BlockProclamationsMaxOrderByAggregateInput + _min?: Prisma.BlockProclamationsMinOrderByAggregateInput + _sum?: Prisma.BlockProclamationsSumOrderByAggregateInput +} + +export type BlockProclamationsScalarWhereWithAggregatesInput = { + AND?: Prisma.BlockProclamationsScalarWhereWithAggregatesInput | Prisma.BlockProclamationsScalarWhereWithAggregatesInput[] + OR?: Prisma.BlockProclamationsScalarWhereWithAggregatesInput[] + NOT?: Prisma.BlockProclamationsScalarWhereWithAggregatesInput | Prisma.BlockProclamationsScalarWhereWithAggregatesInput[] + blockId?: Prisma.StringWithAggregatesFilter<"BlockProclamations"> | string + proclamationId?: Prisma.StringWithAggregatesFilter<"BlockProclamations"> | string + sortOrder?: Prisma.IntWithAggregatesFilter<"BlockProclamations"> | number + createdAt?: Prisma.DateTimeWithAggregatesFilter<"BlockProclamations"> | Date | string + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"BlockProclamations"> | Date | string +} + +export type BlockProclamationsCreateInput = { + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + block: Prisma.BlockCreateNestedOneWithoutProclamationsInput + proclamation: Prisma.ProclamationCreateNestedOneWithoutBlockProclamationsInput +} + +export type BlockProclamationsUncheckedCreateInput = { + blockId: string + proclamationId: string + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockProclamationsUpdateInput = { + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + block?: Prisma.BlockUpdateOneRequiredWithoutProclamationsNestedInput + proclamation?: Prisma.ProclamationUpdateOneRequiredWithoutBlockProclamationsNestedInput +} + +export type BlockProclamationsUncheckedUpdateInput = { + blockId?: Prisma.StringFieldUpdateOperationsInput | string + proclamationId?: Prisma.StringFieldUpdateOperationsInput | string + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockProclamationsCreateManyInput = { + blockId: string + proclamationId: string + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockProclamationsUpdateManyMutationInput = { + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockProclamationsUncheckedUpdateManyInput = { + blockId?: Prisma.StringFieldUpdateOperationsInput | string + proclamationId?: Prisma.StringFieldUpdateOperationsInput | string + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockProclamationsListRelationFilter = { + every?: Prisma.BlockProclamationsWhereInput + some?: Prisma.BlockProclamationsWhereInput + none?: Prisma.BlockProclamationsWhereInput +} + +export type BlockProclamationsOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type BlockProclamationsBlockIdProclamationIdCompoundUniqueInput = { + blockId: string + proclamationId: string +} + +export type BlockProclamationsCountOrderByAggregateInput = { + blockId?: Prisma.SortOrder + proclamationId?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type BlockProclamationsAvgOrderByAggregateInput = { + sortOrder?: Prisma.SortOrder +} + +export type BlockProclamationsMaxOrderByAggregateInput = { + blockId?: Prisma.SortOrder + proclamationId?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type BlockProclamationsMinOrderByAggregateInput = { + blockId?: Prisma.SortOrder + proclamationId?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type BlockProclamationsSumOrderByAggregateInput = { + sortOrder?: Prisma.SortOrder +} + +export type BlockProclamationsCreateNestedManyWithoutProclamationInput = { + create?: Prisma.XOR | Prisma.BlockProclamationsCreateWithoutProclamationInput[] | Prisma.BlockProclamationsUncheckedCreateWithoutProclamationInput[] + connectOrCreate?: Prisma.BlockProclamationsCreateOrConnectWithoutProclamationInput | Prisma.BlockProclamationsCreateOrConnectWithoutProclamationInput[] + createMany?: Prisma.BlockProclamationsCreateManyProclamationInputEnvelope + connect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] +} + +export type BlockProclamationsUncheckedCreateNestedManyWithoutProclamationInput = { + create?: Prisma.XOR | Prisma.BlockProclamationsCreateWithoutProclamationInput[] | Prisma.BlockProclamationsUncheckedCreateWithoutProclamationInput[] + connectOrCreate?: Prisma.BlockProclamationsCreateOrConnectWithoutProclamationInput | Prisma.BlockProclamationsCreateOrConnectWithoutProclamationInput[] + createMany?: Prisma.BlockProclamationsCreateManyProclamationInputEnvelope + connect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] +} + +export type BlockProclamationsUpdateManyWithoutProclamationNestedInput = { + create?: Prisma.XOR | Prisma.BlockProclamationsCreateWithoutProclamationInput[] | Prisma.BlockProclamationsUncheckedCreateWithoutProclamationInput[] + connectOrCreate?: Prisma.BlockProclamationsCreateOrConnectWithoutProclamationInput | Prisma.BlockProclamationsCreateOrConnectWithoutProclamationInput[] + upsert?: Prisma.BlockProclamationsUpsertWithWhereUniqueWithoutProclamationInput | Prisma.BlockProclamationsUpsertWithWhereUniqueWithoutProclamationInput[] + createMany?: Prisma.BlockProclamationsCreateManyProclamationInputEnvelope + set?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + disconnect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + delete?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + connect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + update?: Prisma.BlockProclamationsUpdateWithWhereUniqueWithoutProclamationInput | Prisma.BlockProclamationsUpdateWithWhereUniqueWithoutProclamationInput[] + updateMany?: Prisma.BlockProclamationsUpdateManyWithWhereWithoutProclamationInput | Prisma.BlockProclamationsUpdateManyWithWhereWithoutProclamationInput[] + deleteMany?: Prisma.BlockProclamationsScalarWhereInput | Prisma.BlockProclamationsScalarWhereInput[] +} + +export type BlockProclamationsUncheckedUpdateManyWithoutProclamationNestedInput = { + create?: Prisma.XOR | Prisma.BlockProclamationsCreateWithoutProclamationInput[] | Prisma.BlockProclamationsUncheckedCreateWithoutProclamationInput[] + connectOrCreate?: Prisma.BlockProclamationsCreateOrConnectWithoutProclamationInput | Prisma.BlockProclamationsCreateOrConnectWithoutProclamationInput[] + upsert?: Prisma.BlockProclamationsUpsertWithWhereUniqueWithoutProclamationInput | Prisma.BlockProclamationsUpsertWithWhereUniqueWithoutProclamationInput[] + createMany?: Prisma.BlockProclamationsCreateManyProclamationInputEnvelope + set?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + disconnect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + delete?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + connect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + update?: Prisma.BlockProclamationsUpdateWithWhereUniqueWithoutProclamationInput | Prisma.BlockProclamationsUpdateWithWhereUniqueWithoutProclamationInput[] + updateMany?: Prisma.BlockProclamationsUpdateManyWithWhereWithoutProclamationInput | Prisma.BlockProclamationsUpdateManyWithWhereWithoutProclamationInput[] + deleteMany?: Prisma.BlockProclamationsScalarWhereInput | Prisma.BlockProclamationsScalarWhereInput[] +} + +export type BlockProclamationsCreateNestedManyWithoutBlockInput = { + create?: Prisma.XOR | Prisma.BlockProclamationsCreateWithoutBlockInput[] | Prisma.BlockProclamationsUncheckedCreateWithoutBlockInput[] + connectOrCreate?: Prisma.BlockProclamationsCreateOrConnectWithoutBlockInput | Prisma.BlockProclamationsCreateOrConnectWithoutBlockInput[] + createMany?: Prisma.BlockProclamationsCreateManyBlockInputEnvelope + connect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] +} + +export type BlockProclamationsUncheckedCreateNestedManyWithoutBlockInput = { + create?: Prisma.XOR | Prisma.BlockProclamationsCreateWithoutBlockInput[] | Prisma.BlockProclamationsUncheckedCreateWithoutBlockInput[] + connectOrCreate?: Prisma.BlockProclamationsCreateOrConnectWithoutBlockInput | Prisma.BlockProclamationsCreateOrConnectWithoutBlockInput[] + createMany?: Prisma.BlockProclamationsCreateManyBlockInputEnvelope + connect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] +} + +export type BlockProclamationsUpdateManyWithoutBlockNestedInput = { + create?: Prisma.XOR | Prisma.BlockProclamationsCreateWithoutBlockInput[] | Prisma.BlockProclamationsUncheckedCreateWithoutBlockInput[] + connectOrCreate?: Prisma.BlockProclamationsCreateOrConnectWithoutBlockInput | Prisma.BlockProclamationsCreateOrConnectWithoutBlockInput[] + upsert?: Prisma.BlockProclamationsUpsertWithWhereUniqueWithoutBlockInput | Prisma.BlockProclamationsUpsertWithWhereUniqueWithoutBlockInput[] + createMany?: Prisma.BlockProclamationsCreateManyBlockInputEnvelope + set?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + disconnect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + delete?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + connect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + update?: Prisma.BlockProclamationsUpdateWithWhereUniqueWithoutBlockInput | Prisma.BlockProclamationsUpdateWithWhereUniqueWithoutBlockInput[] + updateMany?: Prisma.BlockProclamationsUpdateManyWithWhereWithoutBlockInput | Prisma.BlockProclamationsUpdateManyWithWhereWithoutBlockInput[] + deleteMany?: Prisma.BlockProclamationsScalarWhereInput | Prisma.BlockProclamationsScalarWhereInput[] +} + +export type BlockProclamationsUncheckedUpdateManyWithoutBlockNestedInput = { + create?: Prisma.XOR | Prisma.BlockProclamationsCreateWithoutBlockInput[] | Prisma.BlockProclamationsUncheckedCreateWithoutBlockInput[] + connectOrCreate?: Prisma.BlockProclamationsCreateOrConnectWithoutBlockInput | Prisma.BlockProclamationsCreateOrConnectWithoutBlockInput[] + upsert?: Prisma.BlockProclamationsUpsertWithWhereUniqueWithoutBlockInput | Prisma.BlockProclamationsUpsertWithWhereUniqueWithoutBlockInput[] + createMany?: Prisma.BlockProclamationsCreateManyBlockInputEnvelope + set?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + disconnect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + delete?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + connect?: Prisma.BlockProclamationsWhereUniqueInput | Prisma.BlockProclamationsWhereUniqueInput[] + update?: Prisma.BlockProclamationsUpdateWithWhereUniqueWithoutBlockInput | Prisma.BlockProclamationsUpdateWithWhereUniqueWithoutBlockInput[] + updateMany?: Prisma.BlockProclamationsUpdateManyWithWhereWithoutBlockInput | Prisma.BlockProclamationsUpdateManyWithWhereWithoutBlockInput[] + deleteMany?: Prisma.BlockProclamationsScalarWhereInput | Prisma.BlockProclamationsScalarWhereInput[] +} + +export type BlockProclamationsCreateWithoutProclamationInput = { + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + block: Prisma.BlockCreateNestedOneWithoutProclamationsInput +} + +export type BlockProclamationsUncheckedCreateWithoutProclamationInput = { + blockId: string + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockProclamationsCreateOrConnectWithoutProclamationInput = { + where: Prisma.BlockProclamationsWhereUniqueInput + create: Prisma.XOR +} + +export type BlockProclamationsCreateManyProclamationInputEnvelope = { + data: Prisma.BlockProclamationsCreateManyProclamationInput | Prisma.BlockProclamationsCreateManyProclamationInput[] + skipDuplicates?: boolean +} + +export type BlockProclamationsUpsertWithWhereUniqueWithoutProclamationInput = { + where: Prisma.BlockProclamationsWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type BlockProclamationsUpdateWithWhereUniqueWithoutProclamationInput = { + where: Prisma.BlockProclamationsWhereUniqueInput + data: Prisma.XOR +} + +export type BlockProclamationsUpdateManyWithWhereWithoutProclamationInput = { + where: Prisma.BlockProclamationsScalarWhereInput + data: Prisma.XOR +} + +export type BlockProclamationsScalarWhereInput = { + AND?: Prisma.BlockProclamationsScalarWhereInput | Prisma.BlockProclamationsScalarWhereInput[] + OR?: Prisma.BlockProclamationsScalarWhereInput[] + NOT?: Prisma.BlockProclamationsScalarWhereInput | Prisma.BlockProclamationsScalarWhereInput[] + blockId?: Prisma.StringFilter<"BlockProclamations"> | string + proclamationId?: Prisma.StringFilter<"BlockProclamations"> | string + sortOrder?: Prisma.IntFilter<"BlockProclamations"> | number + createdAt?: Prisma.DateTimeFilter<"BlockProclamations"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"BlockProclamations"> | Date | string +} + +export type BlockProclamationsCreateWithoutBlockInput = { + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + proclamation: Prisma.ProclamationCreateNestedOneWithoutBlockProclamationsInput +} + +export type BlockProclamationsUncheckedCreateWithoutBlockInput = { + proclamationId: string + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockProclamationsCreateOrConnectWithoutBlockInput = { + where: Prisma.BlockProclamationsWhereUniqueInput + create: Prisma.XOR +} + +export type BlockProclamationsCreateManyBlockInputEnvelope = { + data: Prisma.BlockProclamationsCreateManyBlockInput | Prisma.BlockProclamationsCreateManyBlockInput[] + skipDuplicates?: boolean +} + +export type BlockProclamationsUpsertWithWhereUniqueWithoutBlockInput = { + where: Prisma.BlockProclamationsWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type BlockProclamationsUpdateWithWhereUniqueWithoutBlockInput = { + where: Prisma.BlockProclamationsWhereUniqueInput + data: Prisma.XOR +} + +export type BlockProclamationsUpdateManyWithWhereWithoutBlockInput = { + where: Prisma.BlockProclamationsScalarWhereInput + data: Prisma.XOR +} + +export type BlockProclamationsCreateManyProclamationInput = { + blockId: string + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockProclamationsUpdateWithoutProclamationInput = { + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + block?: Prisma.BlockUpdateOneRequiredWithoutProclamationsNestedInput +} + +export type BlockProclamationsUncheckedUpdateWithoutProclamationInput = { + blockId?: Prisma.StringFieldUpdateOperationsInput | string + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockProclamationsUncheckedUpdateManyWithoutProclamationInput = { + blockId?: Prisma.StringFieldUpdateOperationsInput | string + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockProclamationsCreateManyBlockInput = { + proclamationId: string + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type BlockProclamationsUpdateWithoutBlockInput = { + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + proclamation?: Prisma.ProclamationUpdateOneRequiredWithoutBlockProclamationsNestedInput +} + +export type BlockProclamationsUncheckedUpdateWithoutBlockInput = { + proclamationId?: Prisma.StringFieldUpdateOperationsInput | string + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type BlockProclamationsUncheckedUpdateManyWithoutBlockInput = { + proclamationId?: Prisma.StringFieldUpdateOperationsInput | string + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + + +export type BlockProclamationsSelect = runtime.Types.Extensions.GetSelect<{ + blockId?: boolean + proclamationId?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + block?: boolean | Prisma.BlockDefaultArgs + proclamation?: boolean | Prisma.ProclamationDefaultArgs +}, ExtArgs["result"]["blockProclamations"]> + +export type BlockProclamationsSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + blockId?: boolean + proclamationId?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + block?: boolean | Prisma.BlockDefaultArgs + proclamation?: boolean | Prisma.ProclamationDefaultArgs +}, ExtArgs["result"]["blockProclamations"]> + +export type BlockProclamationsSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + blockId?: boolean + proclamationId?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + block?: boolean | Prisma.BlockDefaultArgs + proclamation?: boolean | Prisma.ProclamationDefaultArgs +}, ExtArgs["result"]["blockProclamations"]> + +export type BlockProclamationsSelectScalar = { + blockId?: boolean + proclamationId?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean +} + +export type BlockProclamationsOmit = runtime.Types.Extensions.GetOmit<"blockId" | "proclamationId" | "sortOrder" | "createdAt" | "updatedAt", ExtArgs["result"]["blockProclamations"]> +export type BlockProclamationsInclude = { + block?: boolean | Prisma.BlockDefaultArgs + proclamation?: boolean | Prisma.ProclamationDefaultArgs +} +export type BlockProclamationsIncludeCreateManyAndReturn = { + block?: boolean | Prisma.BlockDefaultArgs + proclamation?: boolean | Prisma.ProclamationDefaultArgs +} +export type BlockProclamationsIncludeUpdateManyAndReturn = { + block?: boolean | Prisma.BlockDefaultArgs + proclamation?: boolean | Prisma.ProclamationDefaultArgs +} + +export type $BlockProclamationsPayload = { + name: "BlockProclamations" + objects: { + block: Prisma.$BlockPayload + proclamation: Prisma.$ProclamationPayload + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + blockId: string + proclamationId: string + sortOrder: number + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["blockProclamations"]> + composites: {} +} + +export type BlockProclamationsGetPayload = runtime.Types.Result.GetResult + +export type BlockProclamationsCountArgs = + Omit & { + select?: BlockProclamationsCountAggregateInputType | true + } + +export interface BlockProclamationsDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['BlockProclamations'], meta: { name: 'BlockProclamations' } } + /** + * Find zero or one BlockProclamations that matches the filter. + * @param {BlockProclamationsFindUniqueArgs} args - Arguments to find a BlockProclamations + * @example + * // Get one BlockProclamations + * const blockProclamations = await prisma.blockProclamations.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__BlockProclamationsClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one BlockProclamations that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {BlockProclamationsFindUniqueOrThrowArgs} args - Arguments to find a BlockProclamations + * @example + * // Get one BlockProclamations + * const blockProclamations = await prisma.blockProclamations.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__BlockProclamationsClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first BlockProclamations that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockProclamationsFindFirstArgs} args - Arguments to find a BlockProclamations + * @example + * // Get one BlockProclamations + * const blockProclamations = await prisma.blockProclamations.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__BlockProclamationsClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first BlockProclamations that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockProclamationsFindFirstOrThrowArgs} args - Arguments to find a BlockProclamations + * @example + * // Get one BlockProclamations + * const blockProclamations = await prisma.blockProclamations.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__BlockProclamationsClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more BlockProclamations that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockProclamationsFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all BlockProclamations + * const blockProclamations = await prisma.blockProclamations.findMany() + * + * // Get first 10 BlockProclamations + * const blockProclamations = await prisma.blockProclamations.findMany({ take: 10 }) + * + * // Only select the `blockId` + * const blockProclamationsWithBlockIdOnly = await prisma.blockProclamations.findMany({ select: { blockId: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a BlockProclamations. + * @param {BlockProclamationsCreateArgs} args - Arguments to create a BlockProclamations. + * @example + * // Create one BlockProclamations + * const BlockProclamations = await prisma.blockProclamations.create({ + * data: { + * // ... data to create a BlockProclamations + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__BlockProclamationsClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many BlockProclamations. + * @param {BlockProclamationsCreateManyArgs} args - Arguments to create many BlockProclamations. + * @example + * // Create many BlockProclamations + * const blockProclamations = await prisma.blockProclamations.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create many BlockProclamations and returns the data saved in the database. + * @param {BlockProclamationsCreateManyAndReturnArgs} args - Arguments to create many BlockProclamations. + * @example + * // Create many BlockProclamations + * const blockProclamations = await prisma.blockProclamations.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many BlockProclamations and only return the `blockId` + * const blockProclamationsWithBlockIdOnly = await prisma.blockProclamations.createManyAndReturn({ + * select: { blockId: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + + /** + * Delete a BlockProclamations. + * @param {BlockProclamationsDeleteArgs} args - Arguments to delete one BlockProclamations. + * @example + * // Delete one BlockProclamations + * const BlockProclamations = await prisma.blockProclamations.delete({ + * where: { + * // ... filter to delete one BlockProclamations + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__BlockProclamationsClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one BlockProclamations. + * @param {BlockProclamationsUpdateArgs} args - Arguments to update one BlockProclamations. + * @example + * // Update one BlockProclamations + * const blockProclamations = await prisma.blockProclamations.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__BlockProclamationsClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more BlockProclamations. + * @param {BlockProclamationsDeleteManyArgs} args - Arguments to filter BlockProclamations to delete. + * @example + * // Delete a few BlockProclamations + * const { count } = await prisma.blockProclamations.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more BlockProclamations. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockProclamationsUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many BlockProclamations + * const blockProclamations = await prisma.blockProclamations.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more BlockProclamations and returns the data updated in the database. + * @param {BlockProclamationsUpdateManyAndReturnArgs} args - Arguments to update many BlockProclamations. + * @example + * // Update many BlockProclamations + * const blockProclamations = await prisma.blockProclamations.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more BlockProclamations and only return the `blockId` + * const blockProclamationsWithBlockIdOnly = await prisma.blockProclamations.updateManyAndReturn({ + * select: { blockId: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + + /** + * Create or update one BlockProclamations. + * @param {BlockProclamationsUpsertArgs} args - Arguments to update or create a BlockProclamations. + * @example + * // Update or create a BlockProclamations + * const blockProclamations = await prisma.blockProclamations.upsert({ + * create: { + * // ... data to create a BlockProclamations + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the BlockProclamations we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__BlockProclamationsClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of BlockProclamations. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockProclamationsCountArgs} args - Arguments to filter BlockProclamations to count. + * @example + * // Count the number of BlockProclamations + * const count = await prisma.blockProclamations.count({ + * where: { + * // ... the filter for the BlockProclamations we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a BlockProclamations. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockProclamationsAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by BlockProclamations. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {BlockProclamationsGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends BlockProclamationsGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: BlockProclamationsGroupByArgs['orderBy'] } + : { orderBy?: BlockProclamationsGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetBlockProclamationsGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the BlockProclamations model + */ +readonly fields: BlockProclamationsFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for BlockProclamations. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__BlockProclamationsClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + block = {}>(args?: Prisma.Subset>): Prisma.Prisma__BlockClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + proclamation = {}>(args?: Prisma.Subset>): Prisma.Prisma__ProclamationClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the BlockProclamations model + */ +export interface BlockProclamationsFieldRefs { + readonly blockId: Prisma.FieldRef<"BlockProclamations", 'String'> + readonly proclamationId: Prisma.FieldRef<"BlockProclamations", 'String'> + readonly sortOrder: Prisma.FieldRef<"BlockProclamations", 'Int'> + readonly createdAt: Prisma.FieldRef<"BlockProclamations", 'DateTime'> + readonly updatedAt: Prisma.FieldRef<"BlockProclamations", 'DateTime'> +} + + +// Custom InputTypes +/** + * BlockProclamations findUnique + */ +export type BlockProclamationsFindUniqueArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * Filter, which BlockProclamations to fetch. + */ + where: Prisma.BlockProclamationsWhereUniqueInput +} + +/** + * BlockProclamations findUniqueOrThrow + */ +export type BlockProclamationsFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * Filter, which BlockProclamations to fetch. + */ + where: Prisma.BlockProclamationsWhereUniqueInput +} + +/** + * BlockProclamations findFirst + */ +export type BlockProclamationsFindFirstArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * Filter, which BlockProclamations to fetch. + */ + where?: Prisma.BlockProclamationsWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of BlockProclamations to fetch. + */ + orderBy?: Prisma.BlockProclamationsOrderByWithRelationInput | Prisma.BlockProclamationsOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for BlockProclamations. + */ + cursor?: Prisma.BlockProclamationsWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` BlockProclamations from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` BlockProclamations. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of BlockProclamations. + */ + distinct?: Prisma.BlockProclamationsScalarFieldEnum | Prisma.BlockProclamationsScalarFieldEnum[] +} + +/** + * BlockProclamations findFirstOrThrow + */ +export type BlockProclamationsFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * Filter, which BlockProclamations to fetch. + */ + where?: Prisma.BlockProclamationsWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of BlockProclamations to fetch. + */ + orderBy?: Prisma.BlockProclamationsOrderByWithRelationInput | Prisma.BlockProclamationsOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for BlockProclamations. + */ + cursor?: Prisma.BlockProclamationsWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` BlockProclamations from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` BlockProclamations. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of BlockProclamations. + */ + distinct?: Prisma.BlockProclamationsScalarFieldEnum | Prisma.BlockProclamationsScalarFieldEnum[] +} + +/** + * BlockProclamations findMany + */ +export type BlockProclamationsFindManyArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * Filter, which BlockProclamations to fetch. + */ + where?: Prisma.BlockProclamationsWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of BlockProclamations to fetch. + */ + orderBy?: Prisma.BlockProclamationsOrderByWithRelationInput | Prisma.BlockProclamationsOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing BlockProclamations. + */ + cursor?: Prisma.BlockProclamationsWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` BlockProclamations from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` BlockProclamations. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of BlockProclamations. + */ + distinct?: Prisma.BlockProclamationsScalarFieldEnum | Prisma.BlockProclamationsScalarFieldEnum[] +} + +/** + * BlockProclamations create + */ +export type BlockProclamationsCreateArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * The data needed to create a BlockProclamations. + */ + data: Prisma.XOR +} + +/** + * BlockProclamations createMany + */ +export type BlockProclamationsCreateManyArgs = { + /** + * The data used to create many BlockProclamations. + */ + data: Prisma.BlockProclamationsCreateManyInput | Prisma.BlockProclamationsCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * BlockProclamations createManyAndReturn + */ +export type BlockProclamationsCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelectCreateManyAndReturn | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * The data used to create many BlockProclamations. + */ + data: Prisma.BlockProclamationsCreateManyInput | Prisma.BlockProclamationsCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsIncludeCreateManyAndReturn | null +} + +/** + * BlockProclamations update + */ +export type BlockProclamationsUpdateArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * The data needed to update a BlockProclamations. + */ + data: Prisma.XOR + /** + * Choose, which BlockProclamations to update. + */ + where: Prisma.BlockProclamationsWhereUniqueInput +} + +/** + * BlockProclamations updateMany + */ +export type BlockProclamationsUpdateManyArgs = { + /** + * The data used to update BlockProclamations. + */ + data: Prisma.XOR + /** + * Filter which BlockProclamations to update + */ + where?: Prisma.BlockProclamationsWhereInput + /** + * Limit how many BlockProclamations to update. + */ + limit?: number +} + +/** + * BlockProclamations updateManyAndReturn + */ +export type BlockProclamationsUpdateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * The data used to update BlockProclamations. + */ + data: Prisma.XOR + /** + * Filter which BlockProclamations to update + */ + where?: Prisma.BlockProclamationsWhereInput + /** + * Limit how many BlockProclamations to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsIncludeUpdateManyAndReturn | null +} + +/** + * BlockProclamations upsert + */ +export type BlockProclamationsUpsertArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * The filter to search for the BlockProclamations to update in case it exists. + */ + where: Prisma.BlockProclamationsWhereUniqueInput + /** + * In case the BlockProclamations found by the `where` argument doesn't exist, create a new BlockProclamations with this data. + */ + create: Prisma.XOR + /** + * In case the BlockProclamations was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * BlockProclamations delete + */ +export type BlockProclamationsDeleteArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + /** + * Filter which BlockProclamations to delete. + */ + where: Prisma.BlockProclamationsWhereUniqueInput +} + +/** + * BlockProclamations deleteMany + */ +export type BlockProclamationsDeleteManyArgs = { + /** + * Filter which BlockProclamations to delete + */ + where?: Prisma.BlockProclamationsWhereInput + /** + * Limit how many BlockProclamations to delete. + */ + limit?: number +} + +/** + * BlockProclamations without action + */ +export type BlockProclamationsDefaultArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null +} diff --git a/src/lib/generated/prisma/models/Proclamation.ts b/src/lib/generated/prisma/models/Proclamation.ts index 1a0c16d..b25e644 100644 --- a/src/lib/generated/prisma/models/Proclamation.ts +++ b/src/lib/generated/prisma/models/Proclamation.ts @@ -236,6 +236,7 @@ export type ProclamationWhereInput = { category?: Prisma.XOR group?: Prisma.XOR userProclamations?: Prisma.UserProclamationsListRelationFilter + blockProclamations?: Prisma.BlockProclamationsListRelationFilter } export type ProclamationOrderByWithRelationInput = { @@ -249,6 +250,7 @@ export type ProclamationOrderByWithRelationInput = { category?: Prisma.ProclamationCategoryOrderByWithRelationInput group?: Prisma.ProclamationGroupOrderByWithRelationInput userProclamations?: Prisma.UserProclamationsOrderByRelationAggregateInput + blockProclamations?: Prisma.BlockProclamationsOrderByRelationAggregateInput } export type ProclamationWhereUniqueInput = Prisma.AtLeast<{ @@ -265,6 +267,7 @@ export type ProclamationWhereUniqueInput = Prisma.AtLeast<{ category?: Prisma.XOR group?: Prisma.XOR userProclamations?: Prisma.UserProclamationsListRelationFilter + blockProclamations?: Prisma.BlockProclamationsListRelationFilter }, "id" | "name"> export type ProclamationOrderByWithAggregationInput = { @@ -301,6 +304,7 @@ export type ProclamationCreateInput = { category: Prisma.ProclamationCategoryCreateNestedOneWithoutProclamationsInput group: Prisma.ProclamationGroupCreateNestedOneWithoutProclamationsInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutProclamationInput + blockProclamations?: Prisma.BlockProclamationsCreateNestedManyWithoutProclamationInput } export type ProclamationUncheckedCreateInput = { @@ -311,6 +315,7 @@ export type ProclamationUncheckedCreateInput = { categoryId: number groupId: number userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutProclamationInput + blockProclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutProclamationInput } export type ProclamationUpdateInput = { @@ -321,6 +326,7 @@ export type ProclamationUpdateInput = { category?: Prisma.ProclamationCategoryUpdateOneRequiredWithoutProclamationsNestedInput group?: Prisma.ProclamationGroupUpdateOneRequiredWithoutProclamationsNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutProclamationNestedInput + blockProclamations?: Prisma.BlockProclamationsUpdateManyWithoutProclamationNestedInput } export type ProclamationUncheckedUpdateInput = { @@ -331,6 +337,7 @@ export type ProclamationUncheckedUpdateInput = { categoryId?: Prisma.IntFieldUpdateOperationsInput | number groupId?: Prisma.IntFieldUpdateOperationsInput | number userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutProclamationNestedInput + blockProclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutProclamationNestedInput } export type ProclamationCreateManyInput = { @@ -551,6 +558,20 @@ export type ProclamationUncheckedUpdateManyWithoutCategoryNestedInput = { deleteMany?: Prisma.ProclamationScalarWhereInput | Prisma.ProclamationScalarWhereInput[] } +export type ProclamationCreateNestedOneWithoutBlockProclamationsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ProclamationCreateOrConnectWithoutBlockProclamationsInput + connect?: Prisma.ProclamationWhereUniqueInput +} + +export type ProclamationUpdateOneRequiredWithoutBlockProclamationsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ProclamationCreateOrConnectWithoutBlockProclamationsInput + upsert?: Prisma.ProclamationUpsertWithoutBlockProclamationsInput + connect?: Prisma.ProclamationWhereUniqueInput + update?: Prisma.XOR, Prisma.ProclamationUncheckedUpdateWithoutBlockProclamationsInput> +} + export type ProclamationCreateWithoutGroupInput = { id?: string name: string @@ -558,6 +579,7 @@ export type ProclamationCreateWithoutGroupInput = { solfeggioFrequency: Prisma.SolfeggioFrequencyCreateNestedOneWithoutProclamationsInput category: Prisma.ProclamationCategoryCreateNestedOneWithoutProclamationsInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutProclamationInput + blockProclamations?: Prisma.BlockProclamationsCreateNestedManyWithoutProclamationInput } export type ProclamationUncheckedCreateWithoutGroupInput = { @@ -567,6 +589,7 @@ export type ProclamationUncheckedCreateWithoutGroupInput = { solfeggioFrequencyId: number categoryId: number userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutProclamationInput + blockProclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutProclamationInput } export type ProclamationCreateOrConnectWithoutGroupInput = { @@ -614,6 +637,7 @@ export type ProclamationCreateWithoutUserProclamationsInput = { solfeggioFrequency: Prisma.SolfeggioFrequencyCreateNestedOneWithoutProclamationsInput category: Prisma.ProclamationCategoryCreateNestedOneWithoutProclamationsInput group: Prisma.ProclamationGroupCreateNestedOneWithoutProclamationsInput + blockProclamations?: Prisma.BlockProclamationsCreateNestedManyWithoutProclamationInput } export type ProclamationUncheckedCreateWithoutUserProclamationsInput = { @@ -623,6 +647,7 @@ export type ProclamationUncheckedCreateWithoutUserProclamationsInput = { solfeggioFrequencyId: number categoryId: number groupId: number + blockProclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutProclamationInput } export type ProclamationCreateOrConnectWithoutUserProclamationsInput = { @@ -648,6 +673,7 @@ export type ProclamationUpdateWithoutUserProclamationsInput = { solfeggioFrequency?: Prisma.SolfeggioFrequencyUpdateOneRequiredWithoutProclamationsNestedInput category?: Prisma.ProclamationCategoryUpdateOneRequiredWithoutProclamationsNestedInput group?: Prisma.ProclamationGroupUpdateOneRequiredWithoutProclamationsNestedInput + blockProclamations?: Prisma.BlockProclamationsUpdateManyWithoutProclamationNestedInput } export type ProclamationUncheckedUpdateWithoutUserProclamationsInput = { @@ -657,6 +683,7 @@ export type ProclamationUncheckedUpdateWithoutUserProclamationsInput = { solfeggioFrequencyId?: Prisma.IntFieldUpdateOperationsInput | number categoryId?: Prisma.IntFieldUpdateOperationsInput | number groupId?: Prisma.IntFieldUpdateOperationsInput | number + blockProclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutProclamationNestedInput } export type ProclamationCreateWithoutSolfeggioFrequencyInput = { @@ -666,6 +693,7 @@ export type ProclamationCreateWithoutSolfeggioFrequencyInput = { category: Prisma.ProclamationCategoryCreateNestedOneWithoutProclamationsInput group: Prisma.ProclamationGroupCreateNestedOneWithoutProclamationsInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutProclamationInput + blockProclamations?: Prisma.BlockProclamationsCreateNestedManyWithoutProclamationInput } export type ProclamationUncheckedCreateWithoutSolfeggioFrequencyInput = { @@ -675,6 +703,7 @@ export type ProclamationUncheckedCreateWithoutSolfeggioFrequencyInput = { categoryId: number groupId: number userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutProclamationInput + blockProclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutProclamationInput } export type ProclamationCreateOrConnectWithoutSolfeggioFrequencyInput = { @@ -710,6 +739,7 @@ export type ProclamationCreateWithoutCategoryInput = { solfeggioFrequency: Prisma.SolfeggioFrequencyCreateNestedOneWithoutProclamationsInput group: Prisma.ProclamationGroupCreateNestedOneWithoutProclamationsInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutProclamationInput + blockProclamations?: Prisma.BlockProclamationsCreateNestedManyWithoutProclamationInput } export type ProclamationUncheckedCreateWithoutCategoryInput = { @@ -719,6 +749,7 @@ export type ProclamationUncheckedCreateWithoutCategoryInput = { solfeggioFrequencyId: number groupId: number userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutProclamationInput + blockProclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutProclamationInput } export type ProclamationCreateOrConnectWithoutCategoryInput = { @@ -747,6 +778,62 @@ export type ProclamationUpdateManyWithWhereWithoutCategoryInput = { data: Prisma.XOR } +export type ProclamationCreateWithoutBlockProclamationsInput = { + id?: string + name: string + content: string + solfeggioFrequency: Prisma.SolfeggioFrequencyCreateNestedOneWithoutProclamationsInput + category: Prisma.ProclamationCategoryCreateNestedOneWithoutProclamationsInput + group: Prisma.ProclamationGroupCreateNestedOneWithoutProclamationsInput + userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutProclamationInput +} + +export type ProclamationUncheckedCreateWithoutBlockProclamationsInput = { + id?: string + name: string + content: string + solfeggioFrequencyId: number + categoryId: number + groupId: number + userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutProclamationInput +} + +export type ProclamationCreateOrConnectWithoutBlockProclamationsInput = { + where: Prisma.ProclamationWhereUniqueInput + create: Prisma.XOR +} + +export type ProclamationUpsertWithoutBlockProclamationsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.ProclamationWhereInput +} + +export type ProclamationUpdateToOneWithWhereWithoutBlockProclamationsInput = { + where?: Prisma.ProclamationWhereInput + data: Prisma.XOR +} + +export type ProclamationUpdateWithoutBlockProclamationsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + content?: Prisma.StringFieldUpdateOperationsInput | string + solfeggioFrequency?: Prisma.SolfeggioFrequencyUpdateOneRequiredWithoutProclamationsNestedInput + category?: Prisma.ProclamationCategoryUpdateOneRequiredWithoutProclamationsNestedInput + group?: Prisma.ProclamationGroupUpdateOneRequiredWithoutProclamationsNestedInput + userProclamations?: Prisma.UserProclamationsUpdateManyWithoutProclamationNestedInput +} + +export type ProclamationUncheckedUpdateWithoutBlockProclamationsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + content?: Prisma.StringFieldUpdateOperationsInput | string + solfeggioFrequencyId?: Prisma.IntFieldUpdateOperationsInput | number + categoryId?: Prisma.IntFieldUpdateOperationsInput | number + groupId?: Prisma.IntFieldUpdateOperationsInput | number + userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutProclamationNestedInput +} + export type ProclamationCreateManyGroupInput = { id?: string name: string @@ -762,6 +849,7 @@ export type ProclamationUpdateWithoutGroupInput = { solfeggioFrequency?: Prisma.SolfeggioFrequencyUpdateOneRequiredWithoutProclamationsNestedInput category?: Prisma.ProclamationCategoryUpdateOneRequiredWithoutProclamationsNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutProclamationNestedInput + blockProclamations?: Prisma.BlockProclamationsUpdateManyWithoutProclamationNestedInput } export type ProclamationUncheckedUpdateWithoutGroupInput = { @@ -771,6 +859,7 @@ export type ProclamationUncheckedUpdateWithoutGroupInput = { solfeggioFrequencyId?: Prisma.IntFieldUpdateOperationsInput | number categoryId?: Prisma.IntFieldUpdateOperationsInput | number userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutProclamationNestedInput + blockProclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutProclamationNestedInput } export type ProclamationUncheckedUpdateManyWithoutGroupInput = { @@ -796,6 +885,7 @@ export type ProclamationUpdateWithoutSolfeggioFrequencyInput = { category?: Prisma.ProclamationCategoryUpdateOneRequiredWithoutProclamationsNestedInput group?: Prisma.ProclamationGroupUpdateOneRequiredWithoutProclamationsNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutProclamationNestedInput + blockProclamations?: Prisma.BlockProclamationsUpdateManyWithoutProclamationNestedInput } export type ProclamationUncheckedUpdateWithoutSolfeggioFrequencyInput = { @@ -805,6 +895,7 @@ export type ProclamationUncheckedUpdateWithoutSolfeggioFrequencyInput = { categoryId?: Prisma.IntFieldUpdateOperationsInput | number groupId?: Prisma.IntFieldUpdateOperationsInput | number userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutProclamationNestedInput + blockProclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutProclamationNestedInput } export type ProclamationUncheckedUpdateManyWithoutSolfeggioFrequencyInput = { @@ -830,6 +921,7 @@ export type ProclamationUpdateWithoutCategoryInput = { solfeggioFrequency?: Prisma.SolfeggioFrequencyUpdateOneRequiredWithoutProclamationsNestedInput group?: Prisma.ProclamationGroupUpdateOneRequiredWithoutProclamationsNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutProclamationNestedInput + blockProclamations?: Prisma.BlockProclamationsUpdateManyWithoutProclamationNestedInput } export type ProclamationUncheckedUpdateWithoutCategoryInput = { @@ -839,6 +931,7 @@ export type ProclamationUncheckedUpdateWithoutCategoryInput = { solfeggioFrequencyId?: Prisma.IntFieldUpdateOperationsInput | number groupId?: Prisma.IntFieldUpdateOperationsInput | number userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutProclamationNestedInput + blockProclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutProclamationNestedInput } export type ProclamationUncheckedUpdateManyWithoutCategoryInput = { @@ -856,10 +949,12 @@ export type ProclamationUncheckedUpdateManyWithoutCategoryInput = { export type ProclamationCountOutputType = { userProclamations: number + blockProclamations: number } export type ProclamationCountOutputTypeSelect = { userProclamations?: boolean | ProclamationCountOutputTypeCountUserProclamationsArgs + blockProclamations?: boolean | ProclamationCountOutputTypeCountBlockProclamationsArgs } /** @@ -879,6 +974,13 @@ export type ProclamationCountOutputTypeCountUserProclamationsArgs = { + where?: Prisma.BlockProclamationsWhereInput +} + export type ProclamationSelect = runtime.Types.Extensions.GetSelect<{ id?: boolean @@ -891,6 +993,7 @@ export type ProclamationSelect group?: boolean | Prisma.ProclamationGroupDefaultArgs userProclamations?: boolean | Prisma.Proclamation$userProclamationsArgs + blockProclamations?: boolean | Prisma.Proclamation$blockProclamationsArgs _count?: boolean | Prisma.ProclamationCountOutputTypeDefaultArgs }, ExtArgs["result"]["proclamation"]> @@ -933,6 +1036,7 @@ export type ProclamationInclude group?: boolean | Prisma.ProclamationGroupDefaultArgs userProclamations?: boolean | Prisma.Proclamation$userProclamationsArgs + blockProclamations?: boolean | Prisma.Proclamation$blockProclamationsArgs _count?: boolean | Prisma.ProclamationCountOutputTypeDefaultArgs } export type ProclamationIncludeCreateManyAndReturn = { @@ -953,6 +1057,7 @@ export type $ProclamationPayload group: Prisma.$ProclamationGroupPayload userProclamations: Prisma.$UserProclamationsPayload[] + blockProclamations: Prisma.$BlockProclamationsPayload[] } scalars: runtime.Types.Extensions.GetPayloadResult<{ id: string @@ -1359,6 +1464,7 @@ export interface Prisma__ProclamationClient = {}>(args?: Prisma.Subset>): Prisma.Prisma__ProclamationCategoryClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> group = {}>(args?: Prisma.Subset>): Prisma.Prisma__ProclamationGroupClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> userProclamations = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + blockProclamations = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> /** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. @@ -1818,6 +1924,30 @@ export type Proclamation$userProclamationsArgs = { + /** + * Select specific fields to fetch from the BlockProclamations + */ + select?: Prisma.BlockProclamationsSelect | null + /** + * Omit specific fields from the BlockProclamations + */ + omit?: Prisma.BlockProclamationsOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockProclamationsInclude | null + where?: Prisma.BlockProclamationsWhereInput + orderBy?: Prisma.BlockProclamationsOrderByWithRelationInput | Prisma.BlockProclamationsOrderByWithRelationInput[] + cursor?: Prisma.BlockProclamationsWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.BlockProclamationsScalarFieldEnum | Prisma.BlockProclamationsScalarFieldEnum[] +} + /** * Proclamation without action */ diff --git a/src/lib/generated/prisma/models/Schedule.ts b/src/lib/generated/prisma/models/Schedule.ts new file mode 100644 index 0000000..88ca289 --- /dev/null +++ b/src/lib/generated/prisma/models/Schedule.ts @@ -0,0 +1,1396 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `Schedule` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model Schedule + * + */ +export type ScheduleModel = runtime.Types.Result.DefaultSelection + +export type AggregateSchedule = { + _count: ScheduleCountAggregateOutputType | null + _min: ScheduleMinAggregateOutputType | null + _max: ScheduleMaxAggregateOutputType | null +} + +export type ScheduleMinAggregateOutputType = { + id: string | null + userId: string | null + createdAt: Date | null + updatedAt: Date | null +} + +export type ScheduleMaxAggregateOutputType = { + id: string | null + userId: string | null + createdAt: Date | null + updatedAt: Date | null +} + +export type ScheduleCountAggregateOutputType = { + id: number + userId: number + createdAt: number + updatedAt: number + _all: number +} + + +export type ScheduleMinAggregateInputType = { + id?: true + userId?: true + createdAt?: true + updatedAt?: true +} + +export type ScheduleMaxAggregateInputType = { + id?: true + userId?: true + createdAt?: true + updatedAt?: true +} + +export type ScheduleCountAggregateInputType = { + id?: true + userId?: true + createdAt?: true + updatedAt?: true + _all?: true +} + +export type ScheduleAggregateArgs = { + /** + * Filter which Schedule to aggregate. + */ + where?: Prisma.ScheduleWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Schedules to fetch. + */ + orderBy?: Prisma.ScheduleOrderByWithRelationInput | Prisma.ScheduleOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.ScheduleWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Schedules from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Schedules. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned Schedules + **/ + _count?: true | ScheduleCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: ScheduleMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: ScheduleMaxAggregateInputType +} + +export type GetScheduleAggregateType = { + [P in keyof T & keyof AggregateSchedule]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type ScheduleGroupByArgs = { + where?: Prisma.ScheduleWhereInput + orderBy?: Prisma.ScheduleOrderByWithAggregationInput | Prisma.ScheduleOrderByWithAggregationInput[] + by: Prisma.ScheduleScalarFieldEnum[] | Prisma.ScheduleScalarFieldEnum + having?: Prisma.ScheduleScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: ScheduleCountAggregateInputType | true + _min?: ScheduleMinAggregateInputType + _max?: ScheduleMaxAggregateInputType +} + +export type ScheduleGroupByOutputType = { + id: string + userId: string + createdAt: Date + updatedAt: Date + _count: ScheduleCountAggregateOutputType | null + _min: ScheduleMinAggregateOutputType | null + _max: ScheduleMaxAggregateOutputType | null +} + +export type GetScheduleGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof ScheduleGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type ScheduleWhereInput = { + AND?: Prisma.ScheduleWhereInput | Prisma.ScheduleWhereInput[] + OR?: Prisma.ScheduleWhereInput[] + NOT?: Prisma.ScheduleWhereInput | Prisma.ScheduleWhereInput[] + id?: Prisma.StringFilter<"Schedule"> | string + userId?: Prisma.StringFilter<"Schedule"> | string + createdAt?: Prisma.DateTimeFilter<"Schedule"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"Schedule"> | Date | string + user?: Prisma.XOR + blocks?: Prisma.BlockListRelationFilter +} + +export type ScheduleOrderByWithRelationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + user?: Prisma.UserOrderByWithRelationInput + blocks?: Prisma.BlockOrderByRelationAggregateInput +} + +export type ScheduleWhereUniqueInput = Prisma.AtLeast<{ + id?: string + userId?: string + AND?: Prisma.ScheduleWhereInput | Prisma.ScheduleWhereInput[] + OR?: Prisma.ScheduleWhereInput[] + NOT?: Prisma.ScheduleWhereInput | Prisma.ScheduleWhereInput[] + createdAt?: Prisma.DateTimeFilter<"Schedule"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"Schedule"> | Date | string + user?: Prisma.XOR + blocks?: Prisma.BlockListRelationFilter +}, "id" | "userId"> + +export type ScheduleOrderByWithAggregationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _count?: Prisma.ScheduleCountOrderByAggregateInput + _max?: Prisma.ScheduleMaxOrderByAggregateInput + _min?: Prisma.ScheduleMinOrderByAggregateInput +} + +export type ScheduleScalarWhereWithAggregatesInput = { + AND?: Prisma.ScheduleScalarWhereWithAggregatesInput | Prisma.ScheduleScalarWhereWithAggregatesInput[] + OR?: Prisma.ScheduleScalarWhereWithAggregatesInput[] + NOT?: Prisma.ScheduleScalarWhereWithAggregatesInput | Prisma.ScheduleScalarWhereWithAggregatesInput[] + id?: Prisma.StringWithAggregatesFilter<"Schedule"> | string + userId?: Prisma.StringWithAggregatesFilter<"Schedule"> | string + createdAt?: Prisma.DateTimeWithAggregatesFilter<"Schedule"> | Date | string + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Schedule"> | Date | string +} + +export type ScheduleCreateInput = { + id?: string + createdAt?: Date | string + updatedAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutScheduleInput + blocks?: Prisma.BlockCreateNestedManyWithoutScheduleInput +} + +export type ScheduleUncheckedCreateInput = { + id?: string + userId: string + createdAt?: Date | string + updatedAt?: Date | string + blocks?: Prisma.BlockUncheckedCreateNestedManyWithoutScheduleInput +} + +export type ScheduleUpdateInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutScheduleNestedInput + blocks?: Prisma.BlockUpdateManyWithoutScheduleNestedInput +} + +export type ScheduleUncheckedUpdateInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + blocks?: Prisma.BlockUncheckedUpdateManyWithoutScheduleNestedInput +} + +export type ScheduleCreateManyInput = { + id?: string + userId: string + createdAt?: Date | string + updatedAt?: Date | string +} + +export type ScheduleUpdateManyMutationInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type ScheduleUncheckedUpdateManyInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type ScheduleNullableScalarRelationFilter = { + is?: Prisma.ScheduleWhereInput | null + isNot?: Prisma.ScheduleWhereInput | null +} + +export type ScheduleCountOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type ScheduleMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type ScheduleMinOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type ScheduleScalarRelationFilter = { + is?: Prisma.ScheduleWhereInput + isNot?: Prisma.ScheduleWhereInput +} + +export type ScheduleCreateNestedOneWithoutUserInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ScheduleCreateOrConnectWithoutUserInput + connect?: Prisma.ScheduleWhereUniqueInput +} + +export type ScheduleUncheckedCreateNestedOneWithoutUserInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ScheduleCreateOrConnectWithoutUserInput + connect?: Prisma.ScheduleWhereUniqueInput +} + +export type ScheduleUpdateOneWithoutUserNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ScheduleCreateOrConnectWithoutUserInput + upsert?: Prisma.ScheduleUpsertWithoutUserInput + disconnect?: Prisma.ScheduleWhereInput | boolean + delete?: Prisma.ScheduleWhereInput | boolean + connect?: Prisma.ScheduleWhereUniqueInput + update?: Prisma.XOR, Prisma.ScheduleUncheckedUpdateWithoutUserInput> +} + +export type ScheduleUncheckedUpdateOneWithoutUserNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ScheduleCreateOrConnectWithoutUserInput + upsert?: Prisma.ScheduleUpsertWithoutUserInput + disconnect?: Prisma.ScheduleWhereInput | boolean + delete?: Prisma.ScheduleWhereInput | boolean + connect?: Prisma.ScheduleWhereUniqueInput + update?: Prisma.XOR, Prisma.ScheduleUncheckedUpdateWithoutUserInput> +} + +export type ScheduleCreateNestedOneWithoutBlocksInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ScheduleCreateOrConnectWithoutBlocksInput + connect?: Prisma.ScheduleWhereUniqueInput +} + +export type ScheduleUpdateOneRequiredWithoutBlocksNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ScheduleCreateOrConnectWithoutBlocksInput + upsert?: Prisma.ScheduleUpsertWithoutBlocksInput + connect?: Prisma.ScheduleWhereUniqueInput + update?: Prisma.XOR, Prisma.ScheduleUncheckedUpdateWithoutBlocksInput> +} + +export type ScheduleCreateWithoutUserInput = { + id?: string + createdAt?: Date | string + updatedAt?: Date | string + blocks?: Prisma.BlockCreateNestedManyWithoutScheduleInput +} + +export type ScheduleUncheckedCreateWithoutUserInput = { + id?: string + createdAt?: Date | string + updatedAt?: Date | string + blocks?: Prisma.BlockUncheckedCreateNestedManyWithoutScheduleInput +} + +export type ScheduleCreateOrConnectWithoutUserInput = { + where: Prisma.ScheduleWhereUniqueInput + create: Prisma.XOR +} + +export type ScheduleUpsertWithoutUserInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.ScheduleWhereInput +} + +export type ScheduleUpdateToOneWithWhereWithoutUserInput = { + where?: Prisma.ScheduleWhereInput + data: Prisma.XOR +} + +export type ScheduleUpdateWithoutUserInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + blocks?: Prisma.BlockUpdateManyWithoutScheduleNestedInput +} + +export type ScheduleUncheckedUpdateWithoutUserInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + blocks?: Prisma.BlockUncheckedUpdateManyWithoutScheduleNestedInput +} + +export type ScheduleCreateWithoutBlocksInput = { + id?: string + createdAt?: Date | string + updatedAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutScheduleInput +} + +export type ScheduleUncheckedCreateWithoutBlocksInput = { + id?: string + userId: string + createdAt?: Date | string + updatedAt?: Date | string +} + +export type ScheduleCreateOrConnectWithoutBlocksInput = { + where: Prisma.ScheduleWhereUniqueInput + create: Prisma.XOR +} + +export type ScheduleUpsertWithoutBlocksInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.ScheduleWhereInput +} + +export type ScheduleUpdateToOneWithWhereWithoutBlocksInput = { + where?: Prisma.ScheduleWhereInput + data: Prisma.XOR +} + +export type ScheduleUpdateWithoutBlocksInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutScheduleNestedInput +} + +export type ScheduleUncheckedUpdateWithoutBlocksInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + +/** + * Count Type ScheduleCountOutputType + */ + +export type ScheduleCountOutputType = { + blocks: number +} + +export type ScheduleCountOutputTypeSelect = { + blocks?: boolean | ScheduleCountOutputTypeCountBlocksArgs +} + +/** + * ScheduleCountOutputType without action + */ +export type ScheduleCountOutputTypeDefaultArgs = { + /** + * Select specific fields to fetch from the ScheduleCountOutputType + */ + select?: Prisma.ScheduleCountOutputTypeSelect | null +} + +/** + * ScheduleCountOutputType without action + */ +export type ScheduleCountOutputTypeCountBlocksArgs = { + where?: Prisma.BlockWhereInput +} + + +export type ScheduleSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs + blocks?: boolean | Prisma.Schedule$blocksArgs + _count?: boolean | Prisma.ScheduleCountOutputTypeDefaultArgs +}, ExtArgs["result"]["schedule"]> + +export type ScheduleSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["schedule"]> + +export type ScheduleSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["schedule"]> + +export type ScheduleSelectScalar = { + id?: boolean + userId?: boolean + createdAt?: boolean + updatedAt?: boolean +} + +export type ScheduleOmit = runtime.Types.Extensions.GetOmit<"id" | "userId" | "createdAt" | "updatedAt", ExtArgs["result"]["schedule"]> +export type ScheduleInclude = { + user?: boolean | Prisma.UserDefaultArgs + blocks?: boolean | Prisma.Schedule$blocksArgs + _count?: boolean | Prisma.ScheduleCountOutputTypeDefaultArgs +} +export type ScheduleIncludeCreateManyAndReturn = { + user?: boolean | Prisma.UserDefaultArgs +} +export type ScheduleIncludeUpdateManyAndReturn = { + user?: boolean | Prisma.UserDefaultArgs +} + +export type $SchedulePayload = { + name: "Schedule" + objects: { + user: Prisma.$UserPayload + blocks: Prisma.$BlockPayload[] + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: string + userId: string + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["schedule"]> + composites: {} +} + +export type ScheduleGetPayload = runtime.Types.Result.GetResult + +export type ScheduleCountArgs = + Omit & { + select?: ScheduleCountAggregateInputType | true + } + +export interface ScheduleDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['Schedule'], meta: { name: 'Schedule' } } + /** + * Find zero or one Schedule that matches the filter. + * @param {ScheduleFindUniqueArgs} args - Arguments to find a Schedule + * @example + * // Get one Schedule + * const schedule = await prisma.schedule.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__ScheduleClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one Schedule that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {ScheduleFindUniqueOrThrowArgs} args - Arguments to find a Schedule + * @example + * // Get one Schedule + * const schedule = await prisma.schedule.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__ScheduleClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first Schedule that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ScheduleFindFirstArgs} args - Arguments to find a Schedule + * @example + * // Get one Schedule + * const schedule = await prisma.schedule.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__ScheduleClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first Schedule that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ScheduleFindFirstOrThrowArgs} args - Arguments to find a Schedule + * @example + * // Get one Schedule + * const schedule = await prisma.schedule.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__ScheduleClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more Schedules that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ScheduleFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all Schedules + * const schedules = await prisma.schedule.findMany() + * + * // Get first 10 Schedules + * const schedules = await prisma.schedule.findMany({ take: 10 }) + * + * // Only select the `id` + * const scheduleWithIdOnly = await prisma.schedule.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a Schedule. + * @param {ScheduleCreateArgs} args - Arguments to create a Schedule. + * @example + * // Create one Schedule + * const Schedule = await prisma.schedule.create({ + * data: { + * // ... data to create a Schedule + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__ScheduleClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many Schedules. + * @param {ScheduleCreateManyArgs} args - Arguments to create many Schedules. + * @example + * // Create many Schedules + * const schedule = await prisma.schedule.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create many Schedules and returns the data saved in the database. + * @param {ScheduleCreateManyAndReturnArgs} args - Arguments to create many Schedules. + * @example + * // Create many Schedules + * const schedule = await prisma.schedule.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Schedules and only return the `id` + * const scheduleWithIdOnly = await prisma.schedule.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + + /** + * Delete a Schedule. + * @param {ScheduleDeleteArgs} args - Arguments to delete one Schedule. + * @example + * // Delete one Schedule + * const Schedule = await prisma.schedule.delete({ + * where: { + * // ... filter to delete one Schedule + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__ScheduleClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one Schedule. + * @param {ScheduleUpdateArgs} args - Arguments to update one Schedule. + * @example + * // Update one Schedule + * const schedule = await prisma.schedule.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__ScheduleClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more Schedules. + * @param {ScheduleDeleteManyArgs} args - Arguments to filter Schedules to delete. + * @example + * // Delete a few Schedules + * const { count } = await prisma.schedule.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more Schedules. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ScheduleUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many Schedules + * const schedule = await prisma.schedule.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more Schedules and returns the data updated in the database. + * @param {ScheduleUpdateManyAndReturnArgs} args - Arguments to update many Schedules. + * @example + * // Update many Schedules + * const schedule = await prisma.schedule.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Schedules and only return the `id` + * const scheduleWithIdOnly = await prisma.schedule.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + + /** + * Create or update one Schedule. + * @param {ScheduleUpsertArgs} args - Arguments to update or create a Schedule. + * @example + * // Update or create a Schedule + * const schedule = await prisma.schedule.upsert({ + * create: { + * // ... data to create a Schedule + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the Schedule we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__ScheduleClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of Schedules. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ScheduleCountArgs} args - Arguments to filter Schedules to count. + * @example + * // Count the number of Schedules + * const count = await prisma.schedule.count({ + * where: { + * // ... the filter for the Schedules we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a Schedule. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ScheduleAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by Schedule. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ScheduleGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends ScheduleGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: ScheduleGroupByArgs['orderBy'] } + : { orderBy?: ScheduleGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetScheduleGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the Schedule model + */ +readonly fields: ScheduleFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for Schedule. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__ScheduleClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + user = {}>(args?: Prisma.Subset>): Prisma.Prisma__UserClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + blocks = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the Schedule model + */ +export interface ScheduleFieldRefs { + readonly id: Prisma.FieldRef<"Schedule", 'String'> + readonly userId: Prisma.FieldRef<"Schedule", 'String'> + readonly createdAt: Prisma.FieldRef<"Schedule", 'DateTime'> + readonly updatedAt: Prisma.FieldRef<"Schedule", 'DateTime'> +} + + +// Custom InputTypes +/** + * Schedule findUnique + */ +export type ScheduleFindUniqueArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * Filter, which Schedule to fetch. + */ + where: Prisma.ScheduleWhereUniqueInput +} + +/** + * Schedule findUniqueOrThrow + */ +export type ScheduleFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * Filter, which Schedule to fetch. + */ + where: Prisma.ScheduleWhereUniqueInput +} + +/** + * Schedule findFirst + */ +export type ScheduleFindFirstArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * Filter, which Schedule to fetch. + */ + where?: Prisma.ScheduleWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Schedules to fetch. + */ + orderBy?: Prisma.ScheduleOrderByWithRelationInput | Prisma.ScheduleOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for Schedules. + */ + cursor?: Prisma.ScheduleWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Schedules from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Schedules. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Schedules. + */ + distinct?: Prisma.ScheduleScalarFieldEnum | Prisma.ScheduleScalarFieldEnum[] +} + +/** + * Schedule findFirstOrThrow + */ +export type ScheduleFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * Filter, which Schedule to fetch. + */ + where?: Prisma.ScheduleWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Schedules to fetch. + */ + orderBy?: Prisma.ScheduleOrderByWithRelationInput | Prisma.ScheduleOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for Schedules. + */ + cursor?: Prisma.ScheduleWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Schedules from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Schedules. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Schedules. + */ + distinct?: Prisma.ScheduleScalarFieldEnum | Prisma.ScheduleScalarFieldEnum[] +} + +/** + * Schedule findMany + */ +export type ScheduleFindManyArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * Filter, which Schedules to fetch. + */ + where?: Prisma.ScheduleWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Schedules to fetch. + */ + orderBy?: Prisma.ScheduleOrderByWithRelationInput | Prisma.ScheduleOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing Schedules. + */ + cursor?: Prisma.ScheduleWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Schedules from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Schedules. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Schedules. + */ + distinct?: Prisma.ScheduleScalarFieldEnum | Prisma.ScheduleScalarFieldEnum[] +} + +/** + * Schedule create + */ +export type ScheduleCreateArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * The data needed to create a Schedule. + */ + data: Prisma.XOR +} + +/** + * Schedule createMany + */ +export type ScheduleCreateManyArgs = { + /** + * The data used to create many Schedules. + */ + data: Prisma.ScheduleCreateManyInput | Prisma.ScheduleCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * Schedule createManyAndReturn + */ +export type ScheduleCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * The data used to create many Schedules. + */ + data: Prisma.ScheduleCreateManyInput | Prisma.ScheduleCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleIncludeCreateManyAndReturn | null +} + +/** + * Schedule update + */ +export type ScheduleUpdateArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * The data needed to update a Schedule. + */ + data: Prisma.XOR + /** + * Choose, which Schedule to update. + */ + where: Prisma.ScheduleWhereUniqueInput +} + +/** + * Schedule updateMany + */ +export type ScheduleUpdateManyArgs = { + /** + * The data used to update Schedules. + */ + data: Prisma.XOR + /** + * Filter which Schedules to update + */ + where?: Prisma.ScheduleWhereInput + /** + * Limit how many Schedules to update. + */ + limit?: number +} + +/** + * Schedule updateManyAndReturn + */ +export type ScheduleUpdateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * The data used to update Schedules. + */ + data: Prisma.XOR + /** + * Filter which Schedules to update + */ + where?: Prisma.ScheduleWhereInput + /** + * Limit how many Schedules to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleIncludeUpdateManyAndReturn | null +} + +/** + * Schedule upsert + */ +export type ScheduleUpsertArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * The filter to search for the Schedule to update in case it exists. + */ + where: Prisma.ScheduleWhereUniqueInput + /** + * In case the Schedule found by the `where` argument doesn't exist, create a new Schedule with this data. + */ + create: Prisma.XOR + /** + * In case the Schedule was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * Schedule delete + */ +export type ScheduleDeleteArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + /** + * Filter which Schedule to delete. + */ + where: Prisma.ScheduleWhereUniqueInput +} + +/** + * Schedule deleteMany + */ +export type ScheduleDeleteManyArgs = { + /** + * Filter which Schedules to delete + */ + where?: Prisma.ScheduleWhereInput + /** + * Limit how many Schedules to delete. + */ + limit?: number +} + +/** + * Schedule.blocks + */ +export type Schedule$blocksArgs = { + /** + * Select specific fields to fetch from the Block + */ + select?: Prisma.BlockSelect | null + /** + * Omit specific fields from the Block + */ + omit?: Prisma.BlockOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.BlockInclude | null + where?: Prisma.BlockWhereInput + orderBy?: Prisma.BlockOrderByWithRelationInput | Prisma.BlockOrderByWithRelationInput[] + cursor?: Prisma.BlockWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.BlockScalarFieldEnum | Prisma.BlockScalarFieldEnum[] +} + +/** + * Schedule without action + */ +export type ScheduleDefaultArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null +} diff --git a/src/lib/generated/prisma/models/User.ts b/src/lib/generated/prisma/models/User.ts index 230ce1e..7ee86a5 100644 --- a/src/lib/generated/prisma/models/User.ts +++ b/src/lib/generated/prisma/models/User.ts @@ -246,6 +246,7 @@ export type UserWhereInput = { profiles?: Prisma.ProfileListRelationFilter licenseKeys?: Prisma.LicenseKeyListRelationFilter userProclamations?: Prisma.UserProclamationsListRelationFilter + schedule?: Prisma.XOR | null } export type UserOrderByWithRelationInput = { @@ -263,6 +264,7 @@ export type UserOrderByWithRelationInput = { profiles?: Prisma.ProfileOrderByRelationAggregateInput licenseKeys?: Prisma.LicenseKeyOrderByRelationAggregateInput userProclamations?: Prisma.UserProclamationsOrderByRelationAggregateInput + schedule?: Prisma.ScheduleOrderByWithRelationInput } export type UserWhereUniqueInput = Prisma.AtLeast<{ @@ -283,6 +285,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{ profiles?: Prisma.ProfileListRelationFilter licenseKeys?: Prisma.LicenseKeyListRelationFilter userProclamations?: Prisma.UserProclamationsListRelationFilter + schedule?: Prisma.XOR | null }, "id" | "email"> export type UserOrderByWithAggregationInput = { @@ -329,6 +332,7 @@ export type UserCreateInput = { profiles?: Prisma.ProfileCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleCreateNestedOneWithoutUserInput } export type UserUncheckedCreateInput = { @@ -345,6 +349,7 @@ export type UserUncheckedCreateInput = { profiles?: Prisma.ProfileUncheckedCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyUncheckedCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleUncheckedCreateNestedOneWithoutUserInput } export type UserUpdateInput = { @@ -361,6 +366,7 @@ export type UserUpdateInput = { profiles?: Prisma.ProfileUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUpdateOneWithoutUserNestedInput } export type UserUncheckedUpdateInput = { @@ -377,6 +383,7 @@ export type UserUncheckedUpdateInput = { profiles?: Prisma.ProfileUncheckedUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUncheckedUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUncheckedUpdateOneWithoutUserNestedInput } export type UserCreateManyInput = { @@ -612,6 +619,20 @@ export type UserUpdateOneWithoutLicenseKeysNestedInput = { update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutLicenseKeysInput> } +export type UserCreateNestedOneWithoutScheduleInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutScheduleInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneRequiredWithoutScheduleNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutScheduleInput + upsert?: Prisma.UserUpsertWithoutScheduleInput + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutScheduleInput> +} + export type UserCreateWithoutProfilesInput = { id: string name: string @@ -625,6 +646,7 @@ export type UserCreateWithoutProfilesInput = { accounts?: Prisma.AccountCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleCreateNestedOneWithoutUserInput } export type UserUncheckedCreateWithoutProfilesInput = { @@ -640,6 +662,7 @@ export type UserUncheckedCreateWithoutProfilesInput = { accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyUncheckedCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleUncheckedCreateNestedOneWithoutUserInput } export type UserCreateOrConnectWithoutProfilesInput = { @@ -671,6 +694,7 @@ export type UserUpdateWithoutProfilesInput = { accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUpdateOneWithoutUserNestedInput } export type UserUncheckedUpdateWithoutProfilesInput = { @@ -686,6 +710,7 @@ export type UserUncheckedUpdateWithoutProfilesInput = { accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUncheckedUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUncheckedUpdateOneWithoutUserNestedInput } export type UserCreateWithoutSessionsInput = { @@ -701,6 +726,7 @@ export type UserCreateWithoutSessionsInput = { profiles?: Prisma.ProfileCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleCreateNestedOneWithoutUserInput } export type UserUncheckedCreateWithoutSessionsInput = { @@ -716,6 +742,7 @@ export type UserUncheckedCreateWithoutSessionsInput = { profiles?: Prisma.ProfileUncheckedCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyUncheckedCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleUncheckedCreateNestedOneWithoutUserInput } export type UserCreateOrConnectWithoutSessionsInput = { @@ -747,6 +774,7 @@ export type UserUpdateWithoutSessionsInput = { profiles?: Prisma.ProfileUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUpdateOneWithoutUserNestedInput } export type UserUncheckedUpdateWithoutSessionsInput = { @@ -762,6 +790,7 @@ export type UserUncheckedUpdateWithoutSessionsInput = { profiles?: Prisma.ProfileUncheckedUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUncheckedUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUncheckedUpdateOneWithoutUserNestedInput } export type UserCreateWithoutAccountsInput = { @@ -777,6 +806,7 @@ export type UserCreateWithoutAccountsInput = { profiles?: Prisma.ProfileCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleCreateNestedOneWithoutUserInput } export type UserUncheckedCreateWithoutAccountsInput = { @@ -792,6 +822,7 @@ export type UserUncheckedCreateWithoutAccountsInput = { profiles?: Prisma.ProfileUncheckedCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyUncheckedCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleUncheckedCreateNestedOneWithoutUserInput } export type UserCreateOrConnectWithoutAccountsInput = { @@ -823,6 +854,7 @@ export type UserUpdateWithoutAccountsInput = { profiles?: Prisma.ProfileUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUpdateOneWithoutUserNestedInput } export type UserUncheckedUpdateWithoutAccountsInput = { @@ -838,6 +870,7 @@ export type UserUncheckedUpdateWithoutAccountsInput = { profiles?: Prisma.ProfileUncheckedUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUncheckedUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUncheckedUpdateOneWithoutUserNestedInput } export type UserCreateWithoutRoleInput = { @@ -853,6 +886,7 @@ export type UserCreateWithoutRoleInput = { profiles?: Prisma.ProfileCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleCreateNestedOneWithoutUserInput } export type UserUncheckedCreateWithoutRoleInput = { @@ -868,6 +902,7 @@ export type UserUncheckedCreateWithoutRoleInput = { profiles?: Prisma.ProfileUncheckedCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyUncheckedCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleUncheckedCreateNestedOneWithoutUserInput } export type UserCreateOrConnectWithoutRoleInput = { @@ -923,6 +958,7 @@ export type UserCreateWithoutUserProclamationsInput = { accounts?: Prisma.AccountCreateNestedManyWithoutUserInput profiles?: Prisma.ProfileCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleCreateNestedOneWithoutUserInput } export type UserUncheckedCreateWithoutUserProclamationsInput = { @@ -938,6 +974,7 @@ export type UserUncheckedCreateWithoutUserProclamationsInput = { accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput profiles?: Prisma.ProfileUncheckedCreateNestedManyWithoutUserInput licenseKeys?: Prisma.LicenseKeyUncheckedCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleUncheckedCreateNestedOneWithoutUserInput } export type UserCreateOrConnectWithoutUserProclamationsInput = { @@ -969,6 +1006,7 @@ export type UserUpdateWithoutUserProclamationsInput = { accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput profiles?: Prisma.ProfileUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUpdateOneWithoutUserNestedInput } export type UserUncheckedUpdateWithoutUserProclamationsInput = { @@ -984,6 +1022,7 @@ export type UserUncheckedUpdateWithoutUserProclamationsInput = { accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput profiles?: Prisma.ProfileUncheckedUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUncheckedUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUncheckedUpdateOneWithoutUserNestedInput } export type UserCreateWithoutLicenseKeysInput = { @@ -999,6 +1038,7 @@ export type UserCreateWithoutLicenseKeysInput = { accounts?: Prisma.AccountCreateNestedManyWithoutUserInput profiles?: Prisma.ProfileCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleCreateNestedOneWithoutUserInput } export type UserUncheckedCreateWithoutLicenseKeysInput = { @@ -1014,6 +1054,7 @@ export type UserUncheckedCreateWithoutLicenseKeysInput = { accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput profiles?: Prisma.ProfileUncheckedCreateNestedManyWithoutUserInput userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutUserInput + schedule?: Prisma.ScheduleUncheckedCreateNestedOneWithoutUserInput } export type UserCreateOrConnectWithoutLicenseKeysInput = { @@ -1045,6 +1086,7 @@ export type UserUpdateWithoutLicenseKeysInput = { accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput profiles?: Prisma.ProfileUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUpdateOneWithoutUserNestedInput } export type UserUncheckedUpdateWithoutLicenseKeysInput = { @@ -1060,6 +1102,87 @@ export type UserUncheckedUpdateWithoutLicenseKeysInput = { accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput profiles?: Prisma.ProfileUncheckedUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUncheckedUpdateOneWithoutUserNestedInput +} + +export type UserCreateWithoutScheduleInput = { + id: string + name: string + email: string + emailVerified?: boolean + image?: string | null + createdAt?: Date | string + updatedAt?: Date | string + role?: Prisma.UserRoleCreateNestedOneWithoutUsersInput + sessions?: Prisma.SessionCreateNestedManyWithoutUserInput + accounts?: Prisma.AccountCreateNestedManyWithoutUserInput + profiles?: Prisma.ProfileCreateNestedManyWithoutUserInput + licenseKeys?: Prisma.LicenseKeyCreateNestedManyWithoutUserInput + userProclamations?: Prisma.UserProclamationsCreateNestedManyWithoutUserInput +} + +export type UserUncheckedCreateWithoutScheduleInput = { + id: string + name: string + email: string + emailVerified?: boolean + image?: string | null + createdAt?: Date | string + updatedAt?: Date | string + roleId?: number | null + sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput + accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput + profiles?: Prisma.ProfileUncheckedCreateNestedManyWithoutUserInput + licenseKeys?: Prisma.LicenseKeyUncheckedCreateNestedManyWithoutUserInput + userProclamations?: Prisma.UserProclamationsUncheckedCreateNestedManyWithoutUserInput +} + +export type UserCreateOrConnectWithoutScheduleInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutScheduleInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutScheduleInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutScheduleInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.UserRoleUpdateOneWithoutUsersNestedInput + sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput + accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput + profiles?: Prisma.ProfileUpdateManyWithoutUserNestedInput + licenseKeys?: Prisma.LicenseKeyUpdateManyWithoutUserNestedInput + userProclamations?: Prisma.UserProclamationsUpdateManyWithoutUserNestedInput +} + +export type UserUncheckedUpdateWithoutScheduleInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + roleId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput + accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput + profiles?: Prisma.ProfileUncheckedUpdateManyWithoutUserNestedInput + licenseKeys?: Prisma.LicenseKeyUncheckedUpdateManyWithoutUserNestedInput + userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutUserNestedInput } export type UserCreateManyRoleInput = { @@ -1085,6 +1208,7 @@ export type UserUpdateWithoutRoleInput = { profiles?: Prisma.ProfileUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUpdateOneWithoutUserNestedInput } export type UserUncheckedUpdateWithoutRoleInput = { @@ -1100,6 +1224,7 @@ export type UserUncheckedUpdateWithoutRoleInput = { profiles?: Prisma.ProfileUncheckedUpdateManyWithoutUserNestedInput licenseKeys?: Prisma.LicenseKeyUncheckedUpdateManyWithoutUserNestedInput userProclamations?: Prisma.UserProclamationsUncheckedUpdateManyWithoutUserNestedInput + schedule?: Prisma.ScheduleUncheckedUpdateOneWithoutUserNestedInput } export type UserUncheckedUpdateManyWithoutRoleInput = { @@ -1194,6 +1319,7 @@ export type UserSelect licenseKeys?: boolean | Prisma.User$licenseKeysArgs userProclamations?: boolean | Prisma.User$userProclamationsArgs + schedule?: boolean | Prisma.User$scheduleArgs _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs }, ExtArgs["result"]["user"]> @@ -1240,6 +1366,7 @@ export type UserInclude licenseKeys?: boolean | Prisma.User$licenseKeysArgs userProclamations?: boolean | Prisma.User$userProclamationsArgs + schedule?: boolean | Prisma.User$scheduleArgs _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs } export type UserIncludeCreateManyAndReturn = { @@ -1258,6 +1385,7 @@ export type $UserPayload[] licenseKeys: Prisma.$LicenseKeyPayload[] userProclamations: Prisma.$UserProclamationsPayload[] + schedule: Prisma.$SchedulePayload | null } scalars: runtime.Types.Extensions.GetPayloadResult<{ id: string @@ -1668,6 +1796,7 @@ export interface Prisma__UserClient = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> licenseKeys = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> userProclamations = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + schedule = {}>(args?: Prisma.Subset>): Prisma.Prisma__ScheduleClient, T, "findUniqueOrThrow", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> /** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. @@ -2244,6 +2373,25 @@ export type User$userProclamationsArgs = { + /** + * Select specific fields to fetch from the Schedule + */ + select?: Prisma.ScheduleSelect | null + /** + * Omit specific fields from the Schedule + */ + omit?: Prisma.ScheduleOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ScheduleInclude | null + where?: Prisma.ScheduleWhereInput +} + /** * User without action */ From 4922e941ae1c7f240cb542631ad167bfcb64214b Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:16:00 -0500 Subject: [PATCH 02/14] Add schedule validation and service layer --- src/lib/schedule-utils.spec.ts | 144 +++++++++++++++++++++++++ src/lib/schedule-utils.ts | 109 +++++++++++++++++++ src/lib/server/schedule.spec.ts | 185 ++++++++++++++++++++++++++++++++ src/lib/server/schedule.ts | 129 ++++++++++++++++++++++ 4 files changed, 567 insertions(+) create mode 100644 src/lib/schedule-utils.spec.ts create mode 100644 src/lib/schedule-utils.ts create mode 100644 src/lib/server/schedule.spec.ts create mode 100644 src/lib/server/schedule.ts diff --git a/src/lib/schedule-utils.spec.ts b/src/lib/schedule-utils.spec.ts new file mode 100644 index 0000000..6d0fb44 --- /dev/null +++ b/src/lib/schedule-utils.spec.ts @@ -0,0 +1,144 @@ +import { describe, it, expect } from 'vitest'; +import { + findOverlap, + formatTime, + snapMinutes, + toHm, + validateBlock, + type BlockInput, + type BlockSibling +} from './schedule-utils'; + +const input = (overrides: Partial = {}): BlockInput => ({ + startMinutes: 6 * 60, + endMinutes: 8 * 60, + proclamationIds: ['p1'], + ...overrides +}); + +const sibling = (startMinutes: number, endMinutes: number, id = 'b1'): BlockSibling => ({ + id, + startMinutes, + endMinutes +}); + +describe('formatTime', () => { + it('formats 12-hour clock labels', () => { + expect(formatTime(0)).toBe('12:00 AM'); + expect(formatTime(6 * 60)).toBe('6:00 AM'); + expect(formatTime(8 * 60 + 5)).toBe('8:05 AM'); + expect(formatTime(12 * 60)).toBe('12:00 PM'); + expect(formatTime(13 * 60 + 30)).toBe('1:30 PM'); + expect(formatTime(23 * 60 + 59)).toBe('11:59 PM'); + }); +}); + +describe('toHm', () => { + it('formats 24-hour HH:MM strings', () => { + expect(toHm(0)).toBe('00:00'); + expect(toHm(6 * 60)).toBe('06:00'); + expect(toHm(23 * 60 + 59)).toBe('23:59'); + }); +}); + +describe('snapMinutes', () => { + it('rounds to the nearest 15 minutes and clamps to the day', () => { + expect(snapMinutes(0)).toBe(0); + expect(snapMinutes(7)).toBe(0); + expect(snapMinutes(8)).toBe(15); + expect(snapMinutes(370)).toBe(375); + expect(snapMinutes(-10)).toBe(0); + expect(snapMinutes(2000)).toBe(1440); + }); +}); + +describe('findOverlap', () => { + it('returns null for adjacent ranges', () => { + expect( + findOverlap({ startMinutes: 8 * 60, endMinutes: 9 * 60 }, [sibling(6 * 60, 8 * 60)]) + ).toBeNull(); + }); + + it('returns the sibling for a partial overlap', () => { + const other = sibling(7 * 60, 9 * 60); + expect(findOverlap({ startMinutes: 8 * 60, endMinutes: 10 * 60 }, [other])).toBe(other); + }); +}); + +describe('validateBlock', () => { + it('accepts a valid block with no siblings', () => { + expect(validateBlock(input(), [], { isCreate: true })).toEqual({ ok: true }); + }); + + it('rejects equal start and end times', () => { + const result = validateBlock(input({ endMinutes: 6 * 60 }), []); + expect(result).toEqual({ + ok: false, + error: "Start time must be before end time. Overnight blocks aren't supported." + }); + }); + + it('rejects an end time past midnight (overnight blocks disallowed)', () => { + const result = validateBlock(input({ startMinutes: 23 * 60, endMinutes: 25 * 60 }), []); + expect(result.ok).toBe(false); + }); + + it('rejects a negative start time', () => { + expect(validateBlock(input({ startMinutes: -1 }), []).ok).toBe(false); + }); + + it('requires at least one proclamation', () => { + expect(validateBlock(input({ proclamationIds: [] }), [])).toEqual({ + ok: false, + error: 'Select at least one proclamation.' + }); + }); + + it('enforces the four-block maximum on create', () => { + const siblings = [ + sibling(0, 60, 'a'), + sibling(60, 120, 'b'), + sibling(120, 180, 'c'), + sibling(180, 240, 'd') + ]; + const result = validateBlock(input({ startMinutes: 300, endMinutes: 360 }), siblings, { + isCreate: true + }); + expect(result).toEqual({ ok: false, error: 'You can have at most 4 blocks.' }); + }); + + it('allows adjacent blocks (end exactly equals next start)', () => { + expect( + validateBlock(input({ startMinutes: 8 * 60, endMinutes: 9 * 60 }), [sibling(6 * 60, 8 * 60)]) + ).toEqual({ + ok: true + }); + }); + + it('rejects an exact duplicate range and names the conflicting block', () => { + const result = validateBlock(input(), [sibling(6 * 60, 8 * 60)]); + expect(result).toEqual({ + ok: false, + error: 'This overlaps with your 6:00 AM–8:00 AM block.' + }); + }); + + it('rejects a partial overlap', () => { + const result = validateBlock(input({ startMinutes: 7 * 60, endMinutes: 9 * 60 }), [ + sibling(8 * 60, 10 * 60) + ]); + expect(result.ok).toBe(false); + }); + + it('rejects a block that contains another block', () => { + const result = validateBlock(input({ startMinutes: 5 * 60, endMinutes: 11 * 60 }), [ + sibling(6 * 60, 8 * 60) + ]); + expect(result.ok).toBe(false); + }); + + it('does not apply the maximum when updating (isCreate false)', () => { + const siblings = [sibling(0, 60, 'a'), sibling(60, 120, 'b'), sibling(120, 180, 'c')]; + expect(validateBlock(input({ startMinutes: 300, endMinutes: 360 }), siblings).ok).toBe(true); + }); +}); diff --git a/src/lib/schedule-utils.ts b/src/lib/schedule-utils.ts new file mode 100644 index 0000000..9d9e536 --- /dev/null +++ b/src/lib/schedule-utils.ts @@ -0,0 +1,109 @@ +// Isomorphic, dependency-free schedule helpers. Used by the server service +// layer, the v2 serializers and the client-side Block modal (for live +// pre-validation), so it must not import Prisma or any server-only code. + +export const MAX_BLOCKS = 4; +export const MINUTES_PER_DAY = 24 * 60; +export const SNAP_MINUTES = 15; +export const MINUTE_STEP = 5; + +export type BlockSibling = { + id?: string; + startMinutes: number; + endMinutes: number; +}; + +export type BlockInput = { + startMinutes: number; + endMinutes: number; + proclamationIds: string[]; +}; + +export type ValidationResult = { ok: true } | { ok: false; error: string }; + +function normalizeMinutes(minutes: number): number { + return (((Math.trunc(minutes) % MINUTES_PER_DAY) + MINUTES_PER_DAY) % MINUTES_PER_DAY) | 0; +} + +/** Format minutes-from-midnight as a 12-hour clock label, e.g. `6:00 AM`. */ +export function formatTime(minutes: number): string { + const normalized = normalizeMinutes(minutes); + const hours24 = Math.floor(normalized / 60); + const mins = normalized % 60; + const period = hours24 < 12 ? 'AM' : 'PM'; + const hours12 = hours24 % 12 === 0 ? 12 : hours24 % 12; + return `${hours12}:${String(mins).padStart(2, '0')} ${period}`; +} + +/** Format minutes-from-midnight as a 24-hour `HH:MM` string. */ +export function toHm(minutes: number): string { + const normalized = normalizeMinutes(minutes); + const hours = Math.floor(normalized / 60); + const mins = normalized % 60; + return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`; +} + +/** Snap a minute value to the nearest `SNAP_MINUTES` interval, clamped to 24h. */ +export function snapMinutes(minutes: number): number { + const snapped = Math.round(minutes / SNAP_MINUTES) * SNAP_MINUTES; + return Math.max(0, Math.min(MINUTES_PER_DAY, snapped)); +} + +/** First sibling whose half-open range [start, end) intersects the input. */ +export function findOverlap( + input: { startMinutes: number; endMinutes: number }, + siblings: BlockSibling[] +): BlockSibling | null { + for (const sibling of siblings) { + if (input.startMinutes < sibling.endMinutes && sibling.startMinutes < input.endMinutes) { + return sibling; + } + } + return null; +} + +/** + * Validate a Block against the schedule's other Blocks. `siblings` must exclude + * the Block being edited. `isCreate` enables the 4-block maximum (an update + * never increases the count). + */ +export function validateBlock( + input: BlockInput, + siblings: BlockSibling[], + opts: { isCreate?: boolean } = {} +): ValidationResult { + const { startMinutes, endMinutes, proclamationIds } = input; + + if ( + !Number.isInteger(startMinutes) || + !Number.isInteger(endMinutes) || + startMinutes < 0 || + endMinutes > MINUTES_PER_DAY || + startMinutes >= endMinutes + ) { + return { + ok: false, + error: "Start time must be before end time. Overnight blocks aren't supported." + }; + } + + if (!Array.isArray(proclamationIds) || proclamationIds.length === 0) { + return { ok: false, error: 'Select at least one proclamation.' }; + } + + if (opts.isCreate && siblings.length >= MAX_BLOCKS) { + return { ok: false, error: `You can have at most ${MAX_BLOCKS} blocks.` }; + } + + const overlap = findOverlap(input, siblings); + if (overlap) { + return { + ok: false, + error: `This overlaps with your ${formatTime(overlap.startMinutes)}–${formatTime( + overlap.endMinutes + )} block.` + }; + } + + return { ok: true }; +} diff --git a/src/lib/server/schedule.spec.ts b/src/lib/server/schedule.spec.ts new file mode 100644 index 0000000..5a5e641 --- /dev/null +++ b/src/lib/server/schedule.spec.ts @@ -0,0 +1,185 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +vi.mock('$lib/db', () => ({ + prisma: { + schedule: { findUnique: vi.fn(), create: vi.fn() }, + block: { + findMany: vi.fn(), + findFirst: vi.fn(), + create: vi.fn(), + update: vi.fn(), + delete: vi.fn() + } + } +})); + +import { prisma } from '$lib/db'; +import { createBlock, deleteBlock, getOrCreateSchedule, listBlocks, updateBlock } from './schedule'; + +const scheduleFindUnique = prisma.schedule.findUnique as ReturnType; +const scheduleCreate = prisma.schedule.create as ReturnType; +const blockFindMany = prisma.block.findMany as ReturnType; +const blockFindFirst = prisma.block.findFirst as ReturnType; +const blockCreate = prisma.block.create as ReturnType; +const blockUpdate = prisma.block.update as ReturnType; +const blockDelete = prisma.block.delete as ReturnType; + +const validInput = { + startMinutes: 6 * 60, + endMinutes: 8 * 60, + proclamationIds: ['p1'] +}; + +beforeEach(() => { + vi.clearAllMocks(); +}); + +describe('getOrCreateSchedule', () => { + it('returns the existing schedule', async () => { + scheduleFindUnique.mockResolvedValue({ id: 's1', userId: 'u1' }); + + const result = await getOrCreateSchedule('u1'); + + expect(result).toEqual({ id: 's1', userId: 'u1' }); + expect(scheduleCreate).not.toHaveBeenCalled(); + }); + + it('creates the singleton schedule when missing', async () => { + scheduleFindUnique.mockResolvedValue(null); + scheduleCreate.mockResolvedValue({ id: 's1', userId: 'u1' }); + + await getOrCreateSchedule('u1'); + + expect(scheduleCreate).toHaveBeenCalledWith({ data: { userId: 'u1' } }); + }); +}); + +describe('listBlocks', () => { + it('scopes to the user and includes proclamations with frequencies', async () => { + blockFindMany.mockResolvedValue([]); + + await listBlocks('u1'); + + expect(blockFindMany).toHaveBeenCalledWith( + expect.objectContaining({ + where: { schedule: { userId: 'u1' } }, + orderBy: { startMinutes: 'asc' }, + include: expect.objectContaining({ proclamations: expect.anything() }) + }) + ); + }); +}); + +describe('createBlock', () => { + beforeEach(() => { + scheduleFindUnique.mockResolvedValue({ id: 's1', userId: 'u1' }); + }); + + it('creates a block with deduped proclamations in order', async () => { + blockFindMany.mockResolvedValue([]); + blockCreate.mockResolvedValue({ id: 'new-block' }); + + const result = await createBlock('u1', { + ...validInput, + proclamationIds: ['p1', 'p1', 'p2'] + }); + + expect(result).toEqual({ ok: true, id: 'new-block' }); + expect(blockCreate).toHaveBeenCalledWith({ + data: { + scheduleId: 's1', + startMinutes: validInput.startMinutes, + endMinutes: validInput.endMinutes, + proclamations: { + create: [ + { proclamationId: 'p1', sortOrder: 0 }, + { proclamationId: 'p2', sortOrder: 1 } + ] + } + } + }); + }); + + it('rejects a fifth block without creating', async () => { + blockFindMany.mockResolvedValue([ + { id: 'a', startMinutes: 0, endMinutes: 60 }, + { id: 'b', startMinutes: 60, endMinutes: 120 }, + { id: 'c', startMinutes: 120, endMinutes: 180 }, + { id: 'd', startMinutes: 180, endMinutes: 240 } + ]); + + const result = await createBlock('u1', validInput); + + expect(result).toEqual({ ok: false, error: 'You can have at most 4 blocks.' }); + expect(blockCreate).not.toHaveBeenCalled(); + }); + + it('rejects an overlapping block with a specific message', async () => { + blockFindMany.mockResolvedValue([{ id: 'a', startMinutes: 7 * 60, endMinutes: 9 * 60 }]); + + const result = await createBlock('u1', validInput); + + expect(result).toEqual({ + ok: false, + error: 'This overlaps with your 7:00 AM–9:00 AM block.' + }); + expect(blockCreate).not.toHaveBeenCalled(); + }); +}); + +describe('updateBlock', () => { + it('returns not found when the block does not belong to the user', async () => { + blockFindFirst.mockResolvedValue(null); + + const result = await updateBlock('u1', 'missing', validInput); + + expect(result).toEqual({ ok: false, error: 'Block not found.' }); + expect(blockUpdate).not.toHaveBeenCalled(); + }); + + it('replaces proclamations and excludes itself from overlap checks', async () => { + blockFindFirst.mockResolvedValue({ id: 'b1', scheduleId: 's1' }); + blockFindMany.mockResolvedValue([]); + blockUpdate.mockResolvedValue({ id: 'b1' }); + + const result = await updateBlock('u1', 'b1', validInput); + + expect(result).toEqual({ ok: true, id: 'b1' }); + expect(blockFindMany).toHaveBeenCalledWith({ + where: { scheduleId: 's1', id: { not: 'b1' } }, + select: { id: true, startMinutes: true, endMinutes: true } + }); + expect(blockUpdate).toHaveBeenCalledWith({ + where: { id: 'b1' }, + data: { + startMinutes: validInput.startMinutes, + endMinutes: validInput.endMinutes, + proclamations: { + deleteMany: {}, + create: [{ proclamationId: 'p1', sortOrder: 0 }] + } + } + }); + }); +}); + +describe('deleteBlock', () => { + it('returns not found when the block does not belong to the user', async () => { + blockFindFirst.mockResolvedValue(null); + + const result = await deleteBlock('u1', 'missing'); + + expect(result).toEqual({ ok: false, error: 'Block not found.' }); + expect(blockDelete).not.toHaveBeenCalled(); + }); + + it('deletes an owned block', async () => { + blockFindFirst.mockResolvedValue({ id: 'b1' }); + blockDelete.mockResolvedValue({ id: 'b1' }); + + const result = await deleteBlock('u1', 'b1'); + + expect(result).toEqual({ ok: true, id: 'b1' }); + expect(blockDelete).toHaveBeenCalledWith({ where: { id: 'b1' } }); + }); +}); diff --git a/src/lib/server/schedule.ts b/src/lib/server/schedule.ts new file mode 100644 index 0000000..3df0e14 --- /dev/null +++ b/src/lib/server/schedule.ts @@ -0,0 +1,129 @@ +// Schedule service layer. Owns the database orchestration and enforcement of +// the Block business rules (at most 4 per user, at least one Proclamation, +// no overnight ranges, no overlaps). Pure validation lives in +// `$lib/schedule-utils` so the client modal can reuse it. + +import { prisma } from '$lib/db'; +import { validateBlock, type BlockInput } from '$lib/schedule-utils'; + +export { + MAX_BLOCKS, + MINUTES_PER_DAY, + SNAP_MINUTES, + MINUTE_STEP, + formatTime, + toHm, + snapMinutes, + findOverlap, + validateBlock +} from '$lib/schedule-utils'; +export type { BlockInput, BlockSibling, ValidationResult } from '$lib/schedule-utils'; + +export type BlockMutationResult = { ok: true; id?: string } | { ok: false; error: string }; + +function uniqueIds(ids: string[]): string[] { + return [...new Set(ids.filter((id) => typeof id === 'string' && id.length > 0))]; +} + +/** Ensure the user has a Schedule row, creating the singleton on first use. */ +export async function getOrCreateSchedule(userId: string) { + const existing = await prisma.schedule.findUnique({ where: { userId } }); + if (existing) return existing; + return prisma.schedule.create({ data: { userId } }); +} + +/** + * The user's Blocks with their selected Proclamations (and frequencies for + * canonical-id mapping), ordered by start time. + */ +export async function listBlocks(userId: string) { + return prisma.block.findMany({ + where: { schedule: { userId } }, + orderBy: { startMinutes: 'asc' }, + include: { + proclamations: { + orderBy: { sortOrder: 'asc' }, + include: { + proclamation: { include: { solfeggioFrequency: true } } + } + } + } + }); +} + +export async function createBlock(userId: string, input: BlockInput): Promise { + const schedule = await getOrCreateSchedule(userId); + const siblings = await prisma.block.findMany({ + where: { scheduleId: schedule.id }, + select: { id: true, startMinutes: true, endMinutes: true } + }); + + const validation = validateBlock(input, siblings, { isCreate: true }); + if (!validation.ok) return validation; + + const proclamationIds = uniqueIds(input.proclamationIds); + const block = await prisma.block.create({ + data: { + scheduleId: schedule.id, + startMinutes: input.startMinutes, + endMinutes: input.endMinutes, + proclamations: { + create: proclamationIds.map((proclamationId, index) => ({ + proclamationId, + sortOrder: index + })) + } + } + }); + + return { ok: true, id: block.id }; +} + +export async function updateBlock( + userId: string, + blockId: string, + input: BlockInput +): Promise { + const block = await prisma.block.findFirst({ + where: { id: blockId, schedule: { userId } }, + select: { id: true, scheduleId: true } + }); + if (!block) return { ok: false, error: 'Block not found.' }; + + const siblings = await prisma.block.findMany({ + where: { scheduleId: block.scheduleId, id: { not: blockId } }, + select: { id: true, startMinutes: true, endMinutes: true } + }); + + const validation = validateBlock(input, siblings); + if (!validation.ok) return validation; + + const proclamationIds = uniqueIds(input.proclamationIds); + await prisma.block.update({ + where: { id: blockId }, + data: { + startMinutes: input.startMinutes, + endMinutes: input.endMinutes, + proclamations: { + deleteMany: {}, + create: proclamationIds.map((proclamationId, index) => ({ + proclamationId, + sortOrder: index + })) + } + } + }); + + return { ok: true, id: blockId }; +} + +export async function deleteBlock(userId: string, blockId: string): Promise { + const block = await prisma.block.findFirst({ + where: { id: blockId, schedule: { userId } }, + select: { id: true } + }); + if (!block) return { ok: false, error: 'Block not found.' }; + + await prisma.block.delete({ where: { id: blockId } }); + return { ok: true, id: blockId }; +} From 545fb22910f334aa3199f79bcefb9b472cc053a8 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:16:04 -0500 Subject: [PATCH 03/14] Add v2 schedule API endpoint --- src/lib/server/v2-serializers.ts | 32 ++++ src/routes/api/v2/schedule/+server.ts | 63 ++++++++ src/routes/api/v2/schedule/schedule.spec.ts | 155 ++++++++++++++++++++ 3 files changed, 250 insertions(+) create mode 100644 src/routes/api/v2/schedule/+server.ts create mode 100644 src/routes/api/v2/schedule/schedule.spec.ts diff --git a/src/lib/server/v2-serializers.ts b/src/lib/server/v2-serializers.ts index 2ebaf32..1325e0c 100644 --- a/src/lib/server/v2-serializers.ts +++ b/src/lib/server/v2-serializers.ts @@ -1,3 +1,5 @@ +import { toHm } from '$lib/schedule-utils'; + // Canonical solfeggio id <- Hz, mirroring the kiosk's `frequencyIdForHz()` // map (radiantwave-rebuild src/audio/audio_downloader.cpp). v2 must emit these // canonical ids (1-9), never the portal DB autoincrement ids, because @@ -138,3 +140,33 @@ export function serializeColorPalette(palette: { }): V2ColorPalette { return { solfeggioFrequencyId: palette.solfeggioFrequencyId, colors: palette.colors }; } + +export type V2ScheduleBlock = { + id: string; + startTime: string; + startMinutes: number; + endTime: string; + endMinutes: number; + proclamationIds: string[]; +}; + +export type V2Schedule = { + email: string; + blocks: V2ScheduleBlock[]; +}; + +/** Build a schedule Block for the kiosk. Only the selected Proclamation IDs are + * returned; the kiosk fetches proclamation content separately. */ +export function serializeScheduleBlock( + block: { id: string; startMinutes: number; endMinutes: number }, + proclamationIds: string[] +): V2ScheduleBlock { + return { + id: block.id, + startTime: toHm(block.startMinutes), + startMinutes: block.startMinutes, + endTime: toHm(block.endMinutes), + endMinutes: block.endMinutes, + proclamationIds + }; +} diff --git a/src/routes/api/v2/schedule/+server.ts b/src/routes/api/v2/schedule/+server.ts new file mode 100644 index 0000000..da4d212 --- /dev/null +++ b/src/routes/api/v2/schedule/+server.ts @@ -0,0 +1,63 @@ +import { error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { prisma } from '$lib/db'; +import { clientIp, jsonOk, rateLimited } from '$lib/server/v2-helpers'; +import { rateLimit } from '$lib/server/v2-rate-limit'; +import { listBlocks } from '$lib/server/schedule'; +import { serializeScheduleBlock } from '$lib/server/v2-serializers'; + +const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + +/** + * Machine-to-app endpoint used by the RadiantWave kiosk. Authenticates with + * `email` + `licenseKey` query parameters and validates only that the pair + * belong together — license active/entitlement is deliberately not checked + * here, since an invalid license would already lock the kiosk out. + */ +export const GET: RequestHandler = async ({ request, url }) => { + const ip = clientIp(request); + const rl = rateLimit({ key: `schedule:${ip}`, limit: 10, windowMs: 60_000 }); + if (!rl.ok) { + return rateLimited(rl.retryAfterMs); + } + + const email = (url.searchParams.get('email') ?? '').trim().toLowerCase(); + const licenseKey = ( + url.searchParams.get('licenseKey') ?? + url.searchParams.get('key') ?? + '' + ).trim(); + + if (!email || !licenseKey || email.length > 254 || !EMAIL_RE.test(email)) { + throw error(400, 'not-authorized'); + } + + const storedKey = await prisma.licenseKey.findUnique({ where: { key: licenseKey } }); + if (!storedKey) { + throw error(400, 'not-authorized'); + } + + const user = await prisma.user.findUnique({ where: { email } }); + if (!user) { + throw error(400, 'not-authorized'); + } + + // Licenses created before accounts were linked may carry only an email. + const belongs = + storedKey.userId === user.id || + (storedKey.userId === null && storedKey.email?.toLowerCase() === email); + if (!belongs) { + throw error(400, "this key doesn't appear to belong to you"); + } + + const blocks = await listBlocks(user.id); + + const serialized = blocks.map((block) => + serializeScheduleBlock( + block, + block.proclamations.map((entry) => entry.proclamation.id) + ) + ); + + return jsonOk({ email, blocks: serialized }); +}; diff --git a/src/routes/api/v2/schedule/schedule.spec.ts b/src/routes/api/v2/schedule/schedule.spec.ts new file mode 100644 index 0000000..76870cc --- /dev/null +++ b/src/routes/api/v2/schedule/schedule.spec.ts @@ -0,0 +1,155 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { _clearRateLimits } from '$lib/server/v2-rate-limit'; + +vi.mock('$lib/db', () => ({ + prisma: { + schedule: { findUnique: vi.fn(), create: vi.fn() }, + block: { findMany: vi.fn() }, + licenseKey: { findUnique: vi.fn() }, + user: { findUnique: vi.fn() } + } +})); + +import { prisma } from '$lib/db'; +import { GET } from './+server'; + +const licenseKeyFindUnique = prisma.licenseKey.findUnique as ReturnType; +const userFindUnique = prisma.user.findUnique as ReturnType; +const blockFindMany = prisma.block.findMany as ReturnType; + +function call(params: Record) { + const url = new URL('http://localhost/api/v2/schedule'); + for (const [key, value] of Object.entries(params)) url.searchParams.set(key, value); + const request = new Request(url); + return GET({ request, url } as Parameters[0]); +} + +const KEY = 'AAAA-BBBB-CCCC-DDDD'; + +beforeEach(() => { + vi.clearAllMocks(); + _clearRateLimits(); + blockFindMany.mockResolvedValue([]); +}); + +describe('GET /api/v2/schedule auth', () => { + it('rejects a request missing parameters', async () => { + await expect(call({})).rejects.toMatchObject({ + status: 400, + body: { message: 'not-authorized' } + }); + }); + + it('rejects an unknown license key', async () => { + licenseKeyFindUnique.mockResolvedValue(null); + + await expect(call({ email: 'jane@example.com', licenseKey: KEY })).rejects.toMatchObject({ + status: 400, + body: { message: 'not-authorized' } + }); + }); + + it('rejects an unknown user', async () => { + licenseKeyFindUnique.mockResolvedValue({ key: KEY, userId: 'user-1', email: null }); + userFindUnique.mockResolvedValue(null); + + await expect(call({ email: 'jane@example.com', licenseKey: KEY })).rejects.toMatchObject({ + status: 400, + body: { message: 'not-authorized' } + }); + }); + + it('rejects a key that does not belong to the email account', async () => { + licenseKeyFindUnique.mockResolvedValue({ key: KEY, userId: 'someone-else', email: null }); + userFindUnique.mockResolvedValue({ id: 'user-1', email: 'jane@example.com' }); + + await expect(call({ email: 'jane@example.com', licenseKey: KEY })).rejects.toMatchObject({ + status: 400, + body: { message: "this key doesn't appear to belong to you" } + }); + }); + + it('rate limits after ten requests from the same IP', async () => { + licenseKeyFindUnique.mockResolvedValue(null); + for (let i = 0; i < 10; i++) { + try { + await call({}); + } catch { + // Expected: each early call rejects with a 400. + } + } + + const response = await call({}); + + expect(response.status).toBe(429); + }); +}); + +describe('GET /api/v2/schedule success', () => { + it('returns only proclamation IDs even when the key is inactive', async () => { + licenseKeyFindUnique.mockResolvedValue({ + key: KEY, + userId: 'user-1', + email: null, + active: false + }); + userFindUnique.mockResolvedValue({ id: 'user-1', email: 'jane@example.com' }); + blockFindMany.mockResolvedValue([ + { + id: 'block-1', + startMinutes: 360, + endMinutes: 480, + proclamations: [{ proclamation: { id: 'p1' } }, { proclamation: { id: 'p2' } }] + } + ]); + + const response = await call({ email: 'jane@example.com', licenseKey: KEY }); + + expect(response.status).toBe(200); + await expect(response.json()).resolves.toEqual({ + email: 'jane@example.com', + blocks: [ + { + id: 'block-1', + startTime: '06:00', + startMinutes: 360, + endTime: '08:00', + endMinutes: 480, + proclamationIds: ['p1', 'p2'] + } + ] + }); + }); + + it('returns IDs for every selected proclamation regardless of frequency', async () => { + licenseKeyFindUnique.mockResolvedValue({ key: KEY, userId: 'user-1', email: null }); + userFindUnique.mockResolvedValue({ id: 'user-1', email: 'jane@example.com' }); + blockFindMany.mockResolvedValue([ + { + id: 'block-1', + startMinutes: 0, + endMinutes: 60, + proclamations: [{ proclamation: { id: 'p1' } }] + } + ]); + + const response = await call({ email: 'jane@example.com', licenseKey: KEY }); + const body = (await response.json()) as { blocks: { proclamationIds: string[] }[] }; + + expect(body.blocks[0].proclamationIds).toEqual(['p1']); + }); + + it('accepts the legacy `key` query alias and an email-only license', async () => { + licenseKeyFindUnique.mockResolvedValue({ + key: KEY, + userId: null, + email: 'jane@example.com' + }); + userFindUnique.mockResolvedValue({ id: 'user-1', email: 'jane@example.com' }); + + const response = await call({ email: 'jane@example.com', key: KEY }); + + expect(response.status).toBe(200); + await expect(response.json()).resolves.toEqual({ email: 'jane@example.com', blocks: [] }); + }); +}); From 5f4116b8e8324c1ad575499fc8cd6b41c34c43d0 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:16:06 -0500 Subject: [PATCH 04/14] Add schedule page with block editor and proclamation browser --- src/lib/components/schedule/BlockModal.svelte | 353 ++++++++++++++++++ .../schedule/BlockModal.svelte.spec.ts | 110 ++++++ .../components/schedule/DaySchedule.svelte | 147 ++++++++ .../schedule/ProclamationBrowser.svelte | 211 +++++++++++ .../ProclamationBrowser.svelte.spec.ts | 107 ++++++ .../(user)/schedule/+page.server.ts | 89 +++++ .../(protected)/(user)/schedule/+page.svelte | 95 +++++ .../(user)/schedule/page.server.spec.ts | 155 ++++++++ src/routes/+layout.svelte | 13 + 9 files changed, 1280 insertions(+) create mode 100644 src/lib/components/schedule/BlockModal.svelte create mode 100644 src/lib/components/schedule/BlockModal.svelte.spec.ts create mode 100644 src/lib/components/schedule/DaySchedule.svelte create mode 100644 src/lib/components/schedule/ProclamationBrowser.svelte create mode 100644 src/lib/components/schedule/ProclamationBrowser.svelte.spec.ts create mode 100644 src/routes/(protected)/(user)/schedule/+page.server.ts create mode 100644 src/routes/(protected)/(user)/schedule/+page.svelte create mode 100644 src/routes/(protected)/(user)/schedule/page.server.spec.ts diff --git a/src/lib/components/schedule/BlockModal.svelte b/src/lib/components/schedule/BlockModal.svelte new file mode 100644 index 0000000..352aece --- /dev/null +++ b/src/lib/components/schedule/BlockModal.svelte @@ -0,0 +1,353 @@ + + +{#if open} + +{/if} diff --git a/src/lib/components/schedule/BlockModal.svelte.spec.ts b/src/lib/components/schedule/BlockModal.svelte.spec.ts new file mode 100644 index 0000000..507d062 --- /dev/null +++ b/src/lib/components/schedule/BlockModal.svelte.spec.ts @@ -0,0 +1,110 @@ +import { page } from 'vitest/browser'; +import { describe, it, expect, vi } from 'vitest'; +import { render } from 'vitest-browser-svelte'; + +const { submitRef } = vi.hoisted(() => ({ + submitRef: { + current: null as unknown as (opts: { formData: FormData; cancel?: () => void }) => unknown + } +})); + +vi.mock('$app/forms', () => ({ + enhance: (_node: unknown, submit: unknown) => { + submitRef.current = submit as typeof submitRef.current; + return () => {}; + } +})); + +import BlockModal from './BlockModal.svelte'; + +const categories = [{ id: 1, name: 'Physical' }]; +const groups = [{ id: 1, name: 'Prayers' }]; +const proclamations = [ + { id: 'p1', name: 'Peace', categoryId: 1, groupId: 1 }, + { id: 'p2', name: 'Strength', categoryId: 1, groupId: 1 } +]; + +function mount(overrides: Record = {}) { + return render(BlockModal, { + open: true, + mode: 'create', + categories, + groups, + proclamations, + existingBlocks: [], + initialStartMinutes: 6 * 60, + initialEndMinutes: 8 * 60, + initialProclamationIds: ['p1'], + onClose: () => {}, + onSaved: () => {}, + ...overrides + }); +} + +function submit() { + const form = document.querySelector('form') as HTMLFormElement; + return submitRef.current({ formData: new FormData(form), cancel: () => {} }); +} + +describe('BlockModal', () => { + it('uses separate hour and minute selects for start and end', async () => { + mount(); + + await expect.element(page.getByRole('combobox', { name: /^Start hour$/ })).toBeInTheDocument(); + await expect + .element(page.getByRole('combobox', { name: /^Start minute$/ })) + .toBeInTheDocument(); + await expect.element(page.getByRole('combobox', { name: /^End hour$/ })).toBeInTheDocument(); + await expect.element(page.getByRole('combobox', { name: /^End minute$/ })).toBeInTheDocument(); + }); + + it('pre-fills the selects from the initial times', async () => { + mount({ initialStartMinutes: 7 * 60 + 30, initialEndMinutes: 9 * 60 + 15 }); + + await expect.element(page.getByRole('combobox', { name: /^Start hour$/ })).toHaveValue('7'); + await expect.element(page.getByRole('combobox', { name: /^Start minute$/ })).toHaveValue('30'); + await expect.element(page.getByRole('combobox', { name: /^End hour$/ })).toHaveValue('9'); + await expect.element(page.getByRole('combobox', { name: /^End minute$/ })).toHaveValue('15'); + }); + + it('shows the review times and selected proclamation titles', async () => { + mount(); + + await expect.element(page.getByText('6:00 AM – 8:00 AM')).toBeInTheDocument(); + await expect.element(page.getByText('Peace')).toBeInTheDocument(); + }); + + it('rejects an overlapping time range with the specific error', async () => { + mount({ + existingBlocks: [{ id: 'b1', startMinutes: 6 * 60, endMinutes: 8 * 60 }], + initialStartMinutes: 7 * 60, + initialEndMinutes: 9 * 60 + }); + + await page.getByRole('combobox', { name: /^Start hour$/ }).element(); + submit(); + + await expect + .element(page.getByText(/This overlaps with your 6:00 AM–8:00 AM block\./)) + .toBeInTheDocument(); + }); + + it('requires at least one proclamation', async () => { + mount({ initialProclamationIds: [] }); + + await page.getByRole('combobox', { name: /^Start hour$/ }).element(); + submit(); + + await expect.element(page.getByText('Select at least one proclamation.')).toBeInTheDocument(); + }); + + it('does not show an error for a valid selection', async () => { + mount(); + + await page.getByRole('combobox', { name: /^Start hour$/ }).element(); + const result = submit(); + + expect(typeof result).toBe('function'); + await expect.element(page.getByRole('alert')).not.toBeInTheDocument(); + }); +}); diff --git a/src/lib/components/schedule/DaySchedule.svelte b/src/lib/components/schedule/DaySchedule.svelte new file mode 100644 index 0000000..c9dc434 --- /dev/null +++ b/src/lib/components/schedule/DaySchedule.svelte @@ -0,0 +1,147 @@ + + +
+ + + +
diff --git a/src/lib/components/schedule/ProclamationBrowser.svelte b/src/lib/components/schedule/ProclamationBrowser.svelte new file mode 100644 index 0000000..92f0dc0 --- /dev/null +++ b/src/lib/components/schedule/ProclamationBrowser.svelte @@ -0,0 +1,211 @@ + + +
+
+ {#if categories.length === 0} +

No categories available.

+ {:else} +
    + {#each view as categoryView (categoryView.category.id)} + {@const isCategoryOpen = openCategoryIds.includes(categoryView.category.id)} +
  • + + + {#if isCategoryOpen} +
    + {#if categoryView.groups.length === 0 && categoryView.ungrouped.length === 0} +

    + No proclamations in this category. +

    + {/if} + + {#each categoryView.groups as groupView (groupView.group.id)} + {@const isGroupOpen = !closedGroupIds.includes(groupView.group.id)} +
    + + {#if isGroupOpen} +
      + {#each groupView.items as proclamation (proclamation.id)} +
    • + +
    • + {/each} +
    + {/if} +
    + {/each} + + {#if categoryView.ungrouped.length > 0} +
    +
      + {#each categoryView.ungrouped as proclamation (proclamation.id)} +
    • + +
    • + {/each} +
    +
    + {/if} +
    + {/if} +
  • + {/each} +
+ {/if} +
+ +
+

+ Selected ({selectedTitles.length}) +

+ {#if selectedTitles.length === 0} +

No proclamations selected.

+ {:else} +
    + {#each selectedTitles as title, index (selectedIds[index])} +
  • {title}
  • + {/each} +
+ {/if} +
+
diff --git a/src/lib/components/schedule/ProclamationBrowser.svelte.spec.ts b/src/lib/components/schedule/ProclamationBrowser.svelte.spec.ts new file mode 100644 index 0000000..dc28bbe --- /dev/null +++ b/src/lib/components/schedule/ProclamationBrowser.svelte.spec.ts @@ -0,0 +1,107 @@ +import { page } from 'vitest/browser'; +import { describe, it, expect, vi } from 'vitest'; +import { render } from 'vitest-browser-svelte'; +import ProclamationBrowser from './ProclamationBrowser.svelte'; + +const categories = [ + { id: 1, name: 'Physical' }, + { id: 2, name: 'Mental' }, + { id: 3, name: 'Empty' } +]; + +const groups = [ + { id: 1, name: 'Prayers' }, + { id: 2, name: 'Scripture' } +]; + +const proclamations = [ + { id: 'p1', name: 'Healing', categoryId: 1, groupId: 1 }, + { id: 'p2', name: 'Strength', categoryId: 1, groupId: 1 }, + { id: 'p3', name: 'Focus', categoryId: 1, groupId: null }, + { id: 'p4', name: 'Calm', categoryId: 2, groupId: 2 } +]; + +function mount(overrides: Record = {}) { + return render(ProclamationBrowser, { + categories, + groups, + proclamations, + selectedIds: [], + onChange: () => {}, + ...overrides + }); +} + +async function click(locator: { element: () => HTMLElement | SVGElement }) { + const el = locator.element() as HTMLElement; + el.click(); +} + +describe('ProclamationBrowser', () => { + it('collapses categories by default', async () => { + mount(); + + await expect.element(page.getByRole('button', { name: 'Physical' })).toBeInTheDocument(); + await expect.element(page.getByRole('checkbox', { name: 'Healing' })).not.toBeInTheDocument(); + }); + + it('reveals pre-expanded groups and their proclamations when a category opens', async () => { + mount(); + + await click(page.getByRole('button', { name: 'Physical' })); + + await expect.element(page.getByText('Prayers')).toBeInTheDocument(); + await expect.element(page.getByRole('checkbox', { name: 'Healing' })).toBeInTheDocument(); + await expect.element(page.getByRole('checkbox', { name: 'Strength' })).toBeInTheDocument(); + }); + + it('hides groups that have no proclamations in the category', async () => { + mount(); + + await click(page.getByRole('button', { name: 'Physical' })); + + await expect.element(page.getByText('Scripture')).not.toBeInTheDocument(); + }); + + it('lists ungrouped proclamations below the groups', async () => { + mount(); + + await click(page.getByRole('button', { name: 'Physical' })); + + await expect.element(page.getByRole('checkbox', { name: 'Focus' })).toBeInTheDocument(); + }); + + it('reports toggled selections through onChange', async () => { + const onChange = vi.fn(); + mount({ selectedIds: ['p1'], onChange }); + + await click(page.getByRole('button', { name: 'Physical' })); + await click(page.getByRole('checkbox', { name: 'Strength' })); + + expect(onChange).toHaveBeenCalledWith(['p1', 'p2']); + + await click(page.getByRole('checkbox', { name: 'Healing' })); + expect(onChange).toHaveBeenCalledWith([]); + }); + + it('shows selected titles in the summary and keeps selection across collapse', async () => { + mount({ selectedIds: ['p1'] }); + + await expect.element(page.getByText('Selected (1)')).toBeInTheDocument(); + + await click(page.getByRole('button', { name: 'Physical' })); + const checkbox = (await page + .getByRole('checkbox', { name: 'Healing' }) + .element()) as HTMLInputElement; + expect(checkbox.checked).toBe(true); + + await click(page.getByRole('button', { name: 'Physical' })); + await expect.element(page.getByRole('checkbox', { name: 'Healing' })).not.toBeInTheDocument(); + await click(page.getByRole('button', { name: 'Physical' })); + + const reopened = (await page + .getByRole('checkbox', { name: 'Healing' }) + .element()) as HTMLInputElement; + expect(reopened.checked).toBe(true); + }); +}); diff --git a/src/routes/(protected)/(user)/schedule/+page.server.ts b/src/routes/(protected)/(user)/schedule/+page.server.ts new file mode 100644 index 0000000..adad669 --- /dev/null +++ b/src/routes/(protected)/(user)/schedule/+page.server.ts @@ -0,0 +1,89 @@ +import type { Actions, PageServerLoad } from './$types'; +import { error, fail } from '@sveltejs/kit'; +import { prisma } from '$lib/db'; +import { createBlock, deleteBlock, listBlocks, updateBlock } from '$lib/server/schedule'; + +function parseInput(formData: FormData) { + const startMinutes = Number(formData.get('startMinutes')); + const endMinutes = Number(formData.get('endMinutes')); + let proclamationIds: string[] = []; + const raw = formData.get('proclamationIds'); + if (typeof raw === 'string' && raw.length > 0) { + try { + const parsed: unknown = JSON.parse(raw); + if (Array.isArray(parsed)) { + proclamationIds = parsed.filter((id): id is string => typeof id === 'string'); + } + } catch { + proclamationIds = []; + } + } + return { startMinutes, endMinutes, proclamationIds }; +} + +export const load: PageServerLoad = async ({ locals }) => { + if (!locals.user?.id) { + throw error(403, 'not authorized'); + } + + const [blocks, categories, groups, proclamations] = await Promise.all([ + listBlocks(locals.user.id), + prisma.proclamationCategory.findMany({ + select: { id: true, name: true }, + orderBy: [{ sortOrder: 'asc' }, { name: 'asc' }] + }), + prisma.proclamationGroup.findMany({ + select: { id: true, name: true }, + orderBy: [{ sortOrder: 'asc' }, { name: 'asc' }] + }), + // Content is deliberately never selected: the portal only surfaces + // title/category/group. + prisma.proclamation.findMany({ + select: { id: true, name: true, categoryId: true, groupId: true }, + orderBy: { name: 'asc' } + }) + ]); + + const blockViews = blocks.map((block) => ({ + id: block.id, + startMinutes: block.startMinutes, + endMinutes: block.endMinutes, + proclamations: block.proclamations.map((entry) => ({ + id: entry.proclamation.id, + name: entry.proclamation.name, + categoryId: entry.proclamation.categoryId, + groupId: entry.proclamation.groupId + })) + })); + + return { blocks: blockViews, categories, groups, proclamations }; +}; + +export const actions: Actions = { + createBlock: async ({ request, locals }) => { + if (!locals.user?.id) throw error(403, 'not authorized'); + const input = parseInput(await request.formData()); + const result = await createBlock(locals.user.id, input); + if (!result.ok) return fail(400, { error: result.error }); + return { success: true }; + }, + + updateBlock: async ({ request, locals }) => { + if (!locals.user?.id) throw error(403, 'not authorized'); + const formData = await request.formData(); + const id = formData.get('id')?.toString(); + if (!id) return fail(400, { error: 'Block not found.' }); + const result = await updateBlock(locals.user.id, id, parseInput(formData)); + if (!result.ok) return fail(400, { error: result.error }); + return { success: true }; + }, + + deleteBlock: async ({ request, locals }) => { + if (!locals.user?.id) throw error(403, 'not authorized'); + const id = (await request.formData()).get('id')?.toString(); + if (!id) return fail(400, { error: 'Block not found.' }); + const result = await deleteBlock(locals.user.id, id); + if (!result.ok) return fail(400, { error: result.error }); + return { success: true }; + } +}; diff --git a/src/routes/(protected)/(user)/schedule/+page.svelte b/src/routes/(protected)/(user)/schedule/+page.svelte new file mode 100644 index 0000000..c6ef768 --- /dev/null +++ b/src/routes/(protected)/(user)/schedule/+page.svelte @@ -0,0 +1,95 @@ + + +
+
+
+

+ Schedule +

+

+ Build your daily listening schedule. Up to 4 blocks per day. +

+
+ + {data.blocks.length} of 4 blocks + +
+ + {#if successMessage} +
+ {successMessage} +
+ {/if} + +
+ +
+ + +
diff --git a/src/routes/(protected)/(user)/schedule/page.server.spec.ts b/src/routes/(protected)/(user)/schedule/page.server.spec.ts new file mode 100644 index 0000000..5adb727 --- /dev/null +++ b/src/routes/(protected)/(user)/schedule/page.server.spec.ts @@ -0,0 +1,155 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { isActionFailure } from '@sveltejs/kit'; +import { createFormRequest, createLocals, mockUser } from '$lib/test-utils'; + +vi.mock('$lib/db', () => ({ + prisma: { + proclamationCategory: { findMany: vi.fn() }, + proclamationGroup: { findMany: vi.fn() }, + proclamation: { findMany: vi.fn() } + } +})); + +vi.mock('$lib/server/schedule', () => ({ + listBlocks: vi.fn(), + createBlock: vi.fn(), + updateBlock: vi.fn(), + deleteBlock: vi.fn() +})); + +import { prisma } from '$lib/db'; +import { createBlock, deleteBlock, listBlocks } from '$lib/server/schedule'; +import { actions, load } from './+page.server'; + +const procFindMany = prisma.proclamation.findMany as ReturnType; +const listBlocksMock = listBlocks as ReturnType; +const createBlockMock = createBlock as ReturnType; +const deleteBlockMock = deleteBlock as ReturnType; + +const locals = createLocals(mockUser() as never); + +beforeEach(() => { + vi.clearAllMocks(); + (prisma.proclamationCategory.findMany as ReturnType).mockResolvedValue([ + { id: 2, name: 'Physical' } + ]); + (prisma.proclamationGroup.findMany as ReturnType).mockResolvedValue([ + { id: 1, name: 'General' } + ]); + procFindMany.mockResolvedValue([{ id: 'p1', name: 'Peace', categoryId: 2, groupId: 1 }]); + listBlocksMock.mockResolvedValue([]); +}); + +describe('schedule load', () => { + it('rejects unauthenticated requests', async () => { + await expect(load({ locals: createLocals() } as never)).rejects.toMatchObject({ + status: 403 + }); + }); + + it('never selects proclamation content', async () => { + await load({ locals } as never); + + expect(procFindMany).toHaveBeenCalledWith( + expect.objectContaining({ + select: { id: true, name: true, categoryId: true, groupId: true } + }) + ); + }); + + it('maps blocks to title/category/group only', async () => { + listBlocksMock.mockResolvedValue([ + { + id: 'b1', + startMinutes: 360, + endMinutes: 480, + proclamations: [ + { + proclamation: { + id: 'p1', + name: 'Peace', + categoryId: 2, + groupId: 1, + content: '

secret

' + } + } + ] + } + ]); + + const result = (await load({ locals } as never)) as { + blocks: { id: string; proclamations: Record[] }[]; + }; + + expect(result.blocks[0].proclamations[0]).toEqual({ + id: 'p1', + name: 'Peace', + categoryId: 2, + groupId: 1 + }); + expect(Object.keys(result.blocks[0].proclamations[0])).not.toContain('content'); + }); +}); + +describe('schedule actions', () => { + it('createBlock rejects unauthenticated requests', async () => { + await expect( + actions.createBlock!({ + request: createFormRequest({}), + locals: createLocals() + } as never) + ).rejects.toMatchObject({ status: 403 }); + }); + + it('createBlock surfaces the service error', async () => { + createBlockMock.mockResolvedValue({ ok: false, error: 'Select at least one proclamation.' }); + + const result = await actions.createBlock!({ + request: createFormRequest({ + startMinutes: '360', + endMinutes: '480', + proclamationIds: '[]' + }), + locals + } as never); + + expect(isActionFailure(result)).toBe(true); + if (isActionFailure(result)) { + expect(result.status).toBe(400); + expect(result.data).toEqual({ error: 'Select at least one proclamation.' }); + } + }); + + it('createBlock parses the payload and succeeds', async () => { + createBlockMock.mockResolvedValue({ ok: true, id: 'b1' }); + + const result = await actions.createBlock!({ + request: createFormRequest({ + startMinutes: '360', + endMinutes: '480', + proclamationIds: JSON.stringify(['p1', 'p2']) + }), + locals + } as never); + + expect(result).toEqual({ success: true }); + expect(createBlockMock).toHaveBeenCalledWith('user-1', { + startMinutes: 360, + endMinutes: 480, + proclamationIds: ['p1', 'p2'] + }); + }); + + it('deleteBlock returns not found without an id', async () => { + const result = await actions.deleteBlock!({ + request: createFormRequest({}), + locals + } as never); + + expect(isActionFailure(result)).toBe(true); + if (isActionFailure(result)) { + expect(result.data).toEqual({ error: 'Block not found.' }); + } + expect(deleteBlockMock).not.toHaveBeenCalled(); + }); +}); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 55e2185..1f04612 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -129,6 +129,12 @@ > Dashboard + + Schedule + Dashboard + + Schedule + Date: Fri, 11 Sep 2026 18:16:08 -0500 Subject: [PATCH 05/14] Document the v2 schedule endpoint --- docs/ai/api.md | 16 +++++++ docs/openapi.yaml | 103 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/docs/ai/api.md b/docs/ai/api.md index 99397b8..a8d1eaf 100644 --- a/docs/ai/api.md +++ b/docs/ai/api.md @@ -97,6 +97,22 @@ Requires API key. --- +# Schedule (v2) + +Endpoint: + +GET /api/v2/schedule?email=&licenseKey= + +Authenticates with the paired `email` + `licenseKey` query parameters and +validates only that the key belongs to the account (not that the license is +active/entitled). Returns the user's Blocks with start/end times and the IDs of +the selected Proclamations (content is fetched separately via +`/api/v2/proclamations`). Rate limited to 10 requests per minute per IP. +Failure messages follow the existing v2 shape: +`not-authorized` or `this key doesn't appear to belong to you`. + +--- + # GHL Account Creation Webhook Endpoint: diff --git a/docs/openapi.yaml b/docs/openapi.yaml index dc88351..9eb3568 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -31,6 +31,8 @@ tags: description: Proclamation content, optionally scoped by license entitlement. - name: License description: License key validation. + - name: Schedule + description: A user's daily listening schedule, consumed by the kiosk. - name: Automations description: Signed machine-to-machine webhooks. paths: @@ -230,6 +232,64 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorMessage' + /api/v2/schedule: + get: + tags: [Schedule] + summary: Get a user's listening schedule (query-param auth) + description: | + Machine-to-app endpoint used by the RadiantWave kiosk. Authenticates via + the paired `email` + `licenseKey` **query parameters** and validates only + that the key belongs to the account for that email. License + active/entitlement is deliberately not checked here: an invalid license + would already lock the kiosk out, so this endpoint only checks the + pairing. + + Returns every Block with its start/end times and the ordered list of + selected Proclamation IDs. Proclamation content is not included; the + kiosk fetches it separately via `/api/v2/proclamations`. + operationId: getSchedule + parameters: + - in: query + name: email + required: true + schema: + type: string + format: email + description: Account email. + - in: query + name: licenseKey + required: true + schema: + type: string + pattern: '^[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$' + description: License key. The legacy alias `key` is also accepted. + responses: + '200': + description: The user's schedule (possibly empty). + content: + application/json: + schema: + $ref: '#/components/schemas/ScheduleResponse' + '400': + description: | + Missing/invalid parameters, unknown key or user, or the key does not + belong to the email's account. Possible messages: `not-authorized`, + `this key doesn't appear to belong to you`. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorMessage' + '429': + description: Rate limit exceeded (10 requests per minute per IP). + headers: + Retry-After: + schema: + type: integer + description: Seconds to wait before retrying. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorMessage' /api/v2/automations/create/account: post: tags: [Automations] @@ -436,6 +496,49 @@ components: email_address: type: string format: email + ScheduleBlock: + type: object + required: [id, startTime, startMinutes, endTime, endMinutes, proclamationIds] + properties: + id: + type: string + format: uuid + startTime: + type: string + example: '06:00' + description: Wall-clock start time as `HH:MM`. + startMinutes: + type: integer + minimum: 0 + maximum: 1440 + description: Minutes from midnight. + endTime: + type: string + example: '08:00' + description: Wall-clock end time as `HH:MM`. + endMinutes: + type: integer + minimum: 0 + maximum: 1440 + description: Minutes from midnight. + proclamationIds: + type: array + description: IDs of the selected Proclamations, in play order. + items: + type: string + format: uuid + ScheduleResponse: + type: object + required: [email, blocks] + properties: + email: + type: string + format: email + blocks: + type: array + maxItems: 4 + items: + $ref: '#/components/schemas/ScheduleBlock' OnboardingRequest: type: object required: [email] From 750a9286c968395c81fcd1e7a55a296fc54c4895 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:24:48 -0500 Subject: [PATCH 06/14] Support overnight blocks in schedule validation --- src/lib/schedule-utils.spec.ts | 101 +++++++++++++++++++++++++++++++-- src/lib/schedule-utils.ts | 68 +++++++++++++++++++--- 2 files changed, 155 insertions(+), 14 deletions(-) diff --git a/src/lib/schedule-utils.spec.ts b/src/lib/schedule-utils.spec.ts index 6d0fb44..afa03bd 100644 --- a/src/lib/schedule-utils.spec.ts +++ b/src/lib/schedule-utils.spec.ts @@ -1,7 +1,10 @@ import { describe, it, expect } from 'vitest'; import { + blockDuration, + blockSegments, findOverlap, formatTime, + isOvernight, snapMinutes, toHm, validateBlock, @@ -52,6 +55,49 @@ describe('snapMinutes', () => { }); }); +describe('isOvernight', () => { + it('is true when the end clock time is before the start', () => { + expect(isOvernight({ startMinutes: 21 * 60, endMinutes: 9 * 60 })).toBe(true); + expect(isOvernight({ startMinutes: 22 * 60, endMinutes: 0 })).toBe(true); + }); + + it('is false for same-day ranges and a full-day range', () => { + expect(isOvernight({ startMinutes: 6 * 60, endMinutes: 8 * 60 })).toBe(false); + expect(isOvernight({ startMinutes: 0, endMinutes: 1440 })).toBe(false); + }); +}); + +describe('blockDuration', () => { + it('counts a same-day range directly', () => { + expect(blockDuration({ startMinutes: 6 * 60, endMinutes: 8 * 60 })).toBe(120); + }); + + it('counts an overnight range as wrapping to the next day', () => { + expect(blockDuration({ startMinutes: 21 * 60, endMinutes: 9 * 60 })).toBe(720); + }); + + it('treats an end of midnight as wrapping from the start', () => { + expect(blockDuration({ startMinutes: 22 * 60, endMinutes: 0 })).toBe(120); + }); +}); + +describe('blockSegments', () => { + it('returns a single segment for a same-day range', () => { + expect(blockSegments({ startMinutes: 6 * 60, endMinutes: 8 * 60 })).toEqual([[6 * 60, 8 * 60]]); + }); + + it('splits an overnight range at midnight', () => { + expect(blockSegments({ startMinutes: 21 * 60, endMinutes: 9 * 60 })).toEqual([ + [21 * 60, 1440], + [0, 9 * 60] + ]); + }); + + it('returns no segments for a zero-length range', () => { + expect(blockSegments({ startMinutes: 360, endMinutes: 360 })).toEqual([]); + }); +}); + describe('findOverlap', () => { it('returns null for adjacent ranges', () => { expect( @@ -63,6 +109,28 @@ describe('findOverlap', () => { const other = sibling(7 * 60, 9 * 60); expect(findOverlap({ startMinutes: 8 * 60, endMinutes: 10 * 60 }, [other])).toBe(other); }); + + it('detects an overnight block overlapping an early-morning block', () => { + const other = sibling(8 * 60, 10 * 60); + expect(findOverlap({ startMinutes: 21 * 60, endMinutes: 9 * 60 }, [other])).toBe(other); + }); + + it('detects an overnight block overlapping a late-evening block', () => { + const other = sibling(20 * 60, 22 * 60); + expect(findOverlap({ startMinutes: 21 * 60, endMinutes: 9 * 60 }, [other])).toBe(other); + }); + + it('allows an overnight block and its exact complement (adjacent at both ends)', () => { + expect( + findOverlap({ startMinutes: 21 * 60, endMinutes: 9 * 60 }, [sibling(9 * 60, 21 * 60)]) + ).toBeNull(); + }); + + it('allows an overnight block and a midday block it does not touch', () => { + expect( + findOverlap({ startMinutes: 21 * 60, endMinutes: 9 * 60 }, [sibling(10 * 60, 20 * 60)]) + ).toBeNull(); + }); }); describe('validateBlock', () => { @@ -74,17 +142,40 @@ describe('validateBlock', () => { const result = validateBlock(input({ endMinutes: 6 * 60 }), []); expect(result).toEqual({ ok: false, - error: "Start time must be before end time. Overnight blocks aren't supported." + error: "Start and end time can't be the same." }); }); - it('rejects an end time past midnight (overnight blocks disallowed)', () => { - const result = validateBlock(input({ startMinutes: 23 * 60, endMinutes: 25 * 60 }), []); - expect(result.ok).toBe(false); + it('rejects a time outside the 24-hour range', () => { + expect(validateBlock(input({ startMinutes: 23 * 60, endMinutes: 25 * 60 }), [])).toEqual({ + ok: false, + error: 'Enter a valid start and end time.' + }); }); it('rejects a negative start time', () => { - expect(validateBlock(input({ startMinutes: -1 }), []).ok).toBe(false); + expect(validateBlock(input({ startMinutes: -1 }), [])).toEqual({ + ok: false, + error: 'Enter a valid start and end time.' + }); + }); + + it('accepts an overnight block', () => { + expect( + validateBlock(input({ startMinutes: 21 * 60, endMinutes: 9 * 60 }), [], { + isCreate: true + }) + ).toEqual({ ok: true }); + }); + + it('rejects an overnight block that overlaps another and names it', () => { + const result = validateBlock(input({ startMinutes: 21 * 60, endMinutes: 9 * 60 }), [ + sibling(8 * 60, 10 * 60) + ]); + expect(result).toEqual({ + ok: false, + error: 'This overlaps with your 8:00 AM–10:00 AM block.' + }); }); it('requires at least one proclamation', () => { diff --git a/src/lib/schedule-utils.ts b/src/lib/schedule-utils.ts index 9d9e536..be6f9b8 100644 --- a/src/lib/schedule-utils.ts +++ b/src/lib/schedule-utils.ts @@ -49,14 +49,60 @@ export function snapMinutes(minutes: number): number { return Math.max(0, Math.min(MINUTES_PER_DAY, snapped)); } -/** First sibling whose half-open range [start, end) intersects the input. */ +/** A Block whose end clock time is at or before its start wraps past midnight. */ +export function isOvernight(block: { startMinutes: number; endMinutes: number }): boolean { + return block.endMinutes <= block.startMinutes; +} + +/** Block length in minutes, counting a wrap past midnight as the next day. */ +export function blockDuration(block: { startMinutes: number; endMinutes: number }): number { + if (block.endMinutes > block.startMinutes) { + return block.endMinutes - block.startMinutes; + } + return block.endMinutes - block.startMinutes + MINUTES_PER_DAY; +} + +/** + * Split a Block into the linear half-open `[start, end)` segments it occupies + * within the 24h day. An overnight block produces two segments (start→midnight + * and midnight→end); a zero-length block produces none. + */ +export function blockSegments(block: { + startMinutes: number; + endMinutes: number; +}): [number, number][] { + if (block.startMinutes < block.endMinutes) { + return [[block.startMinutes, block.endMinutes]]; + } + if (block.startMinutes > block.endMinutes) { + return [ + [block.startMinutes, MINUTES_PER_DAY], + [0, block.endMinutes] + ]; + } + return []; +} + +function segmentsIntersect(a: [number, number], b: [number, number]): boolean { + return a[0] < b[1] && b[0] < a[1]; +} + +/** + * First sibling whose occupied time intersects the input. Works for overnight + * (midnight-crossing) blocks by comparing their linear segments; ranges that + * only touch at an endpoint (e.g. 9PM–9AM vs 9AM–9PM) do not overlap. + */ export function findOverlap( input: { startMinutes: number; endMinutes: number }, siblings: BlockSibling[] ): BlockSibling | null { + const inputSegments = blockSegments(input); for (const sibling of siblings) { - if (input.startMinutes < sibling.endMinutes && sibling.startMinutes < input.endMinutes) { - return sibling; + const siblingSegments = blockSegments(sibling); + for (const segment of inputSegments) { + for (const other of siblingSegments) { + if (segmentsIntersect(segment, other)) return sibling; + } } } return null; @@ -78,13 +124,17 @@ export function validateBlock( !Number.isInteger(startMinutes) || !Number.isInteger(endMinutes) || startMinutes < 0 || - endMinutes > MINUTES_PER_DAY || - startMinutes >= endMinutes + startMinutes > MINUTES_PER_DAY || + endMinutes < 0 || + endMinutes > MINUTES_PER_DAY ) { - return { - ok: false, - error: "Start time must be before end time. Overnight blocks aren't supported." - }; + return { ok: false, error: 'Enter a valid start and end time.' }; + } + + // Equal clock times would be a zero- or full-length block; both are + // ambiguous, so reject them. Overnight ranges (end before start) are valid. + if (startMinutes === endMinutes) { + return { ok: false, error: "Start and end time can't be the same." }; } if (!Array.isArray(proclamationIds) || proclamationIds.length === 0) { From 177b7bb13abac8c1116a29a01f37bb09d501df47 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:24:51 -0500 Subject: [PATCH 07/14] Flag overnight blocks in the v2 schedule API --- docs/ai/api.md | 6 ++-- docs/openapi.yaml | 23 +++++++++++++-- src/lib/server/v2-serializers.ts | 10 +++++-- src/routes/api/v2/schedule/schedule.spec.ts | 31 +++++++++++++++------ 4 files changed, 55 insertions(+), 15 deletions(-) diff --git a/docs/ai/api.md b/docs/ai/api.md index a8d1eaf..28af62b 100644 --- a/docs/ai/api.md +++ b/docs/ai/api.md @@ -107,8 +107,10 @@ Authenticates with the paired `email` + `licenseKey` query parameters and validates only that the key belongs to the account (not that the license is active/entitled). Returns the user's Blocks with start/end times and the IDs of the selected Proclamations (content is fetched separately via -`/api/v2/proclamations`). Rate limited to 10 requests per minute per IP. -Failure messages follow the existing v2 shape: +`/api/v2/proclamations`). Overnight blocks (end clock time before start) are +supported and flagged with `overnight: true` plus a wrapping `durationMinutes`. +Rate limited to 10 requests per minute per IP. Failure messages follow the +existing v2 shape: `not-authorized` or `this key doesn't appear to belong to you`. --- diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 9eb3568..bfed06a 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -245,7 +245,9 @@ paths: pairing. Returns every Block with its start/end times and the ordered list of - selected Proclamation IDs. Proclamation content is not included; the + selected Proclamation IDs. Overnight blocks (an end clock time before + the start) are supported and flagged with `overnight: true` and a + wrapping `durationMinutes`. Proclamation content is not included; the kiosk fetches it separately via `/api/v2/proclamations`. operationId: getSchedule parameters: @@ -498,7 +500,17 @@ components: format: email ScheduleBlock: type: object - required: [id, startTime, startMinutes, endTime, endMinutes, proclamationIds] + required: + [ + id, + startTime, + startMinutes, + endTime, + endMinutes, + overnight, + durationMinutes, + proclamationIds + ] properties: id: type: string @@ -521,6 +533,13 @@ components: minimum: 0 maximum: 1440 description: Minutes from midnight. + overnight: + type: boolean + description: True when the end clock time is at or before the start, i.e. the block crosses midnight. + durationMinutes: + type: integer + minimum: 1 + description: Block length in minutes. An overnight block counts the wrap past midnight as the next day. proclamationIds: type: array description: IDs of the selected Proclamations, in play order. diff --git a/src/lib/server/v2-serializers.ts b/src/lib/server/v2-serializers.ts index 1325e0c..7aa6a74 100644 --- a/src/lib/server/v2-serializers.ts +++ b/src/lib/server/v2-serializers.ts @@ -1,4 +1,4 @@ -import { toHm } from '$lib/schedule-utils'; +import { blockDuration, isOvernight, toHm } from '$lib/schedule-utils'; // Canonical solfeggio id <- Hz, mirroring the kiosk's `frequencyIdForHz()` // map (radiantwave-rebuild src/audio/audio_downloader.cpp). v2 must emit these @@ -147,6 +147,8 @@ export type V2ScheduleBlock = { startMinutes: number; endTime: string; endMinutes: number; + overnight: boolean; + durationMinutes: number; proclamationIds: string[]; }; @@ -156,7 +158,9 @@ export type V2Schedule = { }; /** Build a schedule Block for the kiosk. Only the selected Proclamation IDs are - * returned; the kiosk fetches proclamation content separately. */ + * returned; the kiosk fetches proclamation content separately. `overnight` + * marks a range that crosses midnight (end clock time before start), and + * `durationMinutes` counts the wrap as the next day. */ export function serializeScheduleBlock( block: { id: string; startMinutes: number; endMinutes: number }, proclamationIds: string[] @@ -167,6 +171,8 @@ export function serializeScheduleBlock( startMinutes: block.startMinutes, endTime: toHm(block.endMinutes), endMinutes: block.endMinutes, + overnight: isOvernight(block), + durationMinutes: blockDuration(block), proclamationIds }; } diff --git a/src/routes/api/v2/schedule/schedule.spec.ts b/src/routes/api/v2/schedule/schedule.spec.ts index 76870cc..de18046 100644 --- a/src/routes/api/v2/schedule/schedule.spec.ts +++ b/src/routes/api/v2/schedule/schedule.spec.ts @@ -86,7 +86,7 @@ describe('GET /api/v2/schedule auth', () => { }); describe('GET /api/v2/schedule success', () => { - it('returns only proclamation IDs even when the key is inactive', async () => { + it('returns only proclamation IDs, marking an overnight block, even when the key is inactive', async () => { licenseKeyFindUnique.mockResolvedValue({ key: KEY, userId: 'user-1', @@ -97,8 +97,8 @@ describe('GET /api/v2/schedule success', () => { blockFindMany.mockResolvedValue([ { id: 'block-1', - startMinutes: 360, - endMinutes: 480, + startMinutes: 21 * 60, + endMinutes: 9 * 60, proclamations: [{ proclamation: { id: 'p1' } }, { proclamation: { id: 'p2' } }] } ]); @@ -111,10 +111,12 @@ describe('GET /api/v2/schedule success', () => { blocks: [ { id: 'block-1', - startTime: '06:00', - startMinutes: 360, - endTime: '08:00', - endMinutes: 480, + startTime: '21:00', + startMinutes: 1260, + endTime: '09:00', + endMinutes: 540, + overnight: true, + durationMinutes: 720, proclamationIds: ['p1', 'p2'] } ] @@ -134,9 +136,20 @@ describe('GET /api/v2/schedule success', () => { ]); const response = await call({ email: 'jane@example.com', licenseKey: KEY }); - const body = (await response.json()) as { blocks: { proclamationIds: string[] }[] }; + const body = (await response.json()) as { + blocks: { proclamationIds: string[]; overnight: boolean; durationMinutes: number }[]; + }; - expect(body.blocks[0].proclamationIds).toEqual(['p1']); + expect(body.blocks[0]).toEqual({ + id: 'block-1', + startTime: '00:00', + startMinutes: 0, + endTime: '01:00', + endMinutes: 60, + overnight: false, + durationMinutes: 60, + proclamationIds: ['p1'] + }); }); it('accepts the legacy `key` query alias and an email-only license', async () => { From 46d7cf66b8d0855ea399ec80c918006933a9d51c Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:24:54 -0500 Subject: [PATCH 08/14] Render overnight blocks across midnight in the day view --- src/lib/components/schedule/BlockModal.svelte | 15 +++- .../schedule/BlockModal.svelte.spec.ts | 6 ++ .../components/schedule/DaySchedule.svelte | 69 +++++++++++++------ 3 files changed, 66 insertions(+), 24 deletions(-) diff --git a/src/lib/components/schedule/BlockModal.svelte b/src/lib/components/schedule/BlockModal.svelte index 352aece..1743433 100644 --- a/src/lib/components/schedule/BlockModal.svelte +++ b/src/lib/components/schedule/BlockModal.svelte @@ -2,7 +2,13 @@ import { enhance } from '$app/forms'; import type { SubmitFunction } from '@sveltejs/kit'; import ProclamationBrowser from './ProclamationBrowser.svelte'; - import { MINUTE_STEP, formatTime, validateBlock, type BlockSibling } from '$lib/schedule-utils'; + import { + MINUTE_STEP, + formatTime, + isOvernight, + validateBlock, + type BlockSibling + } from '$lib/schedule-utils'; type BrowserCategory = { id: number; name: string }; type BrowserGroup = { id: number; name: string }; @@ -77,6 +83,9 @@ const startMinutes = $derived((Number(startHour) * 60 + Number(startMinute)) | 0); const endMinutes = $derived((Number(endHour) * 60 + Number(endMinute)) | 0); + const overnight = $derived( + startMinutes !== endMinutes && isOvernight({ startMinutes, endMinutes }) + ); const siblings = $derived(existingBlocks.filter((block) => block.id !== blockId)); @@ -276,7 +285,9 @@ >

Review

- {formatTime(startMinutes)} – {formatTime(endMinutes)} + {formatTime(startMinutes)} – {formatTime(endMinutes)}{overnight + ? ' (next day)' + : ''}

{#if selectedTitles.length === 0}

diff --git a/src/lib/components/schedule/BlockModal.svelte.spec.ts b/src/lib/components/schedule/BlockModal.svelte.spec.ts index 507d062..b9f66cb 100644 --- a/src/lib/components/schedule/BlockModal.svelte.spec.ts +++ b/src/lib/components/schedule/BlockModal.svelte.spec.ts @@ -74,6 +74,12 @@ describe('BlockModal', () => { await expect.element(page.getByText('Peace')).toBeInTheDocument(); }); + it('marks an overnight block in the review', async () => { + mount({ initialStartMinutes: 21 * 60, initialEndMinutes: 9 * 60 }); + + await expect.element(page.getByText('9:00 PM – 9:00 AM (next day)')).toBeInTheDocument(); + }); + it('rejects an overlapping time range with the specific error', async () => { mount({ existingBlocks: [{ id: 'b1', startMinutes: 6 * 60, endMinutes: 8 * 60 }], diff --git a/src/lib/components/schedule/DaySchedule.svelte b/src/lib/components/schedule/DaySchedule.svelte index c9dc434..1d1b080 100644 --- a/src/lib/components/schedule/DaySchedule.svelte +++ b/src/lib/components/schedule/DaySchedule.svelte @@ -1,5 +1,12 @@

@@ -113,27 +132,33 @@ >
{/if} - {#each blocks as block (block.id)} - {@const top = (block.startMinutes / MINUTES_PER_DAY) * 100} - {@const height = ((block.endMinutes - block.startMinutes) / MINUTES_PER_DAY) * 100} - + {#each blockViews as view (view.block.id)} + {#each view.segments as segment, segmentIndex (`${view.block.id}-${segmentIndex}`)} + + {/each} {/each} {#if blocks.length === 0} From 15bb51582b4020b53b37bef9d42e3cb67197cb2f Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:30:08 -0500 Subject: [PATCH 09/14] Move Cancel left and rename Back to Accept in the block modal --- src/lib/components/schedule/BlockModal.svelte | 28 +++++++++---------- .../schedule/BlockModal.svelte.spec.ts | 20 +++++++++++++ 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/lib/components/schedule/BlockModal.svelte b/src/lib/components/schedule/BlockModal.svelte index 1743433..305e61a 100644 --- a/src/lib/components/schedule/BlockModal.svelte +++ b/src/lib/components/schedule/BlockModal.svelte @@ -316,16 +316,8 @@
-
- {#if step === 'browse'} - - {:else if mode === 'edit' && blockId} +
+ {#if step === 'details' && mode === 'edit' && blockId}
- -
- {#if step === 'details'} +
+ +
+ {#if step === 'browse'} + + {:else}
@@ -244,9 +272,7 @@ class="rounded-md border border-slate-300 bg-white px-2 py-2 text-sm text-slate-900 shadow-sm focus:border-indigo-500 focus:outline-none dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100" > {#each hourOptions as hour (hour)} - + {/each} : @@ -261,6 +287,15 @@ {/each} +
diff --git a/src/lib/components/schedule/BlockModal.svelte.spec.ts b/src/lib/components/schedule/BlockModal.svelte.spec.ts index 30ef6a0..60a411b 100644 --- a/src/lib/components/schedule/BlockModal.svelte.spec.ts +++ b/src/lib/components/schedule/BlockModal.svelte.spec.ts @@ -67,6 +67,32 @@ describe('BlockModal', () => { await expect.element(page.getByRole('combobox', { name: /^End minute$/ })).toHaveValue('15'); }); + it('uses a 12-hour clock with an AM/PM select for each time', async () => { + mount({ initialStartMinutes: 21 * 60, initialEndMinutes: 0 }); + + await expect.element(page.getByRole('combobox', { name: /^Start hour$/ })).toHaveValue('9'); + await expect.element(page.getByRole('combobox', { name: /^Start period$/ })).toHaveValue('PM'); + await expect.element(page.getByRole('combobox', { name: /^End hour$/ })).toHaveValue('12'); + await expect.element(page.getByRole('combobox', { name: /^End period$/ })).toHaveValue('AM'); + + // No 24-hour option exists any more. + await expect + .element(page.getByRole('combobox', { name: /^Start hour$/ })) + .not.toHaveValue('21'); + }); + + it('recomputes the time when the AM/PM switch changes', async () => { + mount({ initialStartMinutes: 9 * 60, initialEndMinutes: 10 * 60 }); + + const period = (await page + .getByRole('combobox', { name: /^End period$/ }) + .element()) as HTMLSelectElement; + period.value = 'PM'; + period.dispatchEvent(new Event('change', { bubbles: true })); + + await expect.element(page.getByText('9:00 AM – 10:00 PM')).toBeInTheDocument(); + }); + it('shows the review times and selected proclamation titles', async () => { mount(); From 468a65a6889d2533c6b77a874a005d97b4aa32d1 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:41:46 -0500 Subject: [PATCH 11/14] Add dynamic audio flag to schedule blocks --- .../migration.sql | 2 + prisma/schema.prisma | 3 ++ src/lib/generated/prisma/internal/class.ts | 8 ++-- .../prisma/internal/prismaNamespace.ts | 1 + .../prisma/internal/prismaNamespaceBrowser.ts | 1 + src/lib/generated/prisma/models/Block.ts | 41 ++++++++++++++++++- 6 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 prisma/migrations/20260911233847_add_block_dynamic_audio/migration.sql diff --git a/prisma/migrations/20260911233847_add_block_dynamic_audio/migration.sql b/prisma/migrations/20260911233847_add_block_dynamic_audio/migration.sql new file mode 100644 index 0000000..4627426 --- /dev/null +++ b/prisma/migrations/20260911233847_add_block_dynamic_audio/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Block" ADD COLUMN "dynamicAudio" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7563bd1..4243932 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -278,6 +278,9 @@ model Block { schedule Schedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade) startMinutes Int endMinutes Int + // When true, the kiosk enables dynamic audio for the duration of this block, + // overriding any audio selections made on the device. + dynamicAudio Boolean @default(false) proclamations BlockProclamations[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/src/lib/generated/prisma/internal/class.ts b/src/lib/generated/prisma/internal/class.ts index ee186df..b61ea9d 100644 --- a/src/lib/generated/prisma/internal/class.ts +++ b/src/lib/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/lib/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n roleId Int? @default(4) // New users default to \"User\"\n role UserRole? @relation(fields: [roleId], references: [id])\n sessions Session[]\n accounts Account[]\n profiles Profile[]\n licenseKeys LicenseKey[]\n userProclamations UserProclamations[]\n schedule Schedule?\n\n @@unique([email])\n @@map(\"user\")\n}\n\n// I chose to create a Profile table here because honestly, I didn't want to waste\n// a bunch of time trying to figure out how to customize the default Better-Auth model. \nmodel Profile {\n id String @id @default(uuid())\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n email String?\n firstName String\n lastName String\n phoneNumber String\n ghlContactId String? @map(\"ghl_contact_id\")\n addresses Address[]\n\n @@index([userId])\n @@index([email])\n}\n\nmodel Address {\n id String @id @default(uuid())\n profileId String\n profile Profile @relation(fields: [profileId], references: [id], onDelete: Cascade)\n street String\n city String\n state String\n postalCode String\n country String\n type String @default(\"Mailing\")\n isDefaultMailing Boolean @default(false)\n isDefaultBilling Boolean @default(false)\n isDefaultShipping Boolean @default(false)\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel UserRole {\n id Int @id @default(autoincrement())\n name String\n users User[]\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Proclamation {\n id String @id @default(uuid())\n name String @unique\n content String\n solfeggioFrequencyId Int\n solfeggioFrequency SolfeggioFrequency @relation(fields: [solfeggioFrequencyId], references: [id])\n categoryId Int\n category ProclamationCategory @relation(fields: [categoryId], references: [id])\n groupId Int\n group ProclamationGroup @relation(fields: [groupId], references: [id])\n userProclamations UserProclamations[]\n blockProclamations BlockProclamations[]\n // Legacy subscription-level FK. Retained in the database but unmanaged; the\n // FK constraint is dropped and the value is left NULL. Hidden from the client.\n subscriptionLevelId Int? @ignore\n}\n\nmodel ProclamationGroup {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\nmodel UserProclamations {\n userId String\n user User @relation(fields: [userId], references: [id])\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([userId, proclamationId])\n}\n\nmodel SolfeggioFrequency {\n id Int @id @default(autoincrement())\n name String @unique\n value Int @unique\n proclamations Proclamation[]\n}\n\nmodel ProclamationCategory {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\n// Archive of the former child sub-categories removed when the\n// ProclamationCategory hierarchy was flattened. Kept for recovery/audit.\n// `@@ignore` keeps it out of the generated client while Prisma remains aware\n// of the table so `migrate dev` does not report it as an untracked table.\nmodel ProclamationCategoryLegacy {\n id Int @id\n name String\n parentId Int?\n sortOrder Int @default(0)\n\n @@map(\"ProclamationCategoryLegacy\")\n @@ignore\n}\n\n// Archive of the category->subscription-level mappings for the child\n// categories removed when the category hierarchy was flattened. Kept with\n// `@@ignore` so Prisma remains aware of the table but it is excluded from the\n// generated client and Prisma's own migrations.\nmodel ProclamationCategorySubscriptionLevelLegacy {\n categoryId Int\n subscriptionLevelId Int\n\n @@id([categoryId, subscriptionLevelId])\n @@map(\"ProclamationCategorySubscriptionLevelLegacy\")\n @@ignore\n}\n\nmodel LicenseKey {\n id String @id @default(uuid())\n key String @unique\n active Boolean\n createdAt DateTime @default(now())\n lastValidatedAt DateTime?\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n email String?\n // Legacy subscription level. Retained in the database but unmanaged; hidden\n // from the client and left NULL.\n level String? @ignore\n\n @@index([userId])\n @@index([email])\n}\n\nmodel ApiKey {\n id String @id @default(cuid())\n keyPrefix String\n keyHash String @unique\n createdAt DateTime @default(now())\n expiresAt DateTime?\n revokedAt DateTime?\n}\n\n// Portal-editable 7-color palette per canonical solfeggio frequency id (1-9).\n// `solfeggioFrequencyId` is the canonical id the kiosk uses (see\n// v2-serializers.ts), not the DB autoincrement id of `SolfeggioFrequency`.\nmodel ColorPalette {\n solfeggioFrequencyId Int @id\n colors Json // [\"#RRGGBB\", ... x7]\n\n @@map(\"ColorPalette\")\n}\n\n// Append-only audit trail of database mutations. Written centrally by the\n// Prisma extension in src/lib/db.ts; read by the admin Audit Log page.\nmodel AuditLog {\n id String @id @default(uuid())\n createdAt DateTime @default(now())\n userId String?\n email String?\n roleId Int?\n roleName String?\n page String\n action String\n entity String?\n entityId String?\n before Json?\n after Json?\n ip String?\n\n @@index([createdAt])\n @@index([roleId])\n @@index([action])\n @@index([page])\n @@map(\"AuditLog\")\n}\n\n// A user's daily listening schedule. Exactly one per user (enforced by the\n// unique userId); contains 0-4 time Blocks. Times are wall-clock minutes from\n// midnight (0-1440), interpreted by the kiosk in the user's configured\n// timezone. The portal never stores a timezone.\nmodel Schedule {\n id String @id @default(uuid())\n userId String @unique\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n blocks Block[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// A single non-overlapping time range within a Schedule, plus the ordered set\n// of selected Proclamations to play during it. Overnight ranges are disallowed\n// in v1, so startMinutes is always less than endMinutes.\nmodel Block {\n id String @id @default(uuid())\n scheduleId String\n schedule Schedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade)\n startMinutes Int\n endMinutes Int\n proclamations BlockProclamations[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([scheduleId])\n}\n\n// Join table: the Proclamations selected for a Block. Carries the Proclamation\n// content for playback via the API; the portal UI only ever reads\n// title/category/group.\nmodel BlockProclamations {\n blockId String\n block Block @relation(fields: [blockId], references: [id], onDelete: Cascade)\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([blockId, proclamationId])\n @@index([proclamationId])\n}\n", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/lib/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n roleId Int? @default(4) // New users default to \"User\"\n role UserRole? @relation(fields: [roleId], references: [id])\n sessions Session[]\n accounts Account[]\n profiles Profile[]\n licenseKeys LicenseKey[]\n userProclamations UserProclamations[]\n schedule Schedule?\n\n @@unique([email])\n @@map(\"user\")\n}\n\n// I chose to create a Profile table here because honestly, I didn't want to waste\n// a bunch of time trying to figure out how to customize the default Better-Auth model. \nmodel Profile {\n id String @id @default(uuid())\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n email String?\n firstName String\n lastName String\n phoneNumber String\n ghlContactId String? @map(\"ghl_contact_id\")\n addresses Address[]\n\n @@index([userId])\n @@index([email])\n}\n\nmodel Address {\n id String @id @default(uuid())\n profileId String\n profile Profile @relation(fields: [profileId], references: [id], onDelete: Cascade)\n street String\n city String\n state String\n postalCode String\n country String\n type String @default(\"Mailing\")\n isDefaultMailing Boolean @default(false)\n isDefaultBilling Boolean @default(false)\n isDefaultShipping Boolean @default(false)\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel UserRole {\n id Int @id @default(autoincrement())\n name String\n users User[]\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Proclamation {\n id String @id @default(uuid())\n name String @unique\n content String\n solfeggioFrequencyId Int\n solfeggioFrequency SolfeggioFrequency @relation(fields: [solfeggioFrequencyId], references: [id])\n categoryId Int\n category ProclamationCategory @relation(fields: [categoryId], references: [id])\n groupId Int\n group ProclamationGroup @relation(fields: [groupId], references: [id])\n userProclamations UserProclamations[]\n blockProclamations BlockProclamations[]\n // Legacy subscription-level FK. Retained in the database but unmanaged; the\n // FK constraint is dropped and the value is left NULL. Hidden from the client.\n subscriptionLevelId Int? @ignore\n}\n\nmodel ProclamationGroup {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\nmodel UserProclamations {\n userId String\n user User @relation(fields: [userId], references: [id])\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([userId, proclamationId])\n}\n\nmodel SolfeggioFrequency {\n id Int @id @default(autoincrement())\n name String @unique\n value Int @unique\n proclamations Proclamation[]\n}\n\nmodel ProclamationCategory {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\n// Archive of the former child sub-categories removed when the\n// ProclamationCategory hierarchy was flattened. Kept for recovery/audit.\n// `@@ignore` keeps it out of the generated client while Prisma remains aware\n// of the table so `migrate dev` does not report it as an untracked table.\nmodel ProclamationCategoryLegacy {\n id Int @id\n name String\n parentId Int?\n sortOrder Int @default(0)\n\n @@map(\"ProclamationCategoryLegacy\")\n @@ignore\n}\n\n// Archive of the category->subscription-level mappings for the child\n// categories removed when the category hierarchy was flattened. Kept with\n// `@@ignore` so Prisma remains aware of the table but it is excluded from the\n// generated client and Prisma's own migrations.\nmodel ProclamationCategorySubscriptionLevelLegacy {\n categoryId Int\n subscriptionLevelId Int\n\n @@id([categoryId, subscriptionLevelId])\n @@map(\"ProclamationCategorySubscriptionLevelLegacy\")\n @@ignore\n}\n\nmodel LicenseKey {\n id String @id @default(uuid())\n key String @unique\n active Boolean\n createdAt DateTime @default(now())\n lastValidatedAt DateTime?\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n email String?\n // Legacy subscription level. Retained in the database but unmanaged; hidden\n // from the client and left NULL.\n level String? @ignore\n\n @@index([userId])\n @@index([email])\n}\n\nmodel ApiKey {\n id String @id @default(cuid())\n keyPrefix String\n keyHash String @unique\n createdAt DateTime @default(now())\n expiresAt DateTime?\n revokedAt DateTime?\n}\n\n// Portal-editable 7-color palette per canonical solfeggio frequency id (1-9).\n// `solfeggioFrequencyId` is the canonical id the kiosk uses (see\n// v2-serializers.ts), not the DB autoincrement id of `SolfeggioFrequency`.\nmodel ColorPalette {\n solfeggioFrequencyId Int @id\n colors Json // [\"#RRGGBB\", ... x7]\n\n @@map(\"ColorPalette\")\n}\n\n// Append-only audit trail of database mutations. Written centrally by the\n// Prisma extension in src/lib/db.ts; read by the admin Audit Log page.\nmodel AuditLog {\n id String @id @default(uuid())\n createdAt DateTime @default(now())\n userId String?\n email String?\n roleId Int?\n roleName String?\n page String\n action String\n entity String?\n entityId String?\n before Json?\n after Json?\n ip String?\n\n @@index([createdAt])\n @@index([roleId])\n @@index([action])\n @@index([page])\n @@map(\"AuditLog\")\n}\n\n// A user's daily listening schedule. Exactly one per user (enforced by the\n// unique userId); contains 0-4 time Blocks. Times are wall-clock minutes from\n// midnight (0-1440), interpreted by the kiosk in the user's configured\n// timezone. The portal never stores a timezone.\nmodel Schedule {\n id String @id @default(uuid())\n userId String @unique\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n blocks Block[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// A single non-overlapping time range within a Schedule, plus the ordered set\n// of selected Proclamations to play during it. Overnight ranges are disallowed\n// in v1, so startMinutes is always less than endMinutes.\nmodel Block {\n id String @id @default(uuid())\n scheduleId String\n schedule Schedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade)\n startMinutes Int\n endMinutes Int\n // When true, the kiosk enables dynamic audio for the duration of this block,\n // overriding any audio selections made on the device.\n dynamicAudio Boolean @default(false)\n proclamations BlockProclamations[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([scheduleId])\n}\n\n// Join table: the Proclamations selected for a Block. Carries the Proclamation\n// content for playback via the API; the portal UI only ever reads\n// title/category/group.\nmodel BlockProclamations {\n blockId String\n block Block @relation(fields: [blockId], references: [id], onDelete: Cascade)\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([blockId, proclamationId])\n @@index([proclamationId])\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"object\",\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"profiles\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"ProfileToUser\"},{\"name\":\"licenseKeys\",\"kind\":\"object\",\"type\":\"LicenseKey\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"schedule\",\"kind\":\"object\",\"type\":\"Schedule\",\"relationName\":\"ScheduleToUser\"}],\"dbName\":\"user\"},\"Profile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProfileToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ghlContactId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"ghl_contact_id\"},{\"name\":\"addresses\",\"kind\":\"object\",\"type\":\"Address\",\"relationName\":\"AddressToProfile\"}],\"dbName\":null},\"Address\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profile\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"AddressToProfile\"},{\"name\":\"street\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDefaultMailing\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultBilling\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultShipping\",\"kind\":\"scalar\",\"type\":\"Boolean\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"session\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"account\"},\"UserRole\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserRole\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Proclamation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"solfeggioFrequency\",\"kind\":\"object\",\"type\":\"SolfeggioFrequency\",\"relationName\":\"ProclamationToSolfeggioFrequency\"},{\"name\":\"categoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"category\",\"kind\":\"object\",\"type\":\"ProclamationCategory\",\"relationName\":\"ProclamationToProclamationCategory\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"ProclamationGroup\",\"relationName\":\"ProclamationToProclamationGroup\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"blockProclamations\",\"kind\":\"object\",\"type\":\"BlockProclamations\",\"relationName\":\"BlockProclamationsToProclamation\"}],\"dbName\":null},\"ProclamationGroup\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationGroup\"}],\"dbName\":null},\"UserProclamations\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SolfeggioFrequency\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToSolfeggioFrequency\"}],\"dbName\":null},\"ProclamationCategory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationCategory\"}],\"dbName\":null},\"LicenseKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"active\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastValidatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyPrefix\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ColorPalette\":{\"fields\":[{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":\"ColorPalette\"},\"AuditLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"page\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"action\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entity\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entityId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"before\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"after\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"ip\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"AuditLog\"},\"Schedule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ScheduleToUser\"},{\"name\":\"blocks\",\"kind\":\"object\",\"type\":\"Block\",\"relationName\":\"BlockToSchedule\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Block\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scheduleId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"schedule\",\"kind\":\"object\",\"type\":\"Schedule\",\"relationName\":\"BlockToSchedule\"},{\"name\":\"startMinutes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"endMinutes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"BlockProclamations\",\"relationName\":\"BlockToBlockProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"BlockProclamations\":{\"fields\":[{\"name\":\"blockId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"block\",\"kind\":\"object\",\"type\":\"Block\",\"relationName\":\"BlockToBlockProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"BlockProclamationsToProclamation\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"object\",\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"profiles\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"ProfileToUser\"},{\"name\":\"licenseKeys\",\"kind\":\"object\",\"type\":\"LicenseKey\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"schedule\",\"kind\":\"object\",\"type\":\"Schedule\",\"relationName\":\"ScheduleToUser\"}],\"dbName\":\"user\"},\"Profile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProfileToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ghlContactId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"ghl_contact_id\"},{\"name\":\"addresses\",\"kind\":\"object\",\"type\":\"Address\",\"relationName\":\"AddressToProfile\"}],\"dbName\":null},\"Address\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profile\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"AddressToProfile\"},{\"name\":\"street\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDefaultMailing\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultBilling\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultShipping\",\"kind\":\"scalar\",\"type\":\"Boolean\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"session\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"account\"},\"UserRole\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserRole\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Proclamation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"solfeggioFrequency\",\"kind\":\"object\",\"type\":\"SolfeggioFrequency\",\"relationName\":\"ProclamationToSolfeggioFrequency\"},{\"name\":\"categoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"category\",\"kind\":\"object\",\"type\":\"ProclamationCategory\",\"relationName\":\"ProclamationToProclamationCategory\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"ProclamationGroup\",\"relationName\":\"ProclamationToProclamationGroup\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"blockProclamations\",\"kind\":\"object\",\"type\":\"BlockProclamations\",\"relationName\":\"BlockProclamationsToProclamation\"}],\"dbName\":null},\"ProclamationGroup\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationGroup\"}],\"dbName\":null},\"UserProclamations\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SolfeggioFrequency\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToSolfeggioFrequency\"}],\"dbName\":null},\"ProclamationCategory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationCategory\"}],\"dbName\":null},\"LicenseKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"active\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastValidatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyPrefix\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ColorPalette\":{\"fields\":[{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":\"ColorPalette\"},\"AuditLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"page\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"action\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entity\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entityId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"before\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"after\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"ip\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"AuditLog\"},\"Schedule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ScheduleToUser\"},{\"name\":\"blocks\",\"kind\":\"object\",\"type\":\"Block\",\"relationName\":\"BlockToSchedule\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Block\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scheduleId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"schedule\",\"kind\":\"object\",\"type\":\"Schedule\",\"relationName\":\"BlockToSchedule\"},{\"name\":\"startMinutes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"endMinutes\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"dynamicAudio\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"BlockProclamations\",\"relationName\":\"BlockToBlockProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"BlockProclamations\":{\"fields\":[{\"name\":\"blockId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"block\",\"kind\":\"object\",\"type\":\"Block\",\"relationName\":\"BlockToBlockProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"BlockProclamationsToProclamation\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"users\",\"_count\",\"role\",\"user\",\"sessions\",\"accounts\",\"profile\",\"addresses\",\"profiles\",\"licenseKeys\",\"proclamations\",\"solfeggioFrequency\",\"category\",\"group\",\"userProclamations\",\"blocks\",\"schedule\",\"block\",\"proclamation\",\"blockProclamations\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Profile.findUnique\",\"Profile.findUniqueOrThrow\",\"Profile.findFirst\",\"Profile.findFirstOrThrow\",\"Profile.findMany\",\"Profile.createOne\",\"Profile.createMany\",\"Profile.createManyAndReturn\",\"Profile.updateOne\",\"Profile.updateMany\",\"Profile.updateManyAndReturn\",\"Profile.upsertOne\",\"Profile.deleteOne\",\"Profile.deleteMany\",\"Profile.groupBy\",\"Profile.aggregate\",\"Address.findUnique\",\"Address.findUniqueOrThrow\",\"Address.findFirst\",\"Address.findFirstOrThrow\",\"Address.findMany\",\"Address.createOne\",\"Address.createMany\",\"Address.createManyAndReturn\",\"Address.updateOne\",\"Address.updateMany\",\"Address.updateManyAndReturn\",\"Address.upsertOne\",\"Address.deleteOne\",\"Address.deleteMany\",\"Address.groupBy\",\"Address.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"UserRole.findUnique\",\"UserRole.findUniqueOrThrow\",\"UserRole.findFirst\",\"UserRole.findFirstOrThrow\",\"UserRole.findMany\",\"UserRole.createOne\",\"UserRole.createMany\",\"UserRole.createManyAndReturn\",\"UserRole.updateOne\",\"UserRole.updateMany\",\"UserRole.updateManyAndReturn\",\"UserRole.upsertOne\",\"UserRole.deleteOne\",\"UserRole.deleteMany\",\"UserRole.groupBy\",\"UserRole.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Proclamation.findUnique\",\"Proclamation.findUniqueOrThrow\",\"Proclamation.findFirst\",\"Proclamation.findFirstOrThrow\",\"Proclamation.findMany\",\"Proclamation.createOne\",\"Proclamation.createMany\",\"Proclamation.createManyAndReturn\",\"Proclamation.updateOne\",\"Proclamation.updateMany\",\"Proclamation.updateManyAndReturn\",\"Proclamation.upsertOne\",\"Proclamation.deleteOne\",\"Proclamation.deleteMany\",\"Proclamation.groupBy\",\"Proclamation.aggregate\",\"ProclamationGroup.findUnique\",\"ProclamationGroup.findUniqueOrThrow\",\"ProclamationGroup.findFirst\",\"ProclamationGroup.findFirstOrThrow\",\"ProclamationGroup.findMany\",\"ProclamationGroup.createOne\",\"ProclamationGroup.createMany\",\"ProclamationGroup.createManyAndReturn\",\"ProclamationGroup.updateOne\",\"ProclamationGroup.updateMany\",\"ProclamationGroup.updateManyAndReturn\",\"ProclamationGroup.upsertOne\",\"ProclamationGroup.deleteOne\",\"ProclamationGroup.deleteMany\",\"ProclamationGroup.groupBy\",\"ProclamationGroup.aggregate\",\"UserProclamations.findUnique\",\"UserProclamations.findUniqueOrThrow\",\"UserProclamations.findFirst\",\"UserProclamations.findFirstOrThrow\",\"UserProclamations.findMany\",\"UserProclamations.createOne\",\"UserProclamations.createMany\",\"UserProclamations.createManyAndReturn\",\"UserProclamations.updateOne\",\"UserProclamations.updateMany\",\"UserProclamations.updateManyAndReturn\",\"UserProclamations.upsertOne\",\"UserProclamations.deleteOne\",\"UserProclamations.deleteMany\",\"UserProclamations.groupBy\",\"UserProclamations.aggregate\",\"SolfeggioFrequency.findUnique\",\"SolfeggioFrequency.findUniqueOrThrow\",\"SolfeggioFrequency.findFirst\",\"SolfeggioFrequency.findFirstOrThrow\",\"SolfeggioFrequency.findMany\",\"SolfeggioFrequency.createOne\",\"SolfeggioFrequency.createMany\",\"SolfeggioFrequency.createManyAndReturn\",\"SolfeggioFrequency.updateOne\",\"SolfeggioFrequency.updateMany\",\"SolfeggioFrequency.updateManyAndReturn\",\"SolfeggioFrequency.upsertOne\",\"SolfeggioFrequency.deleteOne\",\"SolfeggioFrequency.deleteMany\",\"SolfeggioFrequency.groupBy\",\"SolfeggioFrequency.aggregate\",\"ProclamationCategory.findUnique\",\"ProclamationCategory.findUniqueOrThrow\",\"ProclamationCategory.findFirst\",\"ProclamationCategory.findFirstOrThrow\",\"ProclamationCategory.findMany\",\"ProclamationCategory.createOne\",\"ProclamationCategory.createMany\",\"ProclamationCategory.createManyAndReturn\",\"ProclamationCategory.updateOne\",\"ProclamationCategory.updateMany\",\"ProclamationCategory.updateManyAndReturn\",\"ProclamationCategory.upsertOne\",\"ProclamationCategory.deleteOne\",\"ProclamationCategory.deleteMany\",\"ProclamationCategory.groupBy\",\"ProclamationCategory.aggregate\",\"LicenseKey.findUnique\",\"LicenseKey.findUniqueOrThrow\",\"LicenseKey.findFirst\",\"LicenseKey.findFirstOrThrow\",\"LicenseKey.findMany\",\"LicenseKey.createOne\",\"LicenseKey.createMany\",\"LicenseKey.createManyAndReturn\",\"LicenseKey.updateOne\",\"LicenseKey.updateMany\",\"LicenseKey.updateManyAndReturn\",\"LicenseKey.upsertOne\",\"LicenseKey.deleteOne\",\"LicenseKey.deleteMany\",\"LicenseKey.groupBy\",\"LicenseKey.aggregate\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"ColorPalette.findUnique\",\"ColorPalette.findUniqueOrThrow\",\"ColorPalette.findFirst\",\"ColorPalette.findFirstOrThrow\",\"ColorPalette.findMany\",\"ColorPalette.createOne\",\"ColorPalette.createMany\",\"ColorPalette.createManyAndReturn\",\"ColorPalette.updateOne\",\"ColorPalette.updateMany\",\"ColorPalette.updateManyAndReturn\",\"ColorPalette.upsertOne\",\"ColorPalette.deleteOne\",\"ColorPalette.deleteMany\",\"ColorPalette.groupBy\",\"ColorPalette.aggregate\",\"AuditLog.findUnique\",\"AuditLog.findUniqueOrThrow\",\"AuditLog.findFirst\",\"AuditLog.findFirstOrThrow\",\"AuditLog.findMany\",\"AuditLog.createOne\",\"AuditLog.createMany\",\"AuditLog.createManyAndReturn\",\"AuditLog.updateOne\",\"AuditLog.updateMany\",\"AuditLog.updateManyAndReturn\",\"AuditLog.upsertOne\",\"AuditLog.deleteOne\",\"AuditLog.deleteMany\",\"AuditLog.groupBy\",\"AuditLog.aggregate\",\"Schedule.findUnique\",\"Schedule.findUniqueOrThrow\",\"Schedule.findFirst\",\"Schedule.findFirstOrThrow\",\"Schedule.findMany\",\"Schedule.createOne\",\"Schedule.createMany\",\"Schedule.createManyAndReturn\",\"Schedule.updateOne\",\"Schedule.updateMany\",\"Schedule.updateManyAndReturn\",\"Schedule.upsertOne\",\"Schedule.deleteOne\",\"Schedule.deleteMany\",\"Schedule.groupBy\",\"Schedule.aggregate\",\"Block.findUnique\",\"Block.findUniqueOrThrow\",\"Block.findFirst\",\"Block.findFirstOrThrow\",\"Block.findMany\",\"Block.createOne\",\"Block.createMany\",\"Block.createManyAndReturn\",\"Block.updateOne\",\"Block.updateMany\",\"Block.updateManyAndReturn\",\"Block.upsertOne\",\"Block.deleteOne\",\"Block.deleteMany\",\"Block.groupBy\",\"Block.aggregate\",\"BlockProclamations.findUnique\",\"BlockProclamations.findUniqueOrThrow\",\"BlockProclamations.findFirst\",\"BlockProclamations.findFirstOrThrow\",\"BlockProclamations.findMany\",\"BlockProclamations.createOne\",\"BlockProclamations.createMany\",\"BlockProclamations.createManyAndReturn\",\"BlockProclamations.updateOne\",\"BlockProclamations.updateMany\",\"BlockProclamations.updateManyAndReturn\",\"BlockProclamations.upsertOne\",\"BlockProclamations.deleteOne\",\"BlockProclamations.deleteMany\",\"BlockProclamations.groupBy\",\"BlockProclamations.aggregate\",\"AND\",\"OR\",\"NOT\",\"blockId\",\"proclamationId\",\"sortOrder\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"id\",\"scheduleId\",\"startMinutes\",\"endMinutes\",\"userId\",\"every\",\"some\",\"none\",\"email\",\"roleId\",\"roleName\",\"page\",\"action\",\"entity\",\"entityId\",\"before\",\"after\",\"ip\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"solfeggioFrequencyId\",\"colors\",\"keyPrefix\",\"keyHash\",\"expiresAt\",\"revokedAt\",\"key\",\"active\",\"lastValidatedAt\",\"name\",\"value\",\"content\",\"categoryId\",\"groupId\",\"identifier\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"profileId\",\"street\",\"city\",\"state\",\"postalCode\",\"country\",\"type\",\"isDefaultMailing\",\"isDefaultBilling\",\"isDefaultShipping\",\"firstName\",\"lastName\",\"phoneNumber\",\"ghlContactId\",\"emailVerified\",\"image\",\"blockId_proclamationId\",\"userId_proclamationId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "gAi2AbACEgUAAN0EACAHAADeBAAgCAAA3wQAIAsAAOAEACAMAADhBAAgEQAA0AQAIBMAAOIEACDPAgAA3AQAMNACAAAFABDRAgAA3AQAMNUCQACQBAAh1gJAAJAEACHiAgEAAAAB6gIBAAAAAesCAgCgBAAhgwMBAJ4EACGjAyAA1AQAIaQDAQCfBAAhAQAAAAEAIAYDAAC_BAAgzwIAAL4EADDQAgAAAwAQ0QIAAL4EADDiAgIApgQAIYMDAQCeBAAhAQAAAAMAIBIFAADdBAAgBwAA3gQAIAgAAN8EACALAADgBAAgDAAA4QQAIBEAANAEACATAADiBAAgzwIAANwEADDQAgAABQAQ0QIAANwEADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHqAgEAngQAIesCAgCgBAAhgwMBAJ4EACGjAyAA1AQAIaQDAQCfBAAhCQUAAKMHACAHAACkBwAgCAAApQcAIAsAAKYHACAMAACnBwAgEQAAoAcAIBMAAJkHACDrAgAAmQUAIKQDAACZBQAgAwAAAAUAIAEAAAYAMAIAAAEAIAEAAAAFACAMBgAAkQQAIM8CAADbBAAw0AIAAAkAENECAADbBAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh5gIBAJ4EACH-AkAAkAQAIZIDAQCeBAAhkwMBAJ8EACGUAwEAnwQAIQMGAACXBQAgkwMAAJkFACCUAwAAmQUAIAwGAACRBAAgzwIAANsEADDQAgAACQAQ0QIAANsEADDVAkAAkAQAIdYCQACQBAAh4gIBAAAAAeYCAQCeBAAh_gJAAJAEACGSAwEAAAABkwMBAJ8EACGUAwEAnwQAIQMAAAAJACABAAAKADACAAALACARBgAAkQQAIM8CAADaBAAw0AIAAA0AENECAADaBAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh5gIBAJ4EACGJAwEAngQAIYoDAQCeBAAhiwMBAJ8EACGMAwEAnwQAIY0DAQCfBAAhjgNAAK0EACGPA0AArQQAIZADAQCfBAAhkQMBAJ8EACEIBgAAlwUAIIsDAACZBQAgjAMAAJkFACCNAwAAmQUAII4DAACZBQAgjwMAAJkFACCQAwAAmQUAIJEDAACZBQAgEQYAAJEEACDPAgAA2gQAMNACAAANABDRAgAA2gQAMNUCQACQBAAh1gJAAJAEACHiAgEAAAAB5gIBAJ4EACGJAwEAngQAIYoDAQCeBAAhiwMBAJ8EACGMAwEAnwQAIY0DAQCfBAAhjgNAAK0EACGPA0AArQQAIZADAQCfBAAhkQMBAJ8EACEDAAAADQAgAQAADgAwAgAADwAgDAYAANUEACAKAADZBAAgzwIAANgEADDQAgAAEQAQ0QIAANgEADDiAgEAngQAIeYCAQCfBAAh6gIBAJ8EACGfAwEAngQAIaADAQCeBAAhoQMBAJ4EACGiAwEAnwQAIQUGAACXBQAgCgAAogcAIOYCAACZBQAg6gIAAJkFACCiAwAAmQUAIAwGAADVBAAgCgAA2QQAIM8CAADYBAAw0AIAABEAENECAADYBAAw4gIBAAAAAeYCAQCfBAAh6gIBAJ8EACGfAwEAngQAIaADAQCeBAAhoQMBAJ4EACGiAwEAnwQAIQMAAAARACABAAASADACAAATACABAAAABQAgDwkAANcEACDPAgAA1gQAMNACAAAWABDRAgAA1gQAMOICAQCeBAAhlQMBAJ4EACGWAwEAngQAIZcDAQCeBAAhmAMBAJ4EACGZAwEAngQAIZoDAQCeBAAhmwMBAJ4EACGcAyAA1AQAIZ0DIADUBAAhngMgANQEACEBCQAAoQcAIA8JAADXBAAgzwIAANYEADDQAgAAFgAQ0QIAANYEADDiAgEAAAABlQMBAJ4EACGWAwEAngQAIZcDAQCeBAAhmAMBAJ4EACGZAwEAngQAIZoDAQCeBAAhmwMBAJ4EACGcAyAA1AQAIZ0DIADUBAAhngMgANQEACEDAAAAFgAgAQAAFwAwAgAAGAAgAQAAABYAIAsGAADVBAAgzwIAANMEADDQAgAAGwAQ0QIAANMEADDVAkAAkAQAIeICAQCeBAAh5gIBAJ8EACHqAgEAnwQAIYADAQCeBAAhgQMgANQEACGCA0AArQQAIQQGAACXBQAg5gIAAJkFACDqAgAAmQUAIIIDAACZBQAgCwYAANUEACDPAgAA0wQAMNACAAAbABDRAgAA0wQAMNUCQACQBAAh4gIBAAAAAeYCAQCfBAAh6gIBAJ8EACGAAwEAAAABgQMgANQEACGCA0AArQQAIQMAAAAbACABAAAcADACAAAdACABAAAABQAgCQYAAJEEACAVAADLBAAgzwIAANIEADDQAgAAIAAQ0QIAANIEADDTAgEAngQAIdUCQACQBAAh1gJAAJAEACHmAgEAngQAIQIGAACXBQAgFQAAnAcAIAoGAACRBAAgFQAAywQAIM8CAADSBAAw0AIAACAAENECAADSBAAw0wIBAJ4EACHVAkAAkAQAIdYCQACQBAAh5gIBAJ4EACGmAwAA0QQAIAMAAAAgACABAAAhADACAAAiACAODgAAzQQAIA8AAM4EACAQAADPBAAgEQAA0AQAIBYAAMcEACDPAgAAzAQAMNACAAAkABDRAgAAzAQAMOICAQCeBAAh-gICAKYEACGDAwEAngQAIYUDAQCeBAAhhgMCAKYEACGHAwIApgQAIQUOAACdBwAgDwAAngcAIBAAAJ8HACARAACgBwAgFgAAmgcAIA4OAADNBAAgDwAAzgQAIBAAAM8EACARAADQBAAgFgAAxwQAIM8CAADMBAAw0AIAACQAENECAADMBAAw4gIBAAAAAfoCAgCmBAAhgwMBAAAAAYUDAQCeBAAhhgMCAKYEACGHAwIApgQAIQMAAAAkACABAAAlADACAAAmACABAAAAJAAgAwAAACQAIAEAACUAMAIAACYAIAEAAAAkACADAAAAJAAgAQAAJQAwAgAAJgAgAQAAACQAIAMAAAAgACABAAAhADACAAAiACAKFAAAygQAIBUAAMsEACDPAgAAyQQAMNACAAAuABDRAgAAyQQAMNICAQCeBAAh0wIBAJ4EACHUAgIApgQAIdUCQACQBAAh1gJAAJAEACECFAAAmwcAIBUAAJwHACALFAAAygQAIBUAAMsEACDPAgAAyQQAMNACAAAuABDRAgAAyQQAMNICAQCeBAAh0wIBAJ4EACHUAgIApgQAIdUCQACQBAAh1gJAAJAEACGlAwAAyAQAIAMAAAAuACABAAAvADACAAAwACALDQAAxwQAIBMAAMYEACDPAgAAxQQAMNACAAAyABDRAgAAxQQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeMCAQCeBAAh5AICAKYEACHlAgIApgQAIQINAACaBwAgEwAAmQcAIAsNAADHBAAgEwAAxgQAIM8CAADFBAAw0AIAADIAENECAADFBAAw1QJAAJAEACHWAkAAkAQAIeICAQAAAAHjAgEAngQAIeQCAgCmBAAh5QICAKYEACEDAAAAMgAgAQAAMwAwAgAANAAgAQAAADIAIAMAAAAuACABAAAvADACAAAwACABAAAALgAgAQAAACAAIAEAAAAuACAJBgAAkQQAIBIAAJIEACDPAgAAjwQAMNACAAA7ABDRAgAAjwQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAhAQAAADsAIAEAAAAJACABAAAADQAgAQAAABEAIAEAAAAbACABAAAAIAAgAQAAAAEAIAMAAAAFACABAAAGADACAAABACADAAAABQAgAQAABgAwAgAAAQAgAwAAAAUAIAEAAAYAMAIAA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_gJAAIUEACGSAwEAgwQAIZMDAQCUBAAhlAMBAJQEACEDAAAACQAgAQAAmQEAMCgAAJoBACADAAAACQAgAQAACgAwAgAACwAgAQAAAA8AIAEAAAAPACADAAAADQAgAQAADgAwAgAADwAgAwAAAA0AIAEAAA4AMAIAAA8AIAMAAAANACABAAAOADACAAAPACAOBgAAggcAINUCQAAAAAHWAkAAAAAB4gIBAAAAAeYCAQAAAAGJAwEAAAABigMBAAAAAYsDAQAAAAGMAwEAAAABjQMBAAAAAY4DQAAAAAGPA0AAAAABkAMBAAAAAZEDAQAAAAEBHAAAogEAIA3VAkAAAAAB1gJAAAAAAeICAQAAAAHmAgEAAAABiQMBAAAAAYoDAQAAAAGLAwEAAAABjAMBAAAAAY0DAQAAAAGOA0AAAAABjwNAAAAAAZADAQAAAAGRAwEAAAABARwAAKQBADABHAAApAEAMA4GAACBBwAg1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5gIBAOoEACGJAwEA6gQAIYoDAQDqBAAhiwMBAJ8FACGMAwEAnwUAIY0DAQCfBQAhjgNAAKkFACGPA0AAqQUAIZADAQCfBQAhkQMBAJ8FACECAAAADwAgHAAApwEAIA3VAkAA6QQAIdYCQADpBAAh4gIBAOoEACHmAgEA6gQAIYkDAQDqBAAhigMBAOoEACGLAwEAnwUAIYwDAQCfBQAhjQMBAJ8FACGOA0AAqQUAIY8DQACpBQAhkAMBAJ8FACGRAwEAnwUAIQIAAAANACAcAACpAQAgAgAAAA0AIBwAAKkBACADAAAADwAgIwAAogEAICQAAKcBACABAAAADwAgAQAAAA0AIAoEAAD-BgAgKwAAgAcAICwAAP8GACCLAwAAmQUAIIwDAACZBQAgjQMAAJkFACCOAwAAmQUAII8DAACZBQAgkAMAAJkFACCRAwAAmQUAIBDPAgAAwAQAMNACAACwAQAQ0QIAAMAEADDVAkAAhQQAIdYCQACFBAAh4gIBAIMEACHmAgEAgwQAIYkDAQCDBAAhigMBAIMEACGLAwEAlAQAIYwDAQCUBAAhjQMBAJQEACGOA0AAqQQAIY8DQACpBAAhkAMBAJQEACGRAwEAlAQAIQMAAAANACABAACvAQAwKAAAsAEAIAMAAAANACABAAAOADACAAAPACAGAwAAvwQAIM8CAAC-BAAw0AIAAAMAENECAAC-BAAw4gICAAAAAYMDAQCeBAAhAQAAALMBACABAAAAswEAIAEDAAD9BgAgAwAAAAMAIAEAALYBADACAACzAQAgAwAAAAMAIAEAALYBADACAACzAQAgAwAAAAMAIAEAALYBADACAACzAQAgAwMAAPwGACDiAgIAAAABgwMBAAAAAQEcAAC6AQAgAuICAgAAAAGDAwEAAAABARwAALwBADABHAAAvAEAMAMDAACXBgAg4gICAOgEACGDAwEA6gQAIQIAAACzAQAgHAAAvwEAIALiAgIA6AQAIYMDAQDqBAAhAgAAAAMAIBwAAMEBACACAAAAAwAgHAAAwQEAIAMAAACzAQAgIwAAugEAICQAAL8BACABAAAAswEAIAEAAAADACAFBAAAkgYAICkAAJMGACAqAACWBgAgKwAAlQYAICwAAJQGACAFzwIAAL0EADDQAgAAyAEAENECAAC9BAAw4gICAIQEACGDAwEAgwQAIQMAAAADACABAADHAQAwKAAAyAEAIAMAAAADACABAAC2AQAwAgAAswEAIAnPAgAAvAQAMNACAADOAQAQ0QIAALwEADDVAkAAkAQAIdYCQACQBAAh4gIBAAAAAf4CQACQBAAhhAMBAJ4EACGIAwEAngQAIQEAAADLAQAgAQAAAMsBACAJzwIAALwEADDQAgAAzgEAENECAAC8BAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh_gJAAJAEACGEAwEAngQAIYgDAQCeBAAhAAMAAADOAQAgAQAAzwEAMAIAAMsBACADAAAAzgEAIAEAAM8BADACAADLAQAgAwAAAM4BACABAADPAQAwAgAAywEAIAbVAkAAAAAB1gJAAAAAAeICAQAAAAH-AkAAAAABhAMBAAAAAYgDAQAAAAEBHAAA0wEAIAbVAkAAAAAB1gJAAAAAAeICAQAAAAH-AkAAAAABhAMBAAAAAYgDAQAAAAEBHAAA1QEAMAEcAADVAQAwBtUCQADpBAAh1gJAAOkEACHiAgEA6gQAIf4CQADpBAAhhAMBAOoEACGIAwEA6gQAIQIAAADLAQAgHAAA2AEAIAbVAkAA6QQAIdYCQADpBAAh4gIBAOoEACH-AkAA6QQAIYQDAQDqBAAhiAMBAOoEACECAAAAzgEAIBwAANoBACACAAAAzgEAIBwAANoBACADAAAAywEAICMAANMBACAkAADYAQAgAQAAAMsBACABAAAAzgEAIAMEAACPBgAgKwAAkQYAICwAAJAGACAJzwIAALsEADDQAgAA4QEAENECAAC7BAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh_gJAAIUEACGEAwEAgwQAIYgDAQCDBAAhAwAAAM4BACABAADgAQAwKAAA4QEAIAMAAADOAQAgAQAAzwEAMAIAAMsBACABAAAAJgAgAQAAACYAIAMAAAAkACABAAAlADACAAAmACADAAAAJAAgAQAAJQAwAgAAJgAgAwAAACQAIAEAACUAMAIAACYAIAsOAADdBQAgDwAA8wUAIBAAAN4FACARAADfBQAgFgAA4AUAIOICAQAAAAH6AgIAAAABgwMBAAAAAYUDAQAAAAGGAwIAAAABhwMCAAAAAQEcAADpAQAgBuICAQAAAAH6AgIAAAABgwMBAAAAAYUDAQAAAAGGAwIAAAABhwMCAAAAAQEcAADrAQAwARwAAOsBADALDgAAwQUAIA8AAPEFACAQAADCBQAgEQAAwwUAIBYAAMQFACDiAgEA6gQAIfoCAgDoBAAhgwMBAOoEACGFAwEA6gQAIYYDAgDoBAAhhwMCAOgEACECAAAAJgAgHAAA7gEAIAbiAgEA6gQAIfoCAgDoBAAhgwMBAOoEACGFAwEA6gQAIYYDAgDoBAAhhwMCAOgEACECAAAAJAAgHAAA8AEAIAIAAAAkACAcAADwAQAgAwAAACYAICMAAOkBACAkAADuAQAgAQAAACYAIAEAAAAkACAFBAAAigYAICkAAIsGACAqAACOBgAgKwAAjQYAICwAAIwGACAJzwIAALoEADDQAgAA9wEAENECAAC6BAAw4gIBAIMEACH6AgIAhAQAIYMDAQCDBAAhhQMBAIMEACGGAwIAhAQAIYcDAgCEBAAhAwAAACQAIAEAAPYBADAoAAD3AQAgAwAAACQAIAEAACUAMAIAACYAIAcNAAC0BAAgzwIAALkEADDQAgAA_QEAENECAAC5BAAw1AICAKYEACHiAgIAAAABgwMBAAAAAQEAAAD6AQAgAQAAAPoBACAHDQAAtAQAIM8CAAC5BAAw0AIAAP0BABDRAgAAuQQAMNQCAgCmBAAh4gICAKYEACGDAwEAngQAIQENAADiBQAgAwAAAP0BACABAAD-AQAwAgAA-gEAIAMAAAD9AQAgAQAA_gEAMAIAAPoBACADAAAA_QEAIAEAAP4BADACAAD6AQAgBA0AAIkGACDUAgIAAAAB4gICAAAAAYMDAQAAAAEBHAAAggIAIAPUAgIAAAAB4gICAAAAAYMDAQAAAAEBHAAAhAIAMAEcAACEAgAwBA0AAP8FACDUAgIA6AQAIeICAgDoBAAhgwMBAOoEACECAAAA-gEAIBwAAIcCACAD1AICAOgEACHiAgIA6AQAIYMDAQDqBAAhAgAAAP0BACAcAACJAgAgAgAAAP0BACAcAACJAgAgAwAAAPoBACAjAACCAgAgJAAAhwIAIAEAAAD6AQAgAQAAAP0BACAFBAAA-gUAICkAAPsFACAqAAD-BQAgKwAA_QUAICwAAPwFACAGzwIAALgEADDQAgAAkAIAENECAAC4BAAw1AICAIQEACHiAgIAhAQAIYMDAQCDBAAhAwAAAP0BACABAACPAgAwKAAAkAIAIAMAAAD9AQAgAQAA_gEAMAIAAPoBACABAAAAIgAgAQAAACIAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgAwAAACAAIAEAACEAMAIAACIAIAYGAADbBQAgFQAA-QUAINMCAQAAAAHVAkAAAAAB1gJAAAAAAeYCAQAAAAEBHAAAmAIAIATTAgEAAAAB1QJAAAAAAdYCQAAAAAHmAgEAAAABARwAAJoCADABHAAAmgIAMAYGAADZBQAgFQAA-AUAINMCAQDqBAAh1QJAAOkEACHWAkAA6QQAIeYCAQDqBAAhAgAAACIAIBwAAJ0CACAE0wIBAOoEACHVAkAA6QQAIdYCQADpBAAh5gIBAOoEACECAAAAIAAgHAAAnwIAIAIAAAAgACAcAACfAgAgAwAAACIAICMAAJgCACAkAACdAgAgAQAAACIAIAEAAAAgACADBAAA9QUAICsAAPcFACAsAAD2BQAgB88CAAC3BAAw0AIAAKYCABDRAgAAtwQAMNMCAQCDBAAh1QJAAIUEACHWAkAAhQQAIeYCAQCDBAAhAwAAACAAIAEAAKUCADAoAACmAgAgAwAAACAAIAEAACEAMAIAACIAIAcNAAC0BAAgzwIAALYEADDQAgAArAIAENECAAC2BAAw4gICAAAAAYMDAQAAAAGEAwIAAAABAQAAAKkCACABAAAAqQIAIAcNAAC0BAAgzwIAALYEADDQAgAArAIAENECAAC2BAAw4gICAKYEACGDAwEAngQAIYQDAgCmBAAhAQ0AAOIFACADAAAArAIAIAEAAK0CADACAACpAgAgAwAAAKwCACABAACtAgAwAgAAqQIAIAMAAACsAgAgAQAArQIAMAIAAKkCACAEDQAA9AUAIOICAgAAAAGDAwEAAAABhAMCAAAAAQEcAACxAgAgA-ICAgAAAAGDAwEAAAABhAMCAAAAAQEcAACzAgAwARwAALMCADAEDQAA6AUAIOICAgDoBAAhgwMBAOoEACGEAwIA6AQAIQIAAACpAgAgHAAAtgIAIAPiAgIA6AQAIYMDAQDqBAAhhAMCAOgEACECAAAArAIAIBwAALgCACACAAAArAIAIBwAALgCACADAAAAqQIAICMAALECACAkAAC2AgAgAQAAAKkCACABAAAArAIAIAUEAADjBQAgKQAA5AUAICoAAOcFACArAADmBQAgLAAA5QUAIAbPAgAAtQQAMNACAAC_AgAQ0QIAALUEADDiAgIAhAQAIYMDAQCDBAAhhAMCAIQEACEDAAAArAIAIAEAAL4CADAoAAC_AgAgAwAAAKwCACABAACtAgAwAgAAqQIAIAcNAAC0BAAgzwIAALMEADDQAgAAxQIAENECAACzBAAw1AICAKYEACHiAgIAAAABgwMBAAAAAQEAAADCAgAgAQAAAMICACAHDQAAtAQAIM8CAACzBAAw0AIAAMUCABDRAgAAswQAMNQCAgCmBAAh4gICAKYEACGDAwEAngQAIQENAADiBQAgAwAAAMUCACABAADGAgAwAgAAwgIAIAMAAADFAgAgAQAAxgIAMAIAAMICACADAAAAxQIAIAEAAMYCADACAADCAgAgBA0AAOEFACDUAgIAAAAB4gICAAAAAYMDAQAAAAEBHAAAygIAIAPUAgIAAAAB4gICAAAAAYMDAQAAAAEBHAAAzAIAMAEcAADMAgAwBA0AALUFACDUAgIA6AQAIeICAgDoBAAhgwMBAOoEACECAAAAwgIAIBwAAM8CACAD1AICAOgEACHiAgIA6AQAIYMDAQDqBAAhAgAAAMUCACAcAADRAgAgAgAAAMUCACAcAADRAgAgAwAAAMICACAjAADKAgAgJAAAzwIAIAEAAADCAgAgAQAAAMUCACAFBAAAsAUAICkAALEFACAqAAC0BQAgKwAAswUAICwAALIFACAGzwIAALIEADDQAgAA2AIAENECAACyBAAw1AICAIQEACHiAgIAhAQAIYMDAQCDBAAhAwAAAMUCACABAADXAgAwKAAA2AIAIAMAAADFAgAgAQAAxgIAMAIAAMICACABAAAAHQAgAQAAAB0AIAMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAgGAACvBQAg1QJAAAAAAeICAQAAAAHmAgEAAAAB6gIBAAAAAYADAQAAAAGBAyAAAAABggNAAAAAAQEcAADgAgAgB9UCQAAAAAHiAgEAAAAB5gIBAAAAAeoCAQAAAAGAAwEAAAABgQMgAAAAAYIDQAAAAAEBHAAA4gIAMAEcAADiAgAwAQAAAAUAIAgGAACuBQAg1QJAAOkEACHiAgEA6gQAIeYCAQCfBQAh6gIBAJ8FACGAAwEA6gQAIYEDIACtBQAhggNAAKkFACECAAAAHQAgHAAA5gIAIAfVAkAA6QQAIeICAQDqBAAh5gIBAJ8FACHqAgEAnwUAIYADAQDqBAAhgQMgAK0FACGCA0AAqQUAIQIAAAAbACAcAADoAgAgAgAAABsAIBwAAOgCACABAAAABQAgAwAAAB0AICMAAOACACAkAADmAgAgAQAAAB0AIAEAAAAbACAGBAAAqgUAICsAAKwFACAsAACrBQAg5gIAAJkFACDqAgAAmQUAIIIDAACZBQAgCs8CAACuBAAw0AIAAPACABDRAgAArgQAMNUCQACFBAAh4gIBAIMEACHmAgEAlAQAIeoCAQCUBAAhgAMBAIMEACGBAyAArwQAIYIDQACpBAAhAwAAABsAIAEAAO8CADAoAADwAgAgAwAAABsAIAEAABwAMAIAAB0AIAnPAgAArAQAMNACAAD2AgAQ0QIAAKwEADDVAkAAkAQAIeICAQAAAAH8AgEAngQAIf0CAQAAAAH-AkAArQQAIf8CQACtBAAhAQAAAPMCACABAAAA8wIAIAnPAgAArAQAMNACAAD2AgAQ0QIAAKwEADDVAkAAkAQAIeICAQCeBAAh_AIBAJ4EACH9AgEAngQAIf4CQACtBAAh_wJAAK0EACEC_gIAAJkFACD_AgAAmQUAIAMAAAD2AgAgAQAA9wIAMAIAAPMCACADAAAA9gIAIAEAAPcCADACAADzAgAgAwAAAPYCACABAAD3AgAwAgAA8wIAIAbVAkAAAAAB4gIBAAAAAfwCAQAAAAH9AgEAAAAB_gJAAAAAAf8CQAAAAAEBHAAA-wIAIAbVAkAAAAAB4gIBAAAAAfwCAQAAAAH9AgEAAAAB_gJAAAAAAf8CQAAAAAEBHAAA_QIAMAEcAAD9AgAwBtUCQADpBAAh4gIBAOoEACH8AgEA6gQAIf0CAQDqBAAh_gJAAKkFACH_AkAAqQUAIQIAAADzAgAgHAAAgAMAIAbVAkAA6QQAIeICAQDqBAAh_AIBAOoEACH9AgEA6gQAIf4CQACpBQAh_wJAAKkFACECAAAA9gIAIBwAAIIDACACAAAA9gIAIBwAAIIDACADAAAA8wIAICMAAPsCACAkAACAAwAgAQAAAPMCACABAAAA9gIAIAUEAACmBQAgKwAAqAUAICwAAKcFACD-AgAAmQUAIP8CAACZBQAgCc8CAACoBAAw0AIAAIkDABDRAgAAqAQAMNUCQACFBAAh4gIBAIMEACH8AgEAgwQAIf0CAQCDBAAh_gJAAKkEACH_AkAAqQQAIQMAAAD2AgAgAQAAiAMAMCgAAIkDACADAAAA9gIAIAEAAPcCADACAADzAgAgBc8CAAClBAAw0AIAAI8DABDRAgAApQQAMPoCAgAAAAH7AgAApwQAIAEAAACMAwAgAQAAAIwDACAFzwIAAKUEADDQAgAAjwMAENECAAClBAAw-gICAKYEACH7AgAApwQAIAADAAAAjwMAIAEAAJADADACAACMAwAgAwAAAI8DACABAACQAwAwAgAAjAMAIAMAAACPAwAgAQAAkAMAMAIAAIwDACAC-gICAAAAAfsCgAAAAAEBHAAAlAMAIAL6AgIAAAAB-wKAAAAAAQEcAACWAwAwARwAAJYDADAC-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-AwAgAwAAADsAIAEAAMEDADACAAC-AwAgAwAAADsAIAEAAMEDADACAAC-AwAgBgYAAJUFACASAACWBQAg1QJAAAAAAdYCQAAAAAHiAgEAAAAB5gIBAAAAAQEcAADFAwAgBNUCQAAAAAHWAkAAAAAB4gIBAAAAAeYCAQAAAAEBHAAAxwMAMAEcAADHAwAwBgYAAIcFACASAACIBQAg1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5gIBAOoEACECAAAAvgMAIBwAAMoDACAE1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5gIBAOoEACECAAAAOwAgHAAAzAMAIAIAAAA7ACAcAADMAwAgAwAAAL4DACAjAADFAwAgJAAAygMAIAEAAAC-AwAgAQAAADsAIAMEAACEBQAgKwAAhgUAICwAAIUFACAHzwIAAI4EADDQAgAA0wMAENECAACOBAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh5gIBAIMEACEDAAAAOwAgAQAA0gMAMCgAANMDACADAAAAOwAgAQAAwQMAMAIAAL4DACABAAAANAAgAQAAADQAIAMAAAAyACABAAAzADACAAA0ACADAAAAMgAgAQAAMwAwAgAANAAgAwAAADIAIAEAADMAMAIAADQAIAgNAACDBQAgEwAAggUAINUCQAAAAAHWAkAAAAAB4gIBAAAAAeMCAQAAAAHkAgIAAAAB5QICAAAAAQEcAADbAwAgBtUCQAAAAAHWAkAAAAAB4gIBAAAAAeMCAQAAAAHkAgIAAAAB5QICAAAAAQEcAADdAwAwARwAAN0DADAIDQAA9QQAIBMAAPQEACDVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHjAgEA6gQAIeQCAgDoBAAh5QICAOgEACECAAAANAAgHAAA4AMAIAbVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHjAgEA6gQAIeQCAgDoBAAh5QICAOgEACECAAAAMgAgHAAA4gMAIAIAAAAyACAcAADiAwAgAwAAADQAICMAANsDACAkAADgAwAgAQAAADQAIAEAAAAyACAFBAAA7wQAICkAAPAEACAqAADzBAAgKwAA8gQAICwAAPEEACAJzwIAAI0EADDQAgAA6QMAENECAACNBAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh4wIBAIMEACHkAgIAhAQAIeUCAgCEBAAhAwAAADIAIAEAAOgDADAoAADpAwAgAwAAADIAIAEAADMAMAIAADQAIAEAAAAwACABAAAAMAAgAwAAAC4AIAEAAC8AMAIAADAAIAMAAAAuACABAAAvADACAAAwACADAAAALgAgAQAALwAwAgAAMAAgBxQAAO0EACAVAADuBAAg0gIBAAAAAdMCAQAAAAHUAgIAAAAB1QJAAAAAAdYCQAAAAAEBHAAA8QMAIAXSAgEAAAAB0wIBAAAAAdQCAgAAAAHVAkAAAAAB1gJAAAAAAQEcAADzAwAwARwAAPMDADAHFAAA6wQAIBUAAOwEACDSAgEA6gQAIdMCAQDqBAAh1AICAOgEACHVAkAA6QQAIdYCQADpBAAhAgAAADAAIBwAAPYDACAF0gIBAOoEACHTAgEA6gQAIdQCAgDoBAAh1QJAAOkEACHWAkAA6QQAIQIAAAAuACAcAAD4AwAgAgAAAC4AIBwAAPgDACADAAAAMAAgIwAA8QMAICQAAPYDACABAAAAMAAgAQAAAC4AIAUEAADjBAAgKQAA5AQAICoAAOcEACArAADmBAAgLAAA5QQAIAjPAgAAggQAMNACAAD_AwAQ0QIAAIIEADDSAgEAgwQAIdMCAQCDBAAh1AICAIQEACHVAkAAhQQAIdYCQACFBAAhAwAAAC4AIAEAAP4DADAoAAD_AwAgAwAAAC4AIAEAAC8AMAIAADAAIAjPAgAAggQAMNACAAD_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_QIBAIMEACH-AkAAqQQAIf8CQACpBAAhCwQAAJcEACArAACrBAAgLAAAqwQAINcCQAAAAAHYAkAAAAAF2QJAAAAABdoCQAAAAAHbAkAAAAAB3AJAAAAAAd0CQAAAAAHeAkAAqgQAIQsEAACXBAAgKwAAqwQAICwAAKsEACDXAkAAAAAB2AJAAAAABdkCQAAAAAXaAkAAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAAB3gJAAKoEACEI1wJAAAAAAdgCQAAAAAXZAkAAAAAF2gJAAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAd4CQACrBAAhCc8CAACsBAAw0AIAAPYCABDRAgAArAQAMNUCQACQBAAh4gIBAJ4EACH8AgEAngQAIf0CAQCeBAAh_gJAAK0EACH_AkAArQQAIQjXAkAAAAAB2AJAAAAABdkCQAAAAAXaAkAAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAAB3gJAAKsEACEKzwIAAK4EADDQAgAA8AIAENECAACuBAAw1QJAAIUEACHiAgEAgwQAIeYCAQCUBAAh6gIBAJQEACGAAwEAgwQAIYEDIACvBAAhggNAAKkEACEFBAAAhwQAICsAALEEACAsAACxBAAg1wIgAAAAAd4CIACwBAAhBQQAAIcEACArAACxBAAgLAAAsQQAINcCIAAAAAHeAiAAsAQAIQLXAiAAAAAB3gIgALEEACEGzwIAALIEADDQAgAA2AIAENECAACyBAAw1AICAIQEACHiAgIAhAQAIYMDAQCDBAAhBw0AALQEACDPAgAAswQAMNACAADFAgAQ0QIAALMEADDUAgIApgQAIeICAgCmBAAhgwMBAJ4EACED5wIAACQAIOgCAAAkACDpAgAAJAAgBs8CAAC1BAAw0AIAAL8CABDRAgAAtQQAMOICAgCEBAAhgwMBAIMEACGEAwIAhAQAIQcNAAC0BAAgzwIAALYEADDQAgAArAIAENECAAC2BAAw4gICAKYEACGDAwEAngQAIYQDAgCmBAAhB88CAAC3BAAw0AIAAKYCABDRAgAAtwQAMNMCAQCDBAAh1QJAAIUEACHWAkAAhQQAIeYCAQCDBAAhBs8CAAC4BAAw0AIAAJACABDRAgAAuAQAMNQCAgCEBAAh4gICAIQEACGDAwEAgwQAIQcNAAC0BAAgzwIAALkEADDQAgAA_QEAENECAAC5BAAw1AICAKYEACHiAgIApgQAIYMDAQCeBAAhCc8CAAC6BAAw0AIAAPcBABDRAgAAugQAMOICAQCDBAAh-gICAIQEACGDAwEAgwQAIYUDAQCDBAAhhgMCAIQEACGHAwIAhAQAIQnPAgAAuwQAMNACAADhAQAQ0QIAALsEADDVAkAAhQQAIdYCQACFBAAh4gIBAIMEACH-AkAAhQQAIYQDAQCDBAAhiAMBAIMEACEJzwIAALwEADDQAgAAzgEAENECAAC8BAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh_gJAAJAEACGEAwEAngQAIYgDAQCeBAAhBc8CAAC9BAAw0AIAAMgBABDRAgAAvQQAMOICAgCEBAAhgwMBAIMEACEGAwAAvwQAIM8CAAC-BAAw0AIAAAMAENECAAC-BAAw4gICAKYEACGDAwEAngQAIQPnAgAABQAg6AIAAAUAIOkCAAAFACAQzwIAAMAEADDQAgAAsAEAENECAADABAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh5gIBAIMEACGJAwEAgwQAIYoDAQCDBAAhiwMBAJQEACGMAwEAlAQAIY0DAQCUBAAhjgNAAKkEACGPA0AAqQQAIZADAQCUBAAhkQMBAJQEACELzwIAAMEEADDQAgAAmgEAENECAADBBAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh5gIBAIMEACH-AkAAhQQAIZIDAQCDBAAhkwMBAJQEACGUAwEAlAQAIQ7PAgAAwgQAMNACAACEAQAQ0QIAAMIEADDiAgEAgwQAIZUDAQCDBAAhlgMBAIMEACGXAwEAgwQAIZgDAQCDBAAhmQMBAIMEACGaAwEAgwQAIZsDAQCDBAAhnAMgAK8EACGdAyAArwQAIZ4DIACvBAAhCs8CAADDBAAw0AIAAG4AENECAADDBAAw4gIBAIMEACHmAgEAlAQAIeoCAQCUBAAhnwMBAIMEACGgAwEAgwQAIaEDAQCDBAAhogMBAJQEACELzwIAAMQEADDQAgAAVgAQ0QIAAMQEADDVAkAAhQQAIdYCQACFBAAh4gIBAIMEACHqAgEAgwQAIesCAgCVBAAhgwMBAIMEACGjAyAArwQAIaQDAQCUBAAhCw0AAMcEACATAADGBAAgzwIAAMUEADDQAgAAMgAQ0QIAAMUEADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHjAgEAngQAIeQCAgCmBAAh5QICAKYEACELBgAAkQQAIBIAAJIEACDPAgAAjwQAMNACAAA7ABDRAgAAjwQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAhpwMAADsAIKgDAAA7ACAD5wIAAC4AIOgCAAAuACDpAgAALgAgAtICAQAAAAHTAgEAAAABChQAAMoEACAVAADLBAAgzwIAAMkEADDQAgAALgAQ0QIAAMkEADDSAgEAngQAIdMCAQCeBAAh1AICAKYEACHVAkAAkAQAIdYCQACQBAAhDQ0AAMcEACATAADGBAAgzwIAAMUEADDQAgAAMgAQ0QIAAMUEADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHjAgEAngQAIeQCAgCmBAAh5QICAKYEACGnAwAAMgAgqAMAADIAIBAOAADNBAAgDwAAzgQAIBAAAM8EACARAADQBAAgFgAAxwQAIM8CAADMBAAw0AIAACQAENECAADMBAAw4gIBAJ4EACH6AgIApgQAIYMDAQCeBAAhhQMBAJ4EACGGAwIApgQAIYcDAgCmBAAhpwMAACQAIKgDAAAkACAODgAAzQQAIA8AAM4EACAQAADPBAAgEQAA0AQAIBYAAMcEACDPAgAAzAQAMNACAAAkABDRAgAAzAQAMOICAQCeBAAh-gICAKYEACGDAwEAngQAIYUDAQCeBAAhhgMCAKYEACGHAwIApgQAIQkNAAC0BAAgzwIAALYEADDQAgAArAIAENECAAC2BAAw4gICAKYEACGDAwEAngQAIYQDAgCmBAAhpwMAAKwCACCoAwAArAIAIAkNAAC0BAAgzwIAALMEADDQAgAAxQIAENECAACzBAAw1AICAKYEACHiAgIApgQAIYMDAQCeBAAhpwMAAMUCACCoAwAAxQIAIAkNAAC0BAAgzwIAALkEADDQAgAA_QEAENECAAC5BAAw1AICAKYEACHiAgIApgQAIYMDAQCeBAAhpwMAAP0BACCoAwAA_QEAIAPnAgAAIAAg6AIAACAAIOkCAAAgACAC0wIBAAAAAeYCAQAAAAEJBgAAkQQAIBUAAMsEACDPAgAA0gQAMNACAAAgABDRAgAA0gQAMNMCAQCeBAAh1QJAAJAEACHWAkAAkAQAIeYCAQCeBAAhCwYAANUEACDPAgAA0wQAMNACAAAbABDRAgAA0wQAMNUCQACQBAAh4gIBAJ4EACHmAgEAnwQAIeoCAQCfBAAhgAMBAJ4EACGBAyAA1AQAIYIDQACtBAAhAtcCIAAAAAHeAiAAsQQAIRQFAADdBAAgBwAA3gQAIAgAAN8EACALAADgBAAgDAAA4QQAIBEAANAEACATAADiBAAgzwIAANwEADDQAgAABQAQ0QIAANwEADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHqAgEAngQAIesCAgCgBAAhgwMBAJ4EACGjAyAA1AQAIaQDAQCfBAAhpwMAAAUAIKgDAAAFACAPCQAA1wQAIM8CAADWBAAw0AIAABYAENECAADWBAAw4gIBAJ4EACGVAwEAngQAIZYDAQCeBAAhlwMBAJ4EACGYAwEAngQAIZkDAQCeBAAhmgMBAJ4EACGbAwEAngQAIZwDIADUBAAhnQMgANQEACGeAyAA1AQAIQ4GAADVBAAgCgAA2QQAIM8CAADYBAAw0AIAABEAENECAADYBAAw4gIBAJ4EACHmAgEAnwQAIeoCAQCfBAAhnwMBAJ4EACGgAwEAngQAIaEDAQCeBAAhogMBAJ8EACGnAwAAEQAgqAMAABEAIAwGAADVBAAgCgAA2QQAIM8CAADYBAAw0AIAABEAENECAADYBAAw4gIBAJ4EACHmAgEAnwQAIeoCAQCfBAAhnwMBAJ4EACGgAwEAngQAIaEDAQCeBAAhogMBAJ8EACED5wIAABYAIOgCAAAWACDpAgAAFgAgEQYAAJEEACDPAgAA2gQAMNACAAANABDRAgAA2gQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAhiQMBAJ4EACGKAwEAngQAIYsDAQCfBAAhjAMBAJ8EACGNAwEAnwQAIY4DQACtBAAhjwNAAK0EACGQAwEAnwQAIZEDAQCfBAAhDAYAAJEEACDPAgAA2wQAMNACAAAJABDRAgAA2wQAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAh_gJAAJAEACGSAwEAngQAIZMDAQCfBAAhlAMBAJ8EACESBQAA3QQAIAcAAN4EACAIAADfBAAgCwAA4AQAIAwAAOEEACARAADQBAAgEwAA4gQAIM8CAADcBAAw0AIAAAUAENECAADcBAAw1QJAAJAEACHWAkAAkAQAIeICAQCeBAAh6gIBAJ4EACHrAgIAoAQAIYMDAQCeBAAhowMgANQEACGkAwEAnwQAIQgDAAC_BAAgzwIAAL4EADDQAgAAAwAQ0QIAAL4EADDiAgIApgQAIYMDAQCeBAAhpwMAAAMAIKgDAAADACAD5wIAAAkAIOgCAAAJACDpAgAACQAgA-cCAAANACDoAgAADQAg6QIAAA0AIAPnAgAAEQAg6AIAABEAIOkCAAARACAD5wIAABsAIOgCAAAbACDpAgAAGwAgCwYAAJEEACASAACSBAAgzwIAAI8EADDQAgAAOwAQ0QIAAI8EADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHmAgEAngQAIacDAAA7ACCoAwAAOwAgAAAAAAAFrAMCAAAAAbIDAgAAAAGzAwIAAAABtAMCAAAAAbUDAgAAAAEBrANAAAAAAQGsAwEAAAABBSMAAPkHACAkAAD_BwAgqQMAAPoHACCqAwAA_gcAIK8DAAA0ACAFIwAA9wcAICQAAPwHACCpAwAA-AcAIKoDAAD7BwAgrwMAACYAIAMjAAD5BwAgqQMAAPoHACCvAwAANAAgAyMAAPcHACCpAwAA-AcAIK8DAAAmACAAAAAAAAUjAADxBwAgJAAA9QcAIKkDAADyBwAgqgMAAPQHACCvAwAAvgMAIAsjAAD2BAAwJAAA-wQAMKkDAAD3BAAwqgMAAPgEADCrAwAA-QQAIKwDAAD6BAAwrQMAAPoEADCuAwAA-gQAMK8DAAD6BAAwsAMAAPwEADCxAwAA_QQAMAUVAADuBAAg0wIBAAAAAdQCAgAAAAHVAkAAAAAB1gJAAAAAAQIAAAAwACAjAACBBQAgAwAAADAAICMAAIEFACAkAACABQAgARwAAPMHADALFAAAygQAIBUAAMsEACDPAgAAyQQAMNACAAAuABDRAgAAyQQAMNICAQCeBAAh0wIBAJ4EACHUAgIApgQAIdUCQACQBAAh1gJAAJAEACGlAwAAyAQAIAIAAAAwACAcAACABQAgAgAAAP4EACAcAAD_BAAgCM8CAAD9BAAw0AIAAP4EABDRAgAA_QQAMNICAQCeBAAh0wIBAJ4EACHUAgIApgQAIdUCQACQBAAh1gJAAJAEACEIzwIAAP0EADDQAgAA_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_gJAAAAAAZIDAQAAAAGTAwEAAAABlAMBAAAAAQIAAAALACAjAAD0BgAgAwAAAAsAICMAAPQGACAkAADzBgAgARwAAMEHADAMBgAAkQQAIM8CAADbBAAw0AIAAAkAENECAADbBAAw1QJAAJAEACHWAkAAkAQAIeICAQAAAAHmAgEAngQAIf4CQACQBAAhkgMBAAAAAZMDAQCfBAAhlAMBAJ8EACECAAAACwAgHAAA8wYAIAIAAADxBgAgHAAA8gYAIAvPAgAA8AYAMNACAADxBgAQ0QIAAPAGADDVAkAAkAQAIdYCQACQBAAh4gIBAJ4EACHmAgEAngQAIf4CQACQBAAhkgMBAJ4EACGTAwEAnwQAIZQDAQCfBAAhC88CAADwBgAw0AIAAPEGABDRAgAA8AYAMNUCQACQBAAh1gJAAJAEACHiAgEAngQAIeYCAQCeBAAh_gJAAJAEACGSAwEAngQAIZMDAQCfBAAhlAMBAJ8EACEH1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh_gJAAOkEACGSAwEA6gQAIZMDAQCfBQAhlAMBAJ8FACEH1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh_gJAAOkEACGSAwEA6gQAIZMDAQCfBQAhlAMBAJ8FACEH1QJAAAAAAdYCQAAAAAHiAgEAAAAB_gJAAAAAAZIDAQAAAAGTAwEAAAABlAMBAAAAAQ0HAAD2BgAgCAAA9wYAIAsAAPgGACAMAAD5BgAgEQAA-gYAIBMAAPsGACDVAkAAAAAB1gJAAAAAAeICAQAAAAHqAgEAAAABgwMBAAAAAaMDIAAAAAGkAwEAAAABBCMAAOkGADCpAwAA6gYAMKsDAADsBgAgrwMAAO0GADAEIwAA3QYAMKkDAADeBgAwqwMAAOAGACCvAwAA4QYAMAQjAADDBgAwqQMAAMQGADCrAwAAxgYAIK8DAADHBgAwBCMAALcGADCpAwAAuAYAMKsDAAC6BgAgrwMAALsGADAEIwAArgYAMKkDAACvBgAwqwMAALEGACCvAwAA0gUAMAMjAACpBgAgqQMAAKoGACCvAwAAvgMAIAQjAACYBgAwqQMAAJkGADCrAwAAmwYAIK8DAACcBgAwAAAAAAUjAAC8BwAgJAAAvwcAIKkDAAC9BwAgqgMAAL4HACCvAwAAAQAgAyMAALwHACCpAwAAvQcAIK8DAAABACAAAAAFIwAAtwcAICQAALoHACCpAwAAuAcAIKoDAAC5BwAgrwMAAAEAIAMjAAC3BwAgqQMAALgHACCvAwAAAQAgAAAABSMAALIHACAkAAC1BwAgqQMAALMHACCqAwAAtAcAIK8DAAATACADIwAAsgcAIKkDAACzBwAgrwMAABMAIAAAAAcjAACtBwAgJAAAsAcAIKkDAACuBwAgqgMAAK8HACCtAwAABQAgrgMAAAUAIK8DAAABACADIwAArQcAIKkDAACuBwAgrwMAAAEAIAAAAAAAByMAAKgHACAkAACrBwAgqQMAAKkHACCqAwAAqgcAIK0DAAADACCuAwAAAwAgrwMAALMBACADIwAAqAcAIKkDAACpBwAgrwMAALMBACACBgAAlwUAIBIAAJgFACAAAg0AAJoHACATAACZBwAgBQ4AAJ0HACAPAACeBwAgEAAAnwcAIBEAAKAHACAWAACaBwAgAQ0AAOIFACABDQAA4gUAIAENAADiBQAgAAUGAACXBQAgCgAAogcAIOYCAACZBQAg6gIAAJkFACCiAwAAmQUAIAABAwAA_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_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-KwB_LACAAQAAAAMEAIYBKwCHASwAiAEAAAADBACGASsAhwEsAIgBAAAABQQAjgEpAI8BKgCQASsAkQEsAJIBAAAAAAAFBACOASkAjwEqAJABKwCRASwAkgEAAAAFBACYASkAmQEqAJoBKwCbASwAnAEAAAAAAAUEAJgBKQCZASoAmgErAJsBLACcAQEGAAEBBgABAwQAoQErAKIBLACjAQAAAAMEAKEBKwCiASwAowEBEwAUARMAFAUEAKgBKQCpASoAqgErAKsBLACsAQAAAAAABQQAqAEpAKkBKgCqASsAqwEsAKwBAhQAExUACwIUABMVAAsFBACxASkAsgEqALMBKwC0ASwAtQEAAAAAAAUEALEBKQCyASoAswErALQBLAC1ARcCARhCARlDARpEARtFAR1HAR5JGR9KGiBNASFPGSJQGyVSASZTASdUGS1XHC5YIi9ZBjBaBjFbBjJcBjNdBjRfBjVhGTZiIzdlBjhnGTloJDpqBjtrBjxsGT1vJT5wKT9xB0ByB0FzB0J0B0N1B0R3B0V5GUZ6Kkd8B0h-GUl_K0qAAQdLgQEHTIIBGU2FASxOhgEwT4cBBFCIAQRRiQEEUooBBFOLAQRUjQEEVY8BGVaQATFXkgEEWJQBGVmVATJalgEEW5cBBFyYARldmwEzXpwBN1-dAQVgngEFYZ8BBWKgAQVjoQEFZKMBBWWlARlmpgE4Z6gBBWiqARlpqwE5aqwBBWutAQVsrgEZbbEBOm6yAT5vtAECcLUBAnG3AQJyuAECc7kBAnS7AQJ1vQEZdr4BP3fAAQJ4wgEZecMBQHrEAQJ7xQECfMYBGX3JAUF-ygFHf8wBSIABzQFIgQHQAUiCAdEBSIMB0gFIhAHUAUiFAdYBGYYB1wFJhwHZAUiIAdsBGYkB3AFKigHdAUiLAd4BSIwB3wEZjQHiAUuOAeMBT48B5AELkAHlAQuRAeYBC5IB5wELkwHoAQuUAeoBC5UB7AEZlgHtAVCXAe8BC5gB8QEZmQHyAVGaAfMBC5sB9AELnAH1ARmdAfgBUp4B-QFYnwH7ARCgAfwBEKEB_wEQogGAAhCjAYECEKQBgwIQpQGFAhmmAYYCWacBiAIQqAGKAhmpAYsCWqoBjAIQqwGNAhCsAY4CGa0BkQJbrgGSAmGvAZMCCrABlAIKsQGVAgqyAZYCCrMBlwIKtAGZAgq1AZsCGbYBnAJitwGeAgq4AaACGbkBoQJjugGiAgq7AaMCCrwBpAIZvQGnAmS-AagCaL8BqgIMwAGrAgzBAa4CDMIBrwIMwwGwAgzEAbICDMUBtAIZxgG1AmnHAbcCDMgBuQIZyQG6AmrKAbsCDMsBvAIMzAG9AhnNAcACa84BwQJxzwHDAg7QAcQCDtEBxwIO0gHIAg7TAckCDtQBywIO1QHNAhnWAc4CctcB0AIO2AHSAhnZAdMCc9oB1AIO2wHVAg7cAdYCGd0B2QJ03gHaAnrfAdsCCeAB3AIJ4QHdAgniAd4CCeMB3wIJ5AHhAgnlAeMCGeYB5AJ75wHnAgnoAekCGekB6gJ86gHsAgnrAe0CCewB7gIZ7QHxAn3uAfICgQHvAfQCggHwAfUCggHxAfgCggHyAfkCggHzAfoCggH0AfwCggH1Af4CGfYB_wKDAfcBgQOCAfgBgwMZ-QGEA4QB-gGFA4IB-wGGA4IB_AGHAxn9AYoDhQH-AYsDiQH_AY0DigGAAo4DigGBApEDigGCApIDigGDApMDigGEApUDigGFApcDGYYCmAOLAYcCmgOKAYgCnAMZiQKdA4wBigKeA4oBiwKfA4oBjAKgAxmNAqMDjQGOAqQDkwGPAqYDlAGQAqcDlAGRAqoDlAGSAqsDlAGTAqwDlAGUAq4DlAGVArADGZYCsQOVAZcCswOUAZgCtQMZmQK2A5YBmgK3A5QBmwK4A5QBnAK5AxmdArwDlwGeAr0DnQGfAr8DFKACwAMUoQLCAxSiAsMDFKMCxAMUpALGAxSlAsgDGaYCyQOeAacCywMUqALNAxmpAs4DnwGqAs8DFKsC0AMUrALRAxmtAtQDoAGuAtUDpAGvAtYDE7AC1wMTsQLYAxOyAtkDE7MC2gMTtALcAxO1At4DGbYC3wOlAbcC4QMTuALjAxm5AuQDpgG6AuUDE7sC5gMTvALnAxm9AuoDpwG-AusDrQG_AuwDEsAC7QMSwQLuAxLCAu8DEsMC8AMSxALyAxLFAvQDGcYC9QOuAccC9wMSyAL5AxnJAvoDrwHKAvsDEssC_AMSzAL9AxnNAoAEsAHOAoEEtgE" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"users\",\"_count\",\"role\",\"user\",\"sessions\",\"accounts\",\"profile\",\"addresses\",\"profiles\",\"licenseKeys\",\"proclamations\",\"solfeggioFrequency\",\"category\",\"group\",\"userProclamations\",\"blocks\",\"schedule\",\"block\",\"proclamation\",\"blockProclamations\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Profile.findUnique\",\"Profile.findUniqueOrThrow\",\"Profile.findFirst\",\"Profile.findFirstOrThrow\",\"Profile.findMany\",\"Profile.createOne\",\"Profile.createMany\",\"Profile.createManyAndReturn\",\"Profile.updateOne\",\"Profile.updateMany\",\"Profile.updateManyAndReturn\",\"Profile.upsertOne\",\"Profile.deleteOne\",\"Profile.deleteMany\",\"Profile.groupBy\",\"Profile.aggregate\",\"Address.findUnique\",\"Address.findUniqueOrThrow\",\"Address.findFirst\",\"Address.findFirstOrThrow\",\"Address.findMany\",\"Address.createOne\",\"Address.createMany\",\"Address.createManyAndReturn\",\"Address.updateOne\",\"Address.updateMany\",\"Address.updateManyAndReturn\",\"Address.upsertOne\",\"Address.deleteOne\",\"Address.deleteMany\",\"Address.groupBy\",\"Address.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"UserRole.findUnique\",\"UserRole.findUniqueOrThrow\",\"UserRole.findFirst\",\"UserRole.findFirstOrThrow\",\"UserRole.findMany\",\"UserRole.createOne\",\"UserRole.createMany\",\"UserRole.createManyAndReturn\",\"UserRole.updateOne\",\"UserRole.updateMany\",\"UserRole.updateManyAndReturn\",\"UserRole.upsertOne\",\"UserRole.deleteOne\",\"UserRole.deleteMany\",\"UserRole.groupBy\",\"UserRole.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Proclamation.findUnique\",\"Proclamation.findUniqueOrThrow\",\"Proclamation.findFirst\",\"Proclamation.findFirstOrThrow\",\"Proclamation.findMany\",\"Proclamation.createOne\",\"Proclamation.createMany\",\"Proclamation.createManyAndReturn\",\"Proclamation.updateOne\",\"Proclamation.updateMany\",\"Proclamation.updateManyAndReturn\",\"Proclamation.upsertOne\",\"Proclamation.deleteOne\",\"Proclamation.deleteMany\",\"Proclamation.groupBy\",\"Proclamation.aggregate\",\"ProclamationGroup.findUnique\",\"ProclamationGroup.findUniqueOrThrow\",\"ProclamationGroup.findFirst\",\"ProclamationGroup.findFirstOrThrow\",\"ProclamationGroup.findMany\",\"ProclamationGroup.createOne\",\"ProclamationGroup.createMany\",\"ProclamationGroup.createManyAndReturn\",\"ProclamationGroup.updateOne\",\"ProclamationGroup.updateMany\",\"ProclamationGroup.updateManyAndReturn\",\"ProclamationGroup.upsertOne\",\"ProclamationGroup.deleteOne\",\"ProclamationGroup.deleteMany\",\"ProclamationGroup.groupBy\",\"ProclamationGroup.aggregate\",\"UserProclamations.findUnique\",\"UserProclamations.findUniqueOrThrow\",\"UserProclamations.findFirst\",\"UserProclamations.findFirstOrThrow\",\"UserProclamations.findMany\",\"UserProclamations.createOne\",\"UserProclamations.createMany\",\"UserProclamations.createManyAndReturn\",\"UserProclamations.updateOne\",\"UserProclamations.updateMany\",\"UserProclamations.updateManyAndReturn\",\"UserProclamations.upsertOne\",\"UserProclamations.deleteOne\",\"UserProclamations.deleteMany\",\"UserProclamations.groupBy\",\"UserProclamations.aggregate\",\"SolfeggioFrequency.findUnique\",\"SolfeggioFrequency.findUniqueOrThrow\",\"SolfeggioFrequency.findFirst\",\"SolfeggioFrequency.findFirstOrThrow\",\"SolfeggioFrequency.findMany\",\"SolfeggioFrequency.createOne\",\"SolfeggioFrequency.createMany\",\"SolfeggioFrequency.createManyAndReturn\",\"SolfeggioFrequency.updateOne\",\"SolfeggioFrequency.updateMany\",\"SolfeggioFrequency.updateManyAndReturn\",\"SolfeggioFrequency.upsertOne\",\"SolfeggioFrequency.deleteOne\",\"SolfeggioFrequency.deleteMany\",\"SolfeggioFrequency.groupBy\",\"SolfeggioFrequency.aggregate\",\"ProclamationCategory.findUnique\",\"ProclamationCategory.findUniqueOrThrow\",\"ProclamationCategory.findFirst\",\"ProclamationCategory.findFirstOrThrow\",\"ProclamationCategory.findMany\",\"ProclamationCategory.createOne\",\"ProclamationCategory.createMany\",\"ProclamationCategory.createManyAndReturn\",\"ProclamationCategory.updateOne\",\"ProclamationCategory.updateMany\",\"ProclamationCategory.updateManyAndReturn\",\"ProclamationCategory.upsertOne\",\"ProclamationCategory.deleteOne\",\"ProclamationCategory.deleteMany\",\"ProclamationCategory.groupBy\",\"ProclamationCategory.aggregate\",\"LicenseKey.findUnique\",\"LicenseKey.findUniqueOrThrow\",\"LicenseKey.findFirst\",\"LicenseKey.findFirstOrThrow\",\"LicenseKey.findMany\",\"LicenseKey.createOne\",\"LicenseKey.createMany\",\"LicenseKey.createManyAndReturn\",\"LicenseKey.updateOne\",\"LicenseKey.updateMany\",\"LicenseKey.updateManyAndReturn\",\"LicenseKey.upsertOne\",\"LicenseKey.deleteOne\",\"LicenseKey.deleteMany\",\"LicenseKey.groupBy\",\"LicenseKey.aggregate\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"ColorPalette.findUnique\",\"ColorPalette.findUniqueOrThrow\",\"ColorPalette.findFirst\",\"ColorPalette.findFirstOrThrow\",\"ColorPalette.findMany\",\"ColorPalette.createOne\",\"ColorPalette.createMany\",\"ColorPalette.createManyAndReturn\",\"ColorPalette.updateOne\",\"ColorPalette.updateMany\",\"ColorPalette.updateManyAndReturn\",\"ColorPalette.upsertOne\",\"ColorPalette.deleteOne\",\"ColorPalette.deleteMany\",\"ColorPalette.groupBy\",\"ColorPalette.aggregate\",\"AuditLog.findUnique\",\"AuditLog.findUniqueOrThrow\",\"AuditLog.findFirst\",\"AuditLog.findFirstOrThrow\",\"AuditLog.findMany\",\"AuditLog.createOne\",\"AuditLog.createMany\",\"AuditLog.createManyAndReturn\",\"AuditLog.updateOne\",\"AuditLog.updateMany\",\"AuditLog.updateManyAndReturn\",\"AuditLog.upsertOne\",\"AuditLog.deleteOne\",\"AuditLog.deleteMany\",\"AuditLog.groupBy\",\"AuditLog.aggregate\",\"Schedule.findUnique\",\"Schedule.findUniqueOrThrow\",\"Schedule.findFirst\",\"Schedule.findFirstOrThrow\",\"Schedule.findMany\",\"Schedule.createOne\",\"Schedule.createMany\",\"Schedule.createManyAndReturn\",\"Schedule.updateOne\",\"Schedule.updateMany\",\"Schedule.updateManyAndReturn\",\"Schedule.upsertOne\",\"Schedule.deleteOne\",\"Schedule.deleteMany\",\"Schedule.groupBy\",\"Schedule.aggregate\",\"Block.findUnique\",\"Block.findUniqueOrThrow\",\"Block.findFirst\",\"Block.findFirstOrThrow\",\"Block.findMany\",\"Block.createOne\",\"Block.createMany\",\"Block.createManyAndReturn\",\"Block.updateOne\",\"Block.updateMany\",\"Block.updateManyAndReturn\",\"Block.upsertOne\",\"Block.deleteOne\",\"Block.deleteMany\",\"Block.groupBy\",\"Block.aggregate\",\"BlockProclamations.findUnique\",\"BlockProclamations.findUniqueOrThrow\",\"BlockProclamations.findFirst\",\"BlockProclamations.findFirstOrThrow\",\"BlockProclamations.findMany\",\"BlockProclamations.createOne\",\"BlockProclamations.createMany\",\"BlockProclamations.createManyAndReturn\",\"BlockProclamations.updateOne\",\"BlockProclamations.updateMany\",\"BlockProclamations.updateManyAndReturn\",\"BlockProclamations.upsertOne\",\"BlockProclamations.deleteOne\",\"BlockProclamations.deleteMany\",\"BlockProclamations.groupBy\",\"BlockProclamations.aggregate\",\"AND\",\"OR\",\"NOT\",\"blockId\",\"proclamationId\",\"sortOrder\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"id\",\"scheduleId\",\"startMinutes\",\"endMinutes\",\"dynamicAudio\",\"userId\",\"every\",\"some\",\"none\",\"email\",\"roleId\",\"roleName\",\"page\",\"action\",\"entity\",\"entityId\",\"before\",\"after\",\"ip\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"solfeggioFrequencyId\",\"colors\",\"keyPrefix\",\"keyHash\",\"expiresAt\",\"revokedAt\",\"key\",\"active\",\"lastValidatedAt\",\"name\",\"value\",\"content\",\"categoryId\",\"groupId\",\"identifier\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"profileId\",\"street\",\"city\",\"state\",\"postalCode\",\"country\",\"type\",\"isDefaultMailing\",\"isDefaultBilling\",\"isDefaultShipping\",\"firstName\",\"lastName\",\"phoneNumber\",\"ghlContactId\",\"emailVerified\",\"image\",\"blockId_proclamationId\",\"userId_proclamationId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "gAi2AbACEgUAAN0EACAHAADeBAAgCAAA3wQAIAsAAOAEACAMAADhBAAgEQAA0QQAIBMAAOIEACDPAgAA3AQAMNACAAAFABDRAgAA3AQAMNUCQACTBAAh1gJAAJMEACHiAgEAAAAB6wIBAAAAAewCAgCjBAAhhAMBAKEEACGkAyAAxgQAIaUDAQCiBAAhAQAAAAEAIAYDAAC_BAAgzwIAAL4EADDQAgAAAwAQ0QIAAL4EADDiAgIAqQQAIYQDAQChBAAhAQAAAAMAIBIFAADdBAAgBwAA3gQAIAgAAN8EACALAADgBAAgDAAA4QQAIBEAANEEACATAADiBAAgzwIAANwEADDQAgAABQAQ0QIAANwEADDVAkAAkwQAIdYCQACTBAAh4gIBAKEEACHrAgEAoQQAIewCAgCjBAAhhAMBAKEEACGkAyAAxgQAIaUDAQCiBAAhCQUAAKMHACAHAACkBwAgCAAApQcAIAsAAKYHACAMAACnBwAgEQAAoAcAIBMAAJkHACDsAgAAmgUAIKUDAACaBQAgAwAAAAUAIAEAAAYAMAIAAAEAIAEAAAAFACAMBgAAlAQAIM8CAADbBAAw0AIAAAkAENECAADbBAAw1QJAAJMEACHWAkAAkwQAIeICAQChBAAh5wIBAKEEACH_AkAAkwQAIZMDAQChBAAhlAMBAKIEACGVAwEAogQAIQMGAACYBQAglAMAAJoFACCVAwAAmgUAIAwGAACUBAAgzwIAANsEADDQAgAACQAQ0QIAANsEADDVAkAAkwQAIdYCQACTBAAh4gIBAAAAAecCAQChBAAh_wJAAJMEACGTAwEAAAABlAMBAKIEACGVAwEAogQAIQMAAAAJACABAAAKADACAAALACARBgAAlAQAIM8CAADaBAAw0AIAAA0AENECAADaBAAw1QJAAJMEACHWAkAAkwQAIeICAQChBAAh5wIBAKEEACGKAwEAoQQAIYsDAQChBAAhjAMBAKIEACGNAwEAogQAIY4DAQCiBAAhjwNAALAEACGQA0AAsAQAIZEDAQCiBAAhkgMBAKIEACEIBgAAmAUAIIwDAACaBQAgjQMAAJoFACCOAwAAmgUAII8DAACaBQAgkAMAAJoFACCRAwAAmgUAIJIDAACaBQAgEQYAAJQEACDPAgAA2gQAMNACAAANABDRAgAA2gQAMNUCQACTBAAh1gJAAJMEACHiAgEAAAAB5wIBAKEEACGKAwEAoQQAIYsDAQChBAAhjAMBAKIEACGNAwEAogQAIY4DAQCiBAAhjwNAALAEACGQA0AAsAQAIZEDAQCiBAAhkgMBAKIEACEDAAAADQAgAQAADgAwAgAADwAgDAYAANUEACAKAADZBAAgzwIAANgEADDQAgAAEQAQ0QIAANgEADDiAgEAoQQAIecCAQCiBAAh6wIBAKIEACGgAwEAoQQAIaEDAQChBAAhogMBAKEEACGjAwEAogQAIQUGAACYBQAgCgAAogcAIOcCAACaBQAg6wIAAJoFACCjAwAAmgUAIAwGAADVBAAgCgAA2QQAIM8CAADYBAAw0AIAABEAENECAADYBAAw4gIBAAAAAecCAQCiBAAh6wIBAKIEACGgAwEAoQQAIaEDAQChBAAhogMBAKEEACGjAwEAogQAIQMAAAARACABAAASADACAAATACABAAAABQAgDwkAANcEACDPAgAA1gQAMNACAAAWABDRAgAA1gQAMOICAQChBAAhlgMBAKEEACGXAwEAoQQAIZgDAQChBAAhmQMBAKEEACGaAwEAoQQAIZsDAQChBAAhnAMBAKEEACGdAyAAxgQAIZ4DIADGBAAhnwMgAMYEACEBCQAAoQcAIA8JAADXBAAgzwIAANYEADDQAgAAFgAQ0QIAANYEADDiAgEAAAABlgMBAKEEACGXAwEAoQQAIZgDAQChBAAhmQMBAKEEACGaAwEAoQQAIZsDAQChBAAhnAMBAKEEACGdAyAAxgQAIZ4DIADGBAAhnwMgAMYEACEDAAAAFgAgAQAAFwAwAgAAGAAgAQAAABYAIAsGAADVBAAgzwIAANQEADDQAgAAGwAQ0QIAANQEADDVAkAAkwQAIeICAQChBAAh5wIBAKIEACHrAgEAogQAIYEDAQChBAAhggMgAMYEACGDA0AAsAQAIQQGAACYBQAg5wIAAJoFACDrAgAAmgUAIIMDAACaBQAgCwYAANUEACDPAgAA1AQAMNACAAAbABDRAgAA1AQAMNUCQACTBAAh4gIBAAAAAecCAQCiBAAh6wIBAKIEACGBAwEAAAABggMgAMYEACGDA0AAsAQAIQMAAAAbACABAAAcADACAAAdACABAAAABQAgCQYAAJQEACAVAADMBAAgzwIAANMEADDQAgAAIAAQ0QIAANMEADDTAgEAoQQAIdUCQACTBAAh1gJAAJMEACHnAgEAoQQAIQIGAACYBQAgFQAAnAcAIAoGAACUBAAgFQAAzAQAIM8CAADTBAAw0AIAACAAENECAADTBAAw0wIBAKEEACHVAkAAkwQAIdYCQACTBAAh5wIBAKEEACGnAwAA0gQAIAMAAAAgACABAAAhADACAAAiACAODgAAzgQAIA8AAM8EACAQAADQBAAgEQAA0QQAIBYAAMgEACDPAgAAzQQAMNACAAAkABDRAgAAzQQAMOICAQChBAAh-wICAKkEACGEAwEAoQQAIYYDAQChBAAhhwMCAKkEACGIAwIAqQQAIQUOAACdBwAgDwAAngcAIBAAAJ8HACARAACgBwAgFgAAmgcAIA4OAADOBAAgDwAAzwQAIBAAANAEACARAADRBAAgFgAAyAQAIM8CAADNBAAw0AIAACQAENECAADNBAAw4gIBAAAAAfsCAgCpBAAhhAMBAAAAAYYDAQChBAAhhwMCAKkEACGIAwIAqQQAIQMAAAAkACABAAAlADACAAAmACABAAAAJAAgAwAAACQAIAEAACUAMAIAACYAIAEAAAAkACADAAAAJAAgAQAAJQAwAgAAJgAgAQAAACQAIAMAAAAgACABAAAhADACAAAiACAKFAAAywQAIBUAAMwEACDPAgAAygQAMNACAAAuABDRAgAAygQAMNICAQChBAAh0wIBAKEEACHUAgIAqQQAIdUCQACTBAAh1gJAAJMEACECFAAAmwcAIBUAAJwHACALFAAAywQAIBUAAMwEACDPAgAAygQAMNACAAAuABDRAgAAygQAMNICAQChBAAh0wIBAKEEACHUAgIAqQQAIdUCQACTBAAh1gJAAJMEACGmAwAAyQQAIAMAAAAuACABAAAvADACAAAwACAMDQAAyAQAIBMAAMcEACDPAgAAxQQAMNACAAAyABDRAgAAxQQAMNUCQACTBAAh1gJAAJMEACHiAgEAoQQAIeMCAQChBAAh5AICAKkEACHlAgIAqQQAIeYCIADGBAAhAg0AAJoHACATAACZBwAgDA0AAMgEACATAADHBAAgzwIAAMUEADDQAgAAMgAQ0QIAAMUEADDVAkAAkwQAIdYCQACTBAAh4gIBAAAAAeMCAQChBAAh5AICAKkEACHlAgIAqQQAIeYCIADGBAAhAwAAADIAIAEAADMAMAIAADQAIAEAAAAyACADAAAALgAgAQAALwAwAgAAMAAgAQAAAC4AIAEAAAAgACABAAAALgAgCQYAAJQEACASAACVBAAgzwIAAJIEADDQAgAAOwAQ0QIAAJIEADDVAkAAkwQAIdYCQACTBAAh4gIBAKEEACHnAgEAoQQAIQEAAAA7ACABAAAACQAgAQAAAA0AIAEAAAARACABAAAAGwAgAQAAACAAIAEAAAABACADAAAABQAgAQAABgAwAgAAAQAgAwAAAAUAIAEAAAYAMAIAAAEAIAMAAAAFACABAAAGADACAAABACAPBQAAmAcAIAcAAPYGACAIAAD3BgAgCwAA-AYAIAwAAPkGACARAAD6BgAgEwAA-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_wJAAAAAAZMDAQAAAAGUAwEAAAABlQMBAAAAAQEcAACMAQAgCNUCQAAAAAHWAkAAAAAB4gIBAAAAAecCAQAAAAH_AkAAAAABkwMBAAAAAZQDAQAAAAGVAwEAAAABARwAAI4BADABHAAAjgEAMAkGAACGBwAg1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5wIBAOoEACH_AkAA6QQAIZMDAQDqBAAhlAMBAKAFACGVAwEAoAUAIQIAAAALACAcAACRAQAgCNUCQADpBAAh1gJAAOkEACHiAgEA6gQAIecCAQDqBAAh_wJAAOkEACGTAwEA6gQAIZQDAQCgBQAhlQMBAKAFACECAAAACQAgHAAAkwEAIAIAAAAJACAcAACTAQAgAwAAAAsAICMAAIwBACAkAACRAQAgAQAAAAsAIAEAAAAJACAFBAAAgwcAICsAAIUHACAsAACEBwAglAMAAJoFACCVAwAAmgUAIAvPAgAAwQQAMNACAACaAQAQ0QIAAMEEADDVAkAAhQQAIdYCQACFBAAh4gIBAIMEACHnAgEAgwQAIf8CQACFBAAhkwMBAIMEACGUAwEAlwQAIZUDAQCXBAAhAwAAAAkAIAEAAJkBADAoAACaAQAgAwAAAAkAIAEAAAoAMAIAAAsAIAEAAAAPACABAAAADwAgAwAAAA0AIAEAAA4AMAIAAA8AIAMAAAANACABAAAOADACAAAPACADAAAADQAgAQAADgAwAgAADwAgDgYAAIIHACDVAkAAAAAB1gJAAAAAAeICAQAAAAHnAgEAAAABigMBAAAAAYsDAQAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAGPA0AAAAABkANAAAAAAZEDAQAAAAGSAwEAAAABARwAAKIBACAN1QJAAAAAAdYCQAAAAAHiAgEAAAAB5wIBAAAAAYoDAQAAAAGLAwEAAAABjAMBAAAAAY0DAQAAAAGOAwEAAAABjwNAAAAAAZADQAAAAAGRAwEAAAABkgMBAAAAAQEcAACkAQAwARwAAKQBADAOBgAAgQcAINUCQADpBAAh1gJAAOkEACHiAgEA6gQAIecCAQDqBAAhigMBAOoEACGLAwEA6gQAIYwDAQCgBQAhjQMBAKAFACGOAwEAoAUAIY8DQACqBQAhkANAAKoFACGRAwEAoAUAIZIDAQCgBQAhAgAAAA8AIBwAAKcBACAN1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh5wIBAOoEACGKAwEA6gQAIYsDAQDqBAAhjAMBAKAFACGNAwEAoAUAIY4DAQCgBQAhjwNAAKoFACGQA0AAqgUAIZEDAQCgBQAhkgMBAKAFACECAAAADQAgHAAAqQEAIAIAAAANACAcAACpAQAgAwAAAA8AICMAAKIBACAkAACnAQAgAQAAAA8AIAEAAAANACAKBAAA_gYAICsAAIAHACAsAAD_BgAgjAMAAJoFACCNAwAAmgUAII4DAACaBQAgjwMAAJoFACCQAwAAmgUAIJEDAACaBQAgkgMAAJoFACAQzwIAAMAEADDQAgAAsAEAENECAADABAAw1QJAAIUEACHWAkAAhQQAIeICAQCDBAAh5wIBAIMEACGKAwEAgwQAIYsDAQCDBAAhjAMBAJcEACGNAwEAlwQAIY4DAQCXBAAhjwNAAKwEACGQA0AArAQAIZEDAQCXBAAhkgMBAJcEACEDAAAADQAgAQAArwEAMCgAALABACADAAAADQAgAQAADgAwAgAADwAgBgMAAL8EACDPAgAAvgQAMNACAAADABDRAgAAvgQAMOICAgAAAAGEAwEAoQQAIQEAAACzAQAgAQAAALMBACABAwAA_QYAIAMAAAADACABAAC2AQAwAgAAswEAIAMAAAADACABAAC2AQAwAgAAswEAIAMAAAADACABAAC2AQAwAgAAswEAIAMDAAD8BgAg4gICAAAAAYQDAQAAAAEBHAAAugEAIALiAgIAAAABhAMBAAAAAQEcAAC8AQAwARwAALwBADADAwAAlwYAIOICAgDoBAAhhAMBAOoEACECAAAAswEAIBwAAL8BACAC4gICAOgEACGEAwEA6gQAIQIAAAADACAcAADBAQAgAgAAAAMAIBwAAMEBACADAAAAswEAICMAALoBACAkAAC_AQAgAQAAALMBACABAAAAAwAgBQQAAJIGACApAACTBgAgKgAAlgYAICsAAJUGACAsAACUBgAgBc8CAAC9BAAw0AIAAMgBABDRAgAAvQQAMOICAgCEBAAhhAMBAIMEACEDAAAAAwAgAQAAxwEAMCgAAMgBACADAAAAAwAgAQAAtgEAMAIAALMBACAJzwIAALwEADDQAgAAzgEAENECAAC8BAAw1QJAAJMEACHWAkAAkwQAIeICAQAAAAH_AkAAkwQAIYUDAQChBAAhiQMBAKEEACEBAAAAywEAIAEAAADLAQAgCc8CAAC8BAAw0AIAAM4BABDRAgAAvAQAMNUCQACTBAAh1gJAAJMEACHiAgEAoQQAIf8CQACTBAAhhQMBAKEEACGJAwEAoQQAIQADAAAAzgEAIAEAAM8BADACAADLAQAgAwAAAM4BACABAADPAQAwAgAAywEAIAMAAADOAQAgAQAAzwEAMAIAAMsBACAG1QJAAAAAAdYCQAAAAAHiAgEAAAAB_wJAAAAAAYUDAQAAAAGJAwEAAAABARwAANMBACAG1QJAAAAAAdYCQAAAAAHiAgEAAAAB_wJAAAAAAYUDAQAAAAGJAwEAAAABARwAANUBADABHAAA1QEAMAbVAkAA6QQAIdYCQADpBAAh4gIBAOoEACH_AkAA6QQAIYUDAQDqBAAhiQMBAOoEACECAAAAywEAIBwAANgBACAG1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh_wJAAOkEACGFAwEA6gQAIYkDAQDqBAAhAgAAAM4BACAcAADaAQAgAgAAAM4BACAcAADaAQAgAwAAAMsBACAjAADTAQAgJAAA2AEAIAEAAADLAQAgAQAAAM4BACADBAAAjwYAICsAAJEGACAsAACQBgAgCc8CAAC7BAAw0AIAAOEBABDRAgAAuwQAMNUCQACFBAAh1gJAAIUEACHiAgEAgwQAIf8CQACFBAAhhQMBAIMEACGJAwEAgwQAIQMAAADOAQAgAQAA4AEAMCgAAOEBACADAAAAzgEAIAEAAM8BADACAADLAQAgAQAAACYAIAEAAAAmACADAAAAJAAgAQAAJQAwAgAAJgAgAwAAACQAIAEAACUAMAIAACYAIAMAAAAkACABAAAlADACAAAmACALDgAA3QUAIA8AAPMFACAQAADeBQAgEQAA3wUAIBYAAOAFACDiAgEAAAAB-wICAAAAAYQDAQAAAAGGAwEAAAABhwMCAAAAAYgDAgAAAAEBHAAA6QEAIAbiAgEAAAAB-wICAAAAAYQDAQAAAAGGAwEAAAABhwMCAAAAAYgDAgAAAAEBHAAA6wEAMAEcAADrAQAwCw4AAMEFACAPAADxBQAgEAAAwgUAIBEAAMMFACAWAADEBQAg4gIBAOoEACH7AgIA6AQAIYQDAQDqBAAhhgMBAOoEACGHAwIA6AQAIYgDAgDoBAAhAgAAACYAIBwAAO4BACAG4gIBAOoEACH7AgIA6AQAIYQDAQDqBAAhhgMBAOoEACGHAwIA6AQAIYgDAgDoBAAhAgAAACQAIBwAAPABACACAAAAJAAgHAAA8AEAIAMAAAAmACAjAADpAQAgJAAA7gEAIAEAAAAmACABAAAAJAAgBQQAAIoGACApAACLBgAgKgAAjgYAICsAAI0GACAsAACMBgAgCc8CAAC6BAAw0AIAAPcBABDRAgAAugQAMOICAQCDBAAh-wICAIQEACGEAwEAgwQAIYYDAQCDBAAhhwMCAIQEACGIAwIAhAQAIQMAAAAkACABAAD2AQAwKAAA9wEAIAMAAAAkACABAAAlADACAAAmACAHDQAAtAQAIM8CAAC5BAAw0AIAAP0BABDRAgAAuQQAMNQCAgCpBAAh4gICAAAAAYQDAQAAAAEBAAAA-gEAIAEAAAD6AQAgBw0AALQEACDPAgAAuQQAMNACAAD9AQAQ0QIAALkEADDUAgIAqQQAIeICAgCpBAAhhAMBAKEEACEBDQAA4gUAIAMAAAD9AQAgAQAA_gEAMAIAAPoBACADAAAA_QEAIAEAAP4BADACAAD6AQAgAwAAAP0BACABAAD-AQAwAgAA-gEAIAQNAACJBgAg1AICAAAAAeICAgAAAAGEAwEAAAABARwAAIICACAD1AICAAAAAeICAgAAAAGEAwEAAAABARwAAIQCADABHAAAhAIAMAQNAAD_BQAg1AICAOgEACHiAgIA6AQAIYQDAQDqBAAhAgAAAPoBACAcAACHAgAgA9QCAgDoBAAh4gICAOgEACGEAwEA6gQAIQIAAAD9AQAgHAAAiQIAIAIAAAD9AQAgHAAAiQIAIAMAAAD6AQAgIwAAggIAICQAAIcCACABAAAA-gEAIAEAAAD9AQAgBQQAAPoFACApAAD7BQAgKgAA_gUAICsAAP0FACAsAAD8BQAgBs8CAAC4BAAw0AIAAJACABDRAgAAuAQAMNQCAgCEBAAh4gICAIQEACGEAwEAgwQAIQMAAAD9AQAgAQAAjwIAMCgAAJACACADAAAA_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_QIBAKEEACH-AgEAAAAB_wJAALAEACGAA0AAsAQAIQEAAADzAgAgAQAAAPMCACAJzwIAAK8EADDQAgAA9gIAENECAACvBAAw1QJAAJMEACHiAgEAoQQAIf0CAQChBAAh_gIBAKEEACH_AkAAsAQAIYADQACwBAAhAv8CAACaBQAggAMAAJoFACADAAAA9gIAIAEAAPcCADACAADzAgAgAwAAAPYCACABAAD3AgAwAgAA8wIAIAMAAAD2AgAgAQAA9wIAMAIAAPMCACAG1QJAAAAAAeICAQAAAAH9AgEAAAAB_gIBAAAAAf8CQAAAAAGAA0AAAAABARwAAPsCACAG1QJAAAAAAeICAQAAAAH9AgEAAAAB_gIBAAAAAf8CQAAAAAGAA0AAAAABARwAAP0CADABHAAA_QIAMAbVAkAA6QQAIeICAQDqBAAh_QIBAOoEACH-AgEA6gQAIf8CQACqBQAhgANAAKoFACECAAAA8wIAIBwAAIADACAG1QJAAOkEACHiAgEA6gQAIf0CAQDqBAAh_gIBAOoEACH_AkAAqgUAIYADQACqBQAhAgAAAPYCACAcAACCAwAgAgAAAPYCACAcAACCAwAgAwAAAPMCACAjAAD7AgAgJAAAgAMAIAEAAADzAgAgAQAAAPYCACAFBAAApwUAICsAAKkFACAsAACoBQAg_wIAAJoFACCAAwAAmgUAIAnPAgAAqwQAMNACAACJAwAQ0QIAAKsEADDVAkAAhQQAIeICAQCDBAAh_QIBAIMEACH-AgEAgwQAIf8CQACsBAAhgANAAKwEACEDAAAA9gIAIAEAAIgDADAoAACJAwAgAwAAAPYCACABAAD3AgAwAgAA8wIAIAXPAgAAqAQAMNACAACPAwAQ0QIAAKgEADD7AgIAAAAB_AIAAKoEACABAAAAjAMAIAEAAACMAwAgBc8CAACoBAAw0AIAAI8DABDRAgAAqAQAMPsCAgCpBAAh_AIAAKoEACAAAwAAAI8DACABAACQAwAwAgAAjAMAIAMAAACPAwAgAQAAkAMAMAIAAIwDACADAAAAjwMAIAEAAJADADACAACMAwAgAvsCAgAAAAH8AoAAAAABARwAAJQDACAC-wICAAAAAfwCgAAAAAEBHAAAlgMAMAEcAACWAwAwAvsCAgDoBAAh_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_AwAQ0QIAAIIEADDSAgEAgwQAIdMCAQCDBAAh1AICAIQEACHVAkAAhQQAIdYCQACFBAAhAwAAAC4AIAEAAP4DADAoAAD_AwAgAwAAAC4AIAEAAC8AMAIAADAAIAjPAgAAggQAMNACAAD_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_AIAAKoEACAI1wICAAAAAdgCAgAAAATZAgIAAAAE2gICAAAAAdsCAgAAAAHcAgIAAAAB3QICAAAAAd4CAgCHBAAhDNcCgAAAAAHaAoAAAAAB2wKAAAAAAdwCgAAAAAHdAoAAAAAB3gKAAAAAAfUCAQAAAAH2AgEAAAAB9wIBAAAAAfgCgAAAAAH5AoAAAAAB-gKAAAAAAQnPAgAAqwQAMNACAACJAwAQ0QIAAKsEADDVAkAAhQQAIeICAQCDBAAh_QIBAIMEACH-AgEAgwQAIf8CQACsBAAhgANAAKwEACELBAAAmgQAICsAAK4EACAsAACuBAAg1wJAAAAAAdgCQAAAAAXZAkAAAAAF2gJAAAAAAdsCQAAAAAHcAkAAAAAB3QJAAAAAAd4CQACtBAAhCwQAAJoEACArAACuBAAgLAAArgQAINcCQAAAAAHYAkAAAAAF2QJAAAAABdoCQAAAAAHbAkAAAAAB3AJAAAAAAd0CQAAAAAHeAkAArQQAIQjXAkAAAAAB2AJAAAAABdkCQAAAAAXaAkAAAAAB2wJAAAAAAdwCQAAAAAHdAkAAAAAB3gJAAK4EACEJzwIAAK8EADDQAgAA9gIAENECAACvBAAw1QJAAJMEACHiAgEAoQQAIf0CAQChBAAh_gIBAKEEACH_AkAAsAQAIYADQACwBAAhCNcCQAAAAAHYAkAAAAAF2QJAAAAABdoCQAAAAAHbAkAAAAAB3AJAAAAAAd0CQAAAAAHeAkAArgQAIQrPAgAAsQQAMNACAADwAgAQ0QIAALEEADDVAkAAhQQAIeICAQCDBAAh5wIBAJcEACHrAgEAlwQAIYEDAQCDBAAhggMgAI4EACGDA0AArAQAIQbPAgAAsgQAMNACAADYAgAQ0QIAALIEADDUAgIAhAQAIeICAgCEBAAhhAMBAIMEACEHDQAAtAQAIM8CAACzBAAw0AIAAMUCABDRAgAAswQAMNQCAgCpBAAh4gICAKkEACGEAwEAoQQAIQPoAgAAJAAg6QIAACQAIOoCAAAkACAGzwIAALUEADDQAgAAvwIAENECAAC1BAAw4gICAIQEACGEAwEAgwQAIYUDAgCEBAAhBw0AALQEACDPAgAAtgQAMNACAACsAgAQ0QIAALYEADDiAgIAqQQAIYQDAQChBAAhhQMCAKkEACEHzwIAALcEADDQAgAApgIAENECAAC3BAAw0wIBAIMEACHVAkAAhQQAIdYCQACFBAAh5wIBAIMEACEGzwIAALgEADDQAgAAkAIAENECAAC4BAAw1AICAIQEACHiAgIAhAQAIYQDAQCDBAAhBw0AALQEACDPAgAAuQQAMNACAAD9AQAQ0QIAALkEADDUAgIAqQQAIeICAgCpBAAhhAMBAKEEACEJzwIAALoEADDQAgAA9wEAENECAAC6BAAw4gIBAIMEACH7AgIAhAQAIYQDAQCDBAAhhgMBAIMEACGHAwIAhAQAIYgDAgCEBAAhCc8CAAC7BAAw0AIAAOEBABDRAgAAuwQAMNUCQACFBAAh1gJAAIUEACHiAgEAgwQAIf8CQACFBAAhhQMBAIMEACGJAwEAgwQAIQnPAgAAvAQAMNACAADOAQAQ0QIAALwEADDVAkAAkwQAIdYCQACTBAAh4gIBAKEEACH_AkAAkwQAIYUDAQChBAAhiQMBAKEEACEFzwIAAL0EADDQAgAAyAEAENECAAC9BAAw4gICAIQEACGEAwEAgwQAIQYDAAC_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_wJAAJMEACGTAwEAoQQAIZQDAQCiBAAhlQMBAKIEACESBQAA3QQAIAcAAN4EACAIAADfBAAgCwAA4AQAIAwAAOEEACARAADRBAAgEwAA4gQAIM8CAADcBAAw0AIAAAUAENECAADcBAAw1QJAAJMEACHWAkAAkwQAIeICAQChBAAh6wIBAKEEACHsAgIAowQAIYQDAQChBAAhpAMgAMYEACGlAwEAogQAIQgDAAC_BAAgzwIAAL4EADDQAgAAAwAQ0QIAAL4EADDiAgIAqQQAIYQDAQChBAAhqAMAAAMAIKkDAAADACAD6AIAAAkAIOkCAAAJACDqAgAACQAgA-gCAAANACDpAgAADQAg6gIAAA0AIAPoAgAAEQAg6QIAABEAIOoCAAARACAD6AIAABsAIOkCAAAbACDqAgAAGwAgCwYAAJQEACASAACVBAAgzwIAAJIEADDQAgAAOwAQ0QIAAJIEADDVAkAAkwQAIdYCQACTBAAh4gIBAKEEACHnAgEAoQQAIagDAAA7ACCpAwAAOwAgAAAAAAAFrQMCAAAAAbMDAgAAAAG0AwIAAAABtQMCAAAAAbYDAgAAAAEBrQNAAAAAAQGtAwEAAAABBSMAAPkHACAkAAD_BwAgqgMAAPoHACCrAwAA_gcAILADAAA0ACAFIwAA9wcAICQAAPwHACCqAwAA-AcAIKsDAAD7BwAgsAMAACYAIAMjAAD5BwAgqgMAAPoHACCwAwAANAAgAyMAAPcHACCqAwAA-AcAILADAAAmACAAAAAAAAGtAyAAAAABBSMAAPEHACAkAAD1BwAgqgMAAPIHACCrAwAA9AcAILADAAC-AwAgCyMAAPcEADAkAAD8BAAwqgMAAPgEADCrAwAA-QQAMKwDAAD6BAAgrQMAAPsEADCuAwAA-wQAMK8DAAD7BAAwsAMAAPsEADCxAwAA_QQAMLIDAAD-BAAwBRUAAO4EACDTAgEAAAAB1AICAAAAAdUCQAAAAAHWAkAAAAABAgAAADAAICMAAIIFACADAAAAMAAgIwAAggUAICQAAIEFACABHAAA8wcAMAsUAADLBAAgFQAAzAQAIM8CAADKBAAw0AIAAC4AENECAADKBAAw0gIBAKEEACHTAgEAoQQAIdQCAgCpBAAh1QJAAJMEACHWAkAAkwQAIaYDAADJBAAgAgAAADAAIBwAAIEFACACAAAA_wQAIBwAAIAFACAIzwIAAP4EADDQAgAA_wQAENECAAD-BAAw0gIBAKEEACHTAgEAoQQAIdQCAgCpBAAh1QJAAJMEACHWAkAAkwQAIQjPAgAA_gQAMNACAAD_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_wJAAAAAAZMDAQAAAAGUAwEAAAABlQMBAAAAAQIAAAALACAjAAD0BgAgAwAAAAsAICMAAPQGACAkAADzBgAgARwAAMEHADAMBgAAlAQAIM8CAADbBAAw0AIAAAkAENECAADbBAAw1QJAAJMEACHWAkAAkwQAIeICAQAAAAHnAgEAoQQAIf8CQACTBAAhkwMBAAAAAZQDAQCiBAAhlQMBAKIEACECAAAACwAgHAAA8wYAIAIAAADxBgAgHAAA8gYAIAvPAgAA8AYAMNACAADxBgAQ0QIAAPAGADDVAkAAkwQAIdYCQACTBAAh4gIBAKEEACHnAgEAoQQAIf8CQACTBAAhkwMBAKEEACGUAwEAogQAIZUDAQCiBAAhC88CAADwBgAw0AIAAPEGABDRAgAA8AYAMNUCQACTBAAh1gJAAJMEACHiAgEAoQQAIecCAQChBAAh_wJAAJMEACGTAwEAoQQAIZQDAQCiBAAhlQMBAKIEACEH1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh_wJAAOkEACGTAwEA6gQAIZQDAQCgBQAhlQMBAKAFACEH1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh_wJAAOkEACGTAwEA6gQAIZQDAQCgBQAhlQMBAKAFACEH1QJAAAAAAdYCQAAAAAHiAgEAAAAB_wJAAAAAAZMDAQAAAAGUAwEAAAABlQMBAAAAAQ0HAAD2BgAgCAAA9wYAIAsAAPgGACAMAAD5BgAgEQAA-gYAIBMAAPsGACDVAkAAAAAB1gJAAAAAAeICAQAAAAHrAgEAAAABhAMBAAAAAaQDIAAAAAGlAwEAAAABBCMAAOkGADCqAwAA6gYAMKwDAADsBgAgsAMAAO0GADAEIwAA3QYAMKoDAADeBgAwrAMAAOAGACCwAwAA4QYAMAQjAADDBgAwqgMAAMQGADCsAwAAxgYAILADAADHBgAwBCMAALcGADCqAwAAuAYAMKwDAAC6BgAgsAMAALsGADAEIwAArgYAMKoDAACvBgAwrAMAALEGACCwAwAA0gUAMAMjAACpBgAgqgMAAKoGACCwAwAAvgMAIAQjAACYBgAwqgMAAJkGADCsAwAAmwYAILADAACcBgAwAAAAAAUjAAC8BwAgJAAAvwcAIKoDAAC9BwAgqwMAAL4HACCwAwAAAQAgAyMAALwHACCqAwAAvQcAILADAAABACAAAAAFIwAAtwcAICQAALoHACCqAwAAuAcAIKsDAAC5BwAgsAMAAAEAIAMjAAC3BwAgqgMAALgHACCwAwAAAQAgAAAABSMAALIHACAkAAC1BwAgqgMAALMHACCrAwAAtAcAILADAAATACADIwAAsgcAIKoDAACzBwAgsAMAABMAIAAAAAcjAACtBwAgJAAAsAcAIKoDAACuBwAgqwMAAK8HACCuAwAABQAgrwMAAAUAILADAAABACADIwAArQcAIKoDAACuBwAgsAMAAAEAIAAAAAAAByMAAKgHACAkAACrBwAgqgMAAKkHACCrAwAAqgcAIK4DAAADACCvAwAAAwAgsAMAALMBACADIwAAqAcAIKoDAACpBwAgsAMAALMBACACBgAAmAUAIBIAAJkFACAAAg0AAJoHACATAACZBwAgBQ4AAJ0HACAPAACeBwAgEAAAnwcAIBEAAKAHACAWAACaBwAgAQ0AAOIFACABDQAA4gUAIAENAADiBQAgAAUGAACYBQAgCgAAogcAIOcCAACaBQAg6wIAAJoFACCjAwAAmgUAIAABAwAA_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_QEAIBwAAOEHACDUAgIA6AQAIeICAgDoBAAhhAMBAOoEACED1AICAOgEACHiAgIA6AQAIYQDAQDqBAAhAwAAAKwCACAjAADWBwAgJAAA5AcAIAUAAACsAgAgHAAA5AcAIOICAgDoBAAhhAMBAOoEACGFAwIA6AQAIQPiAgIA6AQAIYQDAQDqBAAhhQMCAOgEACEF4gIBAAAAAfsCAgAAAAGEAwEAAAABhgMBAAAAAYgDAgAAAAEOBQAAmAcAIAcAAPYGACAIAAD3BgAgCwAA-AYAIBEAAPoGACATAAD7BgAg1QJAAAAAAdYCQAAAAAHiAgEAAAAB6wIBAAAAAewCAgAAAAGEAwEAAAABpAMgAAAAAaUDAQAAAAECAAAAAQAgIwAA5gcAIAMAAAAFACAjAADmBwAgJAAA6gcAIBAAAAAFACAFAACXBwAgBwAAowYAIAgAAKQGACALAAClBgAgEQAApwYAIBMAAKgGACAcAADqBwAg1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh6wIBAOoEACHsAgIAoQUAIYQDAQDqBAAhpAMgAPQEACGlAwEAoAUAIQ4FAACXBwAgBwAAowYAIAgAAKQGACALAAClBgAgEQAApwYAIBMAAKgGACDVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHrAgEA6gQAIewCAgChBQAhhAMBAOoEACGkAyAA9AQAIaUDAQCgBQAhDgUAAJgHACAHAAD2BgAgCAAA9wYAIAsAAPgGACAMAAD5BgAgEQAA-gYAINUCQAAAAAHWAkAAAAAB4gIBAAAAAesCAQAAAAHsAgIAAAABhAMBAAAAAaQDIAAAAAGlAwEAAAABAgAAAAEAICMAAOsHACAG1QJAAAAAAdYCQAAAAAHiAgEAAAAB5AICAAAAAeUCAgAAAAHmAiAAAAABAwAAAAUAICMAAOsHACAkAADwBwAgEAAAAAUAIAUAAJcHACAHAACjBgAgCAAApAYAIAsAAKUGACAMAACmBgAgEQAApwYAIBwAAPAHACDVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHrAgEA6gQAIewCAgChBQAhhAMBAOoEACGkAyAA9AQAIaUDAQCgBQAhDgUAAJcHACAHAACjBgAgCAAApAYAIAsAAKUGACAMAACmBgAgEQAApwYAINUCQADpBAAh1gJAAOkEACHiAgEA6gQAIesCAQDqBAAh7AICAKEFACGEAwEA6gQAIaQDIAD0BAAhpQMBAKAFACEFBgAAlgUAINUCQAAAAAHWAkAAAAAB4gIBAAAAAecCAQAAAAECAAAAvgMAICMAAPEHACAE0wIBAAAAAdQCAgAAAAHVAkAAAAAB1gJAAAAAAQMAAAA7ACAjAADxBwAgJAAA9gcAIAcAAAA7ACAGAACIBQAgHAAA9gcAINUCQADpBAAh1gJAAOkEACHiAgEA6gQAIecCAQDqBAAhBQYAAIgFACDVAkAA6QQAIdYCQADpBAAh4gIBAOoEACHnAgEA6gQAIQoOAADdBQAgDwAA8wUAIBAAAN4FACARAADfBQAg4gIBAAAAAfsCAgAAAAGEAwEAAAABhgMBAAAAAYcDAgAAAAGIAwIAAAABAgAAACYAICMAAPcHACAIEwAAgwUAINUCQAAAAAHWAkAAAAAB4gIBAAAAAeMCAQAAAAHkAgIAAAAB5QICAAAAAeYCIAAAAAECAAAANAAgIwAA-QcAIAMAAAAkACAjAAD3BwAgJAAA_QcAIAwAAAAkACAOAADBBQAgDwAA8QUAIBAAAMIFACARAADDBQAgHAAA_QcAIOICAQDqBAAh-wICAOgEACGEAwEA6gQAIYYDAQDqBAAhhwMCAOgEACGIAwIA6AQAIQoOAADBBQAgDwAA8QUAIBAAAMIFACARAADDBQAg4gIBAOoEACH7AgIA6AQAIYQDAQDqBAAhhgMBAOoEACGHAwIA6AQAIYgDAgDoBAAhAwAAADIAICMAAPkHACAkAACACAAgCgAAADIAIBMAAPUEACAcAACACAAg1QJAAOkEACHWAkAA6QQAIeICAQDqBAAh4wIBAOoEACHkAgIA6AQAIeUCAgDoBAAh5gIgAPQEACEIEwAA9QQAINUCQADpBAAh1gJAAOkEACHiAgEA6gQAIeMCAQDqBAAh5AICAOgEACHlAgIA6AQAIeYCIAD0BAAhCAQAGAUEAgcMBAgQBQsUBgweCREjChM8FAIDBwEEAAMBAwgAAQYAAQEGAAEDBAAIBhUBChkHAQkABgEKGgABBh8BAgYAARUACwYEABcOAAwPAA4QABARLQoWMRICBAANDScLAQ0oAAIEAA8NKQsBDSoAAgQAEQ0rCwENLAACFAATFQALAwQAFg03EhMAFAMEABUGAAESNRMBEjYAAQ04AAIROQAWOgAFBz0ACD4ACz8ADEAAEUEAAAEFSwIBBVECBQQAHSkAHioAHysAICwAIQAAAAAABQQAHSkAHioAHysAICwAIQEGYwEBBmkBAwQAJisAJywAKAAAAAMEACYrACcsACgBCQAGAQkABgMEAC0rAC4sAC8AAAADBAAtKwAuLAAvAQYAAQEGAAEDBAA0KwA1LAA2AAAAAwQANCsANSwANgEGAAEBBgABAwQAOysAPCwAPQAAAAMEADsrADwsAD0AAAUEAEIpAEMqAEQrAEUsAEYAAAAAAAUEAEIpAEMqAEQrAEUsAEYAAAADBABMKwBNLABOAAAAAwQATCsATSwATgMOAAwPAA4QABADDgAMDwAOEAAQBQQAUykAVCoAVSsAViwAVwAAAAAABQQAUykAVCoAVSsAViwAVwAABQQAXCkAXSoAXisAXywAYAAAAAAABQQAXCkAXSoAXisAXywAYAIGAAEVAAsCBgABFQALAwQAZSsAZiwAZwAAAAMEAGUrAGYsAGcAAAUEAGwpAG0qAG4rAG8sAHAAAAAAAAUEAGwpAG0qAG4rAG8sAHAAAAUEAHUpAHYqAHcrAHgsAHkAAAAAAAUEAHUpAHYqAHcrAHgsAHkBBuUCAQEG6wIBAwQAfisAfywAgAEAAAADBAB-KwB_LACAAQAAAAMEAIYBKwCHASwAiAEAAAADBACGASsAhwEsAIgBAAAABQQAjgEpAI8BKgCQASsAkQEsAJIBAAAAAAAFBACOASkAjwEqAJABKwCRASwAkgEAAAAFBACYASkAmQEqAJoBKwCbASwAnAEAAAAAAAUEAJgBKQCZASoAmgErAJsBLACcAQEGAAEBBgABAwQAoQErAKIBLACjAQAAAAMEAKEBKwCiASwAowEBEwAUARMAFAUEAKgBKQCpASoAqgErAKsBLACsAQAAAAAABQQAqAEpAKkBKgCqASsAqwEsAKwBAhQAExUACwIUABMVAAsFBACxASkAsgEqALMBKwC0ASwAtQEAAAAAAAUEALEBKQCyASoAswErALQBLAC1ARcCARhCARlDARpEARtFAR1HAR5JGR9KGiBNASFPGSJQGyVSASZTASdUGS1XHC5YIi9ZBjBaBjFbBjJcBjNdBjRfBjVhGTZiIzdlBjhnGTloJDpqBjtrBjxsGT1vJT5wKT9xB0ByB0FzB0J0B0N1B0R3B0V5GUZ6Kkd8B0h-GUl_K0qAAQdLgQEHTIIBGU2FASxOhgEwT4cBBFCIAQRRiQEEUooBBFOLAQRUjQEEVY8BGVaQATFXkgEEWJQBGVmVATJalgEEW5cBBFyYARldmwEzXpwBN1-dAQVgngEFYZ8BBWKgAQVjoQEFZKMBBWWlARlmpgE4Z6gBBWiqARlpqwE5aqwBBWutAQVsrgEZbbEBOm6yAT5vtAECcLUBAnG3AQJyuAECc7kBAnS7AQJ1vQEZdr4BP3fAAQJ4wgEZecMBQHrEAQJ7xQECfMYBGX3JAUF-ygFHf8wBSIABzQFIgQHQAUiCAdEBSIMB0gFIhAHUAUiFAdYBGYYB1wFJhwHZAUiIAdsBGYkB3AFKigHdAUiLAd4BSIwB3wEZjQHiAUuOAeMBT48B5AELkAHlAQuRAeYBC5IB5wELkwHoAQuUAeoBC5UB7AEZlgHtAVCXAe8BC5gB8QEZmQHyAVGaAfMBC5sB9AELnAH1ARmdAfgBUp4B-QFYnwH7ARCgAfwBEKEB_wEQogGAAhCjAYECEKQBgwIQpQGFAhmmAYYCWacBiAIQqAGKAhmpAYsCWqoBjAIQqwGNAhCsAY4CGa0BkQJbrgGSAmGvAZMCCrABlAIKsQGVAgqyAZYCCrMBlwIKtAGZAgq1AZsCGbYBnAJitwGeAgq4AaACGbkBoQJjugGiAgq7AaMCCrwBpAIZvQGnAmS-AagCaL8BqgIMwAGrAgzBAa4CDMIBrwIMwwGwAgzEAbICDMUBtAIZxgG1AmnHAbcCDMgBuQIZyQG6AmrKAbsCDMsBvAIMzAG9AhnNAcACa84BwQJxzwHDAg7QAcQCDtEBxwIO0gHIAg7TAckCDtQBywIO1QHNAhnWAc4CctcB0AIO2AHSAhnZAdMCc9oB1AIO2wHVAg7cAdYCGd0B2QJ03gHaAnrfAdsCCeAB3AIJ4QHdAgniAd4CCeMB3wIJ5AHhAgnlAeMCGeYB5AJ75wHnAgnoAekCGekB6gJ86gHsAgnrAe0CCewB7gIZ7QHxAn3uAfICgQHvAfQCggHwAfUCggHxAfgCggHyAfkCggHzAfoCggH0AfwCggH1Af4CGfYB_wKDAfcBgQOCAfgBgwMZ-QGEA4QB-gGFA4IB-wGGA4IB_AGHAxn9AYoDhQH-AYsDiQH_AY0DigGAAo4DigGBApEDigGCApIDigGDApMDigGEApUDigGFApcDGYYCmAOLAYcCmgOKAYgCnAMZiQKdA4wBigKeA4oBiwKfA4oBjAKgAxmNAqMDjQGOAqQDkwGPAqYDlAGQAqcDlAGRAqoDlAGSAqsDlAGTAqwDlAGUAq4DlAGVArADGZYCsQOVAZcCswOUAZgCtQMZmQK2A5YBmgK3A5QBmwK4A5QBnAK5AxmdArwDlwGeAr0DnQGfAr8DFKACwAMUoQLCAxSiAsMDFKMCxAMUpALGAxSlAsgDGaYCyQOeAacCywMUqALNAxmpAs4DnwGqAs8DFKsC0AMUrALRAxmtAtQDoAGuAtUDpAGvAtYDE7AC1wMTsQLYAxOyAtkDE7MC2gMTtALcAxO1At4DGbYC3wOlAbcC4QMTuALjAxm5AuQDpgG6AuUDE7sC5gMTvALnAxm9AuoDpwG-AusDrQG_AuwDEsAC7QMSwQLuAxLCAu8DEsMC8AMSxALyAxLFAvQDGcYC9QOuAccC9wMSyAL5AxnJAvoDrwHKAvsDEssC_AMSzAL9AxnNAoAEsAHOAoEEtgE" } async function decodeBase64AsWasm(wasmBase64: string): Promise { diff --git a/src/lib/generated/prisma/internal/prismaNamespace.ts b/src/lib/generated/prisma/internal/prismaNamespace.ts index f2e5525..2dc3566 100644 --- a/src/lib/generated/prisma/internal/prismaNamespace.ts +++ b/src/lib/generated/prisma/internal/prismaNamespace.ts @@ -2080,6 +2080,7 @@ export const BlockScalarFieldEnum = { scheduleId: 'scheduleId', startMinutes: 'startMinutes', endMinutes: 'endMinutes', + dynamicAudio: 'dynamicAudio', createdAt: 'createdAt', updatedAt: 'updatedAt' } as const diff --git a/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts b/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts index a44f1fa..aa94cb6 100644 --- a/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -301,6 +301,7 @@ export const BlockScalarFieldEnum = { scheduleId: 'scheduleId', startMinutes: 'startMinutes', endMinutes: 'endMinutes', + dynamicAudio: 'dynamicAudio', createdAt: 'createdAt', updatedAt: 'updatedAt' } as const diff --git a/src/lib/generated/prisma/models/Block.ts b/src/lib/generated/prisma/models/Block.ts index e922b49..28969e0 100644 --- a/src/lib/generated/prisma/models/Block.ts +++ b/src/lib/generated/prisma/models/Block.ts @@ -41,6 +41,7 @@ export type BlockMinAggregateOutputType = { scheduleId: string | null startMinutes: number | null endMinutes: number | null + dynamicAudio: boolean | null createdAt: Date | null updatedAt: Date | null } @@ -50,6 +51,7 @@ export type BlockMaxAggregateOutputType = { scheduleId: string | null startMinutes: number | null endMinutes: number | null + dynamicAudio: boolean | null createdAt: Date | null updatedAt: Date | null } @@ -59,6 +61,7 @@ export type BlockCountAggregateOutputType = { scheduleId: number startMinutes: number endMinutes: number + dynamicAudio: number createdAt: number updatedAt: number _all: number @@ -80,6 +83,7 @@ export type BlockMinAggregateInputType = { scheduleId?: true startMinutes?: true endMinutes?: true + dynamicAudio?: true createdAt?: true updatedAt?: true } @@ -89,6 +93,7 @@ export type BlockMaxAggregateInputType = { scheduleId?: true startMinutes?: true endMinutes?: true + dynamicAudio?: true createdAt?: true updatedAt?: true } @@ -98,6 +103,7 @@ export type BlockCountAggregateInputType = { scheduleId?: true startMinutes?: true endMinutes?: true + dynamicAudio?: true createdAt?: true updatedAt?: true _all?: true @@ -194,6 +200,7 @@ export type BlockGroupByOutputType = { scheduleId: string startMinutes: number endMinutes: number + dynamicAudio: boolean createdAt: Date updatedAt: Date _count: BlockCountAggregateOutputType | null @@ -226,6 +233,7 @@ export type BlockWhereInput = { scheduleId?: Prisma.StringFilter<"Block"> | string startMinutes?: Prisma.IntFilter<"Block"> | number endMinutes?: Prisma.IntFilter<"Block"> | number + dynamicAudio?: Prisma.BoolFilter<"Block"> | boolean createdAt?: Prisma.DateTimeFilter<"Block"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Block"> | Date | string schedule?: Prisma.XOR @@ -237,6 +245,7 @@ export type BlockOrderByWithRelationInput = { scheduleId?: Prisma.SortOrder startMinutes?: Prisma.SortOrder endMinutes?: Prisma.SortOrder + dynamicAudio?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder schedule?: Prisma.ScheduleOrderByWithRelationInput @@ -251,6 +260,7 @@ export type BlockWhereUniqueInput = Prisma.AtLeast<{ scheduleId?: Prisma.StringFilter<"Block"> | string startMinutes?: Prisma.IntFilter<"Block"> | number endMinutes?: Prisma.IntFilter<"Block"> | number + dynamicAudio?: Prisma.BoolFilter<"Block"> | boolean createdAt?: Prisma.DateTimeFilter<"Block"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Block"> | Date | string schedule?: Prisma.XOR @@ -262,6 +272,7 @@ export type BlockOrderByWithAggregationInput = { scheduleId?: Prisma.SortOrder startMinutes?: Prisma.SortOrder endMinutes?: Prisma.SortOrder + dynamicAudio?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder _count?: Prisma.BlockCountOrderByAggregateInput @@ -279,6 +290,7 @@ export type BlockScalarWhereWithAggregatesInput = { scheduleId?: Prisma.StringWithAggregatesFilter<"Block"> | string startMinutes?: Prisma.IntWithAggregatesFilter<"Block"> | number endMinutes?: Prisma.IntWithAggregatesFilter<"Block"> | number + dynamicAudio?: Prisma.BoolWithAggregatesFilter<"Block"> | boolean createdAt?: Prisma.DateTimeWithAggregatesFilter<"Block"> | Date | string updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Block"> | Date | string } @@ -287,6 +299,7 @@ export type BlockCreateInput = { id?: string startMinutes: number endMinutes: number + dynamicAudio?: boolean createdAt?: Date | string updatedAt?: Date | string schedule: Prisma.ScheduleCreateNestedOneWithoutBlocksInput @@ -298,6 +311,7 @@ export type BlockUncheckedCreateInput = { scheduleId: string startMinutes: number endMinutes: number + dynamicAudio?: boolean createdAt?: Date | string updatedAt?: Date | string proclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutBlockInput @@ -307,6 +321,7 @@ export type BlockUpdateInput = { id?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string schedule?: Prisma.ScheduleUpdateOneRequiredWithoutBlocksNestedInput @@ -318,6 +333,7 @@ export type BlockUncheckedUpdateInput = { scheduleId?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string proclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutBlockNestedInput @@ -328,6 +344,7 @@ export type BlockCreateManyInput = { scheduleId: string startMinutes: number endMinutes: number + dynamicAudio?: boolean createdAt?: Date | string updatedAt?: Date | string } @@ -336,6 +353,7 @@ export type BlockUpdateManyMutationInput = { id?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -345,6 +363,7 @@ export type BlockUncheckedUpdateManyInput = { scheduleId?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -364,6 +383,7 @@ export type BlockCountOrderByAggregateInput = { scheduleId?: Prisma.SortOrder startMinutes?: Prisma.SortOrder endMinutes?: Prisma.SortOrder + dynamicAudio?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -378,6 +398,7 @@ export type BlockMaxOrderByAggregateInput = { scheduleId?: Prisma.SortOrder startMinutes?: Prisma.SortOrder endMinutes?: Prisma.SortOrder + dynamicAudio?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -387,6 +408,7 @@ export type BlockMinOrderByAggregateInput = { scheduleId?: Prisma.SortOrder startMinutes?: Prisma.SortOrder endMinutes?: Prisma.SortOrder + dynamicAudio?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder } @@ -461,6 +483,7 @@ export type BlockCreateWithoutScheduleInput = { id?: string startMinutes: number endMinutes: number + dynamicAudio?: boolean createdAt?: Date | string updatedAt?: Date | string proclamations?: Prisma.BlockProclamationsCreateNestedManyWithoutBlockInput @@ -470,6 +493,7 @@ export type BlockUncheckedCreateWithoutScheduleInput = { id?: string startMinutes: number endMinutes: number + dynamicAudio?: boolean createdAt?: Date | string updatedAt?: Date | string proclamations?: Prisma.BlockProclamationsUncheckedCreateNestedManyWithoutBlockInput @@ -509,6 +533,7 @@ export type BlockScalarWhereInput = { scheduleId?: Prisma.StringFilter<"Block"> | string startMinutes?: Prisma.IntFilter<"Block"> | number endMinutes?: Prisma.IntFilter<"Block"> | number + dynamicAudio?: Prisma.BoolFilter<"Block"> | boolean createdAt?: Prisma.DateTimeFilter<"Block"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Block"> | Date | string } @@ -517,6 +542,7 @@ export type BlockCreateWithoutProclamationsInput = { id?: string startMinutes: number endMinutes: number + dynamicAudio?: boolean createdAt?: Date | string updatedAt?: Date | string schedule: Prisma.ScheduleCreateNestedOneWithoutBlocksInput @@ -527,6 +553,7 @@ export type BlockUncheckedCreateWithoutProclamationsInput = { scheduleId: string startMinutes: number endMinutes: number + dynamicAudio?: boolean createdAt?: Date | string updatedAt?: Date | string } @@ -551,6 +578,7 @@ export type BlockUpdateWithoutProclamationsInput = { id?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string schedule?: Prisma.ScheduleUpdateOneRequiredWithoutBlocksNestedInput @@ -561,6 +589,7 @@ export type BlockUncheckedUpdateWithoutProclamationsInput = { scheduleId?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -569,6 +598,7 @@ export type BlockCreateManyScheduleInput = { id?: string startMinutes: number endMinutes: number + dynamicAudio?: boolean createdAt?: Date | string updatedAt?: Date | string } @@ -577,6 +607,7 @@ export type BlockUpdateWithoutScheduleInput = { id?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string proclamations?: Prisma.BlockProclamationsUpdateManyWithoutBlockNestedInput @@ -586,6 +617,7 @@ export type BlockUncheckedUpdateWithoutScheduleInput = { id?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string proclamations?: Prisma.BlockProclamationsUncheckedUpdateManyWithoutBlockNestedInput @@ -595,6 +627,7 @@ export type BlockUncheckedUpdateManyWithoutScheduleInput = { id?: Prisma.StringFieldUpdateOperationsInput | string startMinutes?: Prisma.IntFieldUpdateOperationsInput | number endMinutes?: Prisma.IntFieldUpdateOperationsInput | number + dynamicAudio?: Prisma.BoolFieldUpdateOperationsInput | boolean createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } @@ -635,6 +668,7 @@ export type BlockSelect @@ -647,6 +681,7 @@ export type BlockSelectCreateManyAndReturn @@ -657,6 +692,7 @@ export type BlockSelectUpdateManyAndReturn @@ -667,11 +703,12 @@ export type BlockSelectScalar = { scheduleId?: boolean startMinutes?: boolean endMinutes?: boolean + dynamicAudio?: boolean createdAt?: boolean updatedAt?: boolean } -export type BlockOmit = runtime.Types.Extensions.GetOmit<"id" | "scheduleId" | "startMinutes" | "endMinutes" | "createdAt" | "updatedAt", ExtArgs["result"]["block"]> +export type BlockOmit = runtime.Types.Extensions.GetOmit<"id" | "scheduleId" | "startMinutes" | "endMinutes" | "dynamicAudio" | "createdAt" | "updatedAt", ExtArgs["result"]["block"]> export type BlockInclude = { schedule?: boolean | Prisma.ScheduleDefaultArgs proclamations?: boolean | Prisma.Block$proclamationsArgs @@ -695,6 +732,7 @@ export type $BlockPayload @@ -1126,6 +1164,7 @@ export interface BlockFieldRefs { readonly scheduleId: Prisma.FieldRef<"Block", 'String'> readonly startMinutes: Prisma.FieldRef<"Block", 'Int'> readonly endMinutes: Prisma.FieldRef<"Block", 'Int'> + readonly dynamicAudio: Prisma.FieldRef<"Block", 'Boolean'> readonly createdAt: Prisma.FieldRef<"Block", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"Block", 'DateTime'> } From 96a1342c1043bae71d18f2254b5d363056c36734 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:41:53 -0500 Subject: [PATCH 12/14] Add Enable Dynamic Audio option to schedule blocks --- src/lib/components/schedule/BlockModal.svelte | 38 +++++++++++++++++++ .../schedule/BlockModal.svelte.spec.ts | 31 +++++++++++++++ .../components/schedule/DaySchedule.svelte | 1 + src/lib/schedule-utils.ts | 2 + src/lib/server/schedule.spec.ts | 15 ++++++++ src/lib/server/schedule.ts | 2 + .../(user)/schedule/+page.server.ts | 4 +- .../(protected)/(user)/schedule/+page.svelte | 5 +++ .../(user)/schedule/page.server.spec.ts | 32 ++++++++++++++-- 9 files changed, 126 insertions(+), 4 deletions(-) diff --git a/src/lib/components/schedule/BlockModal.svelte b/src/lib/components/schedule/BlockModal.svelte index ea2c5e7..9e1e263 100644 --- a/src/lib/components/schedule/BlockModal.svelte +++ b/src/lib/components/schedule/BlockModal.svelte @@ -26,6 +26,7 @@ initialStartMinutes = 9 * 60, initialEndMinutes = 10 * 60, initialProclamationIds = [], + initialDynamicAudio = false, categories = [], groups = [], proclamations = [], @@ -42,6 +43,7 @@ initialStartMinutes?: number; initialEndMinutes?: number; initialProclamationIds?: string[]; + initialDynamicAudio?: boolean; categories?: BrowserCategory[]; groups?: BrowserGroup[]; proclamations?: BrowserProclamation[]; @@ -61,6 +63,7 @@ let endMinute = $state('0'); let endPeriod = $state<'AM' | 'PM'>('AM'); let selectedIds = $state([]); + let dynamicAudio = $state(false); let error = $state(''); const hourOptions = Array.from({ length: 12 }, (_, i) => String(i + 1)); @@ -98,6 +101,7 @@ endMinute = String(end.minute); endPeriod = end.period; selectedIds = [...initialProclamationIds]; + dynamicAudio = initialDynamicAudio; error = ''; step = 'details'; }); @@ -209,6 +213,7 @@ +
{#if error} @@ -313,6 +318,39 @@
+ +
+ + + + + Dynamic audio will be enabled for this block, while this block is playing. + This will override any audio selections you have made on your device while + this block is active. + + +
{ await expect.element(page.getByRole('button', { name: 'Create Block' })).toBeInTheDocument(); await expect.element(page.getByRole('button', { name: 'Accept' })).not.toBeInTheDocument(); }); + + it('offers an Enable Dynamic Audio checkbox with a help tooltip', async () => { + mount(); + + const checkbox = page.getByRole('checkbox', { name: /Enable Dynamic Audio/ }); + await expect.element(checkbox).toBeInTheDocument(); + expect((checkbox.element() as HTMLInputElement).checked).toBe(false); + + await expect + .element(page.getByText(/Dynamic audio will be enabled for this block/)) + .toBeInTheDocument(); + }); + + it('pre-checks dynamic audio when editing a block that has it enabled', async () => { + mount({ initialDynamicAudio: true }); + + const checkbox = page.getByRole('checkbox', { name: /Enable Dynamic Audio/ }); + await expect.element(checkbox).toBeInTheDocument(); + expect((checkbox.element() as HTMLInputElement).checked).toBe(true); + }); + + it('toggles the dynamic audio flag in the submitted payload', async () => { + mount(); + + const checkbox = page.getByRole('checkbox', { name: /Enable Dynamic Audio/ }); + await expect.element(checkbox).toBeInTheDocument(); + (checkbox.element() as HTMLInputElement).click(); + + const hidden = document.querySelector('input[name="dynamicAudio"]') as HTMLInputElement; + await expect.poll(() => hidden.value).toBe('true'); + }); }); diff --git a/src/lib/components/schedule/DaySchedule.svelte b/src/lib/components/schedule/DaySchedule.svelte index 1d1b080..67aea11 100644 --- a/src/lib/components/schedule/DaySchedule.svelte +++ b/src/lib/components/schedule/DaySchedule.svelte @@ -12,6 +12,7 @@ id: string; startMinutes: number; endMinutes: number; + dynamicAudio: boolean; proclamations: { id: string; name: string }[]; }; diff --git a/src/lib/schedule-utils.ts b/src/lib/schedule-utils.ts index be6f9b8..2f16e65 100644 --- a/src/lib/schedule-utils.ts +++ b/src/lib/schedule-utils.ts @@ -17,6 +17,8 @@ export type BlockInput = { startMinutes: number; endMinutes: number; proclamationIds: string[]; + /** When true the kiosk enables dynamic audio for the block's duration. */ + dynamicAudio?: boolean; }; export type ValidationResult = { ok: true } | { ok: false; error: string }; diff --git a/src/lib/server/schedule.spec.ts b/src/lib/server/schedule.spec.ts index 5a5e641..150af0e 100644 --- a/src/lib/server/schedule.spec.ts +++ b/src/lib/server/schedule.spec.ts @@ -90,6 +90,7 @@ describe('createBlock', () => { scheduleId: 's1', startMinutes: validInput.startMinutes, endMinutes: validInput.endMinutes, + dynamicAudio: false, proclamations: { create: [ { proclamationId: 'p1', sortOrder: 0 }, @@ -100,6 +101,19 @@ describe('createBlock', () => { }); }); + it('persists the dynamic audio flag', async () => { + blockFindMany.mockResolvedValue([]); + blockCreate.mockResolvedValue({ id: 'new-block' }); + + await createBlock('u1', { ...validInput, dynamicAudio: true }); + + expect(blockCreate).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ dynamicAudio: true }) + }) + ); + }); + it('rejects a fifth block without creating', async () => { blockFindMany.mockResolvedValue([ { id: 'a', startMinutes: 0, endMinutes: 60 }, @@ -154,6 +168,7 @@ describe('updateBlock', () => { data: { startMinutes: validInput.startMinutes, endMinutes: validInput.endMinutes, + dynamicAudio: false, proclamations: { deleteMany: {}, create: [{ proclamationId: 'p1', sortOrder: 0 }] diff --git a/src/lib/server/schedule.ts b/src/lib/server/schedule.ts index 3df0e14..48149b7 100644 --- a/src/lib/server/schedule.ts +++ b/src/lib/server/schedule.ts @@ -67,6 +67,7 @@ export async function createBlock(userId: string, input: BlockInput): Promise ({ proclamationId, @@ -104,6 +105,7 @@ export async function updateBlock( data: { startMinutes: input.startMinutes, endMinutes: input.endMinutes, + dynamicAudio: input.dynamicAudio === true, proclamations: { deleteMany: {}, create: proclamationIds.map((proclamationId, index) => ({ diff --git a/src/routes/(protected)/(user)/schedule/+page.server.ts b/src/routes/(protected)/(user)/schedule/+page.server.ts index adad669..10359d1 100644 --- a/src/routes/(protected)/(user)/schedule/+page.server.ts +++ b/src/routes/(protected)/(user)/schedule/+page.server.ts @@ -18,7 +18,8 @@ function parseInput(formData: FormData) { proclamationIds = []; } } - return { startMinutes, endMinutes, proclamationIds }; + const dynamicAudio = formData.get('dynamicAudio') === 'true'; + return { startMinutes, endMinutes, proclamationIds, dynamicAudio }; } export const load: PageServerLoad = async ({ locals }) => { @@ -48,6 +49,7 @@ export const load: PageServerLoad = async ({ locals }) => { id: block.id, startMinutes: block.startMinutes, endMinutes: block.endMinutes, + dynamicAudio: block.dynamicAudio, proclamations: block.proclamations.map((entry) => ({ id: entry.proclamation.id, name: entry.proclamation.name, diff --git a/src/routes/(protected)/(user)/schedule/+page.svelte b/src/routes/(protected)/(user)/schedule/+page.svelte index c6ef768..1f37e36 100644 --- a/src/routes/(protected)/(user)/schedule/+page.svelte +++ b/src/routes/(protected)/(user)/schedule/+page.svelte @@ -11,6 +11,7 @@ let initialStart = $state(9 * 60); let initialEnd = $state(10 * 60); let initialIds = $state([]); + let initialDynamicAudio = $state(false); let successMessage = $state(''); let closeTimer: ReturnType | undefined; @@ -20,6 +21,7 @@ initialStart = startMinutes; initialEnd = endMinutes; initialIds = []; + initialDynamicAudio = false; modalOpen = true; } @@ -27,6 +29,7 @@ id: string; startMinutes: number; endMinutes: number; + dynamicAudio: boolean; proclamations: { id: string }[]; }) { modalMode = 'edit'; @@ -34,6 +37,7 @@ initialStart = block.startMinutes; initialEnd = block.endMinutes; initialIds = block.proclamations.map((proclamation) => proclamation.id); + initialDynamicAudio = block.dynamicAudio; modalOpen = true; } @@ -85,6 +89,7 @@ initialStartMinutes={initialStart} initialEndMinutes={initialEnd} initialProclamationIds={initialIds} + {initialDynamicAudio} categories={data.categories} groups={data.groups} proclamations={data.proclamations} diff --git a/src/routes/(protected)/(user)/schedule/page.server.spec.ts b/src/routes/(protected)/(user)/schedule/page.server.spec.ts index 5adb727..4d6eab0 100644 --- a/src/routes/(protected)/(user)/schedule/page.server.spec.ts +++ b/src/routes/(protected)/(user)/schedule/page.server.spec.ts @@ -63,6 +63,7 @@ describe('schedule load', () => { id: 'b1', startMinutes: 360, endMinutes: 480, + dynamicAudio: true, proclamations: [ { proclamation: { @@ -78,9 +79,14 @@ describe('schedule load', () => { ]); const result = (await load({ locals } as never)) as { - blocks: { id: string; proclamations: Record[] }[]; + blocks: { + id: string; + dynamicAudio: boolean; + proclamations: Record[]; + }[]; }; + expect(result.blocks[0].dynamicAudio).toBe(true); expect(result.blocks[0].proclamations[0]).toEqual({ id: 'p1', name: 'Peace', @@ -127,7 +133,8 @@ describe('schedule actions', () => { request: createFormRequest({ startMinutes: '360', endMinutes: '480', - proclamationIds: JSON.stringify(['p1', 'p2']) + proclamationIds: JSON.stringify(['p1', 'p2']), + dynamicAudio: 'true' }), locals } as never); @@ -136,10 +143,29 @@ describe('schedule actions', () => { expect(createBlockMock).toHaveBeenCalledWith('user-1', { startMinutes: 360, endMinutes: 480, - proclamationIds: ['p1', 'p2'] + proclamationIds: ['p1', 'p2'], + dynamicAudio: true }); }); + it('createBlock defaults dynamic audio to false when the field is absent', async () => { + createBlockMock.mockResolvedValue({ ok: true, id: 'b1' }); + + await actions.createBlock!({ + request: createFormRequest({ + startMinutes: '360', + endMinutes: '480', + proclamationIds: JSON.stringify(['p1']) + }), + locals + } as never); + + expect(createBlockMock).toHaveBeenCalledWith( + 'user-1', + expect.objectContaining({ dynamicAudio: false }) + ); + }); + it('deleteBlock returns not found without an id', async () => { const result = await actions.deleteBlock!({ request: createFormRequest({}), From ec826093eb02c82c24d41921584e3973a355d379 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:41:57 -0500 Subject: [PATCH 13/14] Expose dynamic audio on the v2 schedule API --- docs/openapi.yaml | 6 ++++++ src/lib/server/v2-serializers.ts | 9 ++++++++- src/routes/api/v2/schedule/schedule.spec.ts | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/openapi.yaml b/docs/openapi.yaml index bfed06a..c71c4be 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -509,6 +509,7 @@ components: endMinutes, overnight, durationMinutes, + dynamicAudio, proclamationIds ] properties: @@ -540,6 +541,11 @@ components: type: integer minimum: 1 description: Block length in minutes. An overnight block counts the wrap past midnight as the next day. + dynamicAudio: + type: boolean + description: | + When true, dynamic audio is enabled for the block's duration, overriding any + audio selections made on the device while the block is active. proclamationIds: type: array description: IDs of the selected Proclamations, in play order. diff --git a/src/lib/server/v2-serializers.ts b/src/lib/server/v2-serializers.ts index 7aa6a74..5700851 100644 --- a/src/lib/server/v2-serializers.ts +++ b/src/lib/server/v2-serializers.ts @@ -149,6 +149,7 @@ export type V2ScheduleBlock = { endMinutes: number; overnight: boolean; durationMinutes: number; + dynamicAudio: boolean; proclamationIds: string[]; }; @@ -162,7 +163,12 @@ export type V2Schedule = { * marks a range that crosses midnight (end clock time before start), and * `durationMinutes` counts the wrap as the next day. */ export function serializeScheduleBlock( - block: { id: string; startMinutes: number; endMinutes: number }, + block: { + id: string; + startMinutes: number; + endMinutes: number; + dynamicAudio?: boolean; + }, proclamationIds: string[] ): V2ScheduleBlock { return { @@ -173,6 +179,7 @@ export function serializeScheduleBlock( endMinutes: block.endMinutes, overnight: isOvernight(block), durationMinutes: blockDuration(block), + dynamicAudio: block.dynamicAudio === true, proclamationIds }; } diff --git a/src/routes/api/v2/schedule/schedule.spec.ts b/src/routes/api/v2/schedule/schedule.spec.ts index de18046..cf26dee 100644 --- a/src/routes/api/v2/schedule/schedule.spec.ts +++ b/src/routes/api/v2/schedule/schedule.spec.ts @@ -99,6 +99,7 @@ describe('GET /api/v2/schedule success', () => { id: 'block-1', startMinutes: 21 * 60, endMinutes: 9 * 60, + dynamicAudio: true, proclamations: [{ proclamation: { id: 'p1' } }, { proclamation: { id: 'p2' } }] } ]); @@ -117,6 +118,7 @@ describe('GET /api/v2/schedule success', () => { endMinutes: 540, overnight: true, durationMinutes: 720, + dynamicAudio: true, proclamationIds: ['p1', 'p2'] } ] @@ -148,6 +150,7 @@ describe('GET /api/v2/schedule success', () => { endMinutes: 60, overnight: false, durationMinutes: 60, + dynamicAudio: false, proclamationIds: ['p1'] }); }); From c19c13b1926b12c7958f53811f1903d740394904 Mon Sep 17 00:00:00 2001 From: NeilClack Date: Fri, 11 Sep 2026 18:45:59 -0500 Subject: [PATCH 14/14] Document dynamic audio and add a schedule response example --- docs/ai/api.md | 10 ++++++---- docs/openapi.yaml | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/docs/ai/api.md b/docs/ai/api.md index 28af62b..8349e4b 100644 --- a/docs/ai/api.md +++ b/docs/ai/api.md @@ -107,10 +107,12 @@ Authenticates with the paired `email` + `licenseKey` query parameters and validates only that the key belongs to the account (not that the license is active/entitled). Returns the user's Blocks with start/end times and the IDs of the selected Proclamations (content is fetched separately via -`/api/v2/proclamations`). Overnight blocks (end clock time before start) are -supported and flagged with `overnight: true` plus a wrapping `durationMinutes`. -Rate limited to 10 requests per minute per IP. Failure messages follow the -existing v2 shape: +`/api/v2/proclamations`). Each block also carries `dynamicAudio`; when true, the +kiosk enables dynamic audio for the block's duration, overriding any audio +selections made on the device while the block is active. Overnight blocks (end +clock time before start) are supported and flagged with `overnight: true` plus a +wrapping `durationMinutes`. Rate limited to 10 requests per minute per IP. +Failure messages follow the existing v2 shape: `not-authorized` or `this key doesn't appear to belong to you`. --- diff --git a/docs/openapi.yaml b/docs/openapi.yaml index c71c4be..3afea31 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -247,8 +247,11 @@ paths: Returns every Block with its start/end times and the ordered list of selected Proclamation IDs. Overnight blocks (an end clock time before the start) are supported and flagged with `overnight: true` and a - wrapping `durationMinutes`. Proclamation content is not included; the - kiosk fetches it separately via `/api/v2/proclamations`. + wrapping `durationMinutes`. Each block also carries `dynamicAudio`; + when true, the kiosk enables dynamic audio for the block's duration, + overriding any audio selections made on the device. Proclamation + content is not included; the kiosk fetches it separately via + `/api/v2/proclamations`. operationId: getSchedule parameters: - in: query @@ -272,6 +275,20 @@ paths: application/json: schema: $ref: '#/components/schemas/ScheduleResponse' + example: + email: jane@example.com + blocks: + - id: 3f1c2b7a-9d4e-4c8a-b2f6-1a2b3c4d5e6f + startTime: '21:00' + startMinutes: 1260 + endTime: '09:00' + endMinutes: 540 + overnight: true + durationMinutes: 720 + dynamicAudio: true + proclamationIds: + - b40fdcb9-703c-420e-af32-a081964c6f08 + - 7c9e1a2b-3d4e-5f60-8a9b-0c1d2e3f4a5b '400': description: | Missing/invalid parameters, unknown key or user, or the key does not