A personal media tracker built on the AT Protocol opnshelf.xyz
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: refactor lists to explicit media types and add notes support

Lists:
- Replace scoped mediaId strings (showId:season:1:episode:2) with explicit
mediaType enum (movie/show/season/episode) + seasonNumber/episodeNumber fields
- Update lexicon, Prisma schema, DTOs, service, controller, and mappers
- Add migration with data conversion for existing scoped IDs
- Remove list-media-id.util.ts
- Update frontend hooks (useListActions, useListItemStatus) and ProfileListsPage

Notes:
- Add xyz.opnshelf.note lexicon with AT Protocol PDS sync
- Create Note model, service, controller, and module
- Integrate notes into firehose ingester
- Add NotesSection UI component on movie, show, season, and episode pages
- Add useNotes hook with query invalidation
- Add repo:xyz.opnshelf.note to OAuth scope

Regenerate API client and update tests.

+3976 -339
+227
apps/web/src/components/NotesSection.tsx
··· 1 + import { Loader2, Pencil, Save, StickyNote, Trash2, X } from "lucide-react"; 2 + import { useEffect, useState } from "react"; 3 + import { useAuth } from "#/lib/auth-context"; 4 + import { useDeleteNote, useNote, useUpsertNote } from "#/lib/hooks/useNotes"; 5 + 6 + interface NotesSectionProps { 7 + mediaType: "movie" | "show"; 8 + mediaId: string; 9 + seasonNumber?: number; 10 + episodeNumber?: number; 11 + } 12 + 13 + export default function NotesSection({ 14 + mediaType, 15 + mediaId, 16 + seasonNumber, 17 + episodeNumber, 18 + }: NotesSectionProps) { 19 + const { user, isAuthenticated } = useAuth(); 20 + const userDid = user?.did || ""; 21 + 22 + const { data: note, isLoading } = useNote({ 23 + userDid, 24 + mediaType, 25 + mediaId, 26 + seasonNumber, 27 + episodeNumber, 28 + }); 29 + 30 + const upsertMutation = useUpsertNote({ 31 + userDid, 32 + mediaType, 33 + mediaId, 34 + seasonNumber, 35 + episodeNumber, 36 + }); 37 + 38 + const deleteMutation = useDeleteNote({ 39 + userDid, 40 + mediaType, 41 + mediaId, 42 + seasonNumber, 43 + episodeNumber, 44 + }); 45 + 46 + const [isEditing, setIsEditing] = useState(false); 47 + const [content, setContent] = useState(""); 48 + 49 + // Sync content state with note data when it loads or when entering edit mode 50 + useEffect(() => { 51 + if (isEditing) { 52 + setContent(note?.content || ""); 53 + } 54 + }, [isEditing, note?.content]); 55 + 56 + if (!isAuthenticated) { 57 + return null; 58 + } 59 + 60 + const handleSave = () => { 61 + if (!content.trim()) { 62 + if (note?.id) { 63 + deleteMutation.mutate( 64 + { path: { noteId: note.id } }, 65 + { 66 + onSuccess: () => setIsEditing(false), 67 + }, 68 + ); 69 + } 70 + return; 71 + } 72 + 73 + upsertMutation.mutate( 74 + { 75 + body: { 76 + mediaType: 77 + episodeNumber != null 78 + ? "episode" 79 + : seasonNumber != null 80 + ? "season" 81 + : mediaType, 82 + mediaId, 83 + seasonNumber, 84 + episodeNumber, 85 + content: content.trim(), 86 + }, 87 + }, 88 + { 89 + onSuccess: () => setIsEditing(false), 90 + }, 91 + ); 92 + }; 93 + 94 + const handleDelete = () => { 95 + if (!note?.id) return; 96 + deleteMutation.mutate( 97 + { path: { noteId: note.id } }, 98 + { 99 + onSuccess: () => setIsEditing(false), 100 + }, 101 + ); 102 + }; 103 + 104 + const handleCancel = () => { 105 + setContent(note?.content || ""); 106 + setIsEditing(false); 107 + }; 108 + 109 + if (isLoading) { 110 + return ( 111 + <section className="card p-5"> 112 + <div className="flex items-center gap-2 text-(--foreground-muted)"> 113 + <Loader2 className="size-4 animate-spin" /> 114 + <span className="text-sm">Loading notes...</span> 115 + </div> 116 + </section> 117 + ); 118 + } 119 + 120 + // View mode with existing note 121 + if (note?.content && !isEditing) { 122 + return ( 123 + <section className="card p-5"> 124 + <div className="mb-3 flex items-center justify-between"> 125 + <h3 className="flex items-center gap-2 font-display font-semibold"> 126 + <StickyNote className="size-4 text-(--accent)" /> 127 + Your Note 128 + </h3> 129 + <div className="flex gap-1"> 130 + <button 131 + type="button" 132 + onClick={() => setIsEditing(true)} 133 + className="flex h-8 w-8 items-center justify-center rounded-md text-(--foreground-muted) transition-colors hover:bg-(--background-subtle) hover:text-(--accent)" 134 + aria-label="Edit note" 135 + > 136 + <Pencil className="size-4" /> 137 + </button> 138 + <button 139 + type="button" 140 + onClick={handleDelete} 141 + disabled={deleteMutation.isPending} 142 + className="flex h-8 w-8 items-center justify-center rounded-md text-(--foreground-muted) transition-colors hover:bg-red-500/10 hover:text-red-500 disabled:opacity-50" 143 + aria-label="Delete note" 144 + > 145 + {deleteMutation.isPending ? ( 146 + <Loader2 className="size-4 animate-spin" /> 147 + ) : ( 148 + <Trash2 className="size-4" /> 149 + )} 150 + </button> 151 + </div> 152 + </div> 153 + <p className="whitespace-pre-wrap text-(--foreground-muted) text-sm leading-relaxed"> 154 + {note.content} 155 + </p> 156 + </section> 157 + ); 158 + } 159 + 160 + // Edit mode (new or existing) 161 + if (isEditing) { 162 + return ( 163 + <section className="card p-5"> 164 + <h3 className="mb-3 flex items-center gap-2 font-display font-semibold"> 165 + <StickyNote className="size-4 text-(--accent)" /> 166 + {note?.content ? "Edit Note" : "Add a Note"} 167 + </h3> 168 + <textarea 169 + value={content} 170 + onChange={(e) => setContent(e.target.value)} 171 + placeholder="Write your thoughts about this..." 172 + className="input min-h-[120px] resize-none text-sm" 173 + maxLength={5000} 174 + /> 175 + <div className="mt-3 flex items-center justify-between"> 176 + <span className="text-(--foreground-subtle) text-xs"> 177 + {content.length}/5000 178 + </span> 179 + <div className="flex gap-2"> 180 + <button 181 + type="button" 182 + onClick={handleCancel} 183 + className="btn btn-secondary btn-sm gap-1" 184 + > 185 + <X className="size-3.5" /> 186 + Cancel 187 + </button> 188 + <button 189 + type="button" 190 + onClick={handleSave} 191 + disabled={upsertMutation.isPending} 192 + className="btn btn-primary btn-sm gap-1" 193 + > 194 + {upsertMutation.isPending ? ( 195 + <Loader2 className="size-3.5 animate-spin" /> 196 + ) : ( 197 + <Save className="size-3.5" /> 198 + )} 199 + Save 200 + </button> 201 + </div> 202 + </div> 203 + </section> 204 + ); 205 + } 206 + 207 + // Empty state 208 + return ( 209 + <section className="card p-5"> 210 + <h3 className="mb-3 flex items-center gap-2 font-display font-semibold"> 211 + <StickyNote className="size-4 text-(--accent)" /> 212 + Your Note 213 + </h3> 214 + <p className="mb-3 text-(--foreground-muted) text-sm"> 215 + No notes yet. Add your thoughts about this title. 216 + </p> 217 + <button 218 + type="button" 219 + onClick={() => setIsEditing(true)} 220 + className="btn btn-secondary btn-sm gap-1" 221 + > 222 + <StickyNote className="size-3.5" /> 223 + Add note 224 + </button> 225 + </section> 226 + ); 227 + }
+9 -1
apps/web/src/components/profile/ProfileListsPage.tsx
··· 549 549 } 550 550 posterUrl={getPosterUrl(item.media)} 551 551 backdropUrl={getBackdropUrl(item.media)} 552 - type={item.mediaType as "movie" | "show"} 552 + type={item.mediaType === "movie" ? "movie" : "show"} 553 553 rating={getRating(item.media)} 554 554 duration={formatDuration( 555 555 item.media.runtime as number | undefined, ··· 562 562 slug: selectedListSlug || "", 563 563 mediaType: item.mediaType, 564 564 mediaId: item.mediaId, 565 + }, 566 + query: { 567 + seasonNumber: item.seasonNumber, 568 + episodeNumber: item.episodeNumber, 565 569 }, 566 570 }) 567 571 : undefined ··· 645 649 slug: selectedListSlug || "", 646 650 mediaType: item.mediaType, 647 651 mediaId: item.mediaId, 652 + }, 653 + query: { 654 + seasonNumber: item.seasonNumber, 655 + episodeNumber: item.episodeNumber, 648 656 }, 649 657 }) 650 658 }
+1
apps/web/src/lib/hooks/index.ts
··· 4 4 export * from "./useLists"; 5 5 export * from "./useMedia"; 6 6 export * from "./useMediaWatchStatus"; 7 + export * from "./useNotes"; 7 8 export * from "./usePerson"; 8 9 export * from "./useWatchActions";
+33 -26
apps/web/src/lib/hooks/useListActions.ts
··· 15 15 episodeNumber?: number; 16 16 } 17 17 18 - function buildScopedShowMediaId( 19 - mediaId: string, 20 - seasonNumber?: number, 21 - episodeNumber?: number, 22 - ): string { 23 - if (typeof seasonNumber === "number" && Number.isFinite(seasonNumber)) { 24 - if (typeof episodeNumber === "number" && Number.isFinite(episodeNumber)) { 25 - return `${mediaId}:season:${seasonNumber}:episode:${episodeNumber}`; 26 - } 27 - return `${mediaId}:season:${seasonNumber}`; 28 - } 29 - return mediaId; 30 - } 31 - 32 18 export function useListActions({ 33 19 mediaType, 34 20 mediaId, 35 21 seasonNumber, 36 22 episodeNumber, 37 23 }: UseListActionsOptions) { 38 - const scopedMediaId = buildScopedShowMediaId( 39 - mediaId, 40 - seasonNumber, 41 - episodeNumber, 42 - ); 24 + const resolvedMediaType = 25 + episodeNumber != null 26 + ? "episode" 27 + : seasonNumber != null 28 + ? "season" 29 + : mediaType; 30 + 43 31 const { isAuthenticated } = useAuth(); 44 32 const queryClient = useQueryClient(); 45 33 const [activeListAction, setActiveListAction] = useState<string | null>(null); 46 34 47 35 const listsForItemKey = listsControllerGetListsForItemQueryKey({ 48 - path: { mediaType, mediaId: scopedMediaId }, 36 + path: { mediaType: resolvedMediaType, mediaId }, 37 + query: { seasonNumber, episodeNumber }, 49 38 }); 50 39 const userListsKey = listsControllerGetUserListsQueryKey(); 51 40 ··· 122 111 if (isInWatchlist) { 123 112 removeFromListMutation.mutate( 124 113 { 125 - path: { slug: "watchlist", mediaType, mediaId: scopedMediaId }, 114 + path: { slug: "watchlist", mediaType: resolvedMediaType, mediaId }, 115 + query: { seasonNumber, episodeNumber }, 126 116 }, 127 117 { onSettled: onDone }, 128 118 ); ··· 130 120 addToListMutation.mutate( 131 121 { 132 122 path: { slug: "watchlist" }, 133 - body: { mediaType, mediaId: scopedMediaId }, 123 + body: { 124 + mediaType: resolvedMediaType, 125 + mediaId, 126 + seasonNumber, 127 + episodeNumber, 128 + }, 134 129 }, 135 130 { onSettled: onDone }, 136 131 ); ··· 144 139 if (isInFavorites) { 145 140 removeFromListMutation.mutate( 146 141 { 147 - path: { slug: "favorites", mediaType, mediaId: scopedMediaId }, 142 + path: { slug: "favorites", mediaType: resolvedMediaType, mediaId }, 143 + query: { seasonNumber, episodeNumber }, 148 144 }, 149 145 { onSettled: onDone }, 150 146 ); ··· 152 148 addToListMutation.mutate( 153 149 { 154 150 path: { slug: "favorites" }, 155 - body: { mediaType, mediaId: scopedMediaId }, 151 + body: { 152 + mediaType: resolvedMediaType, 153 + mediaId, 154 + seasonNumber, 155 + episodeNumber, 156 + }, 156 157 }, 157 158 { onSettled: onDone }, 158 159 ); ··· 163 164 if (!isAuthenticated) return; 164 165 addToListMutation.mutate({ 165 166 path: { slug }, 166 - body: { mediaType, mediaId: scopedMediaId }, 167 + body: { 168 + mediaType: resolvedMediaType, 169 + mediaId, 170 + seasonNumber, 171 + episodeNumber, 172 + }, 167 173 }); 168 174 }; 169 175 170 176 const removeFromList = (slug: string) => { 171 177 if (!isAuthenticated) return; 172 178 removeFromListMutation.mutate({ 173 - path: { slug, mediaType, mediaId: scopedMediaId }, 179 + path: { slug, mediaType: resolvedMediaType, mediaId }, 180 + query: { seasonNumber, episodeNumber }, 174 181 }); 175 182 }; 176 183
+11 -22
apps/web/src/lib/hooks/useListItemStatus.ts
··· 16 16 enabled?: boolean; 17 17 } 18 18 19 - function buildScopedShowMediaId( 20 - mediaId: string, 21 - seasonNumber?: number, 22 - episodeNumber?: number, 23 - ): string { 24 - if (typeof seasonNumber === "number" && Number.isFinite(seasonNumber)) { 25 - if (typeof episodeNumber === "number" && Number.isFinite(episodeNumber)) { 26 - return `${mediaId}:season:${seasonNumber}:episode:${episodeNumber}`; 27 - } 28 - return `${mediaId}:season:${seasonNumber}`; 29 - } 30 - return mediaId; 31 - } 32 - 33 19 export function useListItemStatus({ 34 20 mediaType, 35 21 mediaId, ··· 37 23 episodeNumber, 38 24 enabled = true, 39 25 }: UseListItemStatusOptions) { 40 - const { isAuthenticated } = useAuth(); 26 + const resolvedMediaType = 27 + episodeNumber != null 28 + ? "episode" 29 + : seasonNumber != null 30 + ? "season" 31 + : mediaType; 41 32 42 - const scopedMediaId = buildScopedShowMediaId( 43 - mediaId, 44 - seasonNumber, 45 - episodeNumber, 46 - ); 33 + const { isAuthenticated } = useAuth(); 47 34 48 35 const { data: listsForItem } = useQuery({ 49 36 ...listsControllerGetListsForItemOptions({ 50 - path: { mediaType, mediaId: scopedMediaId }, 37 + path: { mediaType: resolvedMediaType, mediaId }, 38 + query: { seasonNumber, episodeNumber }, 51 39 }), 52 40 enabled: isAuthenticated && enabled, 53 41 }); ··· 107 95 availableLists, 108 96 customListsWithStatus, 109 97 listsForItemKey: listsControllerGetListsForItemQueryKey({ 110 - path: { mediaType, mediaId: scopedMediaId }, 98 + path: { mediaType: resolvedMediaType, mediaId }, 99 + query: { seasonNumber, episodeNumber }, 111 100 }), 112 101 userListsKey: listsControllerGetUserListsQueryKey(), 113 102 };
+134
apps/web/src/lib/hooks/useNotes.ts
··· 1 + import { 2 + notesControllerDeleteNoteMutation, 3 + notesControllerGetNoteOptions, 4 + notesControllerGetNoteQueryKey, 5 + notesControllerUpsertNoteMutation, 6 + } from "@opnshelf/api"; 7 + import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; 8 + 9 + interface UseNoteOptions { 10 + userDid: string; 11 + mediaType: "movie" | "show"; 12 + mediaId: string; 13 + seasonNumber?: number; 14 + episodeNumber?: number; 15 + } 16 + 17 + function resolveMediaType( 18 + mediaType: "movie" | "show", 19 + seasonNumber?: number, 20 + episodeNumber?: number, 21 + ) { 22 + return episodeNumber != null 23 + ? "episode" 24 + : seasonNumber != null 25 + ? "season" 26 + : mediaType; 27 + } 28 + 29 + export function useNote({ 30 + userDid, 31 + mediaType, 32 + mediaId, 33 + seasonNumber, 34 + episodeNumber, 35 + }: UseNoteOptions) { 36 + const resolvedMediaType = resolveMediaType( 37 + mediaType, 38 + seasonNumber, 39 + episodeNumber, 40 + ); 41 + 42 + return useQuery({ 43 + ...notesControllerGetNoteOptions({ 44 + path: { userDid }, 45 + query: { 46 + mediaType: resolvedMediaType, 47 + mediaId, 48 + seasonNumber, 49 + episodeNumber, 50 + }, 51 + }), 52 + enabled: !!userDid, 53 + }); 54 + } 55 + 56 + interface UseUpsertNoteOptions { 57 + userDid: string; 58 + mediaType: "movie" | "show"; 59 + mediaId: string; 60 + seasonNumber?: number; 61 + episodeNumber?: number; 62 + } 63 + 64 + export function useUpsertNote({ 65 + userDid, 66 + mediaType, 67 + mediaId, 68 + seasonNumber, 69 + episodeNumber, 70 + }: UseUpsertNoteOptions) { 71 + const queryClient = useQueryClient(); 72 + const resolvedMediaType = resolveMediaType( 73 + mediaType, 74 + seasonNumber, 75 + episodeNumber, 76 + ); 77 + 78 + const noteKey = notesControllerGetNoteQueryKey({ 79 + path: { userDid }, 80 + query: { 81 + mediaType: resolvedMediaType, 82 + mediaId, 83 + seasonNumber, 84 + episodeNumber, 85 + }, 86 + }); 87 + 88 + return useMutation({ 89 + ...notesControllerUpsertNoteMutation(), 90 + onSuccess: () => { 91 + queryClient.invalidateQueries({ queryKey: noteKey }); 92 + }, 93 + }); 94 + } 95 + 96 + interface UseDeleteNoteOptions { 97 + userDid: string; 98 + mediaType: "movie" | "show"; 99 + mediaId: string; 100 + seasonNumber?: number; 101 + episodeNumber?: number; 102 + } 103 + 104 + export function useDeleteNote({ 105 + userDid, 106 + mediaType, 107 + mediaId, 108 + seasonNumber, 109 + episodeNumber, 110 + }: UseDeleteNoteOptions) { 111 + const queryClient = useQueryClient(); 112 + const resolvedMediaType = resolveMediaType( 113 + mediaType, 114 + seasonNumber, 115 + episodeNumber, 116 + ); 117 + 118 + const noteKey = notesControllerGetNoteQueryKey({ 119 + path: { userDid }, 120 + query: { 121 + mediaType: resolvedMediaType, 122 + mediaId, 123 + seasonNumber, 124 + episodeNumber, 125 + }, 126 + }); 127 + 128 + return useMutation({ 129 + ...notesControllerDeleteNoteMutation(), 130 + onSuccess: () => { 131 + queryClient.invalidateQueries({ queryKey: noteKey }); 132 + }, 133 + }); 134 + }
+2
apps/web/src/routes/auth/complete.tsx
··· 46 46 setStatus("success"); 47 47 // Redirect to onboarding for new users, otherwise home 48 48 const redirectTo = data?.needsOnboarding ? "/onboarding" : "/dashboard"; 49 + // Clear any stale query cache from previous sessions 50 + queryClient.clear(); 49 51 setTimeout(() => { 50 52 window.location.href = redirectTo; 51 53 }, 1500);
+4
apps/web/src/routes/movies/$movieId/$movieName.tsx
··· 25 25 import LoadingState from "../../../components/LoadingState"; 26 26 import MediaActionsBar from "../../../components/MediaActionsBar"; 27 27 import MediaHero from "../../../components/MediaHero"; 28 + import NotesSection from "../../../components/NotesSection"; 28 29 import PersonGrid from "../../../components/PersonGrid"; 29 30 import SimilarMediaGrid from "../../../components/SimilarMediaGrid"; 30 31 import { YourActivity } from "../../../components/YourActivity"; ··· 298 299 /> 299 300 300 301 <InYourLists mediaType="movie" mediaId={movieId} /> 302 + 303 + {/* Notes */} 304 + <NotesSection mediaType="movie" mediaId={movieId} /> 301 305 </div> 302 306 </div> 303 307
+26 -25
apps/web/src/routes/onboarding.tsx
··· 1 1 import { 2 + authControllerMeOptions, 2 3 getTraktImportStatusMessage, 3 4 getTraktImportStatusProgress, 4 5 isActiveTraktImportStatus, 6 + isKnownTraktImportStatus, 5 7 isTerminalTraktImportStatus, 6 8 type TraktImportStatusJob, 9 + type UserDto, 7 10 usersControllerCompleteOnboarding, 8 11 usersControllerFetchMyTraktPublicHistory, 9 12 usersControllerGetMyCurrentTraktImportOptions, ··· 22 25 Users, 23 26 X, 24 27 } from "lucide-react"; 25 - import { useEffect, useRef, useState } from "react"; 28 + import { useEffect, useState } from "react"; 26 29 import { useAuth } from "#/lib/auth-context"; 27 30 28 31 export const Route = createFileRoute("/onboarding")({ ··· 57 60 const { user, isAuthenticated, isLoading: authLoading } = useAuth(); 58 61 const navigate = useNavigate(); 59 62 const [step, setStep] = useState<OnboardingStep>("welcome"); 60 - const hasSetInitialStep = useRef(false); 61 - 62 - // Check for an existing Trakt import job on mount 63 - const { data: existingImport, isLoading: checkingImport } = useQuery({ 64 - ...usersControllerGetMyCurrentTraktImportOptions(), 65 - enabled: !authLoading && isAuthenticated && !!user?.needsOnboarding, 66 - }); 67 - 68 - useEffect(() => { 69 - if (hasSetInitialStep.current || authLoading || checkingImport) return; 70 - hasSetInitialStep.current = true; 71 - 72 - if (existingImport) { 73 - setStep("trakt"); 74 - } 75 - }, [authLoading, checkingImport, existingImport]); 76 63 77 64 // Redirect unauthenticated users to login 78 65 useEffect(() => { ··· 88 75 } 89 76 }, [authLoading, isAuthenticated, user?.needsOnboarding, navigate]); 90 77 91 - if (authLoading || checkingImport) { 78 + if (authLoading) { 92 79 return ( 93 80 <div className="container-app flex min-h-[calc(100vh-4rem)] items-center justify-center"> 94 81 <Loader2 className="size-8 animate-spin text-(--accent)" /> ··· 207 194 failedCount: data.job.failedCount, 208 195 lastError: data.job.lastError, 209 196 }); 197 + // Force an immediate refetch of the import status 198 + queryClient.invalidateQueries({ 199 + queryKey: usersControllerGetMyCurrentTraktImportOptions().queryKey, 200 + }); 210 201 } 211 202 }, 212 203 }); 213 204 214 - // Poll current import status when there's an active job 205 + // Fetch existing import and poll when active 215 206 const { data: currentImport } = useQuery({ 216 207 ...usersControllerGetMyCurrentTraktImportOptions(), 217 - enabled: !!jobData && isActiveTraktImportStatus(jobData.status), 218 - refetchInterval: 3000, 208 + refetchInterval: 209 + !!jobData && isActiveTraktImportStatus(jobData.status) ? 3000 : false, 219 210 }); 220 211 221 212 useEffect(() => { 222 - if (currentImport) { 213 + if (currentImport?.id && isKnownTraktImportStatus(currentImport.status)) { 223 214 setJobData({ 224 215 status: currentImport.status, 225 216 currentPage: currentImport.currentPage, ··· 589 580 }); 590 581 return data; 591 582 }, 592 - onSuccess: () => { 593 - // Invalidate user data so needsOnboarding updates 594 - queryClient.invalidateQueries({ queryKey: ["authControllerMe"] }); 583 + onSuccess: (data) => { 584 + const meKey = authControllerMeOptions().queryKey; 585 + // Optimistically update auth cache so needsOnboarding becomes false 586 + queryClient.setQueryData(meKey, (old: UserDto | undefined) => { 587 + if (!old) return old; 588 + return { 589 + ...old, 590 + onboardingCompletedAt: data.onboardingCompletedAt, 591 + needsOnboarding: false, 592 + }; 593 + }); 594 + // Trigger a background refetch to keep cache in sync 595 + queryClient.invalidateQueries({ queryKey: meKey }); 595 596 // Give a moment then redirect 596 597 setTimeout(() => { 597 598 navigate({ to: "/dashboard" });
+4
apps/web/src/routes/shows/$showId/$showName/index.tsx
··· 25 25 import LoadingState from "../../../../components/LoadingState"; 26 26 import MediaActionsBar from "../../../../components/MediaActionsBar"; 27 27 import MediaHero from "../../../../components/MediaHero"; 28 + import NotesSection from "../../../../components/NotesSection"; 28 29 import PersonGrid from "../../../../components/PersonGrid"; 29 30 import ProgressCard from "../../../../components/ProgressCard"; 30 31 import SimilarMediaGrid from "../../../../components/SimilarMediaGrid"; ··· 478 479 /> 479 480 480 481 <InYourLists mediaType="show" mediaId={showId} /> 482 + 483 + {/* Notes */} 484 + <NotesSection mediaType="show" mediaId={showId} /> 481 485 </div> 482 486 </div> 483 487
+9
apps/web/src/routes/shows/$showId/$showName/seasons.$seasonNumber.episodes.$episodeNumber.tsx
··· 37 37 import LoadingState from "../../../../components/LoadingState"; 38 38 import MediaActionsBar from "../../../../components/MediaActionsBar"; 39 39 import MediaHero from "../../../../components/MediaHero"; 40 + import NotesSection from "../../../../components/NotesSection"; 40 41 import PersonGrid from "../../../../components/PersonGrid"; 41 42 import { YourActivity } from "../../../../components/YourActivity"; 42 43 ··· 424 425 /> 425 426 426 427 <InYourLists 428 + mediaType="show" 429 + mediaId={showId} 430 + seasonNumber={seasonNum} 431 + episodeNumber={episodeNum} 432 + /> 433 + 434 + {/* Notes */} 435 + <NotesSection 427 436 mediaType="show" 428 437 mediaId={showId} 429 438 seasonNumber={seasonNum}
+8
apps/web/src/routes/shows/$showId/$showName/seasons.$seasonNumber/index.tsx
··· 24 24 import LoadingState from "../../../../../components/LoadingState"; 25 25 import MediaActionsBar from "../../../../../components/MediaActionsBar"; 26 26 import MediaHero from "../../../../../components/MediaHero"; 27 + import NotesSection from "../../../../../components/NotesSection"; 27 28 import PersonGrid from "../../../../../components/PersonGrid"; 28 29 import ProgressCard from "../../../../../components/ProgressCard"; 29 30 import EpisodeList from "../../../../../components/shows/EpisodeList"; ··· 444 445 /> 445 446 446 447 <InYourLists 448 + mediaType="show" 449 + mediaId={showId} 450 + seasonNumber={seasonNum} 451 + /> 452 + 453 + {/* Notes */} 454 + <NotesSection 447 455 mediaType="show" 448 456 mediaId={showId} 449 457 seasonNumber={seasonNum}
+33
backend/prisma/migrations/20260504120000_refactor_list_items_explicit_types/migration.sql
··· 1 + -- Add new columns with defaults 2 + ALTER TABLE "ListItem" ADD COLUMN IF NOT EXISTS "seasonNumber" INTEGER NOT NULL DEFAULT 0; 3 + ALTER TABLE "ListItem" ADD COLUMN IF NOT EXISTS "episodeNumber" INTEGER NOT NULL DEFAULT 0; 4 + 5 + -- Recreate MediaType enum with all values (works in a single transaction) 6 + ALTER TYPE "MediaType" RENAME TO "MediaType_old"; 7 + CREATE TYPE "MediaType" AS ENUM ('movie', 'show', 'season', 'episode'); 8 + ALTER TABLE "ListItem" ALTER COLUMN "mediaType" TYPE "MediaType" USING "mediaType"::text::"MediaType"; 9 + DROP TYPE "MediaType_old"; 10 + 11 + -- Migrate show items with episode scope (e.g. "1399:season:2:episode:5") 12 + UPDATE "ListItem" 13 + SET 14 + "mediaType" = 'episode', 15 + "mediaId" = (regexp_match("mediaId", '^([^:]+):season:(\d+):episode:(\d+)$'))[1], 16 + "seasonNumber" = (regexp_match("mediaId", '^([^:]+):season:(\d+):episode:(\d+)$'))[2]::int, 17 + "episodeNumber" = (regexp_match("mediaId", '^([^:]+):season:(\d+):episode:(\d+)$'))[3]::int 18 + WHERE "mediaType" = 'show' 19 + AND "mediaId" ~ '^[^:]+:season:\d+:episode:\d+$'; 20 + 21 + -- Migrate show items with season scope (e.g. "1399:season:2") 22 + UPDATE "ListItem" 23 + SET 24 + "mediaType" = 'season', 25 + "mediaId" = (regexp_match("mediaId", '^([^:]+):season:(\d+)$'))[1], 26 + "seasonNumber" = (regexp_match("mediaId", '^([^:]+):season:(\d+)$'))[2]::int 27 + WHERE "mediaType" = 'show' 28 + AND "mediaId" ~ '^[^:]+:season:\d+$'; 29 + 30 + -- Drop old unique constraint and create new one 31 + ALTER TABLE "ListItem" DROP CONSTRAINT IF EXISTS "ListItem_listId_mediaType_mediaId_key"; 32 + ALTER TABLE "ListItem" ADD CONSTRAINT "ListItem_listId_mediaType_mediaId_seasonNumber_episodeNumber_key" 33 + UNIQUE ("listId", "mediaType", "mediaId", "seasonNumber", "episodeNumber");
+28
backend/prisma/migrations/20260504230000_add_notes_table/migration.sql
··· 1 + -- Create Note table 2 + CREATE TABLE "Note" ( 3 + "id" TEXT NOT NULL, 4 + "rkey" TEXT NOT NULL, 5 + "uri" TEXT NOT NULL, 6 + "cid" TEXT NOT NULL, 7 + "userDid" TEXT NOT NULL, 8 + "mediaType" "MediaType" NOT NULL, 9 + "mediaId" TEXT NOT NULL, 10 + "seasonNumber" INTEGER NOT NULL DEFAULT 0, 11 + "episodeNumber" INTEGER NOT NULL DEFAULT 0, 12 + "content" TEXT NOT NULL, 13 + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, 14 + "updatedAt" TIMESTAMP(3) NOT NULL, 15 + 16 + CONSTRAINT "Note_pkey" PRIMARY KEY ("id") 17 + ); 18 + 19 + -- Create unique index for one note per user per media item 20 + CREATE UNIQUE INDEX "Note_userDid_mediaType_mediaId_seasonNumber_episodeNumber_key" ON "Note"("userDid", "mediaType", "mediaId", "seasonNumber", "episodeNumber"); 21 + 22 + -- Create other indexes 23 + CREATE UNIQUE INDEX "Note_rkey_key" ON "Note"("rkey"); 24 + CREATE INDEX "Note_userDid_idx" ON "Note"("userDid"); 25 + CREATE INDEX "Note_mediaType_mediaId_idx" ON "Note"("mediaType", "mediaId"); 26 + 27 + -- Add foreign key to User 28 + ALTER TABLE "Note" ADD CONSTRAINT "Note_userDid_fkey" FOREIGN KEY ("userDid") REFERENCES "User"("did") ON DELETE CASCADE ON UPDATE CASCADE;
+51 -21
backend/prisma/schema.prisma
··· 29 29 trackedMovies TrackedMovie[] 30 30 trackedEpisodes TrackedEpisode[] 31 31 lists List[] 32 + notes Note[] 32 33 following Follow[] @relation("UserFollowing") 33 34 followers Follow[] @relation("UserFollowers") 34 35 ··· 56 57 enum MediaType { 57 58 movie 58 59 show 60 + season 61 + episode 59 62 } 60 63 61 64 ··· 262 265 } 263 266 264 267 model ListItem { 265 - id String @id @default(cuid()) 266 - rkey String @unique 267 - uri String 268 - cid String? 269 - 270 - listId String 271 - list List @relation(fields: [listId], references: [id], onDelete: Cascade) 272 - 273 - mediaType MediaType 274 - mediaId String 275 - movieId String? 276 - movie Movie? @relation(fields: [movieId], references: [movieId], onDelete: Cascade) 277 - showId String? 278 - show Show? @relation(fields: [showId], references: [showId], onDelete: Cascade) 279 - 280 - notes String? 281 - position Int @default(0) 282 - 283 - createdAt DateTime @default(now()) 284 - 285 - @@unique([listId, mediaType, mediaId]) 268 + id String @id @default(cuid()) 269 + rkey String @unique 270 + uri String 271 + cid String? 272 + 273 + listId String 274 + list List @relation(fields: [listId], references: [id], onDelete: Cascade) 275 + 276 + mediaType MediaType 277 + mediaId String 278 + seasonNumber Int @default(0) 279 + episodeNumber Int @default(0) 280 + 281 + movieId String? 282 + movie Movie? @relation(fields: [movieId], references: [movieId], onDelete: Cascade) 283 + showId String? 284 + show Show? @relation(fields: [showId], references: [showId], onDelete: Cascade) 285 + 286 + notes String? 287 + position Int @default(0) 288 + 289 + createdAt DateTime @default(now()) 290 + 291 + @@unique([listId, mediaType, mediaId, seasonNumber, episodeNumber]) 286 292 @@index([listId]) 287 293 @@index([mediaType, mediaId]) 288 294 } 295 + 296 + model Note { 297 + id String @id @default(cuid()) 298 + rkey String @unique 299 + uri String 300 + cid String 301 + 302 + userDid String 303 + user User @relation(fields: [userDid], references: [did], onDelete: Cascade) 304 + 305 + mediaType MediaType 306 + mediaId String 307 + seasonNumber Int @default(0) 308 + episodeNumber Int @default(0) 309 + 310 + content String 311 + 312 + createdAt DateTime @default(now()) 313 + updatedAt DateTime @updatedAt 314 + 315 + @@unique([userDid, mediaType, mediaId, seasonNumber, episodeNumber]) 316 + @@index([userDid]) 317 + @@index([mediaType, mediaId]) 318 + }
+2
backend/src/app.module.ts
··· 4 4 import { IngesterModule } from "./ingester/ingester.module"; 5 5 import { ListsModule } from "./lists/lists.module"; 6 6 import { MoviesModule } from "./movies/movies.module"; 7 + import { NotesModule } from "./notes/notes.module"; 7 8 import { PeopleModule } from "./people/people.module"; 8 9 import { PrismaModule } from "./prisma/prisma.module"; 9 10 import { SearchModule } from "./search/search.module"; ··· 21 22 IngesterModule, 22 23 UsersModule, 23 24 ListsModule, 25 + NotesModule, 24 26 ShowsModule, 25 27 ShelfModule, 26 28 SearchModule,
+5 -3
backend/src/auth/auth.service.spec.ts
··· 431 431 client_uri: "http://127.0.0.1:3001", 432 432 redirect_uris: ["http://127.0.0.1:3001/auth/callback"], 433 433 scope: 434 - "atproto repo:xyz.opnshelf.movie repo:xyz.opnshelf.episode repo:xyz.opnshelf.list repo:xyz.opnshelf.listItem repo:xyz.opnshelf.follow repo:xyz.opnshelf.profile blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview", 434 + "atproto repo:xyz.opnshelf.movie repo:xyz.opnshelf.episode repo:xyz.opnshelf.list repo:xyz.opnshelf.listItem repo:xyz.opnshelf.follow repo:xyz.opnshelf.profile repo:xyz.opnshelf.note blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview", 435 435 grant_types: ["authorization_code", "refresh_token"], 436 436 response_types: ["code"], 437 437 application_type: "native", ··· 499 499 500 500 expect(client.authorize).toHaveBeenCalledWith("user.bsky.social", { 501 501 scope: 502 - "atproto repo:xyz.opnshelf.movie repo:xyz.opnshelf.episode repo:xyz.opnshelf.list repo:xyz.opnshelf.listItem repo:xyz.opnshelf.follow repo:xyz.opnshelf.profile blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview", 502 + "atproto repo:xyz.opnshelf.movie repo:xyz.opnshelf.episode repo:xyz.opnshelf.list repo:xyz.opnshelf.listItem repo:xyz.opnshelf.follow repo:xyz.opnshelf.profile repo:xyz.opnshelf.note blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview", 503 503 state: undefined, 504 504 }); 505 505 expect(result).toBe(mockUrl.toString()); ··· 768 768 // The OAUTH_SCOPE constant should include: 769 769 // - atproto: base AT Protocol access 770 770 // - repo:xyz.opnshelf.movie: write movie records 771 + // - repo:xyz.opnshelf.episode: write episode records 771 772 // - repo:xyz.opnshelf.list: write list records 772 773 // - repo:xyz.opnshelf.listItem: write list item records 773 774 // - repo:xyz.opnshelf.follow: write follow records 774 775 // - repo:xyz.opnshelf.profile: write profile records 776 + // - repo:xyz.opnshelf.note: write note records 775 777 // - blob:*/*: upload profile images 776 778 // - rpc:app.bsky.actor.getProfile: fetch user profiles via Bluesky AppView 777 779 expect(authServiceModule.OAUTH_SCOPE).toBe( 778 - "atproto repo:xyz.opnshelf.movie repo:xyz.opnshelf.episode repo:xyz.opnshelf.list repo:xyz.opnshelf.listItem repo:xyz.opnshelf.follow repo:xyz.opnshelf.profile blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview", 780 + "atproto repo:xyz.opnshelf.movie repo:xyz.opnshelf.episode repo:xyz.opnshelf.list repo:xyz.opnshelf.listItem repo:xyz.opnshelf.follow repo:xyz.opnshelf.profile repo:xyz.opnshelf.note blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview", 779 781 ); 780 782 }); 781 783
+1 -1
backend/src/auth/auth.service.ts
··· 13 13 const BLUESKY_PUBLIC_API = "https://public.api.bsky.app/xrpc"; 14 14 15 15 export const OAUTH_SCOPE = 16 - "atproto repo:xyz.opnshelf.movie repo:xyz.opnshelf.episode repo:xyz.opnshelf.list repo:xyz.opnshelf.listItem repo:xyz.opnshelf.follow repo:xyz.opnshelf.profile blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview"; 16 + "atproto repo:xyz.opnshelf.movie repo:xyz.opnshelf.episode repo:xyz.opnshelf.list repo:xyz.opnshelf.listItem repo:xyz.opnshelf.follow repo:xyz.opnshelf.profile repo:xyz.opnshelf.note blob:*/* rpc:app.bsky.actor.getProfile?aud=did:web:api.bsky.app%23bsky_appview"; 17 17 18 18 export interface OAuthAppState { 19 19 platform?: "mobile";
+5
backend/src/generated/browser.ts
··· 82 82 * 83 83 */ 84 84 export type ListItem = Prisma.ListItemModel 85 + /** 86 + * Model Note 87 + * 88 + */ 89 + export type Note = Prisma.NoteModel
+5
backend/src/generated/client.ts
··· 104 104 * 105 105 */ 106 106 export type ListItem = Prisma.ListItemModel 107 + /** 108 + * Model Note 109 + * 110 + */ 111 + export type Note = Prisma.NoteModel
+3 -1
backend/src/generated/enums.ts
··· 11 11 12 12 export const MediaType = { 13 13 movie: 'movie', 14 - show: 'show' 14 + show: 'show', 15 + season: 'season', 16 + episode: 'episode' 15 17 } as const 16 18 17 19 export type MediaType = (typeof MediaType)[keyof typeof MediaType]
+14 -4
backend/src/generated/internal/class.ts
··· 20 20 "clientVersion": "7.7.0", 21 21 "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711", 22 22 "activeProvider": "postgresql", 23 - "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated\"\n moduleFormat = \"cjs\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n did String @id\n handle String @unique\n displayName String?\n avatar String?\n profileRkey String?\n profileUri String?\n profileCid String?\n profileDisplayName String?\n profileAvatarCid String?\n profileAvatarMimeType String?\n profileUpdatedAt DateTime?\n timezone String @default(\"UTC\")\n timeFormat String @default(\"24h\")\n onboardingCompletedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n trackedMovies TrackedMovie[]\n trackedEpisodes TrackedEpisode[]\n lists List[]\n following Follow[] @relation(\"UserFollowing\")\n followers Follow[] @relation(\"UserFollowers\")\n\n @@index([handle])\n @@index([profileAvatarCid])\n}\n\nmodel Follow {\n followerDid String\n followingDid String\n rkey String?\n uri String?\n cid String?\n createdAt DateTime @default(now())\n\n follower User @relation(\"UserFollowing\", fields: [followerDid], references: [did], onDelete: Cascade)\n following User @relation(\"UserFollowers\", fields: [followingDid], references: [did], onDelete: Cascade)\n\n @@id([followerDid, followingDid])\n @@index([followerDid, createdAt])\n @@index([followingDid, createdAt])\n @@index([followerDid, rkey])\n}\n\nenum MediaType {\n movie\n show\n}\n\n// OAuth session storage for @atproto/oauth-client-node sessionStore\n// No FK to User because the OAuth library stores session before we create the User\n// Cookie stores opaque id (not DID) for session lookup\nmodel AuthSession {\n id String @id @default(cuid())\n userDid String @unique\n sessionData String // JSON-serialized session from the library\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([updatedAt])\n}\n\nmodel AuthState {\n key String @id\n stateData String\n expiresAt DateTime\n createdAt DateTime @default(now())\n\n @@index([expiresAt])\n}\n\nmodel BackgroundJob {\n id String @id @default(cuid())\n type String\n userDid String\n status String @default(\"queued\")\n data Json @default(\"{}\")\n nextRunAt DateTime @default(now())\n lastError String?\n startedAt DateTime?\n completedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([type, status, nextRunAt])\n @@index([userDid, type])\n}\n\nmodel Movie {\n movieId String @id\n title String\n posterPath String?\n backdropPath String?\n releaseYear Int?\n releaseDate DateTime?\n overview String?\n colors Json? // { primary, secondary, accent, muted }\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n trackedBy TrackedMovie[]\n listItems ListItem[]\n\n @@index([title])\n}\n\nmodel Show {\n showId String @id\n title String\n posterPath String?\n backdropPath String?\n firstAirYear Int?\n firstAirDate DateTime?\n overview String?\n colors Json?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n trackedBy TrackedEpisode[]\n listItems ListItem[]\n seasons Season[]\n\n @@index([title])\n}\n\nmodel Season {\n id String @id @default(cuid())\n tmdbId Int @unique\n showId String\n show Show @relation(fields: [showId], references: [showId], onDelete: Cascade)\n seasonNumber Int\n name String\n posterPath String?\n airDate DateTime?\n episodeCount Int?\n\n episodes Episode[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([showId, seasonNumber])\n @@index([showId])\n}\n\nmodel Episode {\n id String @id @default(cuid())\n tmdbId Int @unique\n seasonId String\n season Season @relation(fields: [seasonId], references: [id], onDelete: Cascade)\n showId String\n episodeNumber Int\n seasonNumber Int\n name String\n airDate DateTime?\n overview String?\n stillPath String?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([showId, seasonNumber, episodeNumber])\n @@index([seasonId])\n @@index([showId])\n @@index([airDate])\n}\n\nmodel TrackedMovie {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String\n\n userDid String\n user User @relation(fields: [userDid], references: [did], onDelete: Cascade)\n\n movieId String\n movie Movie @relation(fields: [movieId], references: [movieId], onDelete: Cascade)\n\n status String @default(\"watched\")\n watchedDate DateTime?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userDid])\n @@index([movieId])\n @@index([status])\n @@index([createdAt])\n @@index([watchedDate])\n @@index([uri])\n @@index([cid])\n}\n\nmodel TrackedEpisode {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String\n\n userDid String\n user User @relation(fields: [userDid], references: [did], onDelete: Cascade)\n\n showId String\n show Show @relation(fields: [showId], references: [showId], onDelete: Cascade)\n\n seasonNumber Int\n episodeNumber Int\n status String @default(\"watched\")\n watchedDate DateTime?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userDid])\n @@index([showId])\n @@index([seasonNumber])\n @@index([episodeNumber])\n @@index([status])\n @@index([createdAt])\n @@index([watchedDate])\n @@index([uri])\n @@index([cid])\n}\n\nmodel List {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String?\n\n userDid String\n user User @relation(fields: [userDid], references: [did], onDelete: Cascade)\n\n name String\n description String?\n slug String\n isDefault Boolean @default(false)\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n items ListItem[]\n\n @@unique([userDid, slug])\n @@index([userDid])\n @@index([isDefault])\n}\n\nmodel ListItem {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String?\n\n listId String\n list List @relation(fields: [listId], references: [id], onDelete: Cascade)\n\n mediaType MediaType\n mediaId String\n movieId String?\n movie Movie? @relation(fields: [movieId], references: [movieId], onDelete: Cascade)\n showId String?\n show Show? @relation(fields: [showId], references: [showId], onDelete: Cascade)\n\n notes String?\n position Int @default(0)\n\n createdAt DateTime @default(now())\n\n @@unique([listId, mediaType, mediaId])\n @@index([listId])\n @@index([mediaType, mediaId])\n}\n", 23 + "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated\"\n moduleFormat = \"cjs\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n did String @id\n handle String @unique\n displayName String?\n avatar String?\n profileRkey String?\n profileUri String?\n profileCid String?\n profileDisplayName String?\n profileAvatarCid String?\n profileAvatarMimeType String?\n profileUpdatedAt DateTime?\n timezone String @default(\"UTC\")\n timeFormat String @default(\"24h\")\n onboardingCompletedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n trackedMovies TrackedMovie[]\n trackedEpisodes TrackedEpisode[]\n lists List[]\n notes Note[]\n following Follow[] @relation(\"UserFollowing\")\n followers Follow[] @relation(\"UserFollowers\")\n\n @@index([handle])\n @@index([profileAvatarCid])\n}\n\nmodel Follow {\n followerDid String\n followingDid String\n rkey String?\n uri String?\n cid String?\n createdAt DateTime @default(now())\n\n follower User @relation(\"UserFollowing\", fields: [followerDid], references: [did], onDelete: Cascade)\n following User @relation(\"UserFollowers\", fields: [followingDid], references: [did], onDelete: Cascade)\n\n @@id([followerDid, followingDid])\n @@index([followerDid, createdAt])\n @@index([followingDid, createdAt])\n @@index([followerDid, rkey])\n}\n\nenum MediaType {\n movie\n show\n season\n episode\n}\n\n// OAuth session storage for @atproto/oauth-client-node sessionStore\n// No FK to User because the OAuth library stores session before we create the User\n// Cookie stores opaque id (not DID) for session lookup\nmodel AuthSession {\n id String @id @default(cuid())\n userDid String @unique\n sessionData String // JSON-serialized session from the library\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([updatedAt])\n}\n\nmodel AuthState {\n key String @id\n stateData String\n expiresAt DateTime\n createdAt DateTime @default(now())\n\n @@index([expiresAt])\n}\n\nmodel BackgroundJob {\n id String @id @default(cuid())\n type String\n userDid String\n status String @default(\"queued\")\n data Json @default(\"{}\")\n nextRunAt DateTime @default(now())\n lastError String?\n startedAt DateTime?\n completedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([type, status, nextRunAt])\n @@index([userDid, type])\n}\n\nmodel Movie {\n movieId String @id\n title String\n posterPath String?\n backdropPath String?\n releaseYear Int?\n releaseDate DateTime?\n overview String?\n colors Json? // { primary, secondary, accent, muted }\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n trackedBy TrackedMovie[]\n listItems ListItem[]\n\n @@index([title])\n}\n\nmodel Show {\n showId String @id\n title String\n posterPath String?\n backdropPath String?\n firstAirYear Int?\n firstAirDate DateTime?\n overview String?\n colors Json?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n trackedBy TrackedEpisode[]\n listItems ListItem[]\n seasons Season[]\n\n @@index([title])\n}\n\nmodel Season {\n id String @id @default(cuid())\n tmdbId Int @unique\n showId String\n show Show @relation(fields: [showId], references: [showId], onDelete: Cascade)\n seasonNumber Int\n name String\n posterPath String?\n airDate DateTime?\n episodeCount Int?\n\n episodes Episode[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([showId, seasonNumber])\n @@index([showId])\n}\n\nmodel Episode {\n id String @id @default(cuid())\n tmdbId Int @unique\n seasonId String\n season Season @relation(fields: [seasonId], references: [id], onDelete: Cascade)\n showId String\n episodeNumber Int\n seasonNumber Int\n name String\n airDate DateTime?\n overview String?\n stillPath String?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([showId, seasonNumber, episodeNumber])\n @@index([seasonId])\n @@index([showId])\n @@index([airDate])\n}\n\nmodel TrackedMovie {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String\n\n userDid String\n user User @relation(fields: [userDid], references: [did], onDelete: Cascade)\n\n movieId String\n movie Movie @relation(fields: [movieId], references: [movieId], onDelete: Cascade)\n\n status String @default(\"watched\")\n watchedDate DateTime?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userDid])\n @@index([movieId])\n @@index([status])\n @@index([createdAt])\n @@index([watchedDate])\n @@index([uri])\n @@index([cid])\n}\n\nmodel TrackedEpisode {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String\n\n userDid String\n user User @relation(fields: [userDid], references: [did], onDelete: Cascade)\n\n showId String\n show Show @relation(fields: [showId], references: [showId], onDelete: Cascade)\n\n seasonNumber Int\n episodeNumber Int\n status String @default(\"watched\")\n watchedDate DateTime?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userDid])\n @@index([showId])\n @@index([seasonNumber])\n @@index([episodeNumber])\n @@index([status])\n @@index([createdAt])\n @@index([watchedDate])\n @@index([uri])\n @@index([cid])\n}\n\nmodel List {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String?\n\n userDid String\n user User @relation(fields: [userDid], references: [did], onDelete: Cascade)\n\n name String\n description String?\n slug String\n isDefault Boolean @default(false)\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n items ListItem[]\n\n @@unique([userDid, slug])\n @@index([userDid])\n @@index([isDefault])\n}\n\nmodel ListItem {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String?\n\n listId String\n list List @relation(fields: [listId], references: [id], onDelete: Cascade)\n\n mediaType MediaType\n mediaId String\n seasonNumber Int @default(0)\n episodeNumber Int @default(0)\n\n movieId String?\n movie Movie? @relation(fields: [movieId], references: [movieId], onDelete: Cascade)\n showId String?\n show Show? @relation(fields: [showId], references: [showId], onDelete: Cascade)\n\n notes String?\n position Int @default(0)\n\n createdAt DateTime @default(now())\n\n @@unique([listId, mediaType, mediaId, seasonNumber, episodeNumber])\n @@index([listId])\n @@index([mediaType, mediaId])\n}\n\nmodel Note {\n id String @id @default(cuid())\n rkey String @unique\n uri String\n cid String\n\n userDid String\n user User @relation(fields: [userDid], references: [did], onDelete: Cascade)\n\n mediaType MediaType\n mediaId String\n seasonNumber Int @default(0)\n episodeNumber Int @default(0)\n\n content String\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([userDid, mediaType, mediaId, seasonNumber, episodeNumber])\n @@index([userDid])\n @@index([mediaType, mediaId])\n}\n", 24 24 "runtimeDataModel": { 25 25 "models": {}, 26 26 "enums": {}, ··· 32 32 } 33 33 } 34 34 35 - config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"handle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"avatar\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileRkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileUri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileCid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileDisplayName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileAvatarCid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileAvatarMimeType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"timezone\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timeFormat\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"onboardingCompletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"trackedMovies\",\"kind\":\"object\",\"type\":\"TrackedMovie\",\"relationName\":\"TrackedMovieToUser\"},{\"name\":\"trackedEpisodes\",\"kind\":\"object\",\"type\":\"TrackedEpisode\",\"relationName\":\"TrackedEpisodeToUser\"},{\"name\":\"lists\",\"kind\":\"object\",\"type\":\"List\",\"relationName\":\"ListToUser\"},{\"name\":\"following\",\"kind\":\"object\",\"type\":\"Follow\",\"relationName\":\"UserFollowing\"},{\"name\":\"followers\",\"kind\":\"object\",\"type\":\"Follow\",\"relationName\":\"UserFollowers\"}],\"dbName\":null},\"Follow\":{\"fields\":[{\"name\":\"followerDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"followingDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"follower\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserFollowing\"},{\"name\":\"following\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserFollowers\"}],\"dbName\":null},\"AuthSession\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionData\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"AuthState\":{\"fields\":[{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"stateData\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"BackgroundJob\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"nextRunAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Movie\":{\"fields\":[{\"name\":\"movieId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"posterPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"backdropPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"releaseYear\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"releaseDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"overview\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"trackedBy\",\"kind\":\"object\",\"type\":\"TrackedMovie\",\"relationName\":\"MovieToTrackedMovie\"},{\"name\":\"listItems\",\"kind\":\"object\",\"type\":\"ListItem\",\"relationName\":\"ListItemToMovie\"}],\"dbName\":null},\"Show\":{\"fields\":[{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"posterPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"backdropPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstAirYear\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"firstAirDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"overview\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"trackedBy\",\"kind\":\"object\",\"type\":\"TrackedEpisode\",\"relationName\":\"ShowToTrackedEpisode\"},{\"name\":\"listItems\",\"kind\":\"object\",\"type\":\"ListItem\",\"relationName\":\"ListItemToShow\"},{\"name\":\"seasons\",\"kind\":\"object\",\"type\":\"Season\",\"relationName\":\"SeasonToShow\"}],\"dbName\":null},\"Season\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tmdbId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"show\",\"kind\":\"object\",\"type\":\"Show\",\"relationName\":\"SeasonToShow\"},{\"name\":\"seasonNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"posterPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"airDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"episodeCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"episodes\",\"kind\":\"object\",\"type\":\"Episode\",\"relationName\":\"EpisodeToSeason\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Episode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tmdbId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"seasonId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"season\",\"kind\":\"object\",\"type\":\"Season\",\"relationName\":\"EpisodeToSeason\"},{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"episodeNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"seasonNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"airDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"overview\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"stillPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"TrackedMovie\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TrackedMovieToUser\"},{\"name\":\"movieId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"movie\",\"kind\":\"object\",\"type\":\"Movie\",\"relationName\":\"MovieToTrackedMovie\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"watchedDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"TrackedEpisode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TrackedEpisodeToUser\"},{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"show\",\"kind\":\"object\",\"type\":\"Show\",\"relationName\":\"ShowToTrackedEpisode\"},{\"name\":\"seasonNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"episodeNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"watchedDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"List\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ListToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"ListItem\",\"relationName\":\"ListToListItem\"}],\"dbName\":null},\"ListItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"listId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"list\",\"kind\":\"object\",\"type\":\"List\",\"relationName\":\"ListToListItem\"},{\"name\":\"mediaType\",\"kind\":\"enum\",\"type\":\"MediaType\"},{\"name\":\"mediaId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"movieId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"movie\",\"kind\":\"object\",\"type\":\"Movie\",\"relationName\":\"ListItemToMovie\"},{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"show\",\"kind\":\"object\",\"type\":\"Show\",\"relationName\":\"ListItemToShow\"},{\"name\":\"notes\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"position\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") 35 + config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"handle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"avatar\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileRkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileUri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileCid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileDisplayName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileAvatarCid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileAvatarMimeType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"timezone\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"timeFormat\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"onboardingCompletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"trackedMovies\",\"kind\":\"object\",\"type\":\"TrackedMovie\",\"relationName\":\"TrackedMovieToUser\"},{\"name\":\"trackedEpisodes\",\"kind\":\"object\",\"type\":\"TrackedEpisode\",\"relationName\":\"TrackedEpisodeToUser\"},{\"name\":\"lists\",\"kind\":\"object\",\"type\":\"List\",\"relationName\":\"ListToUser\"},{\"name\":\"notes\",\"kind\":\"object\",\"type\":\"Note\",\"relationName\":\"NoteToUser\"},{\"name\":\"following\",\"kind\":\"object\",\"type\":\"Follow\",\"relationName\":\"UserFollowing\"},{\"name\":\"followers\",\"kind\":\"object\",\"type\":\"Follow\",\"relationName\":\"UserFollowers\"}],\"dbName\":null},\"Follow\":{\"fields\":[{\"name\":\"followerDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"followingDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"follower\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserFollowing\"},{\"name\":\"following\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserFollowers\"}],\"dbName\":null},\"AuthSession\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sessionData\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"AuthState\":{\"fields\":[{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"stateData\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"BackgroundJob\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"nextRunAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Movie\":{\"fields\":[{\"name\":\"movieId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"posterPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"backdropPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"releaseYear\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"releaseDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"overview\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"trackedBy\",\"kind\":\"object\",\"type\":\"TrackedMovie\",\"relationName\":\"MovieToTrackedMovie\"},{\"name\":\"listItems\",\"kind\":\"object\",\"type\":\"ListItem\",\"relationName\":\"ListItemToMovie\"}],\"dbName\":null},\"Show\":{\"fields\":[{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"posterPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"backdropPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstAirYear\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"firstAirDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"overview\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"trackedBy\",\"kind\":\"object\",\"type\":\"TrackedEpisode\",\"relationName\":\"ShowToTrackedEpisode\"},{\"name\":\"listItems\",\"kind\":\"object\",\"type\":\"ListItem\",\"relationName\":\"ListItemToShow\"},{\"name\":\"seasons\",\"kind\":\"object\",\"type\":\"Season\",\"relationName\":\"SeasonToShow\"}],\"dbName\":null},\"Season\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tmdbId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"show\",\"kind\":\"object\",\"type\":\"Show\",\"relationName\":\"SeasonToShow\"},{\"name\":\"seasonNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"posterPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"airDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"episodeCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"episodes\",\"kind\":\"object\",\"type\":\"Episode\",\"relationName\":\"EpisodeToSeason\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Episode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tmdbId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"seasonId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"season\",\"kind\":\"object\",\"type\":\"Season\",\"relationName\":\"EpisodeToSeason\"},{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"episodeNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"seasonNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"airDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"overview\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"stillPath\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"TrackedMovie\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TrackedMovieToUser\"},{\"name\":\"movieId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"movie\",\"kind\":\"object\",\"type\":\"Movie\",\"relationName\":\"MovieToTrackedMovie\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"watchedDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"TrackedEpisode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"TrackedEpisodeToUser\"},{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"show\",\"kind\":\"object\",\"type\":\"Show\",\"relationName\":\"ShowToTrackedEpisode\"},{\"name\":\"seasonNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"episodeNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"watchedDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"List\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ListToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"ListItem\",\"relationName\":\"ListToListItem\"}],\"dbName\":null},\"ListItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"listId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"list\",\"kind\":\"object\",\"type\":\"List\",\"relationName\":\"ListToListItem\"},{\"name\":\"mediaType\",\"kind\":\"enum\",\"type\":\"MediaType\"},{\"name\":\"mediaId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seasonNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"episodeNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"movieId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"movie\",\"kind\":\"object\",\"type\":\"Movie\",\"relationName\":\"ListItemToMovie\"},{\"name\":\"showId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"show\",\"kind\":\"object\",\"type\":\"Show\",\"relationName\":\"ListItemToShow\"},{\"name\":\"notes\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"position\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Note\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rkey\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"uri\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userDid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"NoteToUser\"},{\"name\":\"mediaType\",\"kind\":\"enum\",\"type\":\"MediaType\"},{\"name\":\"mediaId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seasonNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"episodeNumber\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") 36 36 config.parameterizationSchema = { 37 - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"trackedBy\",\"items\",\"_count\",\"list\",\"movie\",\"show\",\"listItems\",\"season\",\"episodes\",\"seasons\",\"trackedMovies\",\"trackedEpisodes\",\"lists\",\"follower\",\"following\",\"followers\",\"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\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Follow.findUnique\",\"Follow.findUniqueOrThrow\",\"Follow.findFirst\",\"Follow.findFirstOrThrow\",\"Follow.findMany\",\"Follow.createOne\",\"Follow.createMany\",\"Follow.createManyAndReturn\",\"Follow.updateOne\",\"Follow.updateMany\",\"Follow.updateManyAndReturn\",\"Follow.upsertOne\",\"Follow.deleteOne\",\"Follow.deleteMany\",\"Follow.groupBy\",\"Follow.aggregate\",\"AuthSession.findUnique\",\"AuthSession.findUniqueOrThrow\",\"AuthSession.findFirst\",\"AuthSession.findFirstOrThrow\",\"AuthSession.findMany\",\"AuthSession.createOne\",\"AuthSession.createMany\",\"AuthSession.createManyAndReturn\",\"AuthSession.updateOne\",\"AuthSession.updateMany\",\"AuthSession.updateManyAndReturn\",\"AuthSession.upsertOne\",\"AuthSession.deleteOne\",\"AuthSession.deleteMany\",\"AuthSession.groupBy\",\"AuthSession.aggregate\",\"AuthState.findUnique\",\"AuthState.findUniqueOrThrow\",\"AuthState.findFirst\",\"AuthState.findFirstOrThrow\",\"AuthState.findMany\",\"AuthState.createOne\",\"AuthState.createMany\",\"AuthState.createManyAndReturn\",\"AuthState.updateOne\",\"AuthState.updateMany\",\"AuthState.updateManyAndReturn\",\"AuthState.upsertOne\",\"AuthState.deleteOne\",\"AuthState.deleteMany\",\"AuthState.groupBy\",\"AuthState.aggregate\",\"BackgroundJob.findUnique\",\"BackgroundJob.findUniqueOrThrow\",\"BackgroundJob.findFirst\",\"BackgroundJob.findFirstOrThrow\",\"BackgroundJob.findMany\",\"BackgroundJob.createOne\",\"BackgroundJob.createMany\",\"BackgroundJob.createManyAndReturn\",\"BackgroundJob.updateOne\",\"BackgroundJob.updateMany\",\"BackgroundJob.updateManyAndReturn\",\"BackgroundJob.upsertOne\",\"BackgroundJob.deleteOne\",\"BackgroundJob.deleteMany\",\"BackgroundJob.groupBy\",\"BackgroundJob.aggregate\",\"Movie.findUnique\",\"Movie.findUniqueOrThrow\",\"Movie.findFirst\",\"Movie.findFirstOrThrow\",\"Movie.findMany\",\"Movie.createOne\",\"Movie.createMany\",\"Movie.createManyAndReturn\",\"Movie.updateOne\",\"Movie.updateMany\",\"Movie.updateManyAndReturn\",\"Movie.upsertOne\",\"Movie.deleteOne\",\"Movie.deleteMany\",\"_avg\",\"_sum\",\"Movie.groupBy\",\"Movie.aggregate\",\"Show.findUnique\",\"Show.findUniqueOrThrow\",\"Show.findFirst\",\"Show.findFirstOrThrow\",\"Show.findMany\",\"Show.createOne\",\"Show.createMany\",\"Show.createManyAndReturn\",\"Show.updateOne\",\"Show.updateMany\",\"Show.updateManyAndReturn\",\"Show.upsertOne\",\"Show.deleteOne\",\"Show.deleteMany\",\"Show.groupBy\",\"Show.aggregate\",\"Season.findUnique\",\"Season.findUniqueOrThrow\",\"Season.findFirst\",\"Season.findFirstOrThrow\",\"Season.findMany\",\"Season.createOne\",\"Season.createMany\",\"Season.createManyAndReturn\",\"Season.updateOne\",\"Season.updateMany\",\"Season.updateManyAndReturn\",\"Season.upsertOne\",\"Season.deleteOne\",\"Season.deleteMany\",\"Season.groupBy\",\"Season.aggregate\",\"Episode.findUnique\",\"Episode.findUniqueOrThrow\",\"Episode.findFirst\",\"Episode.findFirstOrThrow\",\"Episode.findMany\",\"Episode.createOne\",\"Episode.createMany\",\"Episode.createManyAndReturn\",\"Episode.updateOne\",\"Episode.updateMany\",\"Episode.updateManyAndReturn\",\"Episode.upsertOne\",\"Episode.deleteOne\",\"Episode.deleteMany\",\"Episode.groupBy\",\"Episode.aggregate\",\"TrackedMovie.findUnique\",\"TrackedMovie.findUniqueOrThrow\",\"TrackedMovie.findFirst\",\"TrackedMovie.findFirstOrThrow\",\"TrackedMovie.findMany\",\"TrackedMovie.createOne\",\"TrackedMovie.createMany\",\"TrackedMovie.createManyAndReturn\",\"TrackedMovie.updateOne\",\"TrackedMovie.updateMany\",\"TrackedMovie.updateManyAndReturn\",\"TrackedMovie.upsertOne\",\"TrackedMovie.deleteOne\",\"TrackedMovie.deleteMany\",\"TrackedMovie.groupBy\",\"TrackedMovie.aggregate\",\"TrackedEpisode.findUnique\",\"TrackedEpisode.findUniqueOrThrow\",\"TrackedEpisode.findFirst\",\"TrackedEpisode.findFirstOrThrow\",\"TrackedEpisode.findMany\",\"TrackedEpisode.createOne\",\"TrackedEpisode.createMany\",\"TrackedEpisode.createManyAndReturn\",\"TrackedEpisode.updateOne\",\"TrackedEpisode.updateMany\",\"TrackedEpisode.updateManyAndReturn\",\"TrackedEpisode.upsertOne\",\"TrackedEpisode.deleteOne\",\"TrackedEpisode.deleteMany\",\"TrackedEpisode.groupBy\",\"TrackedEpisode.aggregate\",\"List.findUnique\",\"List.findUniqueOrThrow\",\"List.findFirst\",\"List.findFirstOrThrow\",\"List.findMany\",\"List.createOne\",\"List.createMany\",\"List.createManyAndReturn\",\"List.updateOne\",\"List.updateMany\",\"List.updateManyAndReturn\",\"List.upsertOne\",\"List.deleteOne\",\"List.deleteMany\",\"List.groupBy\",\"List.aggregate\",\"ListItem.findUnique\",\"ListItem.findUniqueOrThrow\",\"ListItem.findFirst\",\"ListItem.findFirstOrThrow\",\"ListItem.findMany\",\"ListItem.createOne\",\"ListItem.createMany\",\"ListItem.createManyAndReturn\",\"ListItem.updateOne\",\"ListItem.updateMany\",\"ListItem.updateManyAndReturn\",\"ListItem.upsertOne\",\"ListItem.deleteOne\",\"ListItem.deleteMany\",\"ListItem.groupBy\",\"ListItem.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"rkey\",\"uri\",\"cid\",\"listId\",\"MediaType\",\"mediaType\",\"mediaId\",\"movieId\",\"showId\",\"notes\",\"position\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"userDid\",\"name\",\"description\",\"slug\",\"isDefault\",\"updatedAt\",\"seasonNumber\",\"episodeNumber\",\"status\",\"watchedDate\",\"tmdbId\",\"seasonId\",\"airDate\",\"overview\",\"stillPath\",\"posterPath\",\"episodeCount\",\"title\",\"backdropPath\",\"firstAirYear\",\"firstAirDate\",\"colors\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"every\",\"some\",\"none\",\"releaseYear\",\"releaseDate\",\"type\",\"nextRunAt\",\"lastError\",\"startedAt\",\"completedAt\",\"key\",\"stateData\",\"expiresAt\",\"sessionData\",\"followerDid\",\"followingDid\",\"did\",\"handle\",\"displayName\",\"avatar\",\"profileRkey\",\"profileUri\",\"profileCid\",\"profileDisplayName\",\"profileAvatarCid\",\"profileAvatarMimeType\",\"profileUpdatedAt\",\"timezone\",\"timeFormat\",\"onboardingCompletedAt\",\"followerDid_followingDid\",\"userDid_slug\",\"showId_seasonNumber_episodeNumber\",\"showId_seasonNumber\",\"listId_mediaType_mediaId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), 38 - graph: "-QV60AEYDgAAkwMAIA8AAI4DACAQAACgAwAgEgAAoQMAIBMAAKEDACDsAQAAnwMAMO0BAAA1ABDuAQAAnwMAMPsBQACNAwAhjAJAAI0DACGzAgEAAAABtAIBAAAAAbUCAQCJAwAhtgIBAIkDACG3AgEAiQMAIbgCAQCJAwAhuQIBAIkDACG6AgEAiQMAIbsCAQCJAwAhvAIBAIkDACG9AkAAiwMAIb4CAQCIAwAhvwIBAIgDACHAAkAAiwMAIQEAAAABACAPAwAApAMAIAgAALgDACDsAQAAtwMAMO0BAAADABDuAQAAtwMAMO8BAQCIAwAh8AEBAIgDACHxAQEAiAMAIfIBAQCIAwAh9wEBAIgDACH7AUAAjQMAIYcCAQCIAwAhjAJAAI0DACGPAgEAiAMAIZACQACLAwAhAwMAAKwFACAIAACxBQAgkAIAALkDACAPAwAApAMAIAgAALgDACDsAQAAtwMAMO0BAAADABDuAQAAtwMAMO8BAQAAAAHwAQEAAAAB8QEBAIgDACHyAQEAiAMAIfcBAQCIAwAh-wFAAI0DACGHAgEAiAMAIYwCQACNAwAhjwIBAIgDACGQAkAAiwMAIQMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgEgcAALQDACAIAAC1AwAgCQAAtgMAIOwBAACyAwAw7QEAAAgAEO4BAACyAwAw7wEBAIgDACHwAQEAiAMAIfEBAQCIAwAh8gEBAIkDACHzAQEAiAMAIfUBAACzA_UBIvYBAQCIAwAh9wEBAIkDACH4AQEAiQMAIfkBAQCJAwAh-gECAKoDACH7AUAAjQMAIQcHAACwBQAgCAAAsQUAIAkAAK4FACDyAQAAuQMAIPcBAAC5AwAg-AEAALkDACD5AQAAuQMAIBMHAAC0AwAgCAAAtQMAIAkAALYDACDsAQAAsgMAMO0BAAAIABDuAQAAsgMAMO8BAQAAAAHwAQEAAAAB8QEBAIgDACHyAQEAiQMAIfMBAQCIAwAh9QEAALMD9QEi9gEBAIgDACH3AQEAiQMAIfgBAQCJAwAh-QEBAIkDACH6AQIAqgMAIfsBQACNAwAhxQIAALEDACADAAAACAAgAQAACQAwAgAACgAgAwAAAAgAIAEAAAkAMAIAAAoAIAEAAAAIACAPBAAAkwMAIAoAAI8DACDsAQAAkgMAMO0BAAAOABDuAQAAkgMAMPcBAQCIAwAh-wFAAI0DACGMAkAAjQMAIZQCAQCJAwAhlgIBAIkDACGYAgEAiAMAIZkCAQCJAwAhnAIAAIwDACCmAgIAigMAIacCQACLAwAhAQAAAA4AIBAEAACOAwAgCgAAjwMAIA0AAJADACDsAQAAhwMAMO0BAAAQABDuAQAAhwMAMPgBAQCIAwAh-wFAAI0DACGMAkAAjQMAIZQCAQCJAwAhlgIBAIkDACGYAgEAiAMAIZkCAQCJAwAhmgICAIoDACGbAkAAiwMAIZwCAACMAwAgAQAAABAAIBEDAACkAwAgCQAArgMAIOwBAACwAwAw7QEAABIAEO4BAACwAwAw7wEBAIgDACHwAQEAiAMAIfEBAQCIAwAh8gEBAIgDACH4AQEAiAMAIfsBQACNAwAhhwIBAIgDACGMAkAAjQMAIY0CAgCqAwAhjgICAKoDACGPAgEAiAMAIZACQACLAwAhAwMAAKwFACAJAACuBQAgkAIAALkDACARAwAApAMAIAkAAK4DACDsAQAAsAMAMO0BAAASABDuAQAAsAMAMO8BAQAAAAHwAQEAAAAB8QEBAIgDACHyAQEAiAMAIfgBAQCIAwAh-wFAAI0DACGHAgEAiAMAIYwCQACNAwAhjQICAKoDACGOAgIAqgMAIY8CAQCIAwAhkAJAAIsDACEDAAAAEgAgAQAAEwAwAgAAFAAgAwAAAAgAIAEAAAkAMAIAAAoAIA8JAACuAwAgDAAArwMAIOwBAACtAwAw7QEAABcAEO4BAACtAwAw7wEBAIgDACH4AQEAiAMAIfsBQACNAwAhiAIBAIgDACGMAkAAjQMAIY0CAgCqAwAhkQICAKoDACGTAkAAiwMAIZYCAQCJAwAhlwICAIoDACEFCQAArgUAIAwAAK8FACCTAgAAuQMAIJYCAAC5AwAglwIAALkDACAQCQAArgMAIAwAAK8DACDsAQAArQMAMO0BAAAXABDuAQAArQMAMO8BAQAAAAH4AQEAiAMAIfsBQACNAwAhiAIBAIgDACGMAkAAjQMAIY0CAgCqAwAhkQICAAAAAZMCQACLAwAhlgIBAIkDACGXAgIAigMAIcQCAACsAwAgAwAAABcAIAEAABgAMAIAABkAIBALAACrAwAg7AEAAKkDADDtAQAAGwAQ7gEAAKkDADDvAQEAiAMAIfgBAQCIAwAh-wFAAI0DACGIAgEAiAMAIYwCQACNAwAhjQICAKoDACGOAgIAqgMAIZECAgCqAwAhkgIBAIgDACGTAkAAiwMAIZQCAQCJAwAhlQIBAIkDACEECwAArQUAIJMCAAC5AwAglAIAALkDACCVAgAAuQMAIBELAACrAwAg7AEAAKkDADDtAQAAGwAQ7gEAAKkDADDvAQEAAAAB-AEBAIgDACH7AUAAjQMAIYgCAQCIAwAhjAJAAI0DACGNAgIAqgMAIY4CAgCqAwAhkQICAAAAAZICAQCIAwAhkwJAAIsDACGUAgEAiQMAIZUCAQCJAwAhwwIAAKgDACADAAAAGwAgAQAAHAAwAgAAHQAgAQAAABsAIAEAAAASACABAAAACAAgAQAAABcAIAEAAAADACABAAAACAAgAwAAABIAIAEAABMAMAIAABQAIBADAACkAwAgBQAAjwMAIOwBAACmAwAw7QEAACYAEO4BAACmAwAw7wEBAIgDACHwAQEAiAMAIfEBAQCIAwAh8gEBAIkDACH7AUAAjQMAIYcCAQCIAwAhiAIBAIgDACGJAgEAiQMAIYoCAQCIAwAhiwIgAKcDACGMAkAAjQMAIQQDAACsBQAgBQAAuQQAIPIBAAC5AwAgiQIAALkDACARAwAApAMAIAUAAI8DACDsAQAApgMAMO0BAAAmABDuAQAApgMAMO8BAQAAAAHwAQEAAAAB8QEBAIgDACHyAQEAiQMAIfsBQACNAwAhhwIBAIgDACGIAgEAiAMAIYkCAQCJAwAhigIBAIgDACGLAiAApwMAIYwCQACNAwAhwgIAAKUDACADAAAAJgAgAQAAJwAwAgAAKAAgCxEAAKQDACASAACkAwAg7AEAAKMDADDtAQAAKgAQ7gEAAKMDADDwAQEAiQMAIfEBAQCJAwAh8gEBAIkDACH7AUAAjQMAIbECAQCIAwAhsgIBAIgDACEFEQAArAUAIBIAAKwFACDwAQAAuQMAIPEBAAC5AwAg8gEAALkDACAMEQAApAMAIBIAAKQDACDsAQAAowMAMO0BAAAqABDuAQAAowMAMPABAQCJAwAh8QEBAIkDACHyAQEAiQMAIfsBQACNAwAhsQIBAIgDACGyAgEAiAMAIcECAACiAwAgAwAAACoAIAEAACsAMAIAACwAIAMAAAAqACABAAArADACAAAsACABAAAAAwAgAQAAABIAIAEAAAAmACABAAAAKgAgAQAAACoAIAEAAAABACAYDgAAkwMAIA8AAI4DACAQAACgAwAgEgAAoQMAIBMAAKEDACDsAQAAnwMAMO0BAAA1ABDuAQAAnwMAMPsBQACNAwAhjAJAAI0DACGzAgEAiAMAIbQCAQCIAwAhtQIBAIkDACG2AgEAiQMAIbcCAQCJAwAhuAIBAIkDACG5AgEAiQMAIboCAQCJAwAhuwIBAIkDACG8AgEAiQMAIb0CQACLAwAhvgIBAIgDACG_AgEAiAMAIcACQACLAwAhDw4AANkEACAPAAC4BAAgEAAAqgUAIBIAAKsFACATAACrBQAgtQIAALkDACC2AgAAuQMAILcCAAC5AwAguAIAALkDACC5AgAAuQMAILoCAAC5AwAguwIAALkDACC8AgAAuQMAIL0CAAC5AwAgwAIAALkDACADAAAANQAgAQAANgAwAgAAAQAgAwAAADUAIAEAADYAMAIAAAEAIAMAAAA1ACABAAA2ADACAAABACAVDgAApQUAIA8AAKYFACAQAACnBQAgEgAAqAUAIBMAAKkFACD7AUAAAAABjAJAAAAAAbMCAQAAAAG0AgEAAAABtQIBAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAG9AkAAAAABvgIBAAAAAb8CAQAAAAHAAkAAAAABARkAADoAIBD7AUAAAAABjAJAAAAAAbMCAQAAAAG0AgEAAAABtQIBAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAG9AkAAAAABvgIBAAAAAb8CAQAAAAHAAkAAAAABARkAADwAMAEZAAA8ADAVDgAA7QQAIA8AAO4EACAQAADvBAAgEgAA8AQAIBMAAPEEACD7AUAAwwMAIYwCQADDAwAhswIBAL8DACG0AgEAvwMAIbUCAQDAAwAhtgIBAMADACG3AgEAwAMAIbgCAQDAAwAhuQIBAMADACG6AgEAwAMAIbsCAQDAAwAhvAIBAMADACG9AkAA4wMAIb4CAQC_AwAhvwIBAL8DACHAAkAA4wMAIQIAAAABACAZAAA_ACAQ-wFAAMMDACGMAkAAwwMAIbMCAQC_AwAhtAIBAL8DACG1AgEAwAMAIbYCAQDAAwAhtwIBAMADACG4AgEAwAMAIbkCAQDAAwAhugIBAMADACG7AgEAwAMAIbwCAQDAAwAhvQJAAOMDACG-AgEAvwMAIb8CAQC_AwAhwAJAAOMDACECAAAANQAgGQAAQQAgAgAAADUAIBkAAEEAIAMAAAABACAgAAA6ACAhAAA_ACABAAAAAQAgAQAAADUAIA0GAADqBAAgJgAA7AQAICcAAOsEACC1AgAAuQMAILYCAAC5AwAgtwIAALkDACC4AgAAuQMAILkCAAC5AwAgugIAALkDACC7AgAAuQMAILwCAAC5AwAgvQIAALkDACDAAgAAuQMAIBPsAQAAngMAMO0BAABIABDuAQAAngMAMPsBQADpAgAhjAJAAOkCACGzAgEA5QIAIbQCAQDlAgAhtQIBAOYCACG2AgEA5gIAIbcCAQDmAgAhuAIBAOYCACG5AgEA5gIAIboCAQDmAgAhuwIBAOYCACG8AgEA5gIAIb0CQAD7AgAhvgIBAOUCACG_AgEA5QIAIcACQAD7AgAhAwAAADUAIAEAAEcAMCUAAEgAIAMAAAA1ACABAAA2ADACAAABACABAAAALAAgAQAAACwAIAMAAAAqACABAAArADACAAAsACADAAAAKgAgAQAAKwAwAgAALAAgAwAAACoAIAEAACsAMAIAACwAIAgRAADoBAAgEgAA6QQAIPABAQAAAAHxAQEAAAAB8gEBAAAAAfsBQAAAAAGxAgEAAAABsgIBAAAAAQEZAABQACAG8AEBAAAAAfEBAQAAAAHyAQEAAAAB-wFAAAAAAbECAQAAAAGyAgEAAAABARkAAFIAMAEZAABSADAIEQAA5gQAIBIAAOcEACDwAQEAwAMAIfEBAQDAAwAh8gEBAMADACH7AUAAwwMAIbECAQC_AwAhsgIBAL8DACECAAAALAAgGQAAVQAgBvABAQDAAwAh8QEBAMADACHyAQEAwAMAIfsBQADDAwAhsQIBAL8DACGyAgEAvwMAIQIAAAAqACAZAABXACACAAAAKgAgGQAAVwAgAwAAACwAICAAAFAAICEAAFUAIAEAAAAsACABAAAAKgAgBgYAAOMEACAmAADlBAAgJwAA5AQAIPABAAC5AwAg8QEAALkDACDyAQAAuQMAIAnsAQAAnQMAMO0BAABeABDuAQAAnQMAMPABAQDmAgAh8QEBAOYCACHyAQEA5gIAIfsBQADpAgAhsQIBAOUCACGyAgEA5QIAIQMAAAAqACABAABdADAlAABeACADAAAAKgAgAQAAKwAwAgAALAAgCOwBAACcAwAw7QEAAGQAEO4BAACcAwAw7wEBAAAAAfsBQACNAwAhhwIBAAAAAYwCQACNAwAhsAIBAIgDACEBAAAAYQAgAQAAAGEAIAjsAQAAnAMAMO0BAABkABDuAQAAnAMAMO8BAQCIAwAh-wFAAI0DACGHAgEAiAMAIYwCQACNAwAhsAIBAIgDACEAAwAAAGQAIAEAAGUAMAIAAGEAIAMAAABkACABAABlADACAABhACADAAAAZAAgAQAAZQAwAgAAYQAgBe8BAQAAAAH7AUAAAAABhwIBAAAAAYwCQAAAAAGwAgEAAAABARkAAGkAIAXvAQEAAAAB-wFAAAAAAYcCAQAAAAGMAkAAAAABsAIBAAAAAQEZAABrADABGQAAawAwBe8BAQC_AwAh-wFAAMMDACGHAgEAvwMAIYwCQADDAwAhsAIBAL8DACECAAAAYQAgGQAAbgAgBe8BAQC_AwAh-wFAAMMDACGHAgEAvwMAIYwCQADDAwAhsAIBAL8DACECAAAAZAAgGQAAcAAgAgAAAGQAIBkAAHAAIAMAAABhACAgAABpACAhAABuACABAAAAYQAgAQAAAGQAIAMGAADgBAAgJgAA4gQAICcAAOEEACAI7AEAAJsDADDtAQAAdwAQ7gEAAJsDADDvAQEA5QIAIfsBQADpAgAhhwIBAOUCACGMAkAA6QIAIbACAQDlAgAhAwAAAGQAIAEAAHYAMCUAAHcAIAMAAABkACABAABlADACAABhACAH7AEAAJoDADDtAQAAfQAQ7gEAAJoDADD7AUAAjQMAIa0CAQAAAAGuAgEAiAMAIa8CQACNAwAhAQAAAHoAIAEAAAB6ACAH7AEAAJoDADDtAQAAfQAQ7gEAAJoDADD7AUAAjQMAIa0CAQCIAwAhrgIBAIgDACGvAkAAjQMAIQADAAAAfQAgAQAAfgAwAgAAegAgAwAAAH0AIAEAAH4AMAIAAHoAIAMAAAB9ACABAAB-ADACAAB6ACAE-wFAAAAAAa0CAQAAAAGuAgEAAAABrwJAAAAAAQEZAACCAQAgBPsBQAAAAAGtAgEAAAABrgIBAAAAAa8CQAAAAAEBGQAAhAEAMAEZAACEAQAwBPsBQADDAwAhrQIBAL8DACGuAgEAvwMAIa8CQADDAwAhAgAAAHoAIBkAAIcBACAE-wFAAMMDACGtAgEAvwMAIa4CAQC_AwAhrwJAAMMDACECAAAAfQAgGQAAiQEAIAIAAAB9ACAZAACJAQAgAwAAAHoAICAAAIIBACAhAACHAQAgAQAAAHoAIAEAAAB9ACADBgAA3QQAICYAAN8EACAnAADeBAAgB-wBAACZAwAw7QEAAJABABDuAQAAmQMAMPsBQADpAgAhrQIBAOUCACGuAgEA5QIAIa8CQADpAgAhAwAAAH0AIAEAAI8BADAlAACQAQAgAwAAAH0AIAEAAH4AMAIAAHoAIA4ZAACYAwAg7AEAAJcDADDtAQAAlgEAEO4BAACXAwAw7wEBAAAAAfsBQACNAwAhhwIBAIgDACGMAkAAjQMAIY8CAQCIAwAhqAIBAIgDACGpAkAAjQMAIaoCAQCJAwAhqwJAAIsDACGsAkAAiwMAIQEAAACTAQAgAQAAAJMBACAOGQAAmAMAIOwBAACXAwAw7QEAAJYBABDuAQAAlwMAMO8BAQCIAwAh-wFAAI0DACGHAgEAiAMAIYwCQACNAwAhjwIBAIgDACGoAgEAiAMAIakCQACNAwAhqgIBAIkDACGrAkAAiwMAIawCQACLAwAhA6oCAAC5AwAgqwIAALkDACCsAgAAuQMAIAMAAACWAQAgAQAAlwEAMAIAAJMBACADAAAAlgEAIAEAAJcBADACAACTAQAgAwAAAJYBACABAACXAQAwAgAAkwEAIAsZgAAAAAHvAQEAAAAB-wFAAAAAAYcCAQAAAAGMAkAAAAABjwIBAAAAAagCAQAAAAGpAkAAAAABqgIBAAAAAasCQAAAAAGsAkAAAAABARkAAJsBACALGYAAAAAB7wEBAAAAAfsBQAAAAAGHAgEAAAABjAJAAAAAAY8CAQAAAAGoAgEAAAABqQJAAAAAAaoCAQAAAAGrAkAAAAABrAJAAAAAAQEZAACdAQAwARkAAJ0BADALGYAAAAAB7wEBAL8DACH7AUAAwwMAIYcCAQC_AwAhjAJAAMMDACGPAgEAvwMAIagCAQC_AwAhqQJAAMMDACGqAgEAwAMAIasCQADjAwAhrAJAAOMDACECAAAAkwEAIBkAAKABACALGYAAAAAB7wEBAL8DACH7AUAAwwMAIYcCAQC_AwAhjAJAAMMDACGPAgEAvwMAIagCAQC_AwAhqQJAAMMDACGqAgEAwAMAIasCQADjAwAhrAJAAOMDACECAAAAlgEAIBkAAKIBACACAAAAlgEAIBkAAKIBACADAAAAkwEAICAAAJsBACAhAACgAQAgAQAAAJMBACABAAAAlgEAIAYGAADaBAAgJgAA3AQAICcAANsEACCqAgAAuQMAIKsCAAC5AwAgrAIAALkDACAOGQAAlQMAIOwBAACUAwAw7QEAAKkBABDuAQAAlAMAMO8BAQDlAgAh-wFAAOkCACGHAgEA5QIAIYwCQADpAgAhjwIBAOUCACGoAgEA5QIAIakCQADpAgAhqgIBAOYCACGrAkAA-wIAIawCQAD7AgAhAwAAAJYBACABAACoAQAwJQAAqQEAIAMAAACWAQAgAQAAlwEAMAIAAJMBACAPBAAAkwMAIAoAAI8DACDsAQAAkgMAMO0BAAAOABDuAQAAkgMAMPcBAQAAAAH7AUAAjQMAIYwCQACNAwAhlAIBAIkDACGWAgEAiQMAIZgCAQCIAwAhmQIBAIkDACGcAgAAjAMAIKYCAgCKAwAhpwJAAIsDACEBAAAArAEAIAEAAACsAQAgCAQAANkEACAKAAC5BAAglAIAALkDACCWAgAAuQMAIJkCAAC5AwAgnAIAALkDACCmAgAAuQMAIKcCAAC5AwAgAwAAAA4AIAEAAK8BADACAACsAQAgAwAAAA4AIAEAAK8BADACAACsAQAgAwAAAA4AIAEAAK8BADACAACsAQAgDAQAANcEACAKAADYBAAg9wEBAAAAAfsBQAAAAAGMAkAAAAABlAIBAAAAAZYCAQAAAAGYAgEAAAABmQIBAAAAAZwCgAAAAAGmAgIAAAABpwJAAAAAAQEZAACzAQAgCvcBAQAAAAH7AUAAAAABjAJAAAAAAZQCAQAAAAGWAgEAAAABmAIBAAAAAZkCAQAAAAGcAoAAAAABpgICAAAAAacCQAAAAAEBGQAAtQEAMAEZAAC1AQAwDAQAAMAEACAKAADBBAAg9wEBAL8DACH7AUAAwwMAIYwCQADDAwAhlAIBAMADACGWAgEAwAMAIZgCAQC_AwAhmQIBAMADACGcAoAAAAABpgICAPsDACGnAkAA4wMAIQIAAACsAQAgGQAAuAEAIAr3AQEAvwMAIfsBQADDAwAhjAJAAMMDACGUAgEAwAMAIZYCAQDAAwAhmAIBAL8DACGZAgEAwAMAIZwCgAAAAAGmAgIA-wMAIacCQADjAwAhAgAAAA4AIBkAALoBACACAAAADgAgGQAAugEAIAMAAACsAQAgIAAAswEAICEAALgBACABAAAArAEAIAEAAAAOACALBgAAuwQAICYAAL4EACAnAAC9BAAgeAAAvAQAIHkAAL8EACCUAgAAuQMAIJYCAAC5AwAgmQIAALkDACCcAgAAuQMAIKYCAAC5AwAgpwIAALkDACAN7AEAAJEDADDtAQAAwQEAEO4BAACRAwAw9wEBAOUCACH7AUAA6QIAIYwCQADpAgAhlAIBAOYCACGWAgEA5gIAIZgCAQDlAgAhmQIBAOYCACGcAgAAhQMAIKYCAgCBAwAhpwJAAPsCACEDAAAADgAgAQAAwAEAMCUAAMEBACADAAAADgAgAQAArwEAMAIAAKwBACAQBAAAjgMAIAoAAI8DACANAACQAwAg7AEAAIcDADDtAQAAEAAQ7gEAAIcDADD4AQEAAAAB-wFAAI0DACGMAkAAjQMAIZQCAQCJAwAhlgIBAIkDACGYAgEAiAMAIZkCAQCJAwAhmgICAIoDACGbAkAAiwMAIZwCAACMAwAgAQAAAMQBACABAAAAxAEAIAkEAAC4BAAgCgAAuQQAIA0AALoEACCUAgAAuQMAIJYCAAC5AwAgmQIAALkDACCaAgAAuQMAIJsCAAC5AwAgnAIAALkDACADAAAAEAAgAQAAxwEAMAIAAMQBACADAAAAEAAgAQAAxwEAMAIAAMQBACADAAAAEAAgAQAAxwEAMAIAAMQBACANBAAAtQQAIAoAALYEACANAAC3BAAg-AEBAAAAAfsBQAAAAAGMAkAAAAABlAIBAAAAAZYCAQAAAAGYAgEAAAABmQIBAAAAAZoCAgAAAAGbAkAAAAABnAKAAAAAAQEZAADLAQAgCvgBAQAAAAH7AUAAAAABjAJAAAAAAZQCAQAAAAGWAgEAAAABmAIBAAAAAZkCAQAAAAGaAgIAAAABmwJAAAAAAZwCgAAAAAEBGQAAzQEAMAEZAADNAQAwDQQAAJEEACAKAACSBAAgDQAAkwQAIPgBAQC_AwAh-wFAAMMDACGMAkAAwwMAIZQCAQDAAwAhlgIBAMADACGYAgEAvwMAIZkCAQDAAwAhmgICAPsDACGbAkAA4wMAIZwCgAAAAAECAAAAxAEAIBkAANABACAK-AEBAL8DACH7AUAAwwMAIYwCQADDAwAhlAIBAMADACGWAgEAwAMAIZgCAQC_AwAhmQIBAMADACGaAgIA-wMAIZsCQADjAwAhnAKAAAAAAQIAAAAQACAZAADSAQAgAgAAABAAIBkAANIBACADAAAAxAEAICAAAMsBACAhAADQAQAgAQAAAMQBACABAAAAEAAgCwYAAIwEACAmAACPBAAgJwAAjgQAIHgAAI0EACB5AACQBAAglAIAALkDACCWAgAAuQMAIJkCAAC5AwAgmgIAALkDACCbAgAAuQMAIJwCAAC5AwAgDewBAACEAwAw7QEAANkBABDuAQAAhAMAMPgBAQDlAgAh-wFAAOkCACGMAkAA6QIAIZQCAQDmAgAhlgIBAOYCACGYAgEA5QIAIZkCAQDmAgAhmgICAIEDACGbAkAA-wIAIZwCAACFAwAgAwAAABAAIAEAANgBADAlAADZAQAgAwAAABAAIAEAAMcBADACAADEAQAgAQAAABkAIAEAAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACAMCQAAigQAIAwAAIsEACDvAQEAAAAB-AEBAAAAAfsBQAAAAAGIAgEAAAABjAJAAAAAAY0CAgAAAAGRAgIAAAABkwJAAAAAAZYCAQAAAAGXAgIAAAABARkAAOEBACAK7wEBAAAAAfgBAQAAAAH7AUAAAAABiAIBAAAAAYwCQAAAAAGNAgIAAAABkQICAAAAAZMCQAAAAAGWAgEAAAABlwICAAAAAQEZAADjAQAwARkAAOMBADAMCQAA_AMAIAwAAP0DACDvAQEAvwMAIfgBAQC_AwAh-wFAAMMDACGIAgEAvwMAIYwCQADDAwAhjQICAMIDACGRAgIAwgMAIZMCQADjAwAhlgIBAMADACGXAgIA-wMAIQIAAAAZACAZAADmAQAgCu8BAQC_AwAh-AEBAL8DACH7AUAAwwMAIYgCAQC_AwAhjAJAAMMDACGNAgIAwgMAIZECAgDCAwAhkwJAAOMDACGWAgEAwAMAIZcCAgD7AwAhAgAAABcAIBkAAOgBACACAAAAFwAgGQAA6AEAIAMAAAAZACAgAADhAQAgIQAA5gEAIAEAAAAZACABAAAAFwAgCAYAAPYDACAmAAD5AwAgJwAA-AMAIHgAAPcDACB5AAD6AwAgkwIAALkDACCWAgAAuQMAIJcCAAC5AwAgDewBAACAAwAw7QEAAO8BABDuAQAAgAMAMO8BAQDlAgAh-AEBAOUCACH7AUAA6QIAIYgCAQDlAgAhjAJAAOkCACGNAgIA6AIAIZECAgDoAgAhkwJAAPsCACGWAgEA5gIAIZcCAgCBAwAhAwAAABcAIAEAAO4BADAlAADvAQAgAwAAABcAIAEAABgAMAIAABkAIAEAAAAdACABAAAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgDQsAAPUDACDvAQEAAAAB-AEBAAAAAfsBQAAAAAGIAgEAAAABjAJAAAAAAY0CAgAAAAGOAgIAAAABkQICAAAAAZICAQAAAAGTAkAAAAABlAIBAAAAAZUCAQAAAAEBGQAA9wEAIAzvAQEAAAAB-AEBAAAAAfsBQAAAAAGIAgEAAAABjAJAAAAAAY0CAgAAAAGOAgIAAAABkQICAAAAAZICAQAAAAGTAkAAAAABlAIBAAAAAZUCAQAAAAEBGQAA-QEAMAEZAAD5AQAwDQsAAPQDACDvAQEAvwMAIfgBAQC_AwAh-wFAAMMDACGIAgEAvwMAIYwCQADDAwAhjQICAMIDACGOAgIAwgMAIZECAgDCAwAhkgIBAL8DACGTAkAA4wMAIZQCAQDAAwAhlQIBAMADACECAAAAHQAgGQAA_AEAIAzvAQEAvwMAIfgBAQC_AwAh-wFAAMMDACGIAgEAvwMAIYwCQADDAwAhjQICAMIDACGOAgIAwgMAIZECAgDCAwAhkgIBAL8DACGTAkAA4wMAIZQCAQDAAwAhlQIBAMADACECAAAAGwAgGQAA_gEAIAIAAAAbACAZAAD-AQAgAwAAAB0AICAAAPcBACAhAAD8AQAgAQAAAB0AIAEAAAAbACAIBgAA7wMAICYAAPIDACAnAADxAwAgeAAA8AMAIHkAAPMDACCTAgAAuQMAIJQCAAC5AwAglQIAALkDACAP7AEAAP8CADDtAQAAhQIAEO4BAAD_AgAw7wEBAOUCACH4AQEA5QIAIfsBQADpAgAhiAIBAOUCACGMAkAA6QIAIY0CAgDoAgAhjgICAOgCACGRAgIA6AIAIZICAQDlAgAhkwJAAPsCACGUAgEA5gIAIZUCAQDmAgAhAwAAABsAIAEAAIQCADAlAACFAgAgAwAAABsAIAEAABwAMAIAAB0AIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgDAMAAO0DACAIAADuAwAg7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfcBAQAAAAH7AUAAAAABhwIBAAAAAYwCQAAAAAGPAgEAAAABkAJAAAAAAQEZAACNAgAgCu8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH3AQEAAAAB-wFAAAAAAYcCAQAAAAGMAkAAAAABjwIBAAAAAZACQAAAAAEBGQAAjwIAMAEZAACPAgAwDAMAAOsDACAIAADsAwAg7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAL8DACH3AQEAvwMAIfsBQADDAwAhhwIBAL8DACGMAkAAwwMAIY8CAQC_AwAhkAJAAOMDACECAAAABQAgGQAAkgIAIArvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAvwMAIfcBAQC_AwAh-wFAAMMDACGHAgEAvwMAIYwCQADDAwAhjwIBAL8DACGQAkAA4wMAIQIAAAADACAZAACUAgAgAgAAAAMAIBkAAJQCACADAAAABQAgIAAAjQIAICEAAJICACABAAAABQAgAQAAAAMAIAQGAADoAwAgJgAA6gMAICcAAOkDACCQAgAAuQMAIA3sAQAA_gIAMO0BAACbAgAQ7gEAAP4CADDvAQEA5QIAIfABAQDlAgAh8QEBAOUCACHyAQEA5QIAIfcBAQDlAgAh-wFAAOkCACGHAgEA5QIAIYwCQADpAgAhjwIBAOUCACGQAkAA-wIAIQMAAAADACABAACaAgAwJQAAmwIAIAMAAAADACABAAAEADACAAAFACABAAAAFAAgAQAAABQAIAMAAAASACABAAATADACAAAUACADAAAAEgAgAQAAEwAwAgAAFAAgAwAAABIAIAEAABMAMAIAABQAIA4DAADmAwAgCQAA5wMAIO8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH4AQEAAAAB-wFAAAAAAYcCAQAAAAGMAkAAAAABjQICAAAAAY4CAgAAAAGPAgEAAAABkAJAAAAAAQEZAACjAgAgDO8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH4AQEAAAAB-wFAAAAAAYcCAQAAAAGMAkAAAAABjQICAAAAAY4CAgAAAAGPAgEAAAABkAJAAAAAAQEZAAClAgAwARkAAKUCADAOAwAA5AMAIAkAAOUDACDvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAvwMAIfgBAQC_AwAh-wFAAMMDACGHAgEAvwMAIYwCQADDAwAhjQICAMIDACGOAgIAwgMAIY8CAQC_AwAhkAJAAOMDACECAAAAFAAgGQAAqAIAIAzvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAvwMAIfgBAQC_AwAh-wFAAMMDACGHAgEAvwMAIYwCQADDAwAhjQICAMIDACGOAgIAwgMAIY8CAQC_AwAhkAJAAOMDACECAAAAEgAgGQAAqgIAIAIAAAASACAZAACqAgAgAwAAABQAICAAAKMCACAhAACoAgAgAQAAABQAIAEAAAASACAGBgAA3gMAICYAAOEDACAnAADgAwAgeAAA3wMAIHkAAOIDACCQAgAAuQMAIA_sAQAA-gIAMO0BAACxAgAQ7gEAAPoCADDvAQEA5QIAIfABAQDlAgAh8QEBAOUCACHyAQEA5QIAIfgBAQDlAgAh-wFAAOkCACGHAgEA5QIAIYwCQADpAgAhjQICAOgCACGOAgIA6AIAIY8CAQDlAgAhkAJAAPsCACEDAAAAEgAgAQAAsAIAMCUAALECACADAAAAEgAgAQAAEwAwAgAAFAAgAQAAACgAIAEAAAAoACADAAAAJgAgAQAAJwAwAgAAKAAgAwAAACYAIAEAACcAMAIAACgAIAMAAAAmACABAAAnADACAAAoACANAwAA3AMAIAUAAN0DACDvAQEAAAAB8AEBAAAAAfEBAQAAAAHyAQEAAAAB-wFAAAAAAYcCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAJAAAAAAQEZAAC5AgAgC-8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH7AUAAAAABhwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCIAAAAAGMAkAAAAABARkAALsCADABGQAAuwIAMA0DAADOAwAgBQAAzwMAIO8BAQC_AwAh8AEBAL8DACHxAQEAvwMAIfIBAQDAAwAh-wFAAMMDACGHAgEAvwMAIYgCAQC_AwAhiQIBAMADACGKAgEAvwMAIYsCIADNAwAhjAJAAMMDACECAAAAKAAgGQAAvgIAIAvvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAwAMAIfsBQADDAwAhhwIBAL8DACGIAgEAvwMAIYkCAQDAAwAhigIBAL8DACGLAiAAzQMAIYwCQADDAwAhAgAAACYAIBkAAMACACACAAAAJgAgGQAAwAIAIAMAAAAoACAgAAC5AgAgIQAAvgIAIAEAAAAoACABAAAAJgAgBQYAAMoDACAmAADMAwAgJwAAywMAIPIBAAC5AwAgiQIAALkDACAO7AEAAPYCADDtAQAAxwIAEO4BAAD2AgAw7wEBAOUCACHwAQEA5QIAIfEBAQDlAgAh8gEBAOYCACH7AUAA6QIAIYcCAQDlAgAhiAIBAOUCACGJAgEA5gIAIYoCAQDlAgAhiwIgAPcCACGMAkAA6QIAIQMAAAAmACABAADGAgAwJQAAxwIAIAMAAAAmACABAAAnADACAAAoACABAAAACgAgAQAAAAoAIAMAAAAIACABAAAJADACAAAKACADAAAACAAgAQAACQAwAgAACgAgAwAAAAgAIAEAAAkAMAIAAAoAIA8HAADHAwAgCAAAyAMAIAkAAMkDACDvAQEAAAAB8AEBAAAAAfEBAQAAAAHyAQEAAAAB8wEBAAAAAfUBAAAA9QEC9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAgAAAAH7AUAAAAABARkAAM8CACAM7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfMBAQAAAAH1AQAAAPUBAvYBAQAAAAH3AQEAAAAB-AEBAAAAAfkBAQAAAAH6AQIAAAAB-wFAAAAAAQEZAADRAgAwARkAANECADABAAAADgAgAQAAABAAIA8HAADEAwAgCAAAxQMAIAkAAMYDACDvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAwAMAIfMBAQC_AwAh9QEAAMED9QEi9gEBAL8DACH3AQEAwAMAIfgBAQDAAwAh-QEBAMADACH6AQIAwgMAIfsBQADDAwAhAgAAAAoAIBkAANYCACAM7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAMADACHzAQEAvwMAIfUBAADBA_UBIvYBAQC_AwAh9wEBAMADACH4AQEAwAMAIfkBAQDAAwAh-gECAMIDACH7AUAAwwMAIQIAAAAIACAZAADYAgAgAgAAAAgAIBkAANgCACABAAAADgAgAQAAABAAIAMAAAAKACAgAADPAgAgIQAA1gIAIAEAAAAKACABAAAACAAgCQYAALoDACAmAAC9AwAgJwAAvAMAIHgAALsDACB5AAC-AwAg8gEAALkDACD3AQAAuQMAIPgBAAC5AwAg-QEAALkDACAP7AEAAOQCADDtAQAA4QIAEO4BAADkAgAw7wEBAOUCACHwAQEA5QIAIfEBAQDlAgAh8gEBAOYCACHzAQEA5QIAIfUBAADnAvUBIvYBAQDlAgAh9wEBAOYCACH4AQEA5gIAIfkBAQDmAgAh-gECAOgCACH7AUAA6QIAIQMAAAAIACABAADgAgAwJQAA4QIAIAMAAAAIACABAAAJADACAAAKACAP7AEAAOQCADDtAQAA4QIAEO4BAADkAgAw7wEBAOUCACHwAQEA5QIAIfEBAQDlAgAh8gEBAOYCACHzAQEA5QIAIfUBAADnAvUBIvYBAQDlAgAh9wEBAOYCACH4AQEA5gIAIfkBAQDmAgAh-gECAOgCACH7AUAA6QIAIQ4GAADrAgAgJgAA9QIAICcAAPUCACD8AQEAAAAB_QEBAAAABP4BAQAAAAT_AQEAAAABgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAPQCACGEAgEAAAABhQIBAAAAAYYCAQAAAAEOBgAA8gIAICYAAPMCACAnAADzAgAg_AEBAAAAAf0BAQAAAAX-AQEAAAAF_wEBAAAAAYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQDxAgAhhAIBAAAAAYUCAQAAAAGGAgEAAAABBwYAAOsCACAmAADwAgAgJwAA8AIAIPwBAAAA9QEC_QEAAAD1AQj-AQAAAPUBCIMCAADvAvUBIg0GAADrAgAgJgAA6wIAICcAAOsCACB4AADuAgAgeQAA6wIAIPwBAgAAAAH9AQIAAAAE_gECAAAABP8BAgAAAAGAAgIAAAABgQICAAAAAYICAgAAAAGDAgIA7QIAIQsGAADrAgAgJgAA7AIAICcAAOwCACD8AUAAAAAB_QFAAAAABP4BQAAAAAT_AUAAAAABgAJAAAAAAYECQAAAAAGCAkAAAAABgwJAAOoCACELBgAA6wIAICYAAOwCACAnAADsAgAg_AFAAAAAAf0BQAAAAAT-AUAAAAAE_wFAAAAAAYACQAAAAAGBAkAAAAABggJAAAAAAYMCQADqAgAhCPwBAgAAAAH9AQIAAAAE_gECAAAABP8BAgAAAAGAAgIAAAABgQICAAAAAYICAgAAAAGDAgIA6wIAIQj8AUAAAAAB_QFAAAAABP4BQAAAAAT_AUAAAAABgAJAAAAAAYECQAAAAAGCAkAAAAABgwJAAOwCACENBgAA6wIAICYAAOsCACAnAADrAgAgeAAA7gIAIHkAAOsCACD8AQIAAAAB_QECAAAABP4BAgAAAAT_AQIAAAABgAICAAAAAYECAgAAAAGCAgIAAAABgwICAO0CACEI_AEIAAAAAf0BCAAAAAT-AQgAAAAE_wEIAAAAAYACCAAAAAGBAggAAAABggIIAAAAAYMCCADuAgAhBwYAAOsCACAmAADwAgAgJwAA8AIAIPwBAAAA9QEC_QEAAAD1AQj-AQAAAPUBCIMCAADvAvUBIgT8AQAAAPUBAv0BAAAA9QEI_gEAAAD1AQiDAgAA8AL1ASIOBgAA8gIAICYAAPMCACAnAADzAgAg_AEBAAAAAf0BAQAAAAX-AQEAAAAF_wEBAAAAAYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQDxAgAhhAIBAAAAAYUCAQAAAAGGAgEAAAABCPwBAgAAAAH9AQIAAAAF_gECAAAABf8BAgAAAAGAAgIAAAABgQICAAAAAYICAgAAAAGDAgIA8gIAIQv8AQEAAAAB_QEBAAAABf4BAQAAAAX_AQEAAAABgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAPMCACGEAgEAAAABhQIBAAAAAYYCAQAAAAEOBgAA6wIAICYAAPUCACAnAAD1AgAg_AEBAAAAAf0BAQAAAAT-AQEAAAAE_wEBAAAAAYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQD0AgAhhAIBAAAAAYUCAQAAAAGGAgEAAAABC_wBAQAAAAH9AQEAAAAE_gEBAAAABP8BAQAAAAGAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEA9QIAIYQCAQAAAAGFAgEAAAABhgIBAAAAAQ7sAQAA9gIAMO0BAADHAgAQ7gEAAPYCADDvAQEA5QIAIfABAQDlAgAh8QEBAOUCACHyAQEA5gIAIfsBQADpAgAhhwIBAOUCACGIAgEA5QIAIYkCAQDmAgAhigIBAOUCACGLAiAA9wIAIYwCQADpAgAhBQYAAOsCACAmAAD5AgAgJwAA-QIAIPwBIAAAAAGDAiAA-AIAIQUGAADrAgAgJgAA-QIAICcAAPkCACD8ASAAAAABgwIgAPgCACEC_AEgAAAAAYMCIAD5AgAhD-wBAAD6AgAw7QEAALECABDuAQAA-gIAMO8BAQDlAgAh8AEBAOUCACHxAQEA5QIAIfIBAQDlAgAh-AEBAOUCACH7AUAA6QIAIYcCAQDlAgAhjAJAAOkCACGNAgIA6AIAIY4CAgDoAgAhjwIBAOUCACGQAkAA-wIAIQsGAADyAgAgJgAA_QIAICcAAP0CACD8AUAAAAAB_QFAAAAABf4BQAAAAAX_AUAAAAABgAJAAAAAAYECQAAAAAGCAkAAAAABgwJAAPwCACELBgAA8gIAICYAAP0CACAnAAD9AgAg_AFAAAAAAf0BQAAAAAX-AUAAAAAF_wFAAAAAAYACQAAAAAGBAkAAAAABggJAAAAAAYMCQAD8AgAhCPwBQAAAAAH9AUAAAAAF_gFAAAAABf8BQAAAAAGAAkAAAAABgQJAAAAAAYICQAAAAAGDAkAA_QIAIQ3sAQAA_gIAMO0BAACbAgAQ7gEAAP4CADDvAQEA5QIAIfABAQDlAgAh8QEBAOUCACHyAQEA5QIAIfcBAQDlAgAh-wFAAOkCACGHAgEA5QIAIYwCQADpAgAhjwIBAOUCACGQAkAA-wIAIQ_sAQAA_wIAMO0BAACFAgAQ7gEAAP8CADDvAQEA5QIAIfgBAQDlAgAh-wFAAOkCACGIAgEA5QIAIYwCQADpAgAhjQICAOgCACGOAgIA6AIAIZECAgDoAgAhkgIBAOUCACGTAkAA-wIAIZQCAQDmAgAhlQIBAOYCACEN7AEAAIADADDtAQAA7wEAEO4BAACAAwAw7wEBAOUCACH4AQEA5QIAIfsBQADpAgAhiAIBAOUCACGMAkAA6QIAIY0CAgDoAgAhkQICAOgCACGTAkAA-wIAIZYCAQDmAgAhlwICAIEDACENBgAA8gIAICYAAPICACAnAADyAgAgeAAAgwMAIHkAAPICACD8AQIAAAAB_QECAAAABf4BAgAAAAX_AQIAAAABgAICAAAAAYECAgAAAAGCAgIAAAABgwICAIIDACENBgAA8gIAICYAAPICACAnAADyAgAgeAAAgwMAIHkAAPICACD8AQIAAAAB_QECAAAABf4BAgAAAAX_AQIAAAABgAICAAAAAYECAgAAAAGCAgIAAAABgwICAIIDACEI_AEIAAAAAf0BCAAAAAX-AQgAAAAF_wEIAAAAAYACCAAAAAGBAggAAAABggIIAAAAAYMCCACDAwAhDewBAACEAwAw7QEAANkBABDuAQAAhAMAMPgBAQDlAgAh-wFAAOkCACGMAkAA6QIAIZQCAQDmAgAhlgIBAOYCACGYAgEA5QIAIZkCAQDmAgAhmgICAIEDACGbAkAA-wIAIZwCAACFAwAgDwYAAPICACAmAACGAwAgJwAAhgMAIPwBgAAAAAH_AYAAAAABgAKAAAAAAYECgAAAAAGCAoAAAAABgwKAAAAAAZ0CAQAAAAGeAgEAAAABnwIBAAAAAaACgAAAAAGhAoAAAAABogKAAAAAAQz8AYAAAAAB_wGAAAAAAYACgAAAAAGBAoAAAAABggKAAAAAAYMCgAAAAAGdAgEAAAABngIBAAAAAZ8CAQAAAAGgAoAAAAABoQKAAAAAAaICgAAAAAEQBAAAjgMAIAoAAI8DACANAACQAwAg7AEAAIcDADDtAQAAEAAQ7gEAAIcDADD4AQEAiAMAIfsBQACNAwAhjAJAAI0DACGUAgEAiQMAIZYCAQCJAwAhmAIBAIgDACGZAgEAiQMAIZoCAgCKAwAhmwJAAIsDACGcAgAAjAMAIAv8AQEAAAAB_QEBAAAABP4BAQAAAAT_AQEAAAABgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAPUCACGEAgEAAAABhQIBAAAAAYYCAQAAAAEL_AEBAAAAAf0BAQAAAAX-AQEAAAAF_wEBAAAAAYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQDzAgAhhAIBAAAAAYUCAQAAAAGGAgEAAAABCPwBAgAAAAH9AQIAAAAF_gECAAAABf8BAgAAAAGAAgIAAAABgQICAAAAAYICAgAAAAGDAgIA8gIAIQj8AUAAAAAB_QFAAAAABf4BQAAAAAX_AUAAAAABgAJAAAAAAYECQAAAAAGCAkAAAAABgwJAAP0CACEM_AGAAAAAAf8BgAAAAAGAAoAAAAABgQKAAAAAAYICgAAAAAGDAoAAAAABnQIBAAAAAZ4CAQAAAAGfAgEAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABCPwBQAAAAAH9AUAAAAAE_gFAAAAABP8BQAAAAAGAAkAAAAABgQJAAAAAAYICQAAAAAGDAkAA7AIAIQOjAgAAEgAgpAIAABIAIKUCAAASACADowIAAAgAIKQCAAAIACClAgAACAAgA6MCAAAXACCkAgAAFwAgpQIAABcAIA3sAQAAkQMAMO0BAADBAQAQ7gEAAJEDADD3AQEA5QIAIfsBQADpAgAhjAJAAOkCACGUAgEA5gIAIZYCAQDmAgAhmAIBAOUCACGZAgEA5gIAIZwCAACFAwAgpgICAIEDACGnAkAA-wIAIQ8EAACTAwAgCgAAjwMAIOwBAACSAwAw7QEAAA4AEO4BAACSAwAw9wEBAIgDACH7AUAAjQMAIYwCQACNAwAhlAIBAIkDACGWAgEAiQMAIZgCAQCIAwAhmQIBAIkDACGcAgAAjAMAIKYCAgCKAwAhpwJAAIsDACEDowIAAAMAIKQCAAADACClAgAAAwAgDhkAAJUDACDsAQAAlAMAMO0BAACpAQAQ7gEAAJQDADDvAQEA5QIAIfsBQADpAgAhhwIBAOUCACGMAkAA6QIAIY8CAQDlAgAhqAIBAOUCACGpAkAA6QIAIaoCAQDmAgAhqwJAAPsCACGsAkAA-wIAIQ8GAADrAgAgJgAAlgMAICcAAJYDACD8AYAAAAAB_wGAAAAAAYACgAAAAAGBAoAAAAABggKAAAAAAYMCgAAAAAGdAgEAAAABngIBAAAAAZ8CAQAAAAGgAoAAAAABoQKAAAAAAaICgAAAAAEM_AGAAAAAAf8BgAAAAAGAAoAAAAABgQKAAAAAAYICgAAAAAGDAoAAAAABnQIBAAAAAZ4CAQAAAAGfAgEAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABDhkAAJgDACDsAQAAlwMAMO0BAACWAQAQ7gEAAJcDADDvAQEAiAMAIfsBQACNAwAhhwIBAIgDACGMAkAAjQMAIY8CAQCIAwAhqAIBAIgDACGpAkAAjQMAIaoCAQCJAwAhqwJAAIsDACGsAkAAiwMAIQz8AYAAAAAB_wGAAAAAAYACgAAAAAGBAoAAAAABggKAAAAAAYMCgAAAAAGdAgEAAAABngIBAAAAAZ8CAQAAAAGgAoAAAAABoQKAAAAAAaICgAAAAAEH7AEAAJkDADDtAQAAkAEAEO4BAACZAwAw-wFAAOkCACGtAgEA5QIAIa4CAQDlAgAhrwJAAOkCACEH7AEAAJoDADDtAQAAfQAQ7gEAAJoDADD7AUAAjQMAIa0CAQCIAwAhrgIBAIgDACGvAkAAjQMAIQjsAQAAmwMAMO0BAAB3ABDuAQAAmwMAMO8BAQDlAgAh-wFAAOkCACGHAgEA5QIAIYwCQADpAgAhsAIBAOUCACEI7AEAAJwDADDtAQAAZAAQ7gEAAJwDADDvAQEAiAMAIfsBQACNAwAhhwIBAIgDACGMAkAAjQMAIbACAQCIAwAhCewBAACdAwAw7QEAAF4AEO4BAACdAwAw8AEBAOYCACHxAQEA5gIAIfIBAQDmAgAh-wFAAOkCACGxAgEA5QIAIbICAQDlAgAhE-wBAACeAwAw7QEAAEgAEO4BAACeAwAw-wFAAOkCACGMAkAA6QIAIbMCAQDlAgAhtAIBAOUCACG1AgEA5gIAIbYCAQDmAgAhtwIBAOYCACG4AgEA5gIAIbkCAQDmAgAhugIBAOYCACG7AgEA5gIAIbwCAQDmAgAhvQJAAPsCACG-AgEA5QIAIb8CAQDlAgAhwAJAAPsCACEYDgAAkwMAIA8AAI4DACAQAACgAwAgEgAAoQMAIBMAAKEDACDsAQAAnwMAMO0BAAA1ABDuAQAAnwMAMPsBQACNAwAhjAJAAI0DACGzAgEAiAMAIbQCAQCIAwAhtQIBAIkDACG2AgEAiQMAIbcCAQCJAwAhuAIBAIkDACG5AgEAiQMAIboCAQCJAwAhuwIBAIkDACG8AgEAiQMAIb0CQACLAwAhvgIBAIgDACG_AgEAiAMAIcACQACLAwAhA6MCAAAmACCkAgAAJgAgpQIAACYAIAOjAgAAKgAgpAIAACoAIKUCAAAqACACsQIBAAAAAbICAQAAAAELEQAApAMAIBIAAKQDACDsAQAAowMAMO0BAAAqABDuAQAAowMAMPABAQCJAwAh8QEBAIkDACHyAQEAiQMAIfsBQACNAwAhsQIBAIgDACGyAgEAiAMAIRoOAACTAwAgDwAAjgMAIBAAAKADACASAAChAwAgEwAAoQMAIOwBAACfAwAw7QEAADUAEO4BAACfAwAw-wFAAI0DACGMAkAAjQMAIbMCAQCIAwAhtAIBAIgDACG1AgEAiQMAIbYCAQCJAwAhtwIBAIkDACG4AgEAiQMAIbkCAQCJAwAhugIBAIkDACG7AgEAiQMAIbwCAQCJAwAhvQJAAIsDACG-AgEAiAMAIb8CAQCIAwAhwAJAAIsDACHGAgAANQAgxwIAADUAIAKHAgEAAAABigIBAAAAARADAACkAwAgBQAAjwMAIOwBAACmAwAw7QEAACYAEO4BAACmAwAw7wEBAIgDACHwAQEAiAMAIfEBAQCIAwAh8gEBAIkDACH7AUAAjQMAIYcCAQCIAwAhiAIBAIgDACGJAgEAiQMAIYoCAQCIAwAhiwIgAKcDACGMAkAAjQMAIQL8ASAAAAABgwIgAPkCACED-AEBAAAAAY0CAgAAAAGOAgIAAAABEAsAAKsDACDsAQAAqQMAMO0BAAAbABDuAQAAqQMAMO8BAQCIAwAh-AEBAIgDACH7AUAAjQMAIYgCAQCIAwAhjAJAAI0DACGNAgIAqgMAIY4CAgCqAwAhkQICAKoDACGSAgEAiAMAIZMCQACLAwAhlAIBAIkDACGVAgEAiQMAIQj8AQIAAAAB_QECAAAABP4BAgAAAAT_AQIAAAABgAICAAAAAYECAgAAAAGCAgIAAAABgwICAOsCACERCQAArgMAIAwAAK8DACDsAQAArQMAMO0BAAAXABDuAQAArQMAMO8BAQCIAwAh-AEBAIgDACH7AUAAjQMAIYgCAQCIAwAhjAJAAI0DACGNAgIAqgMAIZECAgCqAwAhkwJAAIsDACGWAgEAiQMAIZcCAgCKAwAhxgIAABcAIMcCAAAXACAC-AEBAAAAAY0CAgAAAAEPCQAArgMAIAwAAK8DACDsAQAArQMAMO0BAAAXABDuAQAArQMAMO8BAQCIAwAh-AEBAIgDACH7AUAAjQMAIYgCAQCIAwAhjAJAAI0DACGNAgIAqgMAIZECAgCqAwAhkwJAAIsDACGWAgEAiQMAIZcCAgCKAwAhEgQAAI4DACAKAACPAwAgDQAAkAMAIOwBAACHAwAw7QEAABAAEO4BAACHAwAw-AEBAIgDACH7AUAAjQMAIYwCQACNAwAhlAIBAIkDACGWAgEAiQMAIZgCAQCIAwAhmQIBAIkDACGaAgIAigMAIZsCQACLAwAhnAIAAIwDACDGAgAAEAAgxwIAABAAIAOjAgAAGwAgpAIAABsAIKUCAAAbACARAwAApAMAIAkAAK4DACDsAQAAsAMAMO0BAAASABDuAQAAsAMAMO8BAQCIAwAh8AEBAIgDACHxAQEAiAMAIfIBAQCIAwAh-AEBAIgDACH7AUAAjQMAIYcCAQCIAwAhjAJAAI0DACGNAgIAqgMAIY4CAgCqAwAhjwIBAIgDACGQAkAAiwMAIQPzAQEAAAAB9QEAAAD1AQL2AQEAAAABEgcAALQDACAIAAC1AwAgCQAAtgMAIOwBAACyAwAw7QEAAAgAEO4BAACyAwAw7wEBAIgDACHwAQEAiAMAIfEBAQCIAwAh8gEBAIkDACHzAQEAiAMAIfUBAACzA_UBIvYBAQCIAwAh9wEBAIkDACH4AQEAiQMAIfkBAQCJAwAh-gECAKoDACH7AUAAjQMAIQT8AQAAAPUBAv0BAAAA9QEI_gEAAAD1AQiDAgAA8AL1ASISAwAApAMAIAUAAI8DACDsAQAApgMAMO0BAAAmABDuAQAApgMAMO8BAQCIAwAh8AEBAIgDACHxAQEAiAMAIfIBAQCJAwAh-wFAAI0DACGHAgEAiAMAIYgCAQCIAwAhiQIBAIkDACGKAgEAiAMAIYsCIACnAwAhjAJAAI0DACHGAgAAJgAgxwIAACYAIBEEAACTAwAgCgAAjwMAIOwBAACSAwAw7QEAAA4AEO4BAACSAwAw9wEBAIgDACH7AUAAjQMAIYwCQACNAwAhlAIBAIkDACGWAgEAiQMAIZgCAQCIAwAhmQIBAIkDACGcAgAAjAMAIKYCAgCKAwAhpwJAAIsDACHGAgAADgAgxwIAAA4AIBIEAACOAwAgCgAAjwMAIA0AAJADACDsAQAAhwMAMO0BAAAQABDuAQAAhwMAMPgBAQCIAwAh-wFAAI0DACGMAkAAjQMAIZQCAQCJAwAhlgIBAIkDACGYAgEAiAMAIZkCAQCJAwAhmgICAIoDACGbAkAAiwMAIZwCAACMAwAgxgIAABAAIMcCAAAQACAPAwAApAMAIAgAALgDACDsAQAAtwMAMO0BAAADABDuAQAAtwMAMO8BAQCIAwAh8AEBAIgDACHxAQEAiAMAIfIBAQCIAwAh9wEBAIgDACH7AUAAjQMAIYcCAQCIAwAhjAJAAI0DACGPAgEAiAMAIZACQACLAwAhEQQAAJMDACAKAACPAwAg7AEAAJIDADDtAQAADgAQ7gEAAJIDADD3AQEAiAMAIfsBQACNAwAhjAJAAI0DACGUAgEAiQMAIZYCAQCJAwAhmAIBAIgDACGZAgEAiQMAIZwCAACMAwAgpgICAIoDACGnAkAAiwMAIcYCAAAOACDHAgAADgAgAAAAAAAAAcsCAQAAAAEBywIBAAAAAQHLAgAAAPUBAgXLAgIAAAAB0QICAAAAAdICAgAAAAHTAgIAAAAB1AICAAAAAQHLAkAAAAABBSAAAO8FACAhAAD4BQAgyAIAAPAFACDJAgAA9wUAIM4CAAAoACAHIAAA7QUAICEAAPUFACDIAgAA7gUAIMkCAAD0BQAgzAIAAA4AIM0CAAAOACDOAgAArAEAIAcgAADrBQAgIQAA8gUAIMgCAADsBQAgyQIAAPEFACDMAgAAEAAgzQIAABAAIM4CAADEAQAgAyAAAO8FACDIAgAA8AUAIM4CAAAoACADIAAA7QUAIMgCAADuBQAgzgIAAKwBACADIAAA6wUAIMgCAADsBQAgzgIAAMQBACAAAAABywIgAAAAAQUgAADlBQAgIQAA6QUAIMgCAADmBQAgyQIAAOgFACDOAgAAAQAgCyAAANADADAhAADVAwAwyAIAANEDADDJAgAA0gMAMMoCAADTAwAgywIAANQDADDMAgAA1AMAMM0CAADUAwAwzgIAANQDADDPAgAA1gMAMNACAADXAwAwDQgAAMgDACAJAADJAwAg7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfUBAAAA9QEC9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAgAAAAH7AUAAAAABAgAAAAoAICAAANsDACADAAAACgAgIAAA2wMAICEAANoDACABGQAA5wUAMBMHAAC0AwAgCAAAtQMAIAkAALYDACDsAQAAsgMAMO0BAAAIABDuAQAAsgMAMO8BAQAAAAHwAQEAAAAB8QEBAIgDACHyAQEAiQMAIfMBAQCIAwAh9QEAALMD9QEi9gEBAIgDACH3AQEAiQMAIfgBAQCJAwAh-QEBAIkDACH6AQIAqgMAIfsBQACNAwAhxQIAALEDACACAAAACgAgGQAA2gMAIAIAAADYAwAgGQAA2QMAIA_sAQAA1wMAMO0BAADYAwAQ7gEAANcDADDvAQEAiAMAIfABAQCIAwAh8QEBAIgDACHyAQEAiQMAIfMBAQCIAwAh9QEAALMD9QEi9gEBAIgDACH3AQEAiQMAIfgBAQCJAwAh-QEBAIkDACH6AQIAqgMAIfsBQACNAwAhD-wBAADXAwAw7QEAANgDABDuAQAA1wMAMO8BAQCIAwAh8AEBAIgDACHxAQEAiAMAIfIBAQCJAwAh8wEBAIgDACH1AQAAswP1ASL2AQEAiAMAIfcBAQCJAwAh-AEBAIkDACH5AQEAiQMAIfoBAgCqAwAh-wFAAI0DACEL7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAMADACH1AQAAwQP1ASL2AQEAvwMAIfcBAQDAAwAh-AEBAMADACH5AQEAwAMAIfoBAgDCAwAh-wFAAMMDACENCAAAxQMAIAkAAMYDACDvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAwAMAIfUBAADBA_UBIvYBAQC_AwAh9wEBAMADACH4AQEAwAMAIfkBAQDAAwAh-gECAMIDACH7AUAAwwMAIQ0IAADIAwAgCQAAyQMAIO8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH1AQAAAPUBAvYBAQAAAAH3AQEAAAAB-AEBAAAAAfkBAQAAAAH6AQIAAAAB-wFAAAAAAQMgAADlBQAgyAIAAOYFACDOAgAAAQAgBCAAANADADDIAgAA0QMAMMoCAADTAwAgzgIAANQDADAAAAAAAAHLAkAAAAABBSAAAN0FACAhAADjBQAgyAIAAN4FACDJAgAA4gUAIM4CAAABACAFIAAA2wUAICEAAOAFACDIAgAA3AUAIMkCAADfBQAgzgIAAMQBACADIAAA3QUAIMgCAADeBQAgzgIAAAEAIAMgAADbBQAgyAIAANwFACDOAgAAxAEAIAAAAAUgAADTBQAgIQAA2QUAIMgCAADUBQAgyQIAANgFACDOAgAAAQAgBSAAANEFACAhAADWBQAgyAIAANIFACDJAgAA1QUAIM4CAACsAQAgAyAAANMFACDIAgAA1AUAIM4CAAABACADIAAA0QUAIMgCAADSBQAgzgIAAKwBACAAAAAAAAUgAADMBQAgIQAAzwUAIMgCAADNBQAgyQIAAM4FACDOAgAAGQAgAyAAAMwFACDIAgAAzQUAIM4CAAAZACAAAAAAAAXLAgIAAAAB0QICAAAAAdICAgAAAAHTAgIAAAAB1AICAAAAAQUgAADGBQAgIQAAygUAIMgCAADHBQAgyQIAAMkFACDOAgAAxAEAIAsgAAD-AwAwIQAAgwQAMMgCAAD_AwAwyQIAAIAEADDKAgAAgQQAIMsCAACCBAAwzAIAAIIEADDNAgAAggQAMM4CAACCBAAwzwIAAIQEADDQAgAAhQQAMAvvAQEAAAAB-AEBAAAAAfsBQAAAAAGIAgEAAAABjAJAAAAAAY0CAgAAAAGOAgIAAAABkQICAAAAAZMCQAAAAAGUAgEAAAABlQIBAAAAAQIAAAAdACAgAACJBAAgAwAAAB0AICAAAIkEACAhAACIBAAgARkAAMgFADARCwAAqwMAIOwBAACpAwAw7QEAABsAEO4BAACpAwAw7wEBAAAAAfgBAQCIAwAh-wFAAI0DACGIAgEAiAMAIYwCQACNAwAhjQICAKoDACGOAgIAqgMAIZECAgAAAAGSAgEAiAMAIZMCQACLAwAhlAIBAIkDACGVAgEAiQMAIcMCAACoAwAgAgAAAB0AIBkAAIgEACACAAAAhgQAIBkAAIcEACAP7AEAAIUEADDtAQAAhgQAEO4BAACFBAAw7wEBAIgDACH4AQEAiAMAIfsBQACNAwAhiAIBAIgDACGMAkAAjQMAIY0CAgCqAwAhjgICAKoDACGRAgIAqgMAIZICAQCIAwAhkwJAAIsDACGUAgEAiQMAIZUCAQCJAwAhD-wBAACFBAAw7QEAAIYEABDuAQAAhQQAMO8BAQCIAwAh-AEBAIgDACH7AUAAjQMAIYgCAQCIAwAhjAJAAI0DACGNAgIAqgMAIY4CAgCqAwAhkQICAKoDACGSAgEAiAMAIZMCQACLAwAhlAIBAIkDACGVAgEAiQMAIQvvAQEAvwMAIfgBAQC_AwAh-wFAAMMDACGIAgEAvwMAIYwCQADDAwAhjQICAMIDACGOAgIAwgMAIZECAgDCAwAhkwJAAOMDACGUAgEAwAMAIZUCAQDAAwAhC-8BAQC_AwAh-AEBAL8DACH7AUAAwwMAIYgCAQC_AwAhjAJAAMMDACGNAgIAwgMAIY4CAgDCAwAhkQICAMIDACGTAkAA4wMAIZQCAQDAAwAhlQIBAMADACEL7wEBAAAAAfgBAQAAAAH7AUAAAAABiAIBAAAAAYwCQAAAAAGNAgIAAAABjgICAAAAAZECAgAAAAGTAkAAAAABlAIBAAAAAZUCAQAAAAEDIAAAxgUAIMgCAADHBQAgzgIAAMQBACAEIAAA_gMAMMgCAAD_AwAwygIAAIEEACDOAgAAggQAMAAAAAAACyAAAKkEADAhAACuBAAwyAIAAKoEADDJAgAAqwQAMMoCAACsBAAgywIAAK0EADDMAgAArQQAMM0CAACtBAAwzgIAAK0EADDPAgAArwQAMNACAACwBAAwCyAAAKAEADAhAACkBAAwyAIAAKEEADDJAgAAogQAMMoCAACjBAAgywIAANQDADDMAgAA1AMAMM0CAADUAwAwzgIAANQDADDPAgAApQQAMNACAADXAwAwCyAAAJQEADAhAACZBAAwyAIAAJUEADDJAgAAlgQAMMoCAACXBAAgywIAAJgEADDMAgAAmAQAMM0CAACYBAAwzgIAAJgEADDPAgAAmgQAMNACAACbBAAwCgwAAIsEACDvAQEAAAAB-wFAAAAAAYgCAQAAAAGMAkAAAAABjQICAAAAAZECAgAAAAGTAkAAAAABlgIBAAAAAZcCAgAAAAECAAAAGQAgIAAAnwQAIAMAAAAZACAgAACfBAAgIQAAngQAIAEZAADFBQAwEAkAAK4DACAMAACvAwAg7AEAAK0DADDtAQAAFwAQ7gEAAK0DADDvAQEAAAAB-AEBAIgDACH7AUAAjQMAIYgCAQCIAwAhjAJAAI0DACGNAgIAqgMAIZECAgAAAAGTAkAAiwMAIZYCAQCJAwAhlwICAIoDACHEAgAArAMAIAIAAAAZACAZAACeBAAgAgAAAJwEACAZAACdBAAgDewBAACbBAAw7QEAAJwEABDuAQAAmwQAMO8BAQCIAwAh-AEBAIgDACH7AUAAjQMAIYgCAQCIAwAhjAJAAI0DACGNAgIAqgMAIZECAgCqAwAhkwJAAIsDACGWAgEAiQMAIZcCAgCKAwAhDewBAACbBAAw7QEAAJwEABDuAQAAmwQAMO8BAQCIAwAh-AEBAIgDACH7AUAAjQMAIYgCAQCIAwAhjAJAAI0DACGNAgIAqgMAIZECAgCqAwAhkwJAAIsDACGWAgEAiQMAIZcCAgCKAwAhCe8BAQC_AwAh-wFAAMMDACGIAgEAvwMAIYwCQADDAwAhjQICAMIDACGRAgIAwgMAIZMCQADjAwAhlgIBAMADACGXAgIA-wMAIQoMAAD9AwAg7wEBAL8DACH7AUAAwwMAIYgCAQC_AwAhjAJAAMMDACGNAgIAwgMAIZECAgDCAwAhkwJAAOMDACGWAgEAwAMAIZcCAgD7AwAhCgwAAIsEACDvAQEAAAAB-wFAAAAAAYgCAQAAAAGMAkAAAAABjQICAAAAAZECAgAAAAGTAkAAAAABlgIBAAAAAZcCAgAAAAENBwAAxwMAIAgAAMgDACDvAQEAAAAB8AEBAAAAAfEBAQAAAAHyAQEAAAAB8wEBAAAAAfUBAAAA9QEC9gEBAAAAAfcBAQAAAAH5AQEAAAAB-gECAAAAAfsBQAAAAAECAAAACgAgIAAAqAQAIAMAAAAKACAgAACoBAAgIQAApwQAIAEZAADEBQAwAgAAAAoAIBkAAKcEACACAAAA2AMAIBkAAKYEACAL7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAMADACHzAQEAvwMAIfUBAADBA_UBIvYBAQC_AwAh9wEBAMADACH5AQEAwAMAIfoBAgDCAwAh-wFAAMMDACENBwAAxAMAIAgAAMUDACDvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAwAMAIfMBAQC_AwAh9QEAAMED9QEi9gEBAL8DACH3AQEAwAMAIfkBAQDAAwAh-gECAMIDACH7AUAAwwMAIQ0HAADHAwAgCAAAyAMAIO8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAHzAQEAAAAB9QEAAAD1AQL2AQEAAAAB9wEBAAAAAfkBAQAAAAH6AQIAAAAB-wFAAAAAAQwDAADmAwAg7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfsBQAAAAAGHAgEAAAABjAJAAAAAAY0CAgAAAAGOAgIAAAABjwIBAAAAAZACQAAAAAECAAAAFAAgIAAAtAQAIAMAAAAUACAgAAC0BAAgIQAAswQAIAEZAADDBQAwEQMAAKQDACAJAACuAwAg7AEAALADADDtAQAAEgAQ7gEAALADADDvAQEAAAAB8AEBAAAAAfEBAQCIAwAh8gEBAIgDACH4AQEAiAMAIfsBQACNAwAhhwIBAIgDACGMAkAAjQMAIY0CAgCqAwAhjgICAKoDACGPAgEAiAMAIZACQACLAwAhAgAAABQAIBkAALMEACACAAAAsQQAIBkAALIEACAP7AEAALAEADDtAQAAsQQAEO4BAACwBAAw7wEBAIgDACHwAQEAiAMAIfEBAQCIAwAh8gEBAIgDACH4AQEAiAMAIfsBQACNAwAhhwIBAIgDACGMAkAAjQMAIY0CAgCqAwAhjgICAKoDACGPAgEAiAMAIZACQACLAwAhD-wBAACwBAAw7QEAALEEABDuAQAAsAQAMO8BAQCIAwAh8AEBAIgDACHxAQEAiAMAIfIBAQCIAwAh-AEBAIgDACH7AUAAjQMAIYcCAQCIAwAhjAJAAI0DACGNAgIAqgMAIY4CAgCqAwAhjwIBAIgDACGQAkAAiwMAIQvvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAvwMAIfsBQADDAwAhhwIBAL8DACGMAkAAwwMAIY0CAgDCAwAhjgICAMIDACGPAgEAvwMAIZACQADjAwAhDAMAAOQDACDvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAvwMAIfsBQADDAwAhhwIBAL8DACGMAkAAwwMAIY0CAgDCAwAhjgICAMIDACGPAgEAvwMAIZACQADjAwAhDAMAAOYDACDvAQEAAAAB8AEBAAAAAfEBAQAAAAHyAQEAAAAB-wFAAAAAAYcCAQAAAAGMAkAAAAABjQICAAAAAY4CAgAAAAGPAgEAAAABkAJAAAAAAQQgAACpBAAwyAIAAKoEADDKAgAArAQAIM4CAACtBAAwBCAAAKAEADDIAgAAoQQAMMoCAACjBAAgzgIAANQDADAEIAAAlAQAMMgCAACVBAAwygIAAJcEACDOAgAAmAQAMAAAAAAAAAAACyAAAMsEADAhAADQBAAwyAIAAMwEADDJAgAAzQQAMMoCAADOBAAgywIAAM8EADDMAgAAzwQAMM0CAADPBAAwzgIAAM8EADDPAgAA0QQAMNACAADSBAAwCyAAAMIEADAhAADGBAAwyAIAAMMEADDJAgAAxAQAMMoCAADFBAAgywIAANQDADDMAgAA1AMAMM0CAADUAwAwzgIAANQDADDPAgAAxwQAMNACAADXAwAwDQcAAMcDACAJAADJAwAg7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfMBAQAAAAH1AQAAAPUBAvYBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAgAAAAH7AUAAAAABAgAAAAoAICAAAMoEACADAAAACgAgIAAAygQAICEAAMkEACABGQAAwgUAMAIAAAAKACAZAADJBAAgAgAAANgDACAZAADIBAAgC-8BAQC_AwAh8AEBAL8DACHxAQEAvwMAIfIBAQDAAwAh8wEBAL8DACH1AQAAwQP1ASL2AQEAvwMAIfgBAQDAAwAh-QEBAMADACH6AQIAwgMAIfsBQADDAwAhDQcAAMQDACAJAADGAwAg7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAMADACHzAQEAvwMAIfUBAADBA_UBIvYBAQC_AwAh-AEBAMADACH5AQEAwAMAIfoBAgDCAwAh-wFAAMMDACENBwAAxwMAIAkAAMkDACDvAQEAAAAB8AEBAAAAAfEBAQAAAAHyAQEAAAAB8wEBAAAAAfUBAAAA9QEC9gEBAAAAAfgBAQAAAAH5AQEAAAAB-gECAAAAAfsBQAAAAAEKAwAA7QMAIO8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH7AUAAAAABhwIBAAAAAYwCQAAAAAGPAgEAAAABkAJAAAAAAQIAAAAFACAgAADWBAAgAwAAAAUAICAAANYEACAhAADVBAAgARkAAMEFADAPAwAApAMAIAgAALgDACDsAQAAtwMAMO0BAAADABDuAQAAtwMAMO8BAQAAAAHwAQEAAAAB8QEBAIgDACHyAQEAiAMAIfcBAQCIAwAh-wFAAI0DACGHAgEAiAMAIYwCQACNAwAhjwIBAIgDACGQAkAAiwMAIQIAAAAFACAZAADVBAAgAgAAANMEACAZAADUBAAgDewBAADSBAAw7QEAANMEABDuAQAA0gQAMO8BAQCIAwAh8AEBAIgDACHxAQEAiAMAIfIBAQCIAwAh9wEBAIgDACH7AUAAjQMAIYcCAQCIAwAhjAJAAI0DACGPAgEAiAMAIZACQACLAwAhDewBAADSBAAw7QEAANMEABDuAQAA0gQAMO8BAQCIAwAh8AEBAIgDACHxAQEAiAMAIfIBAQCIAwAh9wEBAIgDACH7AUAAjQMAIYcCAQCIAwAhjAJAAI0DACGPAgEAiAMAIZACQACLAwAhCe8BAQC_AwAh8AEBAL8DACHxAQEAvwMAIfIBAQC_AwAh-wFAAMMDACGHAgEAvwMAIYwCQADDAwAhjwIBAL8DACGQAkAA4wMAIQoDAADrAwAg7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAL8DACH7AUAAwwMAIYcCAQC_AwAhjAJAAMMDACGPAgEAvwMAIZACQADjAwAhCgMAAO0DACDvAQEAAAAB8AEBAAAAAfEBAQAAAAHyAQEAAAAB-wFAAAAAAYcCAQAAAAGMAkAAAAABjwIBAAAAAZACQAAAAAEEIAAAywQAMMgCAADMBAAwygIAAM4EACDOAgAAzwQAMAQgAADCBAAwyAIAAMMEADDKAgAAxQQAIM4CAADUAwAwAAAAAAAAAAAAAAAAAAUgAAC5BQAgIQAAvwUAIMgCAAC6BQAgyQIAAL4FACDOAgAAAQAgBSAAALcFACAhAAC8BQAgyAIAALgFACDJAgAAuwUAIM4CAAABACADIAAAuQUAIMgCAAC6BQAgzgIAAAEAIAMgAAC3BQAgyAIAALgFACDOAgAAAQAgAAAACyAAAJwFADAhAACgBQAwyAIAAJ0FADDJAgAAngUAMMoCAACfBQAgywIAAM8EADDMAgAAzwQAMM0CAADPBAAwzgIAAM8EADDPAgAAoQUAMNACAADSBAAwCyAAAJMFADAhAACXBQAwyAIAAJQFADDJAgAAlQUAMMoCAACWBQAgywIAAK0EADDMAgAArQQAMM0CAACtBAAwzgIAAK0EADDPAgAAmAUAMNACAACwBAAwCyAAAIcFADAhAACMBQAwyAIAAIgFADDJAgAAiQUAMMoCAACKBQAgywIAAIsFADDMAgAAiwUAMM0CAACLBQAwzgIAAIsFADDPAgAAjQUAMNACAACOBQAwCyAAAP4EADAhAACCBQAwyAIAAP8EADDJAgAAgAUAMMoCAACBBQAgywIAAPYEADDMAgAA9gQAMM0CAAD2BAAwzgIAAPYEADDPAgAAgwUAMNACAAD5BAAwCyAAAPIEADAhAAD3BAAwyAIAAPMEADDJAgAA9AQAMMoCAAD1BAAgywIAAPYEADDMAgAA9gQAMM0CAAD2BAAwzgIAAPYEADDPAgAA-AQAMNACAAD5BAAwBhEAAOgEACDwAQEAAAAB8QEBAAAAAfIBAQAAAAH7AUAAAAABsQIBAAAAAQIAAAAsACAgAAD9BAAgAwAAACwAICAAAP0EACAhAAD8BAAgARkAALYFADAMEQAApAMAIBIAAKQDACDsAQAAowMAMO0BAAAqABDuAQAAowMAMPABAQCJAwAh8QEBAIkDACHyAQEAiQMAIfsBQACNAwAhsQIBAIgDACGyAgEAiAMAIcECAACiAwAgAgAAACwAIBkAAPwEACACAAAA-gQAIBkAAPsEACAJ7AEAAPkEADDtAQAA-gQAEO4BAAD5BAAw8AEBAIkDACHxAQEAiQMAIfIBAQCJAwAh-wFAAI0DACGxAgEAiAMAIbICAQCIAwAhCewBAAD5BAAw7QEAAPoEABDuAQAA-QQAMPABAQCJAwAh8QEBAIkDACHyAQEAiQMAIfsBQACNAwAhsQIBAIgDACGyAgEAiAMAIQXwAQEAwAMAIfEBAQDAAwAh8gEBAMADACH7AUAAwwMAIbECAQC_AwAhBhEAAOYEACDwAQEAwAMAIfEBAQDAAwAh8gEBAMADACH7AUAAwwMAIbECAQC_AwAhBhEAAOgEACDwAQEAAAAB8QEBAAAAAfIBAQAAAAH7AUAAAAABsQIBAAAAAQYSAADpBAAg8AEBAAAAAfEBAQAAAAHyAQEAAAAB-wFAAAAAAbICAQAAAAECAAAALAAgIAAAhgUAIAMAAAAsACAgAACGBQAgIQAAhQUAIAEZAAC1BQAwAgAAACwAIBkAAIUFACACAAAA-gQAIBkAAIQFACAF8AEBAMADACHxAQEAwAMAIfIBAQDAAwAh-wFAAMMDACGyAgEAvwMAIQYSAADnBAAg8AEBAMADACHxAQEAwAMAIfIBAQDAAwAh-wFAAMMDACGyAgEAvwMAIQYSAADpBAAg8AEBAAAAAfEBAQAAAAHyAQEAAAAB-wFAAAAAAbICAQAAAAELBQAA3QMAIO8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH7AUAAAAABiAIBAAAAAYkCAQAAAAGKAgEAAAABiwIgAAAAAYwCQAAAAAECAAAAKAAgIAAAkgUAIAMAAAAoACAgAACSBQAgIQAAkQUAIAEZAAC0BQAwEQMAAKQDACAFAACPAwAg7AEAAKYDADDtAQAAJgAQ7gEAAKYDADDvAQEAAAAB8AEBAAAAAfEBAQCIAwAh8gEBAIkDACH7AUAAjQMAIYcCAQCIAwAhiAIBAIgDACGJAgEAiQMAIYoCAQCIAwAhiwIgAKcDACGMAkAAjQMAIcICAAClAwAgAgAAACgAIBkAAJEFACACAAAAjwUAIBkAAJAFACAO7AEAAI4FADDtAQAAjwUAEO4BAACOBQAw7wEBAIgDACHwAQEAiAMAIfEBAQCIAwAh8gEBAIkDACH7AUAAjQMAIYcCAQCIAwAhiAIBAIgDACGJAgEAiQMAIYoCAQCIAwAhiwIgAKcDACGMAkAAjQMAIQ7sAQAAjgUAMO0BAACPBQAQ7gEAAI4FADDvAQEAiAMAIfABAQCIAwAh8QEBAIgDACHyAQEAiQMAIfsBQACNAwAhhwIBAIgDACGIAgEAiAMAIYkCAQCJAwAhigIBAIgDACGLAiAApwMAIYwCQACNAwAhCu8BAQC_AwAh8AEBAL8DACHxAQEAvwMAIfIBAQDAAwAh-wFAAMMDACGIAgEAvwMAIYkCAQDAAwAhigIBAL8DACGLAiAAzQMAIYwCQADDAwAhCwUAAM8DACDvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAwAMAIfsBQADDAwAhiAIBAL8DACGJAgEAwAMAIYoCAQC_AwAhiwIgAM0DACGMAkAAwwMAIQsFAADdAwAg7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfsBQAAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAJAAAAAAQwJAADnAwAg7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfgBAQAAAAH7AUAAAAABjAJAAAAAAY0CAgAAAAGOAgIAAAABjwIBAAAAAZACQAAAAAECAAAAFAAgIAAAmwUAIAMAAAAUACAgAACbBQAgIQAAmgUAIAEZAACzBQAwAgAAABQAIBkAAJoFACACAAAAsQQAIBkAAJkFACAL7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAL8DACH4AQEAvwMAIfsBQADDAwAhjAJAAMMDACGNAgIAwgMAIY4CAgDCAwAhjwIBAL8DACGQAkAA4wMAIQwJAADlAwAg7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAL8DACH4AQEAvwMAIfsBQADDAwAhjAJAAMMDACGNAgIAwgMAIY4CAgDCAwAhjwIBAL8DACGQAkAA4wMAIQwJAADnAwAg7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfgBAQAAAAH7AUAAAAABjAJAAAAAAY0CAgAAAAGOAgIAAAABjwIBAAAAAZACQAAAAAEKCAAA7gMAIO8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH3AQEAAAAB-wFAAAAAAYwCQAAAAAGPAgEAAAABkAJAAAAAAQIAAAAFACAgAACkBQAgAwAAAAUAICAAAKQFACAhAACjBQAgARkAALIFADACAAAABQAgGQAAowUAIAIAAADTBAAgGQAAogUAIAnvAQEAvwMAIfABAQC_AwAh8QEBAL8DACHyAQEAvwMAIfcBAQC_AwAh-wFAAMMDACGMAkAAwwMAIY8CAQC_AwAhkAJAAOMDACEKCAAA7AMAIO8BAQC_AwAh8AEBAL8DACHxAQEAvwMAIfIBAQC_AwAh9wEBAL8DACH7AUAAwwMAIYwCQADDAwAhjwIBAL8DACGQAkAA4wMAIQoIAADuAwAg7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfcBAQAAAAH7AUAAAAABjAJAAAAAAY8CAQAAAAGQAkAAAAABBCAAAJwFADDIAgAAnQUAMMoCAACfBQAgzgIAAM8EADAEIAAAkwUAMMgCAACUBQAwygIAAJYFACDOAgAArQQAMAQgAACHBQAwyAIAAIgFADDKAgAAigUAIM4CAACLBQAwBCAAAP4EADDIAgAA_wQAMMoCAACBBQAgzgIAAPYEADAEIAAA8gQAMMgCAADzBAAwygIAAPUEACDOAgAA9gQAMAAADw4AANkEACAPAAC4BAAgEAAAqgUAIBIAAKsFACATAACrBQAgtQIAALkDACC2AgAAuQMAILcCAAC5AwAguAIAALkDACC5AgAAuQMAILoCAAC5AwAguwIAALkDACC8AgAAuQMAIL0CAAC5AwAgwAIAALkDACAFCQAArgUAIAwAAK8FACCTAgAAuQMAIJYCAAC5AwAglwIAALkDACAJBAAAuAQAIAoAALkEACANAAC6BAAglAIAALkDACCWAgAAuQMAIJkCAAC5AwAgmgIAALkDACCbAgAAuQMAIJwCAAC5AwAgAAQDAACsBQAgBQAAuQQAIPIBAAC5AwAgiQIAALkDACAIBAAA2QQAIAoAALkEACCUAgAAuQMAIJYCAAC5AwAgmQIAALkDACCcAgAAuQMAIKYCAAC5AwAgpwIAALkDACAJ7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfcBAQAAAAH7AUAAAAABjAJAAAAAAY8CAQAAAAGQAkAAAAABC-8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH4AQEAAAAB-wFAAAAAAYwCQAAAAAGNAgIAAAABjgICAAAAAY8CAQAAAAGQAkAAAAABCu8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH7AUAAAAABiAIBAAAAAYkCAQAAAAGKAgEAAAABiwIgAAAAAYwCQAAAAAEF8AEBAAAAAfEBAQAAAAHyAQEAAAAB-wFAAAAAAbICAQAAAAEF8AEBAAAAAfEBAQAAAAHyAQEAAAAB-wFAAAAAAbECAQAAAAEUDgAApQUAIA8AAKYFACAQAACnBQAgEgAAqAUAIPsBQAAAAAGMAkAAAAABswIBAAAAAbQCAQAAAAG1AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQIBAAAAAboCAQAAAAG7AgEAAAABvAIBAAAAAb0CQAAAAAG-AgEAAAABvwIBAAAAAcACQAAAAAECAAAAAQAgIAAAtwUAIBQOAAClBQAgDwAApgUAIBAAAKcFACATAACpBQAg-wFAAAAAAYwCQAAAAAGzAgEAAAABtAIBAAAAAbUCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABvQJAAAAAAb4CAQAAAAG_AgEAAAABwAJAAAAAAQIAAAABACAgAAC5BQAgAwAAADUAICAAALcFACAhAAC9BQAgFgAAADUAIA4AAO0EACAPAADuBAAgEAAA7wQAIBIAAPAEACAZAAC9BQAg-wFAAMMDACGMAkAAwwMAIbMCAQC_AwAhtAIBAL8DACG1AgEAwAMAIbYCAQDAAwAhtwIBAMADACG4AgEAwAMAIbkCAQDAAwAhugIBAMADACG7AgEAwAMAIbwCAQDAAwAhvQJAAOMDACG-AgEAvwMAIb8CAQC_AwAhwAJAAOMDACEUDgAA7QQAIA8AAO4EACAQAADvBAAgEgAA8AQAIPsBQADDAwAhjAJAAMMDACGzAgEAvwMAIbQCAQC_AwAhtQIBAMADACG2AgEAwAMAIbcCAQDAAwAhuAIBAMADACG5AgEAwAMAIboCAQDAAwAhuwIBAMADACG8AgEAwAMAIb0CQADjAwAhvgIBAL8DACG_AgEAvwMAIcACQADjAwAhAwAAADUAICAAALkFACAhAADABQAgFgAAADUAIA4AAO0EACAPAADuBAAgEAAA7wQAIBMAAPEEACAZAADABQAg-wFAAMMDACGMAkAAwwMAIbMCAQC_AwAhtAIBAL8DACG1AgEAwAMAIbYCAQDAAwAhtwIBAMADACG4AgEAwAMAIbkCAQDAAwAhugIBAMADACG7AgEAwAMAIbwCAQDAAwAhvQJAAOMDACG-AgEAvwMAIb8CAQC_AwAhwAJAAOMDACEUDgAA7QQAIA8AAO4EACAQAADvBAAgEwAA8QQAIPsBQADDAwAhjAJAAMMDACGzAgEAvwMAIbQCAQC_AwAhtQIBAMADACG2AgEAwAMAIbcCAQDAAwAhuAIBAMADACG5AgEAwAMAIboCAQDAAwAhuwIBAMADACG8AgEAwAMAIb0CQADjAwAhvgIBAL8DACG_AgEAvwMAIcACQADjAwAhCe8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH7AUAAAAABhwIBAAAAAYwCQAAAAAGPAgEAAAABkAJAAAAAAQvvAQEAAAAB8AEBAAAAAfEBAQAAAAHyAQEAAAAB8wEBAAAAAfUBAAAA9QEC9gEBAAAAAfgBAQAAAAH5AQEAAAAB-gECAAAAAfsBQAAAAAEL7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfsBQAAAAAGHAgEAAAABjAJAAAAAAY0CAgAAAAGOAgIAAAABjwIBAAAAAZACQAAAAAEL7wEBAAAAAfABAQAAAAHxAQEAAAAB8gEBAAAAAfMBAQAAAAH1AQAAAPUBAvYBAQAAAAH3AQEAAAAB-QEBAAAAAfoBAgAAAAH7AUAAAAABCe8BAQAAAAH7AUAAAAABiAIBAAAAAYwCQAAAAAGNAgIAAAABkQICAAAAAZMCQAAAAAGWAgEAAAABlwICAAAAAQwEAAC1BAAgCgAAtgQAIPgBAQAAAAH7AUAAAAABjAJAAAAAAZQCAQAAAAGWAgEAAAABmAIBAAAAAZkCAQAAAAGaAgIAAAABmwJAAAAAAZwCgAAAAAECAAAAxAEAICAAAMYFACAL7wEBAAAAAfgBAQAAAAH7AUAAAAABiAIBAAAAAYwCQAAAAAGNAgIAAAABjgICAAAAAZECAgAAAAGTAkAAAAABlAIBAAAAAZUCAQAAAAEDAAAAEAAgIAAAxgUAICEAAMsFACAOAAAAEAAgBAAAkQQAIAoAAJIEACAZAADLBQAg-AEBAL8DACH7AUAAwwMAIYwCQADDAwAhlAIBAMADACGWAgEAwAMAIZgCAQC_AwAhmQIBAMADACGaAgIA-wMAIZsCQADjAwAhnAKAAAAAAQwEAACRBAAgCgAAkgQAIPgBAQC_AwAh-wFAAMMDACGMAkAAwwMAIZQCAQDAAwAhlgIBAMADACGYAgEAvwMAIZkCAQDAAwAhmgICAPsDACGbAkAA4wMAIZwCgAAAAAELCQAAigQAIO8BAQAAAAH4AQEAAAAB-wFAAAAAAYgCAQAAAAGMAkAAAAABjQICAAAAAZECAgAAAAGTAkAAAAABlgIBAAAAAZcCAgAAAAECAAAAGQAgIAAAzAUAIAMAAAAXACAgAADMBQAgIQAA0AUAIA0AAAAXACAJAAD8AwAgGQAA0AUAIO8BAQC_AwAh-AEBAL8DACH7AUAAwwMAIYgCAQC_AwAhjAJAAMMDACGNAgIAwgMAIZECAgDCAwAhkwJAAOMDACGWAgEAwAMAIZcCAgD7AwAhCwkAAPwDACDvAQEAvwMAIfgBAQC_AwAh-wFAAMMDACGIAgEAvwMAIYwCQADDAwAhjQICAMIDACGRAgIAwgMAIZMCQADjAwAhlgIBAMADACGXAgIA-wMAIQsKAADYBAAg9wEBAAAAAfsBQAAAAAGMAkAAAAABlAIBAAAAAZYCAQAAAAGYAgEAAAABmQIBAAAAAZwCgAAAAAGmAgIAAAABpwJAAAAAAQIAAACsAQAgIAAA0QUAIBQPAACmBQAgEAAApwUAIBIAAKgFACATAACpBQAg-wFAAAAAAYwCQAAAAAGzAgEAAAABtAIBAAAAAbUCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABvQJAAAAAAb4CAQAAAAG_AgEAAAABwAJAAAAAAQIAAAABACAgAADTBQAgAwAAAA4AICAAANEFACAhAADXBQAgDQAAAA4AIAoAAMEEACAZAADXBQAg9wEBAL8DACH7AUAAwwMAIYwCQADDAwAhlAIBAMADACGWAgEAwAMAIZgCAQC_AwAhmQIBAMADACGcAoAAAAABpgICAPsDACGnAkAA4wMAIQsKAADBBAAg9wEBAL8DACH7AUAAwwMAIYwCQADDAwAhlAIBAMADACGWAgEAwAMAIZgCAQC_AwAhmQIBAMADACGcAoAAAAABpgICAPsDACGnAkAA4wMAIQMAAAA1ACAgAADTBQAgIQAA2gUAIBYAAAA1ACAPAADuBAAgEAAA7wQAIBIAAPAEACATAADxBAAgGQAA2gUAIPsBQADDAwAhjAJAAMMDACGzAgEAvwMAIbQCAQC_AwAhtQIBAMADACG2AgEAwAMAIbcCAQDAAwAhuAIBAMADACG5AgEAwAMAIboCAQDAAwAhuwIBAMADACG8AgEAwAMAIb0CQADjAwAhvgIBAL8DACG_AgEAvwMAIcACQADjAwAhFA8AAO4EACAQAADvBAAgEgAA8AQAIBMAAPEEACD7AUAAwwMAIYwCQADDAwAhswIBAL8DACG0AgEAvwMAIbUCAQDAAwAhtgIBAMADACG3AgEAwAMAIbgCAQDAAwAhuQIBAMADACG6AgEAwAMAIbsCAQDAAwAhvAIBAMADACG9AkAA4wMAIb4CAQC_AwAhvwIBAL8DACHAAkAA4wMAIQwKAAC2BAAgDQAAtwQAIPgBAQAAAAH7AUAAAAABjAJAAAAAAZQCAQAAAAGWAgEAAAABmAIBAAAAAZkCAQAAAAGaAgIAAAABmwJAAAAAAZwCgAAAAAECAAAAxAEAICAAANsFACAUDgAApQUAIBAAAKcFACASAACoBQAgEwAAqQUAIPsBQAAAAAGMAkAAAAABswIBAAAAAbQCAQAAAAG1AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQIBAAAAAboCAQAAAAG7AgEAAAABvAIBAAAAAb0CQAAAAAG-AgEAAAABvwIBAAAAAcACQAAAAAECAAAAAQAgIAAA3QUAIAMAAAAQACAgAADbBQAgIQAA4QUAIA4AAAAQACAKAACSBAAgDQAAkwQAIBkAAOEFACD4AQEAvwMAIfsBQADDAwAhjAJAAMMDACGUAgEAwAMAIZYCAQDAAwAhmAIBAL8DACGZAgEAwAMAIZoCAgD7AwAhmwJAAOMDACGcAoAAAAABDAoAAJIEACANAACTBAAg-AEBAL8DACH7AUAAwwMAIYwCQADDAwAhlAIBAMADACGWAgEAwAMAIZgCAQC_AwAhmQIBAMADACGaAgIA-wMAIZsCQADjAwAhnAKAAAAAAQMAAAA1ACAgAADdBQAgIQAA5AUAIBYAAAA1ACAOAADtBAAgEAAA7wQAIBIAAPAEACATAADxBAAgGQAA5AUAIPsBQADDAwAhjAJAAMMDACGzAgEAvwMAIbQCAQC_AwAhtQIBAMADACG2AgEAwAMAIbcCAQDAAwAhuAIBAMADACG5AgEAwAMAIboCAQDAAwAhuwIBAMADACG8AgEAwAMAIb0CQADjAwAhvgIBAL8DACG_AgEAvwMAIcACQADjAwAhFA4AAO0EACAQAADvBAAgEgAA8AQAIBMAAPEEACD7AUAAwwMAIYwCQADDAwAhswIBAL8DACG0AgEAvwMAIbUCAQDAAwAhtgIBAMADACG3AgEAwAMAIbgCAQDAAwAhuQIBAMADACG6AgEAwAMAIbsCAQDAAwAhvAIBAMADACG9AkAA4wMAIb4CAQC_AwAhvwIBAL8DACHAAkAA4wMAIRQOAAClBQAgDwAApgUAIBIAAKgFACATAACpBQAg-wFAAAAAAYwCQAAAAAGzAgEAAAABtAIBAAAAAbUCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABvQJAAAAAAb4CAQAAAAG_AgEAAAABwAJAAAAAAQIAAAABACAgAADlBQAgC-8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH1AQAAAPUBAvYBAQAAAAH3AQEAAAAB-AEBAAAAAfkBAQAAAAH6AQIAAAAB-wFAAAAAAQMAAAA1ACAgAADlBQAgIQAA6gUAIBYAAAA1ACAOAADtBAAgDwAA7gQAIBIAAPAEACATAADxBAAgGQAA6gUAIPsBQADDAwAhjAJAAMMDACGzAgEAvwMAIbQCAQC_AwAhtQIBAMADACG2AgEAwAMAIbcCAQDAAwAhuAIBAMADACG5AgEAwAMAIboCAQDAAwAhuwIBAMADACG8AgEAwAMAIb0CQADjAwAhvgIBAL8DACG_AgEAvwMAIcACQADjAwAhFA4AAO0EACAPAADuBAAgEgAA8AQAIBMAAPEEACD7AUAAwwMAIYwCQADDAwAhswIBAL8DACG0AgEAvwMAIbUCAQDAAwAhtgIBAMADACG3AgEAwAMAIbgCAQDAAwAhuQIBAMADACG6AgEAwAMAIbsCAQDAAwAhvAIBAMADACG9AkAA4wMAIb4CAQC_AwAhvwIBAL8DACHAAkAA4wMAIQwEAAC1BAAgDQAAtwQAIPgBAQAAAAH7AUAAAAABjAJAAAAAAZQCAQAAAAGWAgEAAAABmAIBAAAAAZkCAQAAAAGaAgIAAAABmwJAAAAAAZwCgAAAAAECAAAAxAEAICAAAOsFACALBAAA1wQAIPcBAQAAAAH7AUAAAAABjAJAAAAAAZQCAQAAAAGWAgEAAAABmAIBAAAAAZkCAQAAAAGcAoAAAAABpgICAAAAAacCQAAAAAECAAAArAEAICAAAO0FACAMAwAA3AMAIO8BAQAAAAHwAQEAAAAB8QEBAAAAAfIBAQAAAAH7AUAAAAABhwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCIAAAAAGMAkAAAAABAgAAACgAICAAAO8FACADAAAAEAAgIAAA6wUAICEAAPMFACAOAAAAEAAgBAAAkQQAIA0AAJMEACAZAADzBQAg-AEBAL8DACH7AUAAwwMAIYwCQADDAwAhlAIBAMADACGWAgEAwAMAIZgCAQC_AwAhmQIBAMADACGaAgIA-wMAIZsCQADjAwAhnAKAAAAAAQwEAACRBAAgDQAAkwQAIPgBAQC_AwAh-wFAAMMDACGMAkAAwwMAIZQCAQDAAwAhlgIBAMADACGYAgEAvwMAIZkCAQDAAwAhmgICAPsDACGbAkAA4wMAIZwCgAAAAAEDAAAADgAgIAAA7QUAICEAAPYFACANAAAADgAgBAAAwAQAIBkAAPYFACD3AQEAvwMAIfsBQADDAwAhjAJAAMMDACGUAgEAwAMAIZYCAQDAAwAhmAIBAL8DACGZAgEAwAMAIZwCgAAAAAGmAgIA-wMAIacCQADjAwAhCwQAAMAEACD3AQEAvwMAIfsBQADDAwAhjAJAAMMDACGUAgEAwAMAIZYCAQDAAwAhmAIBAL8DACGZAgEAwAMAIZwCgAAAAAGmAgIA-wMAIacCQADjAwAhAwAAACYAICAAAO8FACAhAAD5BQAgDgAAACYAIAMAAM4DACAZAAD5BQAg7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAMADACH7AUAAwwMAIYcCAQC_AwAhiAIBAL8DACGJAgEAwAMAIYoCAQC_AwAhiwIgAM0DACGMAkAAwwMAIQwDAADOAwAg7wEBAL8DACHwAQEAvwMAIfEBAQC_AwAh8gEBAMADACH7AUAAwwMAIYcCAQC_AwAhiAIBAL8DACGJAgEAwAMAIYoCAQC_AwAhiwIgAM0DACGMAkAAwwMAIQYGAA8OBgIPJQgQKQUSLQ4TLg4CAwABCAADAwQHAgYADQoLBAMHAAUIDwMJEQcDAwABBQwEBgAGAQUNAAQEFQgGAAwKFgQNGgkCAwABCQAHAwYACwkABwweCgELAAkBDB8AAwQgAAohAA0iAAIEIwAKJAACEQABEgABBQ4vAA8wABAxABIyABMzAAAAAAMGABQmABUnABYAAAADBgAUJgAVJwAWAhEAARIAAQIRAAESAAEDBgAbJgAcJwAdAAAAAwYAGyYAHCcAHQAAAAMGACMmACQnACUAAAADBgAjJgAkJwAlAAAAAwYAKyYALCcALQAAAAMGACsmACwnAC0AAAADBgAzJgA0JwA1AAAAAwYAMyYANCcANQAABQYAOiYAPScAPngAO3kAPAAAAAAABQYAOiYAPScAPngAO3kAPAAABQYAQyYARicAR3gARHkARQAAAAAABQYAQyYARicAR3gARHkARQEJAAcBCQAHBQYATCYATycAUHgATXkATgAAAAAABQYATCYATycAUHgATXkATgELAAkBCwAJBQYAVSYAWCcAWXgAVnkAVwAAAAAABQYAVSYAWCcAWXgAVnkAVwIDAAEIAAMCAwABCAADAwYAXiYAXycAYAAAAAMGAF4mAF8nAGACAwABCQAHAgMAAQkABwUGAGUmAGgnAGl4AGZ5AGcAAAAAAAUGAGUmAGgnAGl4AGZ5AGcBAwABAQMAAQMGAG4mAG8nAHAAAAADBgBuJgBvJwBwAwcABQjUAgMJ1QIHAwcABQjbAgMJ3AIHBQYAdSYAeCcAeXgAdnkAdwAAAAAABQYAdSYAeCcAeXgAdnkAdxQCARU0ARY3ARc4ARg5ARo7ARs9EBw-ER1AAR5CEB9DEiJEASNFASRGEChJEylKFypLDitMDixNDi1ODi5PDi9RDjBTEDFUGDJWDjNYEDRZGTVaDjZbDjdcEDhfGjlgHjpiHztjHzxmHz1nHz5oHz9qH0BsEEFtIEJvH0NxEERyIUVzH0Z0H0d1EEh4Ikl5Jkp7J0t8J0x_J02AASdOgQEnT4MBJ1CFARBRhgEoUogBJ1OKARBUiwEpVYwBJ1aNASdXjgEQWJEBKlmSAS5alAEvW5UBL1yYAS9dmQEvXpoBL1-cAS9gngEQYZ8BMGKhAS9jowEQZKQBMWWlAS9mpgEvZ6cBEGiqATJpqwE2aq0BA2uuAQNssAEDbbEBA26yAQNvtAEDcLYBEHG3ATdyuQEDc7sBEHS8ATh1vQEDdr4BA3e_ARB6wgE5e8MBP3zFAQd9xgEHfsgBB3_JAQeAAcoBB4EBzAEHggHOARCDAc8BQIQB0QEHhQHTARCGAdQBQYcB1QEHiAHWAQeJAdcBEIoB2gFCiwHbAUiMAdwBCY0B3QEJjgHeAQmPAd8BCZAB4AEJkQHiAQmSAeQBEJMB5QFJlAHnAQmVAekBEJYB6gFKlwHrAQmYAewBCZkB7QEQmgHwAUubAfEBUZwB8gEKnQHzAQqeAfQBCp8B9QEKoAH2AQqhAfgBCqIB-gEQowH7AVKkAf0BCqUB_wEQpgGAAlOnAYECCqgBggIKqQGDAhCqAYYCVKsBhwJarAGIAgKtAYkCAq4BigICrwGLAgKwAYwCArEBjgICsgGQAhCzAZECW7QBkwICtQGVAhC2AZYCXLcBlwICuAGYAgK5AZkCELoBnAJduwGdAmG8AZ4CCL0BnwIIvgGgAgi_AaECCMABogIIwQGkAgjCAaYCEMMBpwJixAGpAgjFAasCEMYBrAJjxwGtAgjIAa4CCMkBrwIQygGyAmTLAbMCaswBtAIFzQG1AgXOAbYCBc8BtwIF0AG4AgXRAboCBdIBvAIQ0wG9AmvUAb8CBdUBwQIQ1gHCAmzXAcMCBdgBxAIF2QHFAhDaAcgCbdsByQJx3AHKAgTdAcsCBN4BzAIE3wHNAgTgAc4CBOEB0AIE4gHSAhDjAdMCcuQB1wIE5QHZAhDmAdoCc-cB3QIE6AHeAgTpAd8CEOoB4gJ06wHjAno" 37 + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"trackedBy\",\"items\",\"_count\",\"list\",\"movie\",\"show\",\"listItems\",\"season\",\"episodes\",\"seasons\",\"trackedMovies\",\"trackedEpisodes\",\"lists\",\"notes\",\"follower\",\"following\",\"followers\",\"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\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Follow.findUnique\",\"Follow.findUniqueOrThrow\",\"Follow.findFirst\",\"Follow.findFirstOrThrow\",\"Follow.findMany\",\"Follow.createOne\",\"Follow.createMany\",\"Follow.createManyAndReturn\",\"Follow.updateOne\",\"Follow.updateMany\",\"Follow.updateManyAndReturn\",\"Follow.upsertOne\",\"Follow.deleteOne\",\"Follow.deleteMany\",\"Follow.groupBy\",\"Follow.aggregate\",\"AuthSession.findUnique\",\"AuthSession.findUniqueOrThrow\",\"AuthSession.findFirst\",\"AuthSession.findFirstOrThrow\",\"AuthSession.findMany\",\"AuthSession.createOne\",\"AuthSession.createMany\",\"AuthSession.createManyAndReturn\",\"AuthSession.updateOne\",\"AuthSession.updateMany\",\"AuthSession.updateManyAndReturn\",\"AuthSession.upsertOne\",\"AuthSession.deleteOne\",\"AuthSession.deleteMany\",\"AuthSession.groupBy\",\"AuthSession.aggregate\",\"AuthState.findUnique\",\"AuthState.findUniqueOrThrow\",\"AuthState.findFirst\",\"AuthState.findFirstOrThrow\",\"AuthState.findMany\",\"AuthState.createOne\",\"AuthState.createMany\",\"AuthState.createManyAndReturn\",\"AuthState.updateOne\",\"AuthState.updateMany\",\"AuthState.updateManyAndReturn\",\"AuthState.upsertOne\",\"AuthState.deleteOne\",\"AuthState.deleteMany\",\"AuthState.groupBy\",\"AuthState.aggregate\",\"BackgroundJob.findUnique\",\"BackgroundJob.findUniqueOrThrow\",\"BackgroundJob.findFirst\",\"BackgroundJob.findFirstOrThrow\",\"BackgroundJob.findMany\",\"BackgroundJob.createOne\",\"BackgroundJob.createMany\",\"BackgroundJob.createManyAndReturn\",\"BackgroundJob.updateOne\",\"BackgroundJob.updateMany\",\"BackgroundJob.updateManyAndReturn\",\"BackgroundJob.upsertOne\",\"BackgroundJob.deleteOne\",\"BackgroundJob.deleteMany\",\"BackgroundJob.groupBy\",\"BackgroundJob.aggregate\",\"Movie.findUnique\",\"Movie.findUniqueOrThrow\",\"Movie.findFirst\",\"Movie.findFirstOrThrow\",\"Movie.findMany\",\"Movie.createOne\",\"Movie.createMany\",\"Movie.createManyAndReturn\",\"Movie.updateOne\",\"Movie.updateMany\",\"Movie.updateManyAndReturn\",\"Movie.upsertOne\",\"Movie.deleteOne\",\"Movie.deleteMany\",\"_avg\",\"_sum\",\"Movie.groupBy\",\"Movie.aggregate\",\"Show.findUnique\",\"Show.findUniqueOrThrow\",\"Show.findFirst\",\"Show.findFirstOrThrow\",\"Show.findMany\",\"Show.createOne\",\"Show.createMany\",\"Show.createManyAndReturn\",\"Show.updateOne\",\"Show.updateMany\",\"Show.updateManyAndReturn\",\"Show.upsertOne\",\"Show.deleteOne\",\"Show.deleteMany\",\"Show.groupBy\",\"Show.aggregate\",\"Season.findUnique\",\"Season.findUniqueOrThrow\",\"Season.findFirst\",\"Season.findFirstOrThrow\",\"Season.findMany\",\"Season.createOne\",\"Season.createMany\",\"Season.createManyAndReturn\",\"Season.updateOne\",\"Season.updateMany\",\"Season.updateManyAndReturn\",\"Season.upsertOne\",\"Season.deleteOne\",\"Season.deleteMany\",\"Season.groupBy\",\"Season.aggregate\",\"Episode.findUnique\",\"Episode.findUniqueOrThrow\",\"Episode.findFirst\",\"Episode.findFirstOrThrow\",\"Episode.findMany\",\"Episode.createOne\",\"Episode.createMany\",\"Episode.createManyAndReturn\",\"Episode.updateOne\",\"Episode.updateMany\",\"Episode.updateManyAndReturn\",\"Episode.upsertOne\",\"Episode.deleteOne\",\"Episode.deleteMany\",\"Episode.groupBy\",\"Episode.aggregate\",\"TrackedMovie.findUnique\",\"TrackedMovie.findUniqueOrThrow\",\"TrackedMovie.findFirst\",\"TrackedMovie.findFirstOrThrow\",\"TrackedMovie.findMany\",\"TrackedMovie.createOne\",\"TrackedMovie.createMany\",\"TrackedMovie.createManyAndReturn\",\"TrackedMovie.updateOne\",\"TrackedMovie.updateMany\",\"TrackedMovie.updateManyAndReturn\",\"TrackedMovie.upsertOne\",\"TrackedMovie.deleteOne\",\"TrackedMovie.deleteMany\",\"TrackedMovie.groupBy\",\"TrackedMovie.aggregate\",\"TrackedEpisode.findUnique\",\"TrackedEpisode.findUniqueOrThrow\",\"TrackedEpisode.findFirst\",\"TrackedEpisode.findFirstOrThrow\",\"TrackedEpisode.findMany\",\"TrackedEpisode.createOne\",\"TrackedEpisode.createMany\",\"TrackedEpisode.createManyAndReturn\",\"TrackedEpisode.updateOne\",\"TrackedEpisode.updateMany\",\"TrackedEpisode.updateManyAndReturn\",\"TrackedEpisode.upsertOne\",\"TrackedEpisode.deleteOne\",\"TrackedEpisode.deleteMany\",\"TrackedEpisode.groupBy\",\"TrackedEpisode.aggregate\",\"List.findUnique\",\"List.findUniqueOrThrow\",\"List.findFirst\",\"List.findFirstOrThrow\",\"List.findMany\",\"List.createOne\",\"List.createMany\",\"List.createManyAndReturn\",\"List.updateOne\",\"List.updateMany\",\"List.updateManyAndReturn\",\"List.upsertOne\",\"List.deleteOne\",\"List.deleteMany\",\"List.groupBy\",\"List.aggregate\",\"ListItem.findUnique\",\"ListItem.findUniqueOrThrow\",\"ListItem.findFirst\",\"ListItem.findFirstOrThrow\",\"ListItem.findMany\",\"ListItem.createOne\",\"ListItem.createMany\",\"ListItem.createManyAndReturn\",\"ListItem.updateOne\",\"ListItem.updateMany\",\"ListItem.updateManyAndReturn\",\"ListItem.upsertOne\",\"ListItem.deleteOne\",\"ListItem.deleteMany\",\"ListItem.groupBy\",\"ListItem.aggregate\",\"Note.findUnique\",\"Note.findUniqueOrThrow\",\"Note.findFirst\",\"Note.findFirstOrThrow\",\"Note.findMany\",\"Note.createOne\",\"Note.createMany\",\"Note.createManyAndReturn\",\"Note.updateOne\",\"Note.updateMany\",\"Note.updateManyAndReturn\",\"Note.upsertOne\",\"Note.deleteOne\",\"Note.deleteMany\",\"Note.groupBy\",\"Note.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"rkey\",\"uri\",\"cid\",\"userDid\",\"MediaType\",\"mediaType\",\"mediaId\",\"seasonNumber\",\"episodeNumber\",\"content\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"listId\",\"movieId\",\"showId\",\"position\",\"name\",\"description\",\"slug\",\"isDefault\",\"status\",\"watchedDate\",\"tmdbId\",\"seasonId\",\"airDate\",\"overview\",\"stillPath\",\"posterPath\",\"episodeCount\",\"title\",\"backdropPath\",\"firstAirYear\",\"firstAirDate\",\"colors\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"every\",\"some\",\"none\",\"releaseYear\",\"releaseDate\",\"type\",\"nextRunAt\",\"lastError\",\"startedAt\",\"completedAt\",\"key\",\"stateData\",\"expiresAt\",\"sessionData\",\"followerDid\",\"followingDid\",\"did\",\"handle\",\"displayName\",\"avatar\",\"profileRkey\",\"profileUri\",\"profileCid\",\"profileDisplayName\",\"profileAvatarCid\",\"profileAvatarMimeType\",\"profileUpdatedAt\",\"timezone\",\"timeFormat\",\"onboardingCompletedAt\",\"followerDid_followingDid\",\"userDid_mediaType_mediaId_seasonNumber_episodeNumber\",\"userDid_slug\",\"showId_seasonNumber_episodeNumber\",\"showId_seasonNumber\",\"listId_mediaType_mediaId_seasonNumber_episodeNumber\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), 38 + graph: "tAaEAeABGQ4AAK8DACAPAACqAwAgEAAAvAMAIBEAAL0DACATAAC-AwAgFAAAvgMAIP0BAAC7AwAw_gEAADoAEP8BAAC7AwAwiwJAAKkDACGMAkAAqQMAIcQCAQAAAAHFAgEAAAABxgIBAKUDACHHAgEApQMAIcgCAQClAwAhyQIBAKUDACHKAgEApQMAIcsCAQClAwAhzAIBAKUDACHNAgEApQMAIc4CQACnAwAhzwIBAKQDACHQAgEApAMAIdECQACnAwAhAQAAAAEAIA8DAADBAwAgCAAA1wMAIP0BAADWAwAw_gEAAAMAEP8BAADWAwAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKQDACGEAgEApAMAIYsCQACpAwAhjAJAAKkDACGZAgEApAMAIaACAQCkAwAhoQJAAKcDACEDAwAA4QUAIAgAAOYFACChAgAA4wMAIA8DAADBAwAgCAAA1wMAIP0BAADWAwAw_gEAAAMAEP8BAADWAwAwgAIBAAAAAYECAQAAAAGCAgEApAMAIYMCAQCkAwAhhAIBAKQDACGLAkAAqQMAIYwCQACpAwAhmQIBAKQDACGgAgEApAMAIaECQACnAwAhAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACAUBwAA0wMAIAgAANQDACAJAADVAwAgEQEApQMAIf0BAADSAwAw_gEAAAgAEP8BAADSAwAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKUDACGGAgAAxAOGAiKHAgEApAMAIYgCAgDFAwAhiQICAMUDACGLAkAAqQMAIZgCAQCkAwAhmQIBAKUDACGaAgEApQMAIZsCAgDFAwAhBwcAAOUFACAIAADmBQAgCQAA4wUAIBEAAOMDACCDAgAA4wMAIJkCAADjAwAgmgIAAOMDACAVBwAA0wMAIAgAANQDACAJAADVAwAgEQEApQMAIf0BAADSAwAw_gEAAAgAEP8BAADSAwAwgAIBAAAAAYECAQAAAAGCAgEApAMAIYMCAQClAwAhhgIAAMQDhgIihwIBAKQDACGIAgIAxQMAIYkCAgDFAwAhiwJAAKkDACGYAgEApAMAIZkCAQClAwAhmgIBAKUDACGbAgIAxQMAIdcCAADRAwAgAwAAAAgAIAEAAAkAMAIAAAoAIAMAAAAIACABAAAJADACAAAKACABAAAACAAgDwQAAK8DACAKAACrAwAg_QEAAK4DADD-AQAADgAQ_wEAAK4DADCLAkAAqQMAIYwCQACpAwAhmQIBAKQDACGlAgEApQMAIacCAQClAwAhqQIBAKQDACGqAgEApQMAIa0CAACoAwAgtwICAKYDACG4AkAApwMAIQEAAAAOACAQBAAAqgMAIAoAAKsDACANAACsAwAg_QEAAKMDADD-AQAAEAAQ_wEAAKMDADCLAkAAqQMAIYwCQACpAwAhmgIBAKQDACGlAgEApQMAIacCAQClAwAhqQIBAKQDACGqAgEApQMAIasCAgCmAwAhrAJAAKcDACGtAgAAqAMAIAEAAAAQACARAwAAwQMAIAkAAM4DACD9AQAA0AMAMP4BAAASABD_AQAA0AMAMIACAQCkAwAhgQIBAKQDACGCAgEApAMAIYMCAQCkAwAhhAIBAKQDACGIAgIAxQMAIYkCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhoAIBAKQDACGhAkAApwMAIQMDAADhBQAgCQAA4wUAIKECAADjAwAgEQMAAMEDACAJAADOAwAg_QEAANADADD-AQAAEgAQ_wEAANADADCAAgEAAAABgQIBAAAAAYICAQCkAwAhgwIBAKQDACGEAgEApAMAIYgCAgDFAwAhiQICAMUDACGLAkAAqQMAIYwCQACpAwAhmgIBAKQDACGgAgEApAMAIaECQACnAwAhAwAAABIAIAEAABMAMAIAABQAIAMAAAAIACABAAAJADACAAAKACAPCQAAzgMAIAwAAM8DACD9AQAAzQMAMP4BAAAXABD_AQAAzQMAMIACAQCkAwAhiAICAMUDACGLAkAAqQMAIYwCQACpAwAhmgIBAKQDACGcAgEApAMAIaICAgDFAwAhpAJAAKcDACGnAgEApQMAIagCAgCmAwAhBQkAAOMFACAMAADkBQAgpAIAAOMDACCnAgAA4wMAIKgCAADjAwAgEAkAAM4DACAMAADPAwAg_QEAAM0DADD-AQAAFwAQ_wEAAM0DADCAAgEAAAABiAICAMUDACGLAkAAqQMAIYwCQACpAwAhmgIBAKQDACGcAgEApAMAIaICAgAAAAGkAkAApwMAIacCAQClAwAhqAICAKYDACHWAgAAzAMAIAMAAAAXACABAAAYADACAAAZACAQCwAAywMAIP0BAADKAwAw_gEAABsAEP8BAADKAwAwgAIBAKQDACGIAgIAxQMAIYkCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhnAIBAKQDACGiAgIAxQMAIaMCAQCkAwAhpAJAAKcDACGlAgEApQMAIaYCAQClAwAhBAsAAOIFACCkAgAA4wMAIKUCAADjAwAgpgIAAOMDACARCwAAywMAIP0BAADKAwAw_gEAABsAEP8BAADKAwAwgAIBAAAAAYgCAgDFAwAhiQICAMUDACGLAkAAqQMAIYwCQACpAwAhmgIBAKQDACGcAgEApAMAIaICAgAAAAGjAgEApAMAIaQCQACnAwAhpQIBAKUDACGmAgEApQMAIdUCAADJAwAgAwAAABsAIAEAABwAMAIAAB0AIAEAAAAbACABAAAAEgAgAQAAAAgAIAEAAAAXACABAAAAAwAgAQAAAAgAIAMAAAASACABAAATADACAAAUACAQAwAAwQMAIAUAAKsDACD9AQAAxwMAMP4BAAAmABD_AQAAxwMAMIACAQCkAwAhgQIBAKQDACGCAgEApAMAIYMCAQClAwAhhAIBAKQDACGLAkAAqQMAIYwCQACpAwAhnAIBAKQDACGdAgEApQMAIZ4CAQCkAwAhnwIgAMgDACEEAwAA4QUAIAUAAN8EACCDAgAA4wMAIJ0CAADjAwAgEQMAAMEDACAFAACrAwAg_QEAAMcDADD-AQAAJgAQ_wEAAMcDADCAAgEAAAABgQIBAAAAAYICAQCkAwAhgwIBAKUDACGEAgEApAMAIYsCQACpAwAhjAJAAKkDACGcAgEApAMAIZ0CAQClAwAhngIBAKQDACGfAiAAyAMAIdQCAADGAwAgAwAAACYAIAEAACcAMAIAACgAIBADAADBAwAg_QEAAMMDADD-AQAAKgAQ_wEAAMMDADCAAgEApAMAIYECAQCkAwAhggIBAKQDACGDAgEApAMAIYQCAQCkAwAhhgIAAMQDhgIihwIBAKQDACGIAgIAxQMAIYkCAgDFAwAhigIBAKQDACGLAkAAqQMAIYwCQACpAwAhAQMAAOEFACARAwAAwQMAIP0BAADDAwAw_gEAACoAEP8BAADDAwAwgAIBAAAAAYECAQAAAAGCAgEApAMAIYMCAQCkAwAhhAIBAKQDACGGAgAAxAOGAiKHAgEApAMAIYgCAgDFAwAhiQICAMUDACGKAgEApAMAIYsCQACpAwAhjAJAAKkDACHTAgAAwgMAIAMAAAAqACABAAArADACAAAsACALEgAAwQMAIBMAAMEDACD9AQAAwAMAMP4BAAAuABD_AQAAwAMAMIECAQClAwAhggIBAKUDACGDAgEApQMAIYsCQACpAwAhwgIBAKQDACHDAgEApAMAIQUSAADhBQAgEwAA4QUAIIECAADjAwAgggIAAOMDACCDAgAA4wMAIAwSAADBAwAgEwAAwQMAIP0BAADAAwAw_gEAAC4AEP8BAADAAwAwgQIBAKUDACGCAgEApQMAIYMCAQClAwAhiwJAAKkDACHCAgEApAMAIcMCAQCkAwAh0gIAAL8DACADAAAALgAgAQAALwAwAgAAMAAgAwAAAC4AIAEAAC8AMAIAADAAIAEAAAADACABAAAAEgAgAQAAACYAIAEAAAAqACABAAAALgAgAQAAAC4AIAEAAAABACAZDgAArwMAIA8AAKoDACAQAAC8AwAgEQAAvQMAIBMAAL4DACAUAAC-AwAg_QEAALsDADD-AQAAOgAQ_wEAALsDADCLAkAAqQMAIYwCQACpAwAhxAIBAKQDACHFAgEApAMAIcYCAQClAwAhxwIBAKUDACHIAgEApQMAIckCAQClAwAhygIBAKUDACHLAgEApQMAIcwCAQClAwAhzQIBAKUDACHOAkAApwMAIc8CAQCkAwAh0AIBAKQDACHRAkAApwMAIRAOAAD_BAAgDwAA3gQAIBAAAN4FACARAADfBQAgEwAA4AUAIBQAAOAFACDGAgAA4wMAIMcCAADjAwAgyAIAAOMDACDJAgAA4wMAIMoCAADjAwAgywIAAOMDACDMAgAA4wMAIM0CAADjAwAgzgIAAOMDACDRAgAA4wMAIAMAAAA6ACABAAA7ADACAAABACADAAAAOgAgAQAAOwAwAgAAAQAgAwAAADoAIAEAADsAMAIAAAEAIBYOAADYBQAgDwAA2QUAIBAAANoFACARAADbBQAgEwAA3AUAIBQAAN0FACCLAkAAAAABjAJAAAAAAcQCAQAAAAHFAgEAAAABxgIBAAAAAccCAQAAAAHIAgEAAAAByQIBAAAAAcoCAQAAAAHLAgEAAAABzAIBAAAAAc0CAQAAAAHOAkAAAAABzwIBAAAAAdACAQAAAAHRAkAAAAABARoAAD8AIBCLAkAAAAABjAJAAAAAAcQCAQAAAAHFAgEAAAABxgIBAAAAAccCAQAAAAHIAgEAAAAByQIBAAAAAcoCAQAAAAHLAgEAAAABzAIBAAAAAc0CAQAAAAHOAkAAAAABzwIBAAAAAdACAQAAAAHRAkAAAAABARoAAEEAMAEaAABBADAWDgAAkwUAIA8AAJQFACAQAACVBQAgEQAAlgUAIBMAAJcFACAUAACYBQAgiwJAAOADACGMAkAA4AMAIcQCAQDdAwAhxQIBAN0DACHGAgEA6QMAIccCAQDpAwAhyAIBAOkDACHJAgEA6QMAIcoCAQDpAwAhywIBAOkDACHMAgEA6QMAIc0CAQDpAwAhzgJAAIkEACHPAgEA3QMAIdACAQDdAwAh0QJAAIkEACECAAAAAQAgGgAARAAgEIsCQADgAwAhjAJAAOADACHEAgEA3QMAIcUCAQDdAwAhxgIBAOkDACHHAgEA6QMAIcgCAQDpAwAhyQIBAOkDACHKAgEA6QMAIcsCAQDpAwAhzAIBAOkDACHNAgEA6QMAIc4CQACJBAAhzwIBAN0DACHQAgEA3QMAIdECQACJBAAhAgAAADoAIBoAAEYAIAIAAAA6ACAaAABGACADAAAAAQAgIQAAPwAgIgAARAAgAQAAAAEAIAEAAAA6ACANBgAAkAUAICcAAJIFACAoAACRBQAgxgIAAOMDACDHAgAA4wMAIMgCAADjAwAgyQIAAOMDACDKAgAA4wMAIMsCAADjAwAgzAIAAOMDACDNAgAA4wMAIM4CAADjAwAg0QIAAOMDACAT_QEAALoDADD-AQAATQAQ_wEAALoDADCLAkAAgwMAIYwCQACDAwAhxAIBAIADACHFAgEAgAMAIcYCAQCOAwAhxwIBAI4DACHIAgEAjgMAIckCAQCOAwAhygIBAI4DACHLAgEAjgMAIcwCAQCOAwAhzQIBAI4DACHOAkAAlwMAIc8CAQCAAwAh0AIBAIADACHRAkAAlwMAIQMAAAA6ACABAABMADAmAABNACADAAAAOgAgAQAAOwAwAgAAAQAgAQAAADAAIAEAAAAwACADAAAALgAgAQAALwAwAgAAMAAgAwAAAC4AIAEAAC8AMAIAADAAIAMAAAAuACABAAAvADACAAAwACAIEgAAjgUAIBMAAI8FACCBAgEAAAABggIBAAAAAYMCAQAAAAGLAkAAAAABwgIBAAAAAcMCAQAAAAEBGgAAVQAgBoECAQAAAAGCAgEAAAABgwIBAAAAAYsCQAAAAAHCAgEAAAABwwIBAAAAAQEaAABXADABGgAAVwAwCBIAAIwFACATAACNBQAggQIBAOkDACGCAgEA6QMAIYMCAQDpAwAhiwJAAOADACHCAgEA3QMAIcMCAQDdAwAhAgAAADAAIBoAAFoAIAaBAgEA6QMAIYICAQDpAwAhgwIBAOkDACGLAkAA4AMAIcICAQDdAwAhwwIBAN0DACECAAAALgAgGgAAXAAgAgAAAC4AIBoAAFwAIAMAAAAwACAhAABVACAiAABaACABAAAAMAAgAQAAAC4AIAYGAACJBQAgJwAAiwUAICgAAIoFACCBAgAA4wMAIIICAADjAwAggwIAAOMDACAJ_QEAALkDADD-AQAAYwAQ_wEAALkDADCBAgEAjgMAIYICAQCOAwAhgwIBAI4DACGLAkAAgwMAIcICAQCAAwAhwwIBAIADACEDAAAALgAgAQAAYgAwJgAAYwAgAwAAAC4AIAEAAC8AMAIAADAAIAj9AQAAuAMAMP4BAABpABD_AQAAuAMAMIACAQAAAAGEAgEAAAABiwJAAKkDACGMAkAAqQMAIcECAQCkAwAhAQAAAGYAIAEAAABmACAI_QEAALgDADD-AQAAaQAQ_wEAALgDADCAAgEApAMAIYQCAQCkAwAhiwJAAKkDACGMAkAAqQMAIcECAQCkAwAhAAMAAABpACABAABqADACAABmACADAAAAaQAgAQAAagAwAgAAZgAgAwAAAGkAIAEAAGoAMAIAAGYAIAWAAgEAAAABhAIBAAAAAYsCQAAAAAGMAkAAAAABwQIBAAAAAQEaAABuACAFgAIBAAAAAYQCAQAAAAGLAkAAAAABjAJAAAAAAcECAQAAAAEBGgAAcAAwARoAAHAAMAWAAgEA3QMAIYQCAQDdAwAhiwJAAOADACGMAkAA4AMAIcECAQDdAwAhAgAAAGYAIBoAAHMAIAWAAgEA3QMAIYQCAQDdAwAhiwJAAOADACGMAkAA4AMAIcECAQDdAwAhAgAAAGkAIBoAAHUAIAIAAABpACAaAAB1ACADAAAAZgAgIQAAbgAgIgAAcwAgAQAAAGYAIAEAAABpACADBgAAhgUAICcAAIgFACAoAACHBQAgCP0BAAC3AwAw_gEAAHwAEP8BAAC3AwAwgAIBAIADACGEAgEAgAMAIYsCQACDAwAhjAJAAIMDACHBAgEAgAMAIQMAAABpACABAAB7ADAmAAB8ACADAAAAaQAgAQAAagAwAgAAZgAgB_0BAAC2AwAw_gEAAIIBABD_AQAAtgMAMIsCQACpAwAhvgIBAAAAAb8CAQCkAwAhwAJAAKkDACEBAAAAfwAgAQAAAH8AIAf9AQAAtgMAMP4BAACCAQAQ_wEAALYDADCLAkAAqQMAIb4CAQCkAwAhvwIBAKQDACHAAkAAqQMAIQADAAAAggEAIAEAAIMBADACAAB_ACADAAAAggEAIAEAAIMBADACAAB_ACADAAAAggEAIAEAAIMBADACAAB_ACAEiwJAAAAAAb4CAQAAAAG_AgEAAAABwAJAAAAAAQEaAACHAQAgBIsCQAAAAAG-AgEAAAABvwIBAAAAAcACQAAAAAEBGgAAiQEAMAEaAACJAQAwBIsCQADgAwAhvgIBAN0DACG_AgEA3QMAIcACQADgAwAhAgAAAH8AIBoAAIwBACAEiwJAAOADACG-AgEA3QMAIb8CAQDdAwAhwAJAAOADACECAAAAggEAIBoAAI4BACACAAAAggEAIBoAAI4BACADAAAAfwAgIQAAhwEAICIAAIwBACABAAAAfwAgAQAAAIIBACADBgAAgwUAICcAAIUFACAoAACEBQAgB_0BAAC1AwAw_gEAAJUBABD_AQAAtQMAMIsCQACDAwAhvgIBAIADACG_AgEAgAMAIcACQACDAwAhAwAAAIIBACABAACUAQAwJgAAlQEAIAMAAACCAQAgAQAAgwEAMAIAAH8AIA4aAAC0AwAg_QEAALMDADD-AQAAmwEAEP8BAACzAwAwgAIBAAAAAYQCAQCkAwAhiwJAAKkDACGMAkAAqQMAIaACAQCkAwAhuQIBAKQDACG6AkAAqQMAIbsCAQClAwAhvAJAAKcDACG9AkAApwMAIQEAAACYAQAgAQAAAJgBACAOGgAAtAMAIP0BAACzAwAw_gEAAJsBABD_AQAAswMAMIACAQCkAwAhhAIBAKQDACGLAkAAqQMAIYwCQACpAwAhoAIBAKQDACG5AgEApAMAIboCQACpAwAhuwIBAKUDACG8AkAApwMAIb0CQACnAwAhA7sCAADjAwAgvAIAAOMDACC9AgAA4wMAIAMAAACbAQAgAQAAnAEAMAIAAJgBACADAAAAmwEAIAEAAJwBADACAACYAQAgAwAAAJsBACABAACcAQAwAgAAmAEAIAsagAAAAAGAAgEAAAABhAIBAAAAAYsCQAAAAAGMAkAAAAABoAIBAAAAAbkCAQAAAAG6AkAAAAABuwIBAAAAAbwCQAAAAAG9AkAAAAABARoAAKABACALGoAAAAABgAIBAAAAAYQCAQAAAAGLAkAAAAABjAJAAAAAAaACAQAAAAG5AgEAAAABugJAAAAAAbsCAQAAAAG8AkAAAAABvQJAAAAAAQEaAACiAQAwARoAAKIBADALGoAAAAABgAIBAN0DACGEAgEA3QMAIYsCQADgAwAhjAJAAOADACGgAgEA3QMAIbkCAQDdAwAhugJAAOADACG7AgEA6QMAIbwCQACJBAAhvQJAAIkEACECAAAAmAEAIBoAAKUBACALGoAAAAABgAIBAN0DACGEAgEA3QMAIYsCQADgAwAhjAJAAOADACGgAgEA3QMAIbkCAQDdAwAhugJAAOADACG7AgEA6QMAIbwCQACJBAAhvQJAAIkEACECAAAAmwEAIBoAAKcBACACAAAAmwEAIBoAAKcBACADAAAAmAEAICEAAKABACAiAAClAQAgAQAAAJgBACABAAAAmwEAIAYGAACABQAgJwAAggUAICgAAIEFACC7AgAA4wMAILwCAADjAwAgvQIAAOMDACAOGgAAsQMAIP0BAACwAwAw_gEAAK4BABD_AQAAsAMAMIACAQCAAwAhhAIBAIADACGLAkAAgwMAIYwCQACDAwAhoAIBAIADACG5AgEAgAMAIboCQACDAwAhuwIBAI4DACG8AkAAlwMAIb0CQACXAwAhAwAAAJsBACABAACtAQAwJgAArgEAIAMAAACbAQAgAQAAnAEAMAIAAJgBACAPBAAArwMAIAoAAKsDACD9AQAArgMAMP4BAAAOABD_AQAArgMAMIsCQACpAwAhjAJAAKkDACGZAgEAAAABpQIBAKUDACGnAgEApQMAIakCAQCkAwAhqgIBAKUDACGtAgAAqAMAILcCAgCmAwAhuAJAAKcDACEBAAAAsQEAIAEAAACxAQAgCAQAAP8EACAKAADfBAAgpQIAAOMDACCnAgAA4wMAIKoCAADjAwAgrQIAAOMDACC3AgAA4wMAILgCAADjAwAgAwAAAA4AIAEAALQBADACAACxAQAgAwAAAA4AIAEAALQBADACAACxAQAgAwAAAA4AIAEAALQBADACAACxAQAgDAQAAP0EACAKAAD-BAAgiwJAAAAAAYwCQAAAAAGZAgEAAAABpQIBAAAAAacCAQAAAAGpAgEAAAABqgIBAAAAAa0CgAAAAAG3AgIAAAABuAJAAAAAAQEaAAC4AQAgCosCQAAAAAGMAkAAAAABmQIBAAAAAaUCAQAAAAGnAgEAAAABqQIBAAAAAaoCAQAAAAGtAoAAAAABtwICAAAAAbgCQAAAAAEBGgAAugEAMAEaAAC6AQAwDAQAAOYEACAKAADnBAAgiwJAAOADACGMAkAA4AMAIZkCAQDdAwAhpQIBAOkDACGnAgEA6QMAIakCAQDdAwAhqgIBAOkDACGtAoAAAAABtwICAKEEACG4AkAAiQQAIQIAAACxAQAgGgAAvQEAIAqLAkAA4AMAIYwCQADgAwAhmQIBAN0DACGlAgEA6QMAIacCAQDpAwAhqQIBAN0DACGqAgEA6QMAIa0CgAAAAAG3AgIAoQQAIbgCQACJBAAhAgAAAA4AIBoAAL8BACACAAAADgAgGgAAvwEAIAMAAACxAQAgIQAAuAEAICIAAL0BACABAAAAsQEAIAEAAAAOACALBgAA4QQAICcAAOQEACAoAADjBAAgeQAA4gQAIHoAAOUEACClAgAA4wMAIKcCAADjAwAgqgIAAOMDACCtAgAA4wMAILcCAADjAwAguAIAAOMDACAN_QEAAK0DADD-AQAAxgEAEP8BAACtAwAwiwJAAIMDACGMAkAAgwMAIZkCAQCAAwAhpQIBAI4DACGnAgEAjgMAIakCAQCAAwAhqgIBAI4DACGtAgAAoQMAILcCAgCdAwAhuAJAAJcDACEDAAAADgAgAQAAxQEAMCYAAMYBACADAAAADgAgAQAAtAEAMAIAALEBACAQBAAAqgMAIAoAAKsDACANAACsAwAg_QEAAKMDADD-AQAAEAAQ_wEAAKMDADCLAkAAqQMAIYwCQACpAwAhmgIBAAAAAaUCAQClAwAhpwIBAKUDACGpAgEApAMAIaoCAQClAwAhqwICAKYDACGsAkAApwMAIa0CAACoAwAgAQAAAMkBACABAAAAyQEAIAkEAADeBAAgCgAA3wQAIA0AAOAEACClAgAA4wMAIKcCAADjAwAgqgIAAOMDACCrAgAA4wMAIKwCAADjAwAgrQIAAOMDACADAAAAEAAgAQAAzAEAMAIAAMkBACADAAAAEAAgAQAAzAEAMAIAAMkBACADAAAAEAAgAQAAzAEAMAIAAMkBACANBAAA2wQAIAoAANwEACANAADdBAAgiwJAAAAAAYwCQAAAAAGaAgEAAAABpQIBAAAAAacCAQAAAAGpAgEAAAABqgIBAAAAAasCAgAAAAGsAkAAAAABrQKAAAAAAQEaAADQAQAgCosCQAAAAAGMAkAAAAABmgIBAAAAAaUCAQAAAAGnAgEAAAABqQIBAAAAAaoCAQAAAAGrAgIAAAABrAJAAAAAAa0CgAAAAAEBGgAA0gEAMAEaAADSAQAwDQQAALcEACAKAAC4BAAgDQAAuQQAIIsCQADgAwAhjAJAAOADACGaAgEA3QMAIaUCAQDpAwAhpwIBAOkDACGpAgEA3QMAIaoCAQDpAwAhqwICAKEEACGsAkAAiQQAIa0CgAAAAAECAAAAyQEAIBoAANUBACAKiwJAAOADACGMAkAA4AMAIZoCAQDdAwAhpQIBAOkDACGnAgEA6QMAIakCAQDdAwAhqgIBAOkDACGrAgIAoQQAIawCQACJBAAhrQKAAAAAAQIAAAAQACAaAADXAQAgAgAAABAAIBoAANcBACADAAAAyQEAICEAANABACAiAADVAQAgAQAAAMkBACABAAAAEAAgCwYAALIEACAnAAC1BAAgKAAAtAQAIHkAALMEACB6AAC2BAAgpQIAAOMDACCnAgAA4wMAIKoCAADjAwAgqwIAAOMDACCsAgAA4wMAIK0CAADjAwAgDf0BAACgAwAw_gEAAN4BABD_AQAAoAMAMIsCQACDAwAhjAJAAIMDACGaAgEAgAMAIaUCAQCOAwAhpwIBAI4DACGpAgEAgAMAIaoCAQCOAwAhqwICAJ0DACGsAkAAlwMAIa0CAAChAwAgAwAAABAAIAEAAN0BADAmAADeAQAgAwAAABAAIAEAAMwBADACAADJAQAgAQAAABkAIAEAAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACAMCQAAsAQAIAwAALEEACCAAgEAAAABiAICAAAAAYsCQAAAAAGMAkAAAAABmgIBAAAAAZwCAQAAAAGiAgIAAAABpAJAAAAAAacCAQAAAAGoAgIAAAABARoAAOYBACAKgAIBAAAAAYgCAgAAAAGLAkAAAAABjAJAAAAAAZoCAQAAAAGcAgEAAAABogICAAAAAaQCQAAAAAGnAgEAAAABqAICAAAAAQEaAADoAQAwARoAAOgBADAMCQAAogQAIAwAAKMEACCAAgEA3QMAIYgCAgDfAwAhiwJAAOADACGMAkAA4AMAIZoCAQDdAwAhnAIBAN0DACGiAgIA3wMAIaQCQACJBAAhpwIBAOkDACGoAgIAoQQAIQIAAAAZACAaAADrAQAgCoACAQDdAwAhiAICAN8DACGLAkAA4AMAIYwCQADgAwAhmgIBAN0DACGcAgEA3QMAIaICAgDfAwAhpAJAAIkEACGnAgEA6QMAIagCAgChBAAhAgAAABcAIBoAAO0BACACAAAAFwAgGgAA7QEAIAMAAAAZACAhAADmAQAgIgAA6wEAIAEAAAAZACABAAAAFwAgCAYAAJwEACAnAACfBAAgKAAAngQAIHkAAJ0EACB6AACgBAAgpAIAAOMDACCnAgAA4wMAIKgCAADjAwAgDf0BAACcAwAw_gEAAPQBABD_AQAAnAMAMIACAQCAAwAhiAICAIIDACGLAkAAgwMAIYwCQACDAwAhmgIBAIADACGcAgEAgAMAIaICAgCCAwAhpAJAAJcDACGnAgEAjgMAIagCAgCdAwAhAwAAABcAIAEAAPMBADAmAAD0AQAgAwAAABcAIAEAABgAMAIAABkAIAEAAAAdACABAAAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgDQsAAJsEACCAAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABjAJAAAAAAZoCAQAAAAGcAgEAAAABogICAAAAAaMCAQAAAAGkAkAAAAABpQIBAAAAAaYCAQAAAAEBGgAA_AEAIAyAAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABjAJAAAAAAZoCAQAAAAGcAgEAAAABogICAAAAAaMCAQAAAAGkAkAAAAABpQIBAAAAAaYCAQAAAAEBGgAA_gEAMAEaAAD-AQAwDQsAAJoEACCAAgEA3QMAIYgCAgDfAwAhiQICAN8DACGLAkAA4AMAIYwCQADgAwAhmgIBAN0DACGcAgEA3QMAIaICAgDfAwAhowIBAN0DACGkAkAAiQQAIaUCAQDpAwAhpgIBAOkDACECAAAAHQAgGgAAgQIAIAyAAgEA3QMAIYgCAgDfAwAhiQICAN8DACGLAkAA4AMAIYwCQADgAwAhmgIBAN0DACGcAgEA3QMAIaICAgDfAwAhowIBAN0DACGkAkAAiQQAIaUCAQDpAwAhpgIBAOkDACECAAAAGwAgGgAAgwIAIAIAAAAbACAaAACDAgAgAwAAAB0AICEAAPwBACAiAACBAgAgAQAAAB0AIAEAAAAbACAIBgAAlQQAICcAAJgEACAoAACXBAAgeQAAlgQAIHoAAJkEACCkAgAA4wMAIKUCAADjAwAgpgIAAOMDACAP_QEAAJsDADD-AQAAigIAEP8BAACbAwAwgAIBAIADACGIAgIAggMAIYkCAgCCAwAhiwJAAIMDACGMAkAAgwMAIZoCAQCAAwAhnAIBAIADACGiAgIAggMAIaMCAQCAAwAhpAJAAJcDACGlAgEAjgMAIaYCAQCOAwAhAwAAABsAIAEAAIkCADAmAACKAgAgAwAAABsAIAEAABwAMAIAAB0AIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgDAMAAJMEACAIAACUBAAggAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYQCAQAAAAGLAkAAAAABjAJAAAAAAZkCAQAAAAGgAgEAAAABoQJAAAAAAQEaAACSAgAgCoACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABiwJAAAAAAYwCQAAAAAGZAgEAAAABoAIBAAAAAaECQAAAAAEBGgAAlAIAMAEaAACUAgAwDAMAAJEEACAIAACSBAAggAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAN0DACGEAgEA3QMAIYsCQADgAwAhjAJAAOADACGZAgEA3QMAIaACAQDdAwAhoQJAAIkEACECAAAABQAgGgAAlwIAIAqAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA3QMAIYQCAQDdAwAhiwJAAOADACGMAkAA4AMAIZkCAQDdAwAhoAIBAN0DACGhAkAAiQQAIQIAAAADACAaAACZAgAgAgAAAAMAIBoAAJkCACADAAAABQAgIQAAkgIAICIAAJcCACABAAAABQAgAQAAAAMAIAQGAACOBAAgJwAAkAQAICgAAI8EACChAgAA4wMAIA39AQAAmgMAMP4BAACgAgAQ_wEAAJoDADCAAgEAgAMAIYECAQCAAwAhggIBAIADACGDAgEAgAMAIYQCAQCAAwAhiwJAAIMDACGMAkAAgwMAIZkCAQCAAwAhoAIBAIADACGhAkAAlwMAIQMAAAADACABAACfAgAwJgAAoAIAIAMAAAADACABAAAEADACAAAFACABAAAAFAAgAQAAABQAIAMAAAASACABAAATADACAAAUACADAAAAEgAgAQAAEwAwAgAAFAAgAwAAABIAIAEAABMAMAIAABQAIA4DAACMBAAgCQAAjQQAIIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABjAJAAAAAAZoCAQAAAAGgAgEAAAABoQJAAAAAAQEaAACoAgAgDIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABjAJAAAAAAZoCAQAAAAGgAgEAAAABoQJAAAAAAQEaAACqAgAwARoAAKoCADAOAwAAigQAIAkAAIsEACCAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA3QMAIYQCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhjAJAAOADACGaAgEA3QMAIaACAQDdAwAhoQJAAIkEACECAAAAFAAgGgAArQIAIAyAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA3QMAIYQCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhjAJAAOADACGaAgEA3QMAIaACAQDdAwAhoQJAAIkEACECAAAAEgAgGgAArwIAIAIAAAASACAaAACvAgAgAwAAABQAICEAAKgCACAiAACtAgAgAQAAABQAIAEAAAASACAGBgAAhAQAICcAAIcEACAoAACGBAAgeQAAhQQAIHoAAIgEACChAgAA4wMAIA_9AQAAlgMAMP4BAAC2AgAQ_wEAAJYDADCAAgEAgAMAIYECAQCAAwAhggIBAIADACGDAgEAgAMAIYQCAQCAAwAhiAICAIIDACGJAgIAggMAIYsCQACDAwAhjAJAAIMDACGaAgEAgAMAIaACAQCAAwAhoQJAAJcDACEDAAAAEgAgAQAAtQIAMCYAALYCACADAAAAEgAgAQAAEwAwAgAAFAAgAQAAACgAIAEAAAAoACADAAAAJgAgAQAAJwAwAgAAKAAgAwAAACYAIAEAACcAMAIAACgAIAMAAAAmACABAAAnADACAAAoACANAwAAggQAIAUAAIMEACCAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABhAIBAAAAAYsCQAAAAAGMAkAAAAABnAIBAAAAAZ0CAQAAAAGeAgEAAAABnwIgAAAAAQEaAAC-AgAgC4ACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABiwJAAAAAAYwCQAAAAAGcAgEAAAABnQIBAAAAAZ4CAQAAAAGfAiAAAAABARoAAMACADABGgAAwAIAMA0DAAD0AwAgBQAA9QMAIIACAQDdAwAhgQIBAN0DACGCAgEA3QMAIYMCAQDpAwAhhAIBAN0DACGLAkAA4AMAIYwCQADgAwAhnAIBAN0DACGdAgEA6QMAIZ4CAQDdAwAhnwIgAPMDACECAAAAKAAgGgAAwwIAIAuAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA6QMAIYQCAQDdAwAhiwJAAOADACGMAkAA4AMAIZwCAQDdAwAhnQIBAOkDACGeAgEA3QMAIZ8CIADzAwAhAgAAACYAIBoAAMUCACACAAAAJgAgGgAAxQIAIAMAAAAoACAhAAC-AgAgIgAAwwIAIAEAAAAoACABAAAAJgAgBQYAAPADACAnAADyAwAgKAAA8QMAIIMCAADjAwAgnQIAAOMDACAO_QEAAJIDADD-AQAAzAIAEP8BAACSAwAwgAIBAIADACGBAgEAgAMAIYICAQCAAwAhgwIBAI4DACGEAgEAgAMAIYsCQACDAwAhjAJAAIMDACGcAgEAgAMAIZ0CAQCOAwAhngIBAIADACGfAiAAkwMAIQMAAAAmACABAADLAgAwJgAAzAIAIAMAAAAmACABAAAnADACAAAoACABAAAACgAgAQAAAAoAIAMAAAAIACABAAAJADACAAAKACADAAAACAAgAQAACQAwAgAACgAgAwAAAAgAIAEAAAkAMAIAAAoAIBEHAADtAwAgCAAA7gMAIAkAAO8DACARAQAAAAGAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABhgIAAACGAgKHAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABmAIBAAAAAZkCAQAAAAGaAgEAAAABmwICAAAAAQEaAADUAgAgDhEBAAAAAYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGGAgAAAIYCAocCAQAAAAGIAgIAAAABiQICAAAAAYsCQAAAAAGYAgEAAAABmQIBAAAAAZoCAQAAAAGbAgIAAAABARoAANYCADABGgAA1gIAMAEAAAAOACABAAAAEAAgEQcAAOoDACAIAADrAwAgCQAA7AMAIBEBAOkDACGAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA6QMAIYYCAADeA4YCIocCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhmAIBAN0DACGZAgEA6QMAIZoCAQDpAwAhmwICAN8DACECAAAACgAgGgAA2wIAIA4RAQDpAwAhgAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAOkDACGGAgAA3gOGAiKHAgEA3QMAIYgCAgDfAwAhiQICAN8DACGLAkAA4AMAIZgCAQDdAwAhmQIBAOkDACGaAgEA6QMAIZsCAgDfAwAhAgAAAAgAIBoAAN0CACACAAAACAAgGgAA3QIAIAEAAAAOACABAAAAEAAgAwAAAAoAICEAANQCACAiAADbAgAgAQAAAAoAIAEAAAAIACAJBgAA5AMAIBEAAOMDACAnAADnAwAgKAAA5gMAIHkAAOUDACB6AADoAwAggwIAAOMDACCZAgAA4wMAIJoCAADjAwAgEREBAI4DACH9AQAAjQMAMP4BAADmAgAQ_wEAAI0DADCAAgEAgAMAIYECAQCAAwAhggIBAIADACGDAgEAjgMAIYYCAACBA4YCIocCAQCAAwAhiAICAIIDACGJAgIAggMAIYsCQACDAwAhmAIBAIADACGZAgEAjgMAIZoCAQCOAwAhmwICAIIDACEDAAAACAAgAQAA5QIAMCYAAOYCACADAAAACAAgAQAACQAwAgAACgAgAQAAACwAIAEAAAAsACADAAAAKgAgAQAAKwAwAgAALAAgAwAAACoAIAEAACsAMAIAACwAIAMAAAAqACABAAArADACAAAsACANAwAA4gMAIIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABhgIAAACGAgKHAgEAAAABiAICAAAAAYkCAgAAAAGKAgEAAAABiwJAAAAAAYwCQAAAAAEBGgAA7gIAIAyAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABhAIBAAAAAYYCAAAAhgIChwIBAAAAAYgCAgAAAAGJAgIAAAABigIBAAAAAYsCQAAAAAGMAkAAAAABARoAAPACADABGgAA8AIAMA0DAADhAwAggAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAN0DACGEAgEA3QMAIYYCAADeA4YCIocCAQDdAwAhiAICAN8DACGJAgIA3wMAIYoCAQDdAwAhiwJAAOADACGMAkAA4AMAIQIAAAAsACAaAADzAgAgDIACAQDdAwAhgQIBAN0DACGCAgEA3QMAIYMCAQDdAwAhhAIBAN0DACGGAgAA3gOGAiKHAgEA3QMAIYgCAgDfAwAhiQICAN8DACGKAgEA3QMAIYsCQADgAwAhjAJAAOADACECAAAAKgAgGgAA9QIAIAIAAAAqACAaAAD1AgAgAwAAACwAICEAAO4CACAiAADzAgAgAQAAACwAIAEAAAAqACAFBgAA2AMAICcAANsDACAoAADaAwAgeQAA2QMAIHoAANwDACAP_QEAAP8CADD-AQAA_AIAEP8BAAD_AgAwgAIBAIADACGBAgEAgAMAIYICAQCAAwAhgwIBAIADACGEAgEAgAMAIYYCAACBA4YCIocCAQCAAwAhiAICAIIDACGJAgIAggMAIYoCAQCAAwAhiwJAAIMDACGMAkAAgwMAIQMAAAAqACABAAD7AgAwJgAA_AIAIAMAAAAqACABAAArADACAAAsACAP_QEAAP8CADD-AQAA_AIAEP8BAAD_AgAwgAIBAIADACGBAgEAgAMAIYICAQCAAwAhgwIBAIADACGEAgEAgAMAIYYCAACBA4YCIocCAQCAAwAhiAICAIIDACGJAgIAggMAIYoCAQCAAwAhiwJAAIMDACGMAkAAgwMAIQ4GAACFAwAgJwAAjAMAICgAAIwDACCNAgEAAAABjgIBAAAABI8CAQAAAASQAgEAAAABkQIBAAAAAZICAQAAAAGTAgEAAAABlAIBAIsDACGVAgEAAAABlgIBAAAAAZcCAQAAAAEHBgAAhQMAICcAAIoDACAoAACKAwAgjQIAAACGAgKOAgAAAIYCCI8CAAAAhgIIlAIAAIkDhgIiDQYAAIUDACAnAACFAwAgKAAAhQMAIHkAAIgDACB6AACFAwAgjQICAAAAAY4CAgAAAASPAgIAAAAEkAICAAAAAZECAgAAAAGSAgIAAAABkwICAAAAAZQCAgCHAwAhCwYAAIUDACAnAACGAwAgKAAAhgMAII0CQAAAAAGOAkAAAAAEjwJAAAAABJACQAAAAAGRAkAAAAABkgJAAAAAAZMCQAAAAAGUAkAAhAMAIQsGAACFAwAgJwAAhgMAICgAAIYDACCNAkAAAAABjgJAAAAABI8CQAAAAASQAkAAAAABkQJAAAAAAZICQAAAAAGTAkAAAAABlAJAAIQDACEIjQICAAAAAY4CAgAAAASPAgIAAAAEkAICAAAAAZECAgAAAAGSAgIAAAABkwICAAAAAZQCAgCFAwAhCI0CQAAAAAGOAkAAAAAEjwJAAAAABJACQAAAAAGRAkAAAAABkgJAAAAAAZMCQAAAAAGUAkAAhgMAIQ0GAACFAwAgJwAAhQMAICgAAIUDACB5AACIAwAgegAAhQMAII0CAgAAAAGOAgIAAAAEjwICAAAABJACAgAAAAGRAgIAAAABkgICAAAAAZMCAgAAAAGUAgIAhwMAIQiNAggAAAABjgIIAAAABI8CCAAAAASQAggAAAABkQIIAAAAAZICCAAAAAGTAggAAAABlAIIAIgDACEHBgAAhQMAICcAAIoDACAoAACKAwAgjQIAAACGAgKOAgAAAIYCCI8CAAAAhgIIlAIAAIkDhgIiBI0CAAAAhgICjgIAAACGAgiPAgAAAIYCCJQCAACKA4YCIg4GAACFAwAgJwAAjAMAICgAAIwDACCNAgEAAAABjgIBAAAABI8CAQAAAASQAgEAAAABkQIBAAAAAZICAQAAAAGTAgEAAAABlAIBAIsDACGVAgEAAAABlgIBAAAAAZcCAQAAAAELjQIBAAAAAY4CAQAAAASPAgEAAAAEkAIBAAAAAZECAQAAAAGSAgEAAAABkwIBAAAAAZQCAQCMAwAhlQIBAAAAAZYCAQAAAAGXAgEAAAABEREBAI4DACH9AQAAjQMAMP4BAADmAgAQ_wEAAI0DADCAAgEAgAMAIYECAQCAAwAhggIBAIADACGDAgEAjgMAIYYCAACBA4YCIocCAQCAAwAhiAICAIIDACGJAgIAggMAIYsCQACDAwAhmAIBAIADACGZAgEAjgMAIZoCAQCOAwAhmwICAIIDACEOBgAAkAMAICcAAJEDACAoAACRAwAgjQIBAAAAAY4CAQAAAAWPAgEAAAAFkAIBAAAAAZECAQAAAAGSAgEAAAABkwIBAAAAAZQCAQCPAwAhlQIBAAAAAZYCAQAAAAGXAgEAAAABDgYAAJADACAnAACRAwAgKAAAkQMAII0CAQAAAAGOAgEAAAAFjwIBAAAABZACAQAAAAGRAgEAAAABkgIBAAAAAZMCAQAAAAGUAgEAjwMAIZUCAQAAAAGWAgEAAAABlwIBAAAAAQiNAgIAAAABjgICAAAABY8CAgAAAAWQAgIAAAABkQICAAAAAZICAgAAAAGTAgIAAAABlAICAJADACELjQIBAAAAAY4CAQAAAAWPAgEAAAAFkAIBAAAAAZECAQAAAAGSAgEAAAABkwIBAAAAAZQCAQCRAwAhlQIBAAAAAZYCAQAAAAGXAgEAAAABDv0BAACSAwAw_gEAAMwCABD_AQAAkgMAMIACAQCAAwAhgQIBAIADACGCAgEAgAMAIYMCAQCOAwAhhAIBAIADACGLAkAAgwMAIYwCQACDAwAhnAIBAIADACGdAgEAjgMAIZ4CAQCAAwAhnwIgAJMDACEFBgAAhQMAICcAAJUDACAoAACVAwAgjQIgAAAAAZQCIACUAwAhBQYAAIUDACAnAACVAwAgKAAAlQMAII0CIAAAAAGUAiAAlAMAIQKNAiAAAAABlAIgAJUDACEP_QEAAJYDADD-AQAAtgIAEP8BAACWAwAwgAIBAIADACGBAgEAgAMAIYICAQCAAwAhgwIBAIADACGEAgEAgAMAIYgCAgCCAwAhiQICAIIDACGLAkAAgwMAIYwCQACDAwAhmgIBAIADACGgAgEAgAMAIaECQACXAwAhCwYAAJADACAnAACZAwAgKAAAmQMAII0CQAAAAAGOAkAAAAAFjwJAAAAABZACQAAAAAGRAkAAAAABkgJAAAAAAZMCQAAAAAGUAkAAmAMAIQsGAACQAwAgJwAAmQMAICgAAJkDACCNAkAAAAABjgJAAAAABY8CQAAAAAWQAkAAAAABkQJAAAAAAZICQAAAAAGTAkAAAAABlAJAAJgDACEIjQJAAAAAAY4CQAAAAAWPAkAAAAAFkAJAAAAAAZECQAAAAAGSAkAAAAABkwJAAAAAAZQCQACZAwAhDf0BAACaAwAw_gEAAKACABD_AQAAmgMAMIACAQCAAwAhgQIBAIADACGCAgEAgAMAIYMCAQCAAwAhhAIBAIADACGLAkAAgwMAIYwCQACDAwAhmQIBAIADACGgAgEAgAMAIaECQACXAwAhD_0BAACbAwAw_gEAAIoCABD_AQAAmwMAMIACAQCAAwAhiAICAIIDACGJAgIAggMAIYsCQACDAwAhjAJAAIMDACGaAgEAgAMAIZwCAQCAAwAhogICAIIDACGjAgEAgAMAIaQCQACXAwAhpQIBAI4DACGmAgEAjgMAIQ39AQAAnAMAMP4BAAD0AQAQ_wEAAJwDADCAAgEAgAMAIYgCAgCCAwAhiwJAAIMDACGMAkAAgwMAIZoCAQCAAwAhnAIBAIADACGiAgIAggMAIaQCQACXAwAhpwIBAI4DACGoAgIAnQMAIQ0GAACQAwAgJwAAkAMAICgAAJADACB5AACfAwAgegAAkAMAII0CAgAAAAGOAgIAAAAFjwICAAAABZACAgAAAAGRAgIAAAABkgICAAAAAZMCAgAAAAGUAgIAngMAIQ0GAACQAwAgJwAAkAMAICgAAJADACB5AACfAwAgegAAkAMAII0CAgAAAAGOAgIAAAAFjwICAAAABZACAgAAAAGRAgIAAAABkgICAAAAAZMCAgAAAAGUAgIAngMAIQiNAggAAAABjgIIAAAABY8CCAAAAAWQAggAAAABkQIIAAAAAZICCAAAAAGTAggAAAABlAIIAJ8DACEN_QEAAKADADD-AQAA3gEAEP8BAACgAwAwiwJAAIMDACGMAkAAgwMAIZoCAQCAAwAhpQIBAI4DACGnAgEAjgMAIakCAQCAAwAhqgIBAI4DACGrAgIAnQMAIawCQACXAwAhrQIAAKEDACAPBgAAkAMAICcAAKIDACAoAACiAwAgjQKAAAAAAZACgAAAAAGRAoAAAAABkgKAAAAAAZMCgAAAAAGUAoAAAAABrgIBAAAAAa8CAQAAAAGwAgEAAAABsQKAAAAAAbICgAAAAAGzAoAAAAABDI0CgAAAAAGQAoAAAAABkQKAAAAAAZICgAAAAAGTAoAAAAABlAKAAAAAAa4CAQAAAAGvAgEAAAABsAIBAAAAAbECgAAAAAGyAoAAAAABswKAAAAAARAEAACqAwAgCgAAqwMAIA0AAKwDACD9AQAAowMAMP4BAAAQABD_AQAAowMAMIsCQACpAwAhjAJAAKkDACGaAgEApAMAIaUCAQClAwAhpwIBAKUDACGpAgEApAMAIaoCAQClAwAhqwICAKYDACGsAkAApwMAIa0CAACoAwAgC40CAQAAAAGOAgEAAAAEjwIBAAAABJACAQAAAAGRAgEAAAABkgIBAAAAAZMCAQAAAAGUAgEAjAMAIZUCAQAAAAGWAgEAAAABlwIBAAAAAQuNAgEAAAABjgIBAAAABY8CAQAAAAWQAgEAAAABkQIBAAAAAZICAQAAAAGTAgEAAAABlAIBAJEDACGVAgEAAAABlgIBAAAAAZcCAQAAAAEIjQICAAAAAY4CAgAAAAWPAgIAAAAFkAICAAAAAZECAgAAAAGSAgIAAAABkwICAAAAAZQCAgCQAwAhCI0CQAAAAAGOAkAAAAAFjwJAAAAABZACQAAAAAGRAkAAAAABkgJAAAAAAZMCQAAAAAGUAkAAmQMAIQyNAoAAAAABkAKAAAAAAZECgAAAAAGSAoAAAAABkwKAAAAAAZQCgAAAAAGuAgEAAAABrwIBAAAAAbACAQAAAAGxAoAAAAABsgKAAAAAAbMCgAAAAAEIjQJAAAAAAY4CQAAAAASPAkAAAAAEkAJAAAAAAZECQAAAAAGSAkAAAAABkwJAAAAAAZQCQACGAwAhA7QCAAASACC1AgAAEgAgtgIAABIAIAO0AgAACAAgtQIAAAgAILYCAAAIACADtAIAABcAILUCAAAXACC2AgAAFwAgDf0BAACtAwAw_gEAAMYBABD_AQAArQMAMIsCQACDAwAhjAJAAIMDACGZAgEAgAMAIaUCAQCOAwAhpwIBAI4DACGpAgEAgAMAIaoCAQCOAwAhrQIAAKEDACC3AgIAnQMAIbgCQACXAwAhDwQAAK8DACAKAACrAwAg_QEAAK4DADD-AQAADgAQ_wEAAK4DADCLAkAAqQMAIYwCQACpAwAhmQIBAKQDACGlAgEApQMAIacCAQClAwAhqQIBAKQDACGqAgEApQMAIa0CAACoAwAgtwICAKYDACG4AkAApwMAIQO0AgAAAwAgtQIAAAMAILYCAAADACAOGgAAsQMAIP0BAACwAwAw_gEAAK4BABD_AQAAsAMAMIACAQCAAwAhhAIBAIADACGLAkAAgwMAIYwCQACDAwAhoAIBAIADACG5AgEAgAMAIboCQACDAwAhuwIBAI4DACG8AkAAlwMAIb0CQACXAwAhDwYAAIUDACAnAACyAwAgKAAAsgMAII0CgAAAAAGQAoAAAAABkQKAAAAAAZICgAAAAAGTAoAAAAABlAKAAAAAAa4CAQAAAAGvAgEAAAABsAIBAAAAAbECgAAAAAGyAoAAAAABswKAAAAAAQyNAoAAAAABkAKAAAAAAZECgAAAAAGSAoAAAAABkwKAAAAAAZQCgAAAAAGuAgEAAAABrwIBAAAAAbACAQAAAAGxAoAAAAABsgKAAAAAAbMCgAAAAAEOGgAAtAMAIP0BAACzAwAw_gEAAJsBABD_AQAAswMAMIACAQCkAwAhhAIBAKQDACGLAkAAqQMAIYwCQACpAwAhoAIBAKQDACG5AgEApAMAIboCQACpAwAhuwIBAKUDACG8AkAApwMAIb0CQACnAwAhDI0CgAAAAAGQAoAAAAABkQKAAAAAAZICgAAAAAGTAoAAAAABlAKAAAAAAa4CAQAAAAGvAgEAAAABsAIBAAAAAbECgAAAAAGyAoAAAAABswKAAAAAAQf9AQAAtQMAMP4BAACVAQAQ_wEAALUDADCLAkAAgwMAIb4CAQCAAwAhvwIBAIADACHAAkAAgwMAIQf9AQAAtgMAMP4BAACCAQAQ_wEAALYDADCLAkAAqQMAIb4CAQCkAwAhvwIBAKQDACHAAkAAqQMAIQj9AQAAtwMAMP4BAAB8ABD_AQAAtwMAMIACAQCAAwAhhAIBAIADACGLAkAAgwMAIYwCQACDAwAhwQIBAIADACEI_QEAALgDADD-AQAAaQAQ_wEAALgDADCAAgEApAMAIYQCAQCkAwAhiwJAAKkDACGMAkAAqQMAIcECAQCkAwAhCf0BAAC5AwAw_gEAAGMAEP8BAAC5AwAwgQIBAI4DACGCAgEAjgMAIYMCAQCOAwAhiwJAAIMDACHCAgEAgAMAIcMCAQCAAwAhE_0BAAC6AwAw_gEAAE0AEP8BAAC6AwAwiwJAAIMDACGMAkAAgwMAIcQCAQCAAwAhxQIBAIADACHGAgEAjgMAIccCAQCOAwAhyAIBAI4DACHJAgEAjgMAIcoCAQCOAwAhywIBAI4DACHMAgEAjgMAIc0CAQCOAwAhzgJAAJcDACHPAgEAgAMAIdACAQCAAwAh0QJAAJcDACEZDgAArwMAIA8AAKoDACAQAAC8AwAgEQAAvQMAIBMAAL4DACAUAAC-AwAg_QEAALsDADD-AQAAOgAQ_wEAALsDADCLAkAAqQMAIYwCQACpAwAhxAIBAKQDACHFAgEApAMAIcYCAQClAwAhxwIBAKUDACHIAgEApQMAIckCAQClAwAhygIBAKUDACHLAgEApQMAIcwCAQClAwAhzQIBAKUDACHOAkAApwMAIc8CAQCkAwAh0AIBAKQDACHRAkAApwMAIQO0AgAAJgAgtQIAACYAILYCAAAmACADtAIAACoAILUCAAAqACC2AgAAKgAgA7QCAAAuACC1AgAALgAgtgIAAC4AIALCAgEAAAABwwIBAAAAAQsSAADBAwAgEwAAwQMAIP0BAADAAwAw_gEAAC4AEP8BAADAAwAwgQIBAKUDACGCAgEApQMAIYMCAQClAwAhiwJAAKkDACHCAgEApAMAIcMCAQCkAwAhGw4AAK8DACAPAACqAwAgEAAAvAMAIBEAAL0DACATAAC-AwAgFAAAvgMAIP0BAAC7AwAw_gEAADoAEP8BAAC7AwAwiwJAAKkDACGMAkAAqQMAIcQCAQCkAwAhxQIBAKQDACHGAgEApQMAIccCAQClAwAhyAIBAKUDACHJAgEApQMAIcoCAQClAwAhywIBAKUDACHMAgEApQMAIc0CAQClAwAhzgJAAKcDACHPAgEApAMAIdACAQCkAwAh0QJAAKcDACHYAgAAOgAg2QIAADoAIAWEAgEAAAABhgIAAACGAgKHAgEAAAABiAICAAAAAYkCAgAAAAEQAwAAwQMAIP0BAADDAwAw_gEAACoAEP8BAADDAwAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKQDACGEAgEApAMAIYYCAADEA4YCIocCAQCkAwAhiAICAMUDACGJAgIAxQMAIYoCAQCkAwAhiwJAAKkDACGMAkAAqQMAIQSNAgAAAIYCAo4CAAAAhgIIjwIAAACGAgiUAgAAigOGAiIIjQICAAAAAY4CAgAAAASPAgIAAAAEkAICAAAAAZECAgAAAAGSAgIAAAABkwICAAAAAZQCAgCFAwAhAoQCAQAAAAGeAgEAAAABEAMAAMEDACAFAACrAwAg_QEAAMcDADD-AQAAJgAQ_wEAAMcDADCAAgEApAMAIYECAQCkAwAhggIBAKQDACGDAgEApQMAIYQCAQCkAwAhiwJAAKkDACGMAkAAqQMAIZwCAQCkAwAhnQIBAKUDACGeAgEApAMAIZ8CIADIAwAhAo0CIAAAAAGUAiAAlQMAIQOIAgIAAAABiQICAAAAAZoCAQAAAAEQCwAAywMAIP0BAADKAwAw_gEAABsAEP8BAADKAwAwgAIBAKQDACGIAgIAxQMAIYkCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhnAIBAKQDACGiAgIAxQMAIaMCAQCkAwAhpAJAAKcDACGlAgEApQMAIaYCAQClAwAhEQkAAM4DACAMAADPAwAg_QEAAM0DADD-AQAAFwAQ_wEAAM0DADCAAgEApAMAIYgCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhnAIBAKQDACGiAgIAxQMAIaQCQACnAwAhpwIBAKUDACGoAgIApgMAIdgCAAAXACDZAgAAFwAgAogCAgAAAAGaAgEAAAABDwkAAM4DACAMAADPAwAg_QEAAM0DADD-AQAAFwAQ_wEAAM0DADCAAgEApAMAIYgCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhnAIBAKQDACGiAgIAxQMAIaQCQACnAwAhpwIBAKUDACGoAgIApgMAIRIEAACqAwAgCgAAqwMAIA0AAKwDACD9AQAAowMAMP4BAAAQABD_AQAAowMAMIsCQACpAwAhjAJAAKkDACGaAgEApAMAIaUCAQClAwAhpwIBAKUDACGpAgEApAMAIaoCAQClAwAhqwICAKYDACGsAkAApwMAIa0CAACoAwAg2AIAABAAINkCAAAQACADtAIAABsAILUCAAAbACC2AgAAGwAgEQMAAMEDACAJAADOAwAg_QEAANADADD-AQAAEgAQ_wEAANADADCAAgEApAMAIYECAQCkAwAhggIBAKQDACGDAgEApAMAIYQCAQCkAwAhiAICAMUDACGJAgIAxQMAIYsCQACpAwAhjAJAAKkDACGaAgEApAMAIaACAQCkAwAhoQJAAKcDACEFhgIAAACGAgKHAgEAAAABiAICAAAAAYkCAgAAAAGYAgEAAAABFAcAANMDACAIAADUAwAgCQAA1QMAIBEBAKUDACH9AQAA0gMAMP4BAAAIABD_AQAA0gMAMIACAQCkAwAhgQIBAKQDACGCAgEApAMAIYMCAQClAwAhhgIAAMQDhgIihwIBAKQDACGIAgIAxQMAIYkCAgDFAwAhiwJAAKkDACGYAgEApAMAIZkCAQClAwAhmgIBAKUDACGbAgIAxQMAIRIDAADBAwAgBQAAqwMAIP0BAADHAwAw_gEAACYAEP8BAADHAwAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKUDACGEAgEApAMAIYsCQACpAwAhjAJAAKkDACGcAgEApAMAIZ0CAQClAwAhngIBAKQDACGfAiAAyAMAIdgCAAAmACDZAgAAJgAgEQQAAK8DACAKAACrAwAg_QEAAK4DADD-AQAADgAQ_wEAAK4DADCLAkAAqQMAIYwCQACpAwAhmQIBAKQDACGlAgEApQMAIacCAQClAwAhqQIBAKQDACGqAgEApQMAIa0CAACoAwAgtwICAKYDACG4AkAApwMAIdgCAAAOACDZAgAADgAgEgQAAKoDACAKAACrAwAgDQAArAMAIP0BAACjAwAw_gEAABAAEP8BAACjAwAwiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhpQIBAKUDACGnAgEApQMAIakCAQCkAwAhqgIBAKUDACGrAgIApgMAIawCQACnAwAhrQIAAKgDACDYAgAAEAAg2QIAABAAIA8DAADBAwAgCAAA1wMAIP0BAADWAwAw_gEAAAMAEP8BAADWAwAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKQDACGEAgEApAMAIYsCQACpAwAhjAJAAKkDACGZAgEApAMAIaACAQCkAwAhoQJAAKcDACERBAAArwMAIAoAAKsDACD9AQAArgMAMP4BAAAOABD_AQAArgMAMIsCQACpAwAhjAJAAKkDACGZAgEApAMAIaUCAQClAwAhpwIBAKUDACGpAgEApAMAIaoCAQClAwAhrQIAAKgDACC3AgIApgMAIbgCQACnAwAh2AIAAA4AINkCAAAOACAAAAAAAAHdAgEAAAABAd0CAAAAhgICBd0CAgAAAAHjAgIAAAAB5AICAAAAAeUCAgAAAAHmAgIAAAABAd0CQAAAAAEFIQAAsAYAICIAALMGACDaAgAAsQYAINsCAACyBgAg4AIAAAEAIAMhAACwBgAg2gIAALEGACDgAgAAAQAgAAAAAAAAAd0CAQAAAAEFIQAApQYAICIAAK4GACDaAgAApgYAINsCAACtBgAg4AIAACgAIAchAACjBgAgIgAAqwYAINoCAACkBgAg2wIAAKoGACDeAgAADgAg3wIAAA4AIOACAACxAQAgByEAAKEGACAiAACoBgAg2gIAAKIGACDbAgAApwYAIN4CAAAQACDfAgAAEAAg4AIAAMkBACADIQAApQYAINoCAACmBgAg4AIAACgAIAMhAACjBgAg2gIAAKQGACDgAgAAsQEAIAMhAAChBgAg2gIAAKIGACDgAgAAyQEAIAAAAAHdAiAAAAABBSEAAJsGACAiAACfBgAg2gIAAJwGACDbAgAAngYAIOACAAABACALIQAA9gMAMCIAAPsDADDaAgAA9wMAMNsCAAD4AwAw3AIAAPkDACDdAgAA-gMAMN4CAAD6AwAw3wIAAPoDADDgAgAA-gMAMOECAAD8AwAw4gIAAP0DADAPCAAA7gMAIAkAAO8DACARAQAAAAGAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABhgIAAACGAgKHAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABmQIBAAAAAZoCAQAAAAGbAgIAAAABAgAAAAoAICEAAIEEACADAAAACgAgIQAAgQQAICIAAIAEACABGgAAnQYAMBUHAADTAwAgCAAA1AMAIAkAANUDACARAQClAwAh_QEAANIDADD-AQAACAAQ_wEAANIDADCAAgEAAAABgQIBAAAAAYICAQCkAwAhgwIBAKUDACGGAgAAxAOGAiKHAgEApAMAIYgCAgDFAwAhiQICAMUDACGLAkAAqQMAIZgCAQCkAwAhmQIBAKUDACGaAgEApQMAIZsCAgDFAwAh1wIAANEDACACAAAACgAgGgAAgAQAIAIAAAD-AwAgGgAA_wMAIBERAQClAwAh_QEAAP0DADD-AQAA_gMAEP8BAAD9AwAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKUDACGGAgAAxAOGAiKHAgEApAMAIYgCAgDFAwAhiQICAMUDACGLAkAAqQMAIZgCAQCkAwAhmQIBAKUDACGaAgEApQMAIZsCAgDFAwAhEREBAKUDACH9AQAA_QMAMP4BAAD-AwAQ_wEAAP0DADCAAgEApAMAIYECAQCkAwAhggIBAKQDACGDAgEApQMAIYYCAADEA4YCIocCAQCkAwAhiAICAMUDACGJAgIAxQMAIYsCQACpAwAhmAIBAKQDACGZAgEApQMAIZoCAQClAwAhmwICAMUDACENEQEA6QMAIYACAQDdAwAhgQIBAN0DACGCAgEA3QMAIYMCAQDpAwAhhgIAAN4DhgIihwIBAN0DACGIAgIA3wMAIYkCAgDfAwAhiwJAAOADACGZAgEA6QMAIZoCAQDpAwAhmwICAN8DACEPCAAA6wMAIAkAAOwDACARAQDpAwAhgAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAOkDACGGAgAA3gOGAiKHAgEA3QMAIYgCAgDfAwAhiQICAN8DACGLAkAA4AMAIZkCAQDpAwAhmgIBAOkDACGbAgIA3wMAIQ8IAADuAwAgCQAA7wMAIBEBAAAAAYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGGAgAAAIYCAocCAQAAAAGIAgIAAAABiQICAAAAAYsCQAAAAAGZAgEAAAABmgIBAAAAAZsCAgAAAAEDIQAAmwYAINoCAACcBgAg4AIAAAEAIAQhAAD2AwAw2gIAAPcDADDcAgAA-QMAIOACAAD6AwAwAAAAAAAB3QJAAAAAAQUhAACTBgAgIgAAmQYAINoCAACUBgAg2wIAAJgGACDgAgAAAQAgBSEAAJEGACAiAACWBgAg2gIAAJIGACDbAgAAlQYAIOACAADJAQAgAyEAAJMGACDaAgAAlAYAIOACAAABACADIQAAkQYAINoCAACSBgAg4AIAAMkBACAAAAAFIQAAiQYAICIAAI8GACDaAgAAigYAINsCAACOBgAg4AIAAAEAIAUhAACHBgAgIgAAjAYAINoCAACIBgAg2wIAAIsGACDgAgAAsQEAIAMhAACJBgAg2gIAAIoGACDgAgAAAQAgAyEAAIcGACDaAgAAiAYAIOACAACxAQAgAAAAAAAFIQAAggYAICIAAIUGACDaAgAAgwYAINsCAACEBgAg4AIAABkAIAMhAACCBgAg2gIAAIMGACDgAgAAGQAgAAAAAAAF3QICAAAAAeMCAgAAAAHkAgIAAAAB5QICAAAAAeYCAgAAAAEFIQAA_AUAICIAAIAGACDaAgAA_QUAINsCAAD_BQAg4AIAAMkBACALIQAApAQAMCIAAKkEADDaAgAApQQAMNsCAACmBAAw3AIAAKcEACDdAgAAqAQAMN4CAACoBAAw3wIAAKgEADDgAgAAqAQAMOECAACqBAAw4gIAAKsEADALgAIBAAAAAYgCAgAAAAGJAgIAAAABiwJAAAAAAYwCQAAAAAGaAgEAAAABnAIBAAAAAaICAgAAAAGkAkAAAAABpQIBAAAAAaYCAQAAAAECAAAAHQAgIQAArwQAIAMAAAAdACAhAACvBAAgIgAArgQAIAEaAAD-BQAwEQsAAMsDACD9AQAAygMAMP4BAAAbABD_AQAAygMAMIACAQAAAAGIAgIAxQMAIYkCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhnAIBAKQDACGiAgIAAAABowIBAKQDACGkAkAApwMAIaUCAQClAwAhpgIBAKUDACHVAgAAyQMAIAIAAAAdACAaAACuBAAgAgAAAKwEACAaAACtBAAgD_0BAACrBAAw_gEAAKwEABD_AQAAqwQAMIACAQCkAwAhiAICAMUDACGJAgIAxQMAIYsCQACpAwAhjAJAAKkDACGaAgEApAMAIZwCAQCkAwAhogICAMUDACGjAgEApAMAIaQCQACnAwAhpQIBAKUDACGmAgEApQMAIQ_9AQAAqwQAMP4BAACsBAAQ_wEAAKsEADCAAgEApAMAIYgCAgDFAwAhiQICAMUDACGLAkAAqQMAIYwCQACpAwAhmgIBAKQDACGcAgEApAMAIaICAgDFAwAhowIBAKQDACGkAkAApwMAIaUCAQClAwAhpgIBAKUDACELgAIBAN0DACGIAgIA3wMAIYkCAgDfAwAhiwJAAOADACGMAkAA4AMAIZoCAQDdAwAhnAIBAN0DACGiAgIA3wMAIaQCQACJBAAhpQIBAOkDACGmAgEA6QMAIQuAAgEA3QMAIYgCAgDfAwAhiQICAN8DACGLAkAA4AMAIYwCQADgAwAhmgIBAN0DACGcAgEA3QMAIaICAgDfAwAhpAJAAIkEACGlAgEA6QMAIaYCAQDpAwAhC4ACAQAAAAGIAgIAAAABiQICAAAAAYsCQAAAAAGMAkAAAAABmgIBAAAAAZwCAQAAAAGiAgIAAAABpAJAAAAAAaUCAQAAAAGmAgEAAAABAyEAAPwFACDaAgAA_QUAIOACAADJAQAgBCEAAKQEADDaAgAApQQAMNwCAACnBAAg4AIAAKgEADAAAAAAAAshAADPBAAwIgAA1AQAMNoCAADQBAAw2wIAANEEADDcAgAA0gQAIN0CAADTBAAw3gIAANMEADDfAgAA0wQAMOACAADTBAAw4QIAANUEADDiAgAA1gQAMAshAADGBAAwIgAAygQAMNoCAADHBAAw2wIAAMgEADDcAgAAyQQAIN0CAAD6AwAw3gIAAPoDADDfAgAA-gMAMOACAAD6AwAw4QIAAMsEADDiAgAA_QMAMAshAAC6BAAwIgAAvwQAMNoCAAC7BAAw2wIAALwEADDcAgAAvQQAIN0CAAC-BAAw3gIAAL4EADDfAgAAvgQAMOACAAC-BAAw4QIAAMAEADDiAgAAwQQAMAoMAACxBAAggAIBAAAAAYgCAgAAAAGLAkAAAAABjAJAAAAAAZwCAQAAAAGiAgIAAAABpAJAAAAAAacCAQAAAAGoAgIAAAABAgAAABkAICEAAMUEACADAAAAGQAgIQAAxQQAICIAAMQEACABGgAA-wUAMBAJAADOAwAgDAAAzwMAIP0BAADNAwAw_gEAABcAEP8BAADNAwAwgAIBAAAAAYgCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhnAIBAKQDACGiAgIAAAABpAJAAKcDACGnAgEApQMAIagCAgCmAwAh1gIAAMwDACACAAAAGQAgGgAAxAQAIAIAAADCBAAgGgAAwwQAIA39AQAAwQQAMP4BAADCBAAQ_wEAAMEEADCAAgEApAMAIYgCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhnAIBAKQDACGiAgIAxQMAIaQCQACnAwAhpwIBAKUDACGoAgIApgMAIQ39AQAAwQQAMP4BAADCBAAQ_wEAAMEEADCAAgEApAMAIYgCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhnAIBAKQDACGiAgIAxQMAIaQCQACnAwAhpwIBAKUDACGoAgIApgMAIQmAAgEA3QMAIYgCAgDfAwAhiwJAAOADACGMAkAA4AMAIZwCAQDdAwAhogICAN8DACGkAkAAiQQAIacCAQDpAwAhqAICAKEEACEKDAAAowQAIIACAQDdAwAhiAICAN8DACGLAkAA4AMAIYwCQADgAwAhnAIBAN0DACGiAgIA3wMAIaQCQACJBAAhpwIBAOkDACGoAgIAoQQAIQoMAACxBAAggAIBAAAAAYgCAgAAAAGLAkAAAAABjAJAAAAAAZwCAQAAAAGiAgIAAAABpAJAAAAAAacCAQAAAAGoAgIAAAABDwcAAO0DACAIAADuAwAgEQEAAAABgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYYCAAAAhgIChwIBAAAAAYgCAgAAAAGJAgIAAAABiwJAAAAAAZgCAQAAAAGZAgEAAAABmwICAAAAAQIAAAAKACAhAADOBAAgAwAAAAoAICEAAM4EACAiAADNBAAgARoAAPoFADACAAAACgAgGgAAzQQAIAIAAAD-AwAgGgAAzAQAIA0RAQDpAwAhgAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAOkDACGGAgAA3gOGAiKHAgEA3QMAIYgCAgDfAwAhiQICAN8DACGLAkAA4AMAIZgCAQDdAwAhmQIBAOkDACGbAgIA3wMAIQ8HAADqAwAgCAAA6wMAIBEBAOkDACGAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA6QMAIYYCAADeA4YCIocCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhmAIBAN0DACGZAgEA6QMAIZsCAgDfAwAhDwcAAO0DACAIAADuAwAgEQEAAAABgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYYCAAAAhgIChwIBAAAAAYgCAgAAAAGJAgIAAAABiwJAAAAAAZgCAQAAAAGZAgEAAAABmwICAAAAAQwDAACMBAAggAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYQCAQAAAAGIAgIAAAABiQICAAAAAYsCQAAAAAGMAkAAAAABoAIBAAAAAaECQAAAAAECAAAAFAAgIQAA2gQAIAMAAAAUACAhAADaBAAgIgAA2QQAIAEaAAD5BQAwEQMAAMEDACAJAADOAwAg_QEAANADADD-AQAAEgAQ_wEAANADADCAAgEAAAABgQIBAAAAAYICAQCkAwAhgwIBAKQDACGEAgEApAMAIYgCAgDFAwAhiQICAMUDACGLAkAAqQMAIYwCQACpAwAhmgIBAKQDACGgAgEApAMAIaECQACnAwAhAgAAABQAIBoAANkEACACAAAA1wQAIBoAANgEACAP_QEAANYEADD-AQAA1wQAEP8BAADWBAAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKQDACGEAgEApAMAIYgCAgDFAwAhiQICAMUDACGLAkAAqQMAIYwCQACpAwAhmgIBAKQDACGgAgEApAMAIaECQACnAwAhD_0BAADWBAAw_gEAANcEABD_AQAA1gQAMIACAQCkAwAhgQIBAKQDACGCAgEApAMAIYMCAQCkAwAhhAIBAKQDACGIAgIAxQMAIYkCAgDFAwAhiwJAAKkDACGMAkAAqQMAIZoCAQCkAwAhoAIBAKQDACGhAkAApwMAIQuAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA3QMAIYQCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhjAJAAOADACGgAgEA3QMAIaECQACJBAAhDAMAAIoEACCAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA3QMAIYQCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhjAJAAOADACGgAgEA3QMAIaECQACJBAAhDAMAAIwEACCAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABhAIBAAAAAYgCAgAAAAGJAgIAAAABiwJAAAAAAYwCQAAAAAGgAgEAAAABoQJAAAAAAQQhAADPBAAw2gIAANAEADDcAgAA0gQAIOACAADTBAAwBCEAAMYEADDaAgAAxwQAMNwCAADJBAAg4AIAAPoDADAEIQAAugQAMNoCAAC7BAAw3AIAAL0EACDgAgAAvgQAMAAAAAAAAAAACyEAAPEEADAiAAD2BAAw2gIAAPIEADDbAgAA8wQAMNwCAAD0BAAg3QIAAPUEADDeAgAA9QQAMN8CAAD1BAAw4AIAAPUEADDhAgAA9wQAMOICAAD4BAAwCyEAAOgEADAiAADsBAAw2gIAAOkEADDbAgAA6gQAMNwCAADrBAAg3QIAAPoDADDeAgAA-gMAMN8CAAD6AwAw4AIAAPoDADDhAgAA7QQAMOICAAD9AwAwDwcAAO0DACAJAADvAwAgEQEAAAABgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYYCAAAAhgIChwIBAAAAAYgCAgAAAAGJAgIAAAABiwJAAAAAAZgCAQAAAAGaAgEAAAABmwICAAAAAQIAAAAKACAhAADwBAAgAwAAAAoAICEAAPAEACAiAADvBAAgARoAAPgFADACAAAACgAgGgAA7wQAIAIAAAD-AwAgGgAA7gQAIA0RAQDpAwAhgAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAOkDACGGAgAA3gOGAiKHAgEA3QMAIYgCAgDfAwAhiQICAN8DACGLAkAA4AMAIZgCAQDdAwAhmgIBAOkDACGbAgIA3wMAIQ8HAADqAwAgCQAA7AMAIBEBAOkDACGAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA6QMAIYYCAADeA4YCIocCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhmAIBAN0DACGaAgEA6QMAIZsCAgDfAwAhDwcAAO0DACAJAADvAwAgEQEAAAABgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYYCAAAAhgIChwIBAAAAAYgCAgAAAAGJAgIAAAABiwJAAAAAAZgCAQAAAAGaAgEAAAABmwICAAAAAQoDAACTBAAggAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYQCAQAAAAGLAkAAAAABjAJAAAAAAaACAQAAAAGhAkAAAAABAgAAAAUAICEAAPwEACADAAAABQAgIQAA_AQAICIAAPsEACABGgAA9wUAMA8DAADBAwAgCAAA1wMAIP0BAADWAwAw_gEAAAMAEP8BAADWAwAwgAIBAAAAAYECAQAAAAGCAgEApAMAIYMCAQCkAwAhhAIBAKQDACGLAkAAqQMAIYwCQACpAwAhmQIBAKQDACGgAgEApAMAIaECQACnAwAhAgAAAAUAIBoAAPsEACACAAAA-QQAIBoAAPoEACAN_QEAAPgEADD-AQAA-QQAEP8BAAD4BAAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKQDACGEAgEApAMAIYsCQACpAwAhjAJAAKkDACGZAgEApAMAIaACAQCkAwAhoQJAAKcDACEN_QEAAPgEADD-AQAA-QQAEP8BAAD4BAAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKQDACGEAgEApAMAIYsCQACpAwAhjAJAAKkDACGZAgEApAMAIaACAQCkAwAhoQJAAKcDACEJgAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAN0DACGEAgEA3QMAIYsCQADgAwAhjAJAAOADACGgAgEA3QMAIaECQACJBAAhCgMAAJEEACCAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA3QMAIYQCAQDdAwAhiwJAAOADACGMAkAA4AMAIaACAQDdAwAhoQJAAIkEACEKAwAAkwQAIIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABiwJAAAAAAYwCQAAAAAGgAgEAAAABoQJAAAAAAQQhAADxBAAw2gIAAPIEADDcAgAA9AQAIOACAAD1BAAwBCEAAOgEADDaAgAA6QQAMNwCAADrBAAg4AIAAPoDADAAAAAAAAAAAAAAAAAABSEAAO8FACAiAAD1BQAg2gIAAPAFACDbAgAA9AUAIOACAAABACAFIQAA7QUAICIAAPIFACDaAgAA7gUAINsCAADxBQAg4AIAAAEAIAMhAADvBQAg2gIAAPAFACDgAgAAAQAgAyEAAO0FACDaAgAA7gUAIOACAAABACAAAAALIQAAzwUAMCIAANMFADDaAgAA0AUAMNsCAADRBQAw3AIAANIFACDdAgAA9QQAMN4CAAD1BAAw3wIAAPUEADDgAgAA9QQAMOECAADUBQAw4gIAAPgEADALIQAAxgUAMCIAAMoFADDaAgAAxwUAMNsCAADIBQAw3AIAAMkFACDdAgAA0wQAMN4CAADTBAAw3wIAANMEADDgAgAA0wQAMOECAADLBQAw4gIAANYEADALIQAAugUAMCIAAL8FADDaAgAAuwUAMNsCAAC8BQAw3AIAAL0FACDdAgAAvgUAMN4CAAC-BQAw3wIAAL4FADDgAgAAvgUAMOECAADABQAw4gIAAMEFADALIQAArgUAMCIAALMFADDaAgAArwUAMNsCAACwBQAw3AIAALEFACDdAgAAsgUAMN4CAACyBQAw3wIAALIFADDgAgAAsgUAMOECAAC0BQAw4gIAALUFADALIQAApQUAMCIAAKkFADDaAgAApgUAMNsCAACnBQAw3AIAAKgFACDdAgAAnQUAMN4CAACdBQAw3wIAAJ0FADDgAgAAnQUAMOECAACqBQAw4gIAAKAFADALIQAAmQUAMCIAAJ4FADDaAgAAmgUAMNsCAACbBQAw3AIAAJwFACDdAgAAnQUAMN4CAACdBQAw3wIAAJ0FADDgAgAAnQUAMOECAACfBQAw4gIAAKAFADAGEgAAjgUAIIECAQAAAAGCAgEAAAABgwIBAAAAAYsCQAAAAAHCAgEAAAABAgAAADAAICEAAKQFACADAAAAMAAgIQAApAUAICIAAKMFACABGgAA7AUAMAwSAADBAwAgEwAAwQMAIP0BAADAAwAw_gEAAC4AEP8BAADAAwAwgQIBAKUDACGCAgEApQMAIYMCAQClAwAhiwJAAKkDACHCAgEApAMAIcMCAQCkAwAh0gIAAL8DACACAAAAMAAgGgAAowUAIAIAAAChBQAgGgAAogUAIAn9AQAAoAUAMP4BAAChBQAQ_wEAAKAFADCBAgEApQMAIYICAQClAwAhgwIBAKUDACGLAkAAqQMAIcICAQCkAwAhwwIBAKQDACEJ_QEAAKAFADD-AQAAoQUAEP8BAACgBQAwgQIBAKUDACGCAgEApQMAIYMCAQClAwAhiwJAAKkDACHCAgEApAMAIcMCAQCkAwAhBYECAQDpAwAhggIBAOkDACGDAgEA6QMAIYsCQADgAwAhwgIBAN0DACEGEgAAjAUAIIECAQDpAwAhggIBAOkDACGDAgEA6QMAIYsCQADgAwAhwgIBAN0DACEGEgAAjgUAIIECAQAAAAGCAgEAAAABgwIBAAAAAYsCQAAAAAHCAgEAAAABBhMAAI8FACCBAgEAAAABggIBAAAAAYMCAQAAAAGLAkAAAAABwwIBAAAAAQIAAAAwACAhAACtBQAgAwAAADAAICEAAK0FACAiAACsBQAgARoAAOsFADACAAAAMAAgGgAArAUAIAIAAAChBQAgGgAAqwUAIAWBAgEA6QMAIYICAQDpAwAhgwIBAOkDACGLAkAA4AMAIcMCAQDdAwAhBhMAAI0FACCBAgEA6QMAIYICAQDpAwAhgwIBAOkDACGLAkAA4AMAIcMCAQDdAwAhBhMAAI8FACCBAgEAAAABggIBAAAAAYMCAQAAAAGLAkAAAAABwwIBAAAAAQuAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABhgIAAACGAgKHAgEAAAABiAICAAAAAYkCAgAAAAGKAgEAAAABiwJAAAAAAYwCQAAAAAECAAAALAAgIQAAuQUAIAMAAAAsACAhAAC5BQAgIgAAuAUAIAEaAADqBQAwEQMAAMEDACD9AQAAwwMAMP4BAAAqABD_AQAAwwMAMIACAQAAAAGBAgEAAAABggIBAKQDACGDAgEApAMAIYQCAQCkAwAhhgIAAMQDhgIihwIBAKQDACGIAgIAxQMAIYkCAgDFAwAhigIBAKQDACGLAkAAqQMAIYwCQACpAwAh0wIAAMIDACACAAAALAAgGgAAuAUAIAIAAAC2BQAgGgAAtwUAIA_9AQAAtQUAMP4BAAC2BQAQ_wEAALUFADCAAgEApAMAIYECAQCkAwAhggIBAKQDACGDAgEApAMAIYQCAQCkAwAhhgIAAMQDhgIihwIBAKQDACGIAgIAxQMAIYkCAgDFAwAhigIBAKQDACGLAkAAqQMAIYwCQACpAwAhD_0BAAC1BQAw_gEAALYFABD_AQAAtQUAMIACAQCkAwAhgQIBAKQDACGCAgEApAMAIYMCAQCkAwAhhAIBAKQDACGGAgAAxAOGAiKHAgEApAMAIYgCAgDFAwAhiQICAMUDACGKAgEApAMAIYsCQACpAwAhjAJAAKkDACELgAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAN0DACGGAgAA3gOGAiKHAgEA3QMAIYgCAgDfAwAhiQICAN8DACGKAgEA3QMAIYsCQADgAwAhjAJAAOADACELgAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAN0DACGGAgAA3gOGAiKHAgEA3QMAIYgCAgDfAwAhiQICAN8DACGKAgEA3QMAIYsCQADgAwAhjAJAAOADACELgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYYCAAAAhgIChwIBAAAAAYgCAgAAAAGJAgIAAAABigIBAAAAAYsCQAAAAAGMAkAAAAABCwUAAIMEACCAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABiwJAAAAAAYwCQAAAAAGcAgEAAAABnQIBAAAAAZ4CAQAAAAGfAiAAAAABAgAAACgAICEAAMUFACADAAAAKAAgIQAAxQUAICIAAMQFACABGgAA6QUAMBEDAADBAwAgBQAAqwMAIP0BAADHAwAw_gEAACYAEP8BAADHAwAwgAIBAAAAAYECAQAAAAGCAgEApAMAIYMCAQClAwAhhAIBAKQDACGLAkAAqQMAIYwCQACpAwAhnAIBAKQDACGdAgEApQMAIZ4CAQCkAwAhnwIgAMgDACHUAgAAxgMAIAIAAAAoACAaAADEBQAgAgAAAMIFACAaAADDBQAgDv0BAADBBQAw_gEAAMIFABD_AQAAwQUAMIACAQCkAwAhgQIBAKQDACGCAgEApAMAIYMCAQClAwAhhAIBAKQDACGLAkAAqQMAIYwCQACpAwAhnAIBAKQDACGdAgEApQMAIZ4CAQCkAwAhnwIgAMgDACEO_QEAAMEFADD-AQAAwgUAEP8BAADBBQAwgAIBAKQDACGBAgEApAMAIYICAQCkAwAhgwIBAKUDACGEAgEApAMAIYsCQACpAwAhjAJAAKkDACGcAgEApAMAIZ0CAQClAwAhngIBAKQDACGfAiAAyAMAIQqAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA6QMAIYsCQADgAwAhjAJAAOADACGcAgEA3QMAIZ0CAQDpAwAhngIBAN0DACGfAiAA8wMAIQsFAAD1AwAggAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAOkDACGLAkAA4AMAIYwCQADgAwAhnAIBAN0DACGdAgEA6QMAIZ4CAQDdAwAhnwIgAPMDACELBQAAgwQAIIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGLAkAAAAABjAJAAAAAAZwCAQAAAAGdAgEAAAABngIBAAAAAZ8CIAAAAAEMCQAAjQQAIIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGIAgIAAAABiQICAAAAAYsCQAAAAAGMAkAAAAABmgIBAAAAAaACAQAAAAGhAkAAAAABAgAAABQAICEAAM4FACADAAAAFAAgIQAAzgUAICIAAM0FACABGgAA6AUAMAIAAAAUACAaAADNBQAgAgAAANcEACAaAADMBQAgC4ACAQDdAwAhgQIBAN0DACGCAgEA3QMAIYMCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhjAJAAOADACGaAgEA3QMAIaACAQDdAwAhoQJAAIkEACEMCQAAiwQAIIACAQDdAwAhgQIBAN0DACGCAgEA3QMAIYMCAQDdAwAhiAICAN8DACGJAgIA3wMAIYsCQADgAwAhjAJAAOADACGaAgEA3QMAIaACAQDdAwAhoQJAAIkEACEMCQAAjQQAIIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGIAgIAAAABiQICAAAAAYsCQAAAAAGMAkAAAAABmgIBAAAAAaACAQAAAAGhAkAAAAABCggAAJQEACCAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABiwJAAAAAAYwCQAAAAAGZAgEAAAABoAIBAAAAAaECQAAAAAECAAAABQAgIQAA1wUAIAMAAAAFACAhAADXBQAgIgAA1gUAIAEaAADnBQAwAgAAAAUAIBoAANYFACACAAAA-QQAIBoAANUFACAJgAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAN0DACGLAkAA4AMAIYwCQADgAwAhmQIBAN0DACGgAgEA3QMAIaECQACJBAAhCggAAJIEACCAAgEA3QMAIYECAQDdAwAhggIBAN0DACGDAgEA3QMAIYsCQADgAwAhjAJAAOADACGZAgEA3QMAIaACAQDdAwAhoQJAAIkEACEKCAAAlAQAIIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGLAkAAAAABjAJAAAAAAZkCAQAAAAGgAgEAAAABoQJAAAAAAQQhAADPBQAw2gIAANAFADDcAgAA0gUAIOACAAD1BAAwBCEAAMYFADDaAgAAxwUAMNwCAADJBQAg4AIAANMEADAEIQAAugUAMNoCAAC7BQAw3AIAAL0FACDgAgAAvgUAMAQhAACuBQAw2gIAAK8FADDcAgAAsQUAIOACAACyBQAwBCEAAKUFADDaAgAApgUAMNwCAACoBQAg4AIAAJ0FADAEIQAAmQUAMNoCAACaBQAw3AIAAJwFACDgAgAAnQUAMAAAABAOAAD_BAAgDwAA3gQAIBAAAN4FACARAADfBQAgEwAA4AUAIBQAAOAFACDGAgAA4wMAIMcCAADjAwAgyAIAAOMDACDJAgAA4wMAIMoCAADjAwAgywIAAOMDACDMAgAA4wMAIM0CAADjAwAgzgIAAOMDACDRAgAA4wMAIAUJAADjBQAgDAAA5AUAIKQCAADjAwAgpwIAAOMDACCoAgAA4wMAIAkEAADeBAAgCgAA3wQAIA0AAOAEACClAgAA4wMAIKcCAADjAwAgqgIAAOMDACCrAgAA4wMAIKwCAADjAwAgrQIAAOMDACAABAMAAOEFACAFAADfBAAggwIAAOMDACCdAgAA4wMAIAgEAAD_BAAgCgAA3wQAIKUCAADjAwAgpwIAAOMDACCqAgAA4wMAIK0CAADjAwAgtwIAAOMDACC4AgAA4wMAIAmAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABiwJAAAAAAYwCQAAAAAGZAgEAAAABoAIBAAAAAaECQAAAAAELgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYgCAgAAAAGJAgIAAAABiwJAAAAAAYwCQAAAAAGaAgEAAAABoAIBAAAAAaECQAAAAAEKgAIBAAAAAYECAQAAAAGCAgEAAAABgwIBAAAAAYsCQAAAAAGMAkAAAAABnAIBAAAAAZ0CAQAAAAGeAgEAAAABnwIgAAAAAQuAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABhgIAAACGAgKHAgEAAAABiAICAAAAAYkCAgAAAAGKAgEAAAABiwJAAAAAAYwCQAAAAAEFgQIBAAAAAYICAQAAAAGDAgEAAAABiwJAAAAAAcMCAQAAAAEFgQIBAAAAAYICAQAAAAGDAgEAAAABiwJAAAAAAcICAQAAAAEVDgAA2AUAIA8AANkFACAQAADaBQAgEQAA2wUAIBMAANwFACCLAkAAAAABjAJAAAAAAcQCAQAAAAHFAgEAAAABxgIBAAAAAccCAQAAAAHIAgEAAAAByQIBAAAAAcoCAQAAAAHLAgEAAAABzAIBAAAAAc0CAQAAAAHOAkAAAAABzwIBAAAAAdACAQAAAAHRAkAAAAABAgAAAAEAICEAAO0FACAVDgAA2AUAIA8AANkFACAQAADaBQAgEQAA2wUAIBQAAN0FACCLAkAAAAABjAJAAAAAAcQCAQAAAAHFAgEAAAABxgIBAAAAAccCAQAAAAHIAgEAAAAByQIBAAAAAcoCAQAAAAHLAgEAAAABzAIBAAAAAc0CAQAAAAHOAkAAAAABzwIBAAAAAdACAQAAAAHRAkAAAAABAgAAAAEAICEAAO8FACADAAAAOgAgIQAA7QUAICIAAPMFACAXAAAAOgAgDgAAkwUAIA8AAJQFACAQAACVBQAgEQAAlgUAIBMAAJcFACAaAADzBQAgiwJAAOADACGMAkAA4AMAIcQCAQDdAwAhxQIBAN0DACHGAgEA6QMAIccCAQDpAwAhyAIBAOkDACHJAgEA6QMAIcoCAQDpAwAhywIBAOkDACHMAgEA6QMAIc0CAQDpAwAhzgJAAIkEACHPAgEA3QMAIdACAQDdAwAh0QJAAIkEACEVDgAAkwUAIA8AAJQFACAQAACVBQAgEQAAlgUAIBMAAJcFACCLAkAA4AMAIYwCQADgAwAhxAIBAN0DACHFAgEA3QMAIcYCAQDpAwAhxwIBAOkDACHIAgEA6QMAIckCAQDpAwAhygIBAOkDACHLAgEA6QMAIcwCAQDpAwAhzQIBAOkDACHOAkAAiQQAIc8CAQDdAwAh0AIBAN0DACHRAkAAiQQAIQMAAAA6ACAhAADvBQAgIgAA9gUAIBcAAAA6ACAOAACTBQAgDwAAlAUAIBAAAJUFACARAACWBQAgFAAAmAUAIBoAAPYFACCLAkAA4AMAIYwCQADgAwAhxAIBAN0DACHFAgEA3QMAIcYCAQDpAwAhxwIBAOkDACHIAgEA6QMAIckCAQDpAwAhygIBAOkDACHLAgEA6QMAIcwCAQDpAwAhzQIBAOkDACHOAkAAiQQAIc8CAQDdAwAh0AIBAN0DACHRAkAAiQQAIRUOAACTBQAgDwAAlAUAIBAAAJUFACARAACWBQAgFAAAmAUAIIsCQADgAwAhjAJAAOADACHEAgEA3QMAIcUCAQDdAwAhxgIBAOkDACHHAgEA6QMAIcgCAQDpAwAhyQIBAOkDACHKAgEA6QMAIcsCAQDpAwAhzAIBAOkDACHNAgEA6QMAIc4CQACJBAAhzwIBAN0DACHQAgEA3QMAIdECQACJBAAhCYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABiwJAAAAAAYwCQAAAAAGgAgEAAAABoQJAAAAAAQ0RAQAAAAGAAgEAAAABgQIBAAAAAYICAQAAAAGDAgEAAAABhgIAAACGAgKHAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABmAIBAAAAAZoCAQAAAAGbAgIAAAABC4ACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABjAJAAAAAAaACAQAAAAGhAkAAAAABDREBAAAAAYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGGAgAAAIYCAocCAQAAAAGIAgIAAAABiQICAAAAAYsCQAAAAAGYAgEAAAABmQIBAAAAAZsCAgAAAAEJgAIBAAAAAYgCAgAAAAGLAkAAAAABjAJAAAAAAZwCAQAAAAGiAgIAAAABpAJAAAAAAacCAQAAAAGoAgIAAAABDAQAANsEACAKAADcBAAgiwJAAAAAAYwCQAAAAAGaAgEAAAABpQIBAAAAAacCAQAAAAGpAgEAAAABqgIBAAAAAasCAgAAAAGsAkAAAAABrQKAAAAAAQIAAADJAQAgIQAA_AUAIAuAAgEAAAABiAICAAAAAYkCAgAAAAGLAkAAAAABjAJAAAAAAZoCAQAAAAGcAgEAAAABogICAAAAAaQCQAAAAAGlAgEAAAABpgIBAAAAAQMAAAAQACAhAAD8BQAgIgAAgQYAIA4AAAAQACAEAAC3BAAgCgAAuAQAIBoAAIEGACCLAkAA4AMAIYwCQADgAwAhmgIBAN0DACGlAgEA6QMAIacCAQDpAwAhqQIBAN0DACGqAgEA6QMAIasCAgChBAAhrAJAAIkEACGtAoAAAAABDAQAALcEACAKAAC4BAAgiwJAAOADACGMAkAA4AMAIZoCAQDdAwAhpQIBAOkDACGnAgEA6QMAIakCAQDdAwAhqgIBAOkDACGrAgIAoQQAIawCQACJBAAhrQKAAAAAAQsJAACwBAAggAIBAAAAAYgCAgAAAAGLAkAAAAABjAJAAAAAAZoCAQAAAAGcAgEAAAABogICAAAAAaQCQAAAAAGnAgEAAAABqAICAAAAAQIAAAAZACAhAACCBgAgAwAAABcAICEAAIIGACAiAACGBgAgDQAAABcAIAkAAKIEACAaAACGBgAggAIBAN0DACGIAgIA3wMAIYsCQADgAwAhjAJAAOADACGaAgEA3QMAIZwCAQDdAwAhogICAN8DACGkAkAAiQQAIacCAQDpAwAhqAICAKEEACELCQAAogQAIIACAQDdAwAhiAICAN8DACGLAkAA4AMAIYwCQADgAwAhmgIBAN0DACGcAgEA3QMAIaICAgDfAwAhpAJAAIkEACGnAgEA6QMAIagCAgChBAAhCwoAAP4EACCLAkAAAAABjAJAAAAAAZkCAQAAAAGlAgEAAAABpwIBAAAAAakCAQAAAAGqAgEAAAABrQKAAAAAAbcCAgAAAAG4AkAAAAABAgAAALEBACAhAACHBgAgFQ8AANkFACAQAADaBQAgEQAA2wUAIBMAANwFACAUAADdBQAgiwJAAAAAAYwCQAAAAAHEAgEAAAABxQIBAAAAAcYCAQAAAAHHAgEAAAAByAIBAAAAAckCAQAAAAHKAgEAAAABywIBAAAAAcwCAQAAAAHNAgEAAAABzgJAAAAAAc8CAQAAAAHQAgEAAAAB0QJAAAAAAQIAAAABACAhAACJBgAgAwAAAA4AICEAAIcGACAiAACNBgAgDQAAAA4AIAoAAOcEACAaAACNBgAgiwJAAOADACGMAkAA4AMAIZkCAQDdAwAhpQIBAOkDACGnAgEA6QMAIakCAQDdAwAhqgIBAOkDACGtAoAAAAABtwICAKEEACG4AkAAiQQAIQsKAADnBAAgiwJAAOADACGMAkAA4AMAIZkCAQDdAwAhpQIBAOkDACGnAgEA6QMAIakCAQDdAwAhqgIBAOkDACGtAoAAAAABtwICAKEEACG4AkAAiQQAIQMAAAA6ACAhAACJBgAgIgAAkAYAIBcAAAA6ACAPAACUBQAgEAAAlQUAIBEAAJYFACATAACXBQAgFAAAmAUAIBoAAJAGACCLAkAA4AMAIYwCQADgAwAhxAIBAN0DACHFAgEA3QMAIcYCAQDpAwAhxwIBAOkDACHIAgEA6QMAIckCAQDpAwAhygIBAOkDACHLAgEA6QMAIcwCAQDpAwAhzQIBAOkDACHOAkAAiQQAIc8CAQDdAwAh0AIBAN0DACHRAkAAiQQAIRUPAACUBQAgEAAAlQUAIBEAAJYFACATAACXBQAgFAAAmAUAIIsCQADgAwAhjAJAAOADACHEAgEA3QMAIcUCAQDdAwAhxgIBAOkDACHHAgEA6QMAIcgCAQDpAwAhyQIBAOkDACHKAgEA6QMAIcsCAQDpAwAhzAIBAOkDACHNAgEA6QMAIc4CQACJBAAhzwIBAN0DACHQAgEA3QMAIdECQACJBAAhDAoAANwEACANAADdBAAgiwJAAAAAAYwCQAAAAAGaAgEAAAABpQIBAAAAAacCAQAAAAGpAgEAAAABqgIBAAAAAasCAgAAAAGsAkAAAAABrQKAAAAAAQIAAADJAQAgIQAAkQYAIBUOAADYBQAgEAAA2gUAIBEAANsFACATAADcBQAgFAAA3QUAIIsCQAAAAAGMAkAAAAABxAIBAAAAAcUCAQAAAAHGAgEAAAABxwIBAAAAAcgCAQAAAAHJAgEAAAABygIBAAAAAcsCAQAAAAHMAgEAAAABzQIBAAAAAc4CQAAAAAHPAgEAAAAB0AIBAAAAAdECQAAAAAECAAAAAQAgIQAAkwYAIAMAAAAQACAhAACRBgAgIgAAlwYAIA4AAAAQACAKAAC4BAAgDQAAuQQAIBoAAJcGACCLAkAA4AMAIYwCQADgAwAhmgIBAN0DACGlAgEA6QMAIacCAQDpAwAhqQIBAN0DACGqAgEA6QMAIasCAgChBAAhrAJAAIkEACGtAoAAAAABDAoAALgEACANAAC5BAAgiwJAAOADACGMAkAA4AMAIZoCAQDdAwAhpQIBAOkDACGnAgEA6QMAIakCAQDdAwAhqgIBAOkDACGrAgIAoQQAIawCQACJBAAhrQKAAAAAAQMAAAA6ACAhAACTBgAgIgAAmgYAIBcAAAA6ACAOAACTBQAgEAAAlQUAIBEAAJYFACATAACXBQAgFAAAmAUAIBoAAJoGACCLAkAA4AMAIYwCQADgAwAhxAIBAN0DACHFAgEA3QMAIcYCAQDpAwAhxwIBAOkDACHIAgEA6QMAIckCAQDpAwAhygIBAOkDACHLAgEA6QMAIcwCAQDpAwAhzQIBAOkDACHOAkAAiQQAIc8CAQDdAwAh0AIBAN0DACHRAkAAiQQAIRUOAACTBQAgEAAAlQUAIBEAAJYFACATAACXBQAgFAAAmAUAIIsCQADgAwAhjAJAAOADACHEAgEA3QMAIcUCAQDdAwAhxgIBAOkDACHHAgEA6QMAIcgCAQDpAwAhyQIBAOkDACHKAgEA6QMAIcsCAQDpAwAhzAIBAOkDACHNAgEA6QMAIc4CQACJBAAhzwIBAN0DACHQAgEA3QMAIdECQACJBAAhFQ4AANgFACAPAADZBQAgEQAA2wUAIBMAANwFACAUAADdBQAgiwJAAAAAAYwCQAAAAAHEAgEAAAABxQIBAAAAAcYCAQAAAAHHAgEAAAAByAIBAAAAAckCAQAAAAHKAgEAAAABywIBAAAAAcwCAQAAAAHNAgEAAAABzgJAAAAAAc8CAQAAAAHQAgEAAAAB0QJAAAAAAQIAAAABACAhAACbBgAgDREBAAAAAYACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGGAgAAAIYCAocCAQAAAAGIAgIAAAABiQICAAAAAYsCQAAAAAGZAgEAAAABmgIBAAAAAZsCAgAAAAEDAAAAOgAgIQAAmwYAICIAAKAGACAXAAAAOgAgDgAAkwUAIA8AAJQFACARAACWBQAgEwAAlwUAIBQAAJgFACAaAACgBgAgiwJAAOADACGMAkAA4AMAIcQCAQDdAwAhxQIBAN0DACHGAgEA6QMAIccCAQDpAwAhyAIBAOkDACHJAgEA6QMAIcoCAQDpAwAhywIBAOkDACHMAgEA6QMAIc0CAQDpAwAhzgJAAIkEACHPAgEA3QMAIdACAQDdAwAh0QJAAIkEACEVDgAAkwUAIA8AAJQFACARAACWBQAgEwAAlwUAIBQAAJgFACCLAkAA4AMAIYwCQADgAwAhxAIBAN0DACHFAgEA3QMAIcYCAQDpAwAhxwIBAOkDACHIAgEA6QMAIckCAQDpAwAhygIBAOkDACHLAgEA6QMAIcwCAQDpAwAhzQIBAOkDACHOAkAAiQQAIc8CAQDdAwAh0AIBAN0DACHRAkAAiQQAIQwEAADbBAAgDQAA3QQAIIsCQAAAAAGMAkAAAAABmgIBAAAAAaUCAQAAAAGnAgEAAAABqQIBAAAAAaoCAQAAAAGrAgIAAAABrAJAAAAAAa0CgAAAAAECAAAAyQEAICEAAKEGACALBAAA_QQAIIsCQAAAAAGMAkAAAAABmQIBAAAAAaUCAQAAAAGnAgEAAAABqQIBAAAAAaoCAQAAAAGtAoAAAAABtwICAAAAAbgCQAAAAAECAAAAsQEAICEAAKMGACAMAwAAggQAIIACAQAAAAGBAgEAAAABggIBAAAAAYMCAQAAAAGEAgEAAAABiwJAAAAAAYwCQAAAAAGcAgEAAAABnQIBAAAAAZ4CAQAAAAGfAiAAAAABAgAAACgAICEAAKUGACADAAAAEAAgIQAAoQYAICIAAKkGACAOAAAAEAAgBAAAtwQAIA0AALkEACAaAACpBgAgiwJAAOADACGMAkAA4AMAIZoCAQDdAwAhpQIBAOkDACGnAgEA6QMAIakCAQDdAwAhqgIBAOkDACGrAgIAoQQAIawCQACJBAAhrQKAAAAAAQwEAAC3BAAgDQAAuQQAIIsCQADgAwAhjAJAAOADACGaAgEA3QMAIaUCAQDpAwAhpwIBAOkDACGpAgEA3QMAIaoCAQDpAwAhqwICAKEEACGsAkAAiQQAIa0CgAAAAAEDAAAADgAgIQAAowYAICIAAKwGACANAAAADgAgBAAA5gQAIBoAAKwGACCLAkAA4AMAIYwCQADgAwAhmQIBAN0DACGlAgEA6QMAIacCAQDpAwAhqQIBAN0DACGqAgEA6QMAIa0CgAAAAAG3AgIAoQQAIbgCQACJBAAhCwQAAOYEACCLAkAA4AMAIYwCQADgAwAhmQIBAN0DACGlAgEA6QMAIacCAQDpAwAhqQIBAN0DACGqAgEA6QMAIa0CgAAAAAG3AgIAoQQAIbgCQACJBAAhAwAAACYAICEAAKUGACAiAACvBgAgDgAAACYAIAMAAPQDACAaAACvBgAggAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAOkDACGEAgEA3QMAIYsCQADgAwAhjAJAAOADACGcAgEA3QMAIZ0CAQDpAwAhngIBAN0DACGfAiAA8wMAIQwDAAD0AwAggAIBAN0DACGBAgEA3QMAIYICAQDdAwAhgwIBAOkDACGEAgEA3QMAIYsCQADgAwAhjAJAAOADACGcAgEA3QMAIZ0CAQDpAwAhngIBAN0DACGfAiAA8wMAIRUOAADYBQAgDwAA2QUAIBAAANoFACATAADcBQAgFAAA3QUAIIsCQAAAAAGMAkAAAAABxAIBAAAAAcUCAQAAAAHGAgEAAAABxwIBAAAAAcgCAQAAAAHJAgEAAAABygIBAAAAAcsCAQAAAAHMAgEAAAABzQIBAAAAAc4CQAAAAAHPAgEAAAAB0AIBAAAAAdECQAAAAAECAAAAAQAgIQAAsAYAIAMAAAA6ACAhAACwBgAgIgAAtAYAIBcAAAA6ACAOAACTBQAgDwAAlAUAIBAAAJUFACATAACXBQAgFAAAmAUAIBoAALQGACCLAkAA4AMAIYwCQADgAwAhxAIBAN0DACHFAgEA3QMAIcYCAQDpAwAhxwIBAOkDACHIAgEA6QMAIckCAQDpAwAhygIBAOkDACHLAgEA6QMAIcwCAQDpAwAhzQIBAOkDACHOAkAAiQQAIc8CAQDdAwAh0AIBAN0DACHRAkAAiQQAIRUOAACTBQAgDwAAlAUAIBAAAJUFACATAACXBQAgFAAAmAUAIIsCQADgAwAhjAJAAOADACHEAgEA3QMAIcUCAQDdAwAhxgIBAOkDACHHAgEA6QMAIcgCAQDpAwAhyQIBAOkDACHKAgEA6QMAIcsCAQDpAwAhzAIBAOkDACHNAgEA6QMAIc4CQACJBAAhzwIBAN0DACHQAgEA3QMAIdECQACJBAAhBwYAEA4GAg8lCBApBREtDhMxDxQyDwIDAAEIAAMDBAcCBgANCgsEAwcABQgPAwkRBwMDAAEFDAQGAAYBBQ0ABAQVCAYADAoWBA0aCQIDAAEJAAcDBgALCQAHDB4KAQsACQEMHwADBCAACiEADSIAAgQjAAokAAEDAAECEgABEwABBg4zAA80ABA1ABE2ABM3ABQ4AAAAAAMGABUnABYoABcAAAADBgAVJwAWKAAXAhIAARMAAQISAAETAAEDBgAcJwAdKAAeAAAAAwYAHCcAHSgAHgAAAAMGACQnACUoACYAAAADBgAkJwAlKAAmAAAAAwYALCcALSgALgAAAAMGACwnAC0oAC4AAAADBgA0JwA1KAA2AAAAAwYANCcANSgANgAABQYAOycAPigAP3kAPHoAPQAAAAAABQYAOycAPigAP3kAPHoAPQAABQYARCcARygASHkARXoARgAAAAAABQYARCcARygASHkARXoARgEJAAcBCQAHBQYATScAUCgAUXkATnoATwAAAAAABQYATScAUCgAUXkATnoATwELAAkBCwAJBQYAVicAWSgAWnkAV3oAWAAAAAAABQYAVicAWSgAWnkAV3oAWAIDAAEIAAMCAwABCAADAwYAXycAYCgAYQAAAAMGAF8nAGAoAGECAwABCQAHAgMAAQkABwUGAGYnAGkoAGp5AGd6AGgAAAAAAAUGAGYnAGkoAGp5AGd6AGgBAwABAQMAAQMGAG8nAHAoAHEAAAADBgBvJwBwKABxAwcABQjZAgMJ2gIHAwcABQjgAgMJ4QIHBQYAdicAeSgAenkAd3oAeAAAAAAABQYAdicAeSgAenkAd3oAeAEDAAEBAwABBQYAfycAggEoAIMBeQCAAXoAgQEAAAAAAAUGAH8nAIIBKACDAXkAgAF6AIEBFQIBFjkBFzwBGD0BGT4BG0ABHEIRHUMSHkUBH0cRIEgTI0kBJEoBJUsRKU4UKk8YK1APLFEPLVIPLlMPL1QPMFYPMVgRMlkZM1sPNF0RNV4aNl8PN2APOGEROWQbOmUfO2cgPGggPWsgPmwgP20gQG8gQXERQnIhQ3QgRHYRRXciRnggR3kgSHoRSX0jSn4nS4ABKEyBAShNhAEoToUBKE-GAShQiAEoUYoBEVKLASlTjQEoVI8BEVWQASpWkQEoV5IBKFiTARFZlgErWpcBL1uZATBcmgEwXZ0BMF6eATBfnwEwYKEBMGGjARFipAExY6YBMGSoARFlqQEyZqoBMGerATBorAERaa8BM2qwATdrsgEDbLMBA221AQNutgEDb7cBA3C5AQNxuwERcrwBOHO-AQN0wAERdcEBOXbCAQN3wwEDeMQBEXvHATp8yAFAfcoBB37LAQd_zQEHgAHOAQeBAc8BB4IB0QEHgwHTARGEAdQBQYUB1gEHhgHYARGHAdkBQogB2gEHiQHbAQeKAdwBEYsB3wFDjAHgAUmNAeEBCY4B4gEJjwHjAQmQAeQBCZEB5QEJkgHnAQmTAekBEZQB6gFKlQHsAQmWAe4BEZcB7wFLmAHwAQmZAfEBCZoB8gERmwH1AUycAfYBUp0B9wEKngH4AQqfAfkBCqAB-gEKoQH7AQqiAf0BCqMB_wERpAGAAlOlAYICCqYBhAIRpwGFAlSoAYYCCqkBhwIKqgGIAhGrAYsCVawBjAJbrQGNAgKuAY4CAq8BjwICsAGQAgKxAZECArIBkwICswGVAhG0AZYCXLUBmAICtgGaAhG3AZsCXbgBnAICuQGdAgK6AZ4CEbsBoQJevAGiAmK9AaMCCL4BpAIIvwGlAgjAAaYCCMEBpwIIwgGpAgjDAasCEcQBrAJjxQGuAgjGAbACEccBsQJkyAGyAgjJAbMCCMoBtAIRywG3AmXMAbgCa80BuQIFzgG6AgXPAbsCBdABvAIF0QG9AgXSAb8CBdMBwQIR1AHCAmzVAcQCBdYBxgIR1wHHAm3YAcgCBdkByQIF2gHKAhHbAc0CbtwBzgJy3QHPAgTeAdACBN8B0QIE4AHSAgThAdMCBOIB1QIE4wHXAhHkAdgCc-UB3AIE5gHeAhHnAd8CdOgB4gIE6QHjAgTqAeQCEesB5wJ17AHoAnvtAekCDu4B6gIO7wHrAg7wAewCDvEB7QIO8gHvAg7zAfECEfQB8gJ89QH0Ag72AfYCEfcB9wJ9-AH4Ag75AfkCDvoB-gIR-wH9An78Af4ChAE" 39 39 } 40 40 41 41 async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> { ··· 317 317 * ``` 318 318 */ 319 319 get listItem(): Prisma.ListItemDelegate<ExtArgs, { omit: OmitOpts }>; 320 + 321 + /** 322 + * `prisma.note`: Exposes CRUD operations for the **Note** model. 323 + * Example usage: 324 + * ```ts 325 + * // Fetch zero or more Notes 326 + * const notes = await prisma.note.findMany() 327 + * ``` 328 + */ 329 + get note(): Prisma.NoteDelegate<ExtArgs, { omit: OmitOpts }>; 320 330 } 321 331 322 332 export function getPrismaClientClass(): PrismaClientConstructor {
+98 -2
backend/src/generated/internal/prismaNamespace.ts
··· 396 396 TrackedMovie: 'TrackedMovie', 397 397 TrackedEpisode: 'TrackedEpisode', 398 398 List: 'List', 399 - ListItem: 'ListItem' 399 + ListItem: 'ListItem', 400 + Note: 'Note' 400 401 } as const 401 402 402 403 export type ModelName = (typeof ModelName)[keyof typeof ModelName] ··· 412 413 omit: GlobalOmitOptions 413 414 } 414 415 meta: { 415 - modelProps: "user" | "follow" | "authSession" | "authState" | "backgroundJob" | "movie" | "show" | "season" | "episode" | "trackedMovie" | "trackedEpisode" | "list" | "listItem" 416 + modelProps: "user" | "follow" | "authSession" | "authState" | "backgroundJob" | "movie" | "show" | "season" | "episode" | "trackedMovie" | "trackedEpisode" | "list" | "listItem" | "note" 416 417 txIsolationLevel: TransactionIsolationLevel 417 418 } 418 419 model: { ··· 1378 1379 } 1379 1380 } 1380 1381 } 1382 + Note: { 1383 + payload: Prisma.$NotePayload<ExtArgs> 1384 + fields: Prisma.NoteFieldRefs 1385 + operations: { 1386 + findUnique: { 1387 + args: Prisma.NoteFindUniqueArgs<ExtArgs> 1388 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload> | null 1389 + } 1390 + findUniqueOrThrow: { 1391 + args: Prisma.NoteFindUniqueOrThrowArgs<ExtArgs> 1392 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload> 1393 + } 1394 + findFirst: { 1395 + args: Prisma.NoteFindFirstArgs<ExtArgs> 1396 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload> | null 1397 + } 1398 + findFirstOrThrow: { 1399 + args: Prisma.NoteFindFirstOrThrowArgs<ExtArgs> 1400 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload> 1401 + } 1402 + findMany: { 1403 + args: Prisma.NoteFindManyArgs<ExtArgs> 1404 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload>[] 1405 + } 1406 + create: { 1407 + args: Prisma.NoteCreateArgs<ExtArgs> 1408 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload> 1409 + } 1410 + createMany: { 1411 + args: Prisma.NoteCreateManyArgs<ExtArgs> 1412 + result: BatchPayload 1413 + } 1414 + createManyAndReturn: { 1415 + args: Prisma.NoteCreateManyAndReturnArgs<ExtArgs> 1416 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload>[] 1417 + } 1418 + delete: { 1419 + args: Prisma.NoteDeleteArgs<ExtArgs> 1420 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload> 1421 + } 1422 + update: { 1423 + args: Prisma.NoteUpdateArgs<ExtArgs> 1424 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload> 1425 + } 1426 + deleteMany: { 1427 + args: Prisma.NoteDeleteManyArgs<ExtArgs> 1428 + result: BatchPayload 1429 + } 1430 + updateMany: { 1431 + args: Prisma.NoteUpdateManyArgs<ExtArgs> 1432 + result: BatchPayload 1433 + } 1434 + updateManyAndReturn: { 1435 + args: Prisma.NoteUpdateManyAndReturnArgs<ExtArgs> 1436 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload>[] 1437 + } 1438 + upsert: { 1439 + args: Prisma.NoteUpsertArgs<ExtArgs> 1440 + result: runtime.Types.Utils.PayloadToResult<Prisma.$NotePayload> 1441 + } 1442 + aggregate: { 1443 + args: Prisma.NoteAggregateArgs<ExtArgs> 1444 + result: runtime.Types.Utils.Optional<Prisma.AggregateNote> 1445 + } 1446 + groupBy: { 1447 + args: Prisma.NoteGroupByArgs<ExtArgs> 1448 + result: runtime.Types.Utils.Optional<Prisma.NoteGroupByOutputType>[] 1449 + } 1450 + count: { 1451 + args: Prisma.NoteCountArgs<ExtArgs> 1452 + result: runtime.Types.Utils.Optional<Prisma.NoteCountAggregateOutputType> | number 1453 + } 1454 + } 1455 + } 1381 1456 } 1382 1457 } & { 1383 1458 other: { ··· 1614 1689 listId: 'listId', 1615 1690 mediaType: 'mediaType', 1616 1691 mediaId: 'mediaId', 1692 + seasonNumber: 'seasonNumber', 1693 + episodeNumber: 'episodeNumber', 1617 1694 movieId: 'movieId', 1618 1695 showId: 'showId', 1619 1696 notes: 'notes', ··· 1624 1701 export type ListItemScalarFieldEnum = (typeof ListItemScalarFieldEnum)[keyof typeof ListItemScalarFieldEnum] 1625 1702 1626 1703 1704 + export const NoteScalarFieldEnum = { 1705 + id: 'id', 1706 + rkey: 'rkey', 1707 + uri: 'uri', 1708 + cid: 'cid', 1709 + userDid: 'userDid', 1710 + mediaType: 'mediaType', 1711 + mediaId: 'mediaId', 1712 + seasonNumber: 'seasonNumber', 1713 + episodeNumber: 'episodeNumber', 1714 + content: 'content', 1715 + createdAt: 'createdAt', 1716 + updatedAt: 'updatedAt' 1717 + } as const 1718 + 1719 + export type NoteScalarFieldEnum = (typeof NoteScalarFieldEnum)[keyof typeof NoteScalarFieldEnum] 1720 + 1721 + 1627 1722 export const SortOrder = { 1628 1723 asc: 'asc', 1629 1724 desc: 'desc' ··· 1876 1971 trackedEpisode?: Prisma.TrackedEpisodeOmit 1877 1972 list?: Prisma.ListOmit 1878 1973 listItem?: Prisma.ListItemOmit 1974 + note?: Prisma.NoteOmit 1879 1975 } 1880 1976 1881 1977 /* Types for Logging */
+22 -1
backend/src/generated/internal/prismaNamespaceBrowser.ts
··· 63 63 TrackedMovie: 'TrackedMovie', 64 64 TrackedEpisode: 'TrackedEpisode', 65 65 List: 'List', 66 - ListItem: 'ListItem' 66 + ListItem: 'ListItem', 67 + Note: 'Note' 67 68 } as const 68 69 69 70 export type ModelName = (typeof ModelName)[keyof typeof ModelName] ··· 279 280 listId: 'listId', 280 281 mediaType: 'mediaType', 281 282 mediaId: 'mediaId', 283 + seasonNumber: 'seasonNumber', 284 + episodeNumber: 'episodeNumber', 282 285 movieId: 'movieId', 283 286 showId: 'showId', 284 287 notes: 'notes', ··· 287 290 } as const 288 291 289 292 export type ListItemScalarFieldEnum = (typeof ListItemScalarFieldEnum)[keyof typeof ListItemScalarFieldEnum] 293 + 294 + 295 + export const NoteScalarFieldEnum = { 296 + id: 'id', 297 + rkey: 'rkey', 298 + uri: 'uri', 299 + cid: 'cid', 300 + userDid: 'userDid', 301 + mediaType: 'mediaType', 302 + mediaId: 'mediaId', 303 + seasonNumber: 'seasonNumber', 304 + episodeNumber: 'episodeNumber', 305 + content: 'content', 306 + createdAt: 'createdAt', 307 + updatedAt: 'updatedAt' 308 + } as const 309 + 310 + export type NoteScalarFieldEnum = (typeof NoteScalarFieldEnum)[keyof typeof NoteScalarFieldEnum] 290 311 291 312 292 313 export const SortOrder = {
+1
backend/src/generated/models.ts
··· 21 21 export type * from './models/TrackedEpisode.js' 22 22 export type * from './models/List.js' 23 23 export type * from './models/ListItem.js' 24 + export type * from './models/Note.js' 24 25 export type * from './commonInputTypes.js'
+112 -4
backend/src/generated/models/ListItem.ts
··· 27 27 } 28 28 29 29 export type ListItemAvgAggregateOutputType = { 30 + seasonNumber: number | null 31 + episodeNumber: number | null 30 32 position: number | null 31 33 } 32 34 33 35 export type ListItemSumAggregateOutputType = { 36 + seasonNumber: number | null 37 + episodeNumber: number | null 34 38 position: number | null 35 39 } 36 40 ··· 42 46 listId: string | null 43 47 mediaType: $Enums.MediaType | null 44 48 mediaId: string | null 49 + seasonNumber: number | null 50 + episodeNumber: number | null 45 51 movieId: string | null 46 52 showId: string | null 47 53 notes: string | null ··· 57 63 listId: string | null 58 64 mediaType: $Enums.MediaType | null 59 65 mediaId: string | null 66 + seasonNumber: number | null 67 + episodeNumber: number | null 60 68 movieId: string | null 61 69 showId: string | null 62 70 notes: string | null ··· 72 80 listId: number 73 81 mediaType: number 74 82 mediaId: number 83 + seasonNumber: number 84 + episodeNumber: number 75 85 movieId: number 76 86 showId: number 77 87 notes: number ··· 82 92 83 93 84 94 export type ListItemAvgAggregateInputType = { 95 + seasonNumber?: true 96 + episodeNumber?: true 85 97 position?: true 86 98 } 87 99 88 100 export type ListItemSumAggregateInputType = { 101 + seasonNumber?: true 102 + episodeNumber?: true 89 103 position?: true 90 104 } 91 105 ··· 97 111 listId?: true 98 112 mediaType?: true 99 113 mediaId?: true 114 + seasonNumber?: true 115 + episodeNumber?: true 100 116 movieId?: true 101 117 showId?: true 102 118 notes?: true ··· 112 128 listId?: true 113 129 mediaType?: true 114 130 mediaId?: true 131 + seasonNumber?: true 132 + episodeNumber?: true 115 133 movieId?: true 116 134 showId?: true 117 135 notes?: true ··· 127 145 listId?: true 128 146 mediaType?: true 129 147 mediaId?: true 148 + seasonNumber?: true 149 + episodeNumber?: true 130 150 movieId?: true 131 151 showId?: true 132 152 notes?: true ··· 229 249 listId: string 230 250 mediaType: $Enums.MediaType 231 251 mediaId: string 252 + seasonNumber: number 253 + episodeNumber: number 232 254 movieId: string | null 233 255 showId: string | null 234 256 notes: string | null ··· 267 289 listId?: Prisma.StringFilter<"ListItem"> | string 268 290 mediaType?: Prisma.EnumMediaTypeFilter<"ListItem"> | $Enums.MediaType 269 291 mediaId?: Prisma.StringFilter<"ListItem"> | string 292 + seasonNumber?: Prisma.IntFilter<"ListItem"> | number 293 + episodeNumber?: Prisma.IntFilter<"ListItem"> | number 270 294 movieId?: Prisma.StringNullableFilter<"ListItem"> | string | null 271 295 showId?: Prisma.StringNullableFilter<"ListItem"> | string | null 272 296 notes?: Prisma.StringNullableFilter<"ListItem"> | string | null ··· 285 309 listId?: Prisma.SortOrder 286 310 mediaType?: Prisma.SortOrder 287 311 mediaId?: Prisma.SortOrder 312 + seasonNumber?: Prisma.SortOrder 313 + episodeNumber?: Prisma.SortOrder 288 314 movieId?: Prisma.SortOrderInput | Prisma.SortOrder 289 315 showId?: Prisma.SortOrderInput | Prisma.SortOrder 290 316 notes?: Prisma.SortOrderInput | Prisma.SortOrder ··· 298 324 export type ListItemWhereUniqueInput = Prisma.AtLeast<{ 299 325 id?: string 300 326 rkey?: string 301 - listId_mediaType_mediaId?: Prisma.ListItemListIdMediaTypeMediaIdCompoundUniqueInput 327 + listId_mediaType_mediaId_seasonNumber_episodeNumber?: Prisma.ListItemListIdMediaTypeMediaIdSeasonNumberEpisodeNumberCompoundUniqueInput 302 328 AND?: Prisma.ListItemWhereInput | Prisma.ListItemWhereInput[] 303 329 OR?: Prisma.ListItemWhereInput[] 304 330 NOT?: Prisma.ListItemWhereInput | Prisma.ListItemWhereInput[] ··· 307 333 listId?: Prisma.StringFilter<"ListItem"> | string 308 334 mediaType?: Prisma.EnumMediaTypeFilter<"ListItem"> | $Enums.MediaType 309 335 mediaId?: Prisma.StringFilter<"ListItem"> | string 336 + seasonNumber?: Prisma.IntFilter<"ListItem"> | number 337 + episodeNumber?: Prisma.IntFilter<"ListItem"> | number 310 338 movieId?: Prisma.StringNullableFilter<"ListItem"> | string | null 311 339 showId?: Prisma.StringNullableFilter<"ListItem"> | string | null 312 340 notes?: Prisma.StringNullableFilter<"ListItem"> | string | null ··· 315 343 list?: Prisma.XOR<Prisma.ListScalarRelationFilter, Prisma.ListWhereInput> 316 344 movie?: Prisma.XOR<Prisma.MovieNullableScalarRelationFilter, Prisma.MovieWhereInput> | null 317 345 show?: Prisma.XOR<Prisma.ShowNullableScalarRelationFilter, Prisma.ShowWhereInput> | null 318 - }, "id" | "rkey" | "listId_mediaType_mediaId"> 346 + }, "id" | "rkey" | "listId_mediaType_mediaId_seasonNumber_episodeNumber"> 319 347 320 348 export type ListItemOrderByWithAggregationInput = { 321 349 id?: Prisma.SortOrder ··· 325 353 listId?: Prisma.SortOrder 326 354 mediaType?: Prisma.SortOrder 327 355 mediaId?: Prisma.SortOrder 356 + seasonNumber?: Prisma.SortOrder 357 + episodeNumber?: Prisma.SortOrder 328 358 movieId?: Prisma.SortOrderInput | Prisma.SortOrder 329 359 showId?: Prisma.SortOrderInput | Prisma.SortOrder 330 360 notes?: Prisma.SortOrderInput | Prisma.SortOrder ··· 348 378 listId?: Prisma.StringWithAggregatesFilter<"ListItem"> | string 349 379 mediaType?: Prisma.EnumMediaTypeWithAggregatesFilter<"ListItem"> | $Enums.MediaType 350 380 mediaId?: Prisma.StringWithAggregatesFilter<"ListItem"> | string 381 + seasonNumber?: Prisma.IntWithAggregatesFilter<"ListItem"> | number 382 + episodeNumber?: Prisma.IntWithAggregatesFilter<"ListItem"> | number 351 383 movieId?: Prisma.StringNullableWithAggregatesFilter<"ListItem"> | string | null 352 384 showId?: Prisma.StringNullableWithAggregatesFilter<"ListItem"> | string | null 353 385 notes?: Prisma.StringNullableWithAggregatesFilter<"ListItem"> | string | null ··· 362 394 cid?: string | null 363 395 mediaType: $Enums.MediaType 364 396 mediaId: string 397 + seasonNumber?: number 398 + episodeNumber?: number 365 399 notes?: string | null 366 400 position?: number 367 401 createdAt?: Date | string ··· 378 412 listId: string 379 413 mediaType: $Enums.MediaType 380 414 mediaId: string 415 + seasonNumber?: number 416 + episodeNumber?: number 381 417 movieId?: string | null 382 418 showId?: string | null 383 419 notes?: string | null ··· 392 428 cid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 393 429 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 394 430 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 431 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 432 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 395 433 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 396 434 position?: Prisma.IntFieldUpdateOperationsInput | number 397 435 createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string ··· 408 446 listId?: Prisma.StringFieldUpdateOperationsInput | string 409 447 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 410 448 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 449 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 450 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 411 451 movieId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 412 452 showId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 413 453 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null ··· 423 463 listId: string 424 464 mediaType: $Enums.MediaType 425 465 mediaId: string 466 + seasonNumber?: number 467 + episodeNumber?: number 426 468 movieId?: string | null 427 469 showId?: string | null 428 470 notes?: string | null ··· 437 479 cid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 438 480 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 439 481 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 482 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 483 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 440 484 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 441 485 position?: Prisma.IntFieldUpdateOperationsInput | number 442 486 createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string ··· 450 494 listId?: Prisma.StringFieldUpdateOperationsInput | string 451 495 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 452 496 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 497 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 498 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 453 499 movieId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 454 500 showId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 455 501 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null ··· 467 513 _count?: Prisma.SortOrder 468 514 } 469 515 470 - export type ListItemListIdMediaTypeMediaIdCompoundUniqueInput = { 516 + export type ListItemListIdMediaTypeMediaIdSeasonNumberEpisodeNumberCompoundUniqueInput = { 471 517 listId: string 472 518 mediaType: $Enums.MediaType 473 519 mediaId: string 520 + seasonNumber: number 521 + episodeNumber: number 474 522 } 475 523 476 524 export type ListItemCountOrderByAggregateInput = { ··· 481 529 listId?: Prisma.SortOrder 482 530 mediaType?: Prisma.SortOrder 483 531 mediaId?: Prisma.SortOrder 532 + seasonNumber?: Prisma.SortOrder 533 + episodeNumber?: Prisma.SortOrder 484 534 movieId?: Prisma.SortOrder 485 535 showId?: Prisma.SortOrder 486 536 notes?: Prisma.SortOrder ··· 489 539 } 490 540 491 541 export type ListItemAvgOrderByAggregateInput = { 542 + seasonNumber?: Prisma.SortOrder 543 + episodeNumber?: Prisma.SortOrder 492 544 position?: Prisma.SortOrder 493 545 } 494 546 ··· 500 552 listId?: Prisma.SortOrder 501 553 mediaType?: Prisma.SortOrder 502 554 mediaId?: Prisma.SortOrder 555 + seasonNumber?: Prisma.SortOrder 556 + episodeNumber?: Prisma.SortOrder 503 557 movieId?: Prisma.SortOrder 504 558 showId?: Prisma.SortOrder 505 559 notes?: Prisma.SortOrder ··· 515 569 listId?: Prisma.SortOrder 516 570 mediaType?: Prisma.SortOrder 517 571 mediaId?: Prisma.SortOrder 572 + seasonNumber?: Prisma.SortOrder 573 + episodeNumber?: Prisma.SortOrder 518 574 movieId?: Prisma.SortOrder 519 575 showId?: Prisma.SortOrder 520 576 notes?: Prisma.SortOrder ··· 523 579 } 524 580 525 581 export type ListItemSumOrderByAggregateInput = { 582 + seasonNumber?: Prisma.SortOrder 583 + episodeNumber?: Prisma.SortOrder 526 584 position?: Prisma.SortOrder 527 585 } 528 586 ··· 663 721 cid?: string | null 664 722 mediaType: $Enums.MediaType 665 723 mediaId: string 724 + seasonNumber?: number 725 + episodeNumber?: number 666 726 notes?: string | null 667 727 position?: number 668 728 createdAt?: Date | string ··· 678 738 listId: string 679 739 mediaType: $Enums.MediaType 680 740 mediaId: string 741 + seasonNumber?: number 742 + episodeNumber?: number 681 743 showId?: string | null 682 744 notes?: string | null 683 745 position?: number ··· 721 783 listId?: Prisma.StringFilter<"ListItem"> | string 722 784 mediaType?: Prisma.EnumMediaTypeFilter<"ListItem"> | $Enums.MediaType 723 785 mediaId?: Prisma.StringFilter<"ListItem"> | string 786 + seasonNumber?: Prisma.IntFilter<"ListItem"> | number 787 + episodeNumber?: Prisma.IntFilter<"ListItem"> | number 724 788 movieId?: Prisma.StringNullableFilter<"ListItem"> | string | null 725 789 showId?: Prisma.StringNullableFilter<"ListItem"> | string | null 726 790 notes?: Prisma.StringNullableFilter<"ListItem"> | string | null ··· 735 799 cid?: string | null 736 800 mediaType: $Enums.MediaType 737 801 mediaId: string 802 + seasonNumber?: number 803 + episodeNumber?: number 738 804 notes?: string | null 739 805 position?: number 740 806 createdAt?: Date | string ··· 750 816 listId: string 751 817 mediaType: $Enums.MediaType 752 818 mediaId: string 819 + seasonNumber?: number 820 + episodeNumber?: number 753 821 movieId?: string | null 754 822 notes?: string | null 755 823 position?: number ··· 789 857 cid?: string | null 790 858 mediaType: $Enums.MediaType 791 859 mediaId: string 860 + seasonNumber?: number 861 + episodeNumber?: number 792 862 notes?: string | null 793 863 position?: number 794 864 createdAt?: Date | string ··· 803 873 cid?: string | null 804 874 mediaType: $Enums.MediaType 805 875 mediaId: string 876 + seasonNumber?: number 877 + episodeNumber?: number 806 878 movieId?: string | null 807 879 showId?: string | null 808 880 notes?: string | null ··· 844 916 listId: string 845 917 mediaType: $Enums.MediaType 846 918 mediaId: string 919 + seasonNumber?: number 920 + episodeNumber?: number 847 921 showId?: string | null 848 922 notes?: string | null 849 923 position?: number ··· 857 931 cid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 858 932 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 859 933 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 934 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 935 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 860 936 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 861 937 position?: Prisma.IntFieldUpdateOperationsInput | number 862 938 createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string ··· 872 948 listId?: Prisma.StringFieldUpdateOperationsInput | string 873 949 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 874 950 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 951 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 952 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 875 953 showId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 876 954 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 877 955 position?: Prisma.IntFieldUpdateOperationsInput | number ··· 886 964 listId?: Prisma.StringFieldUpdateOperationsInput | string 887 965 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 888 966 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 967 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 968 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 889 969 showId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 890 970 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 891 971 position?: Prisma.IntFieldUpdateOperationsInput | number ··· 900 980 listId: string 901 981 mediaType: $Enums.MediaType 902 982 mediaId: string 983 + seasonNumber?: number 984 + episodeNumber?: number 903 985 movieId?: string | null 904 986 notes?: string | null 905 987 position?: number ··· 913 995 cid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 914 996 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 915 997 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 998 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 999 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 916 1000 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 917 1001 position?: Prisma.IntFieldUpdateOperationsInput | number 918 1002 createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string ··· 928 1012 listId?: Prisma.StringFieldUpdateOperationsInput | string 929 1013 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 930 1014 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 1015 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 1016 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 931 1017 movieId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 932 1018 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 933 1019 position?: Prisma.IntFieldUpdateOperationsInput | number ··· 942 1028 listId?: Prisma.StringFieldUpdateOperationsInput | string 943 1029 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 944 1030 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 1031 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 1032 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 945 1033 movieId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 946 1034 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 947 1035 position?: Prisma.IntFieldUpdateOperationsInput | number ··· 955 1043 cid?: string | null 956 1044 mediaType: $Enums.MediaType 957 1045 mediaId: string 1046 + seasonNumber?: number 1047 + episodeNumber?: number 958 1048 movieId?: string | null 959 1049 showId?: string | null 960 1050 notes?: string | null ··· 969 1059 cid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 970 1060 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 971 1061 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 1062 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 1063 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 972 1064 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 973 1065 position?: Prisma.IntFieldUpdateOperationsInput | number 974 1066 createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string ··· 983 1075 cid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 984 1076 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 985 1077 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 1078 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 1079 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 986 1080 movieId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 987 1081 showId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 988 1082 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null ··· 997 1091 cid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 998 1092 mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 999 1093 mediaId?: Prisma.StringFieldUpdateOperationsInput | string 1094 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 1095 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 1000 1096 movieId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1001 1097 showId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1002 1098 notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null ··· 1014 1110 listId?: boolean 1015 1111 mediaType?: boolean 1016 1112 mediaId?: boolean 1113 + seasonNumber?: boolean 1114 + episodeNumber?: boolean 1017 1115 movieId?: boolean 1018 1116 showId?: boolean 1019 1117 notes?: boolean ··· 1032 1130 listId?: boolean 1033 1131 mediaType?: boolean 1034 1132 mediaId?: boolean 1133 + seasonNumber?: boolean 1134 + episodeNumber?: boolean 1035 1135 movieId?: boolean 1036 1136 showId?: boolean 1037 1137 notes?: boolean ··· 1050 1150 listId?: boolean 1051 1151 mediaType?: boolean 1052 1152 mediaId?: boolean 1153 + seasonNumber?: boolean 1154 + episodeNumber?: boolean 1053 1155 movieId?: boolean 1054 1156 showId?: boolean 1055 1157 notes?: boolean ··· 1068 1170 listId?: boolean 1069 1171 mediaType?: boolean 1070 1172 mediaId?: boolean 1173 + seasonNumber?: boolean 1174 + episodeNumber?: boolean 1071 1175 movieId?: boolean 1072 1176 showId?: boolean 1073 1177 notes?: boolean ··· 1075 1179 createdAt?: boolean 1076 1180 } 1077 1181 1078 - export type ListItemOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "rkey" | "uri" | "cid" | "listId" | "mediaType" | "mediaId" | "movieId" | "showId" | "notes" | "position" | "createdAt", ExtArgs["result"]["listItem"]> 1182 + export type ListItemOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "rkey" | "uri" | "cid" | "listId" | "mediaType" | "mediaId" | "seasonNumber" | "episodeNumber" | "movieId" | "showId" | "notes" | "position" | "createdAt", ExtArgs["result"]["listItem"]> 1079 1183 export type ListItemInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1080 1184 list?: boolean | Prisma.ListDefaultArgs<ExtArgs> 1081 1185 movie?: boolean | Prisma.ListItem$movieArgs<ExtArgs> ··· 1107 1211 listId: string 1108 1212 mediaType: $Enums.MediaType 1109 1213 mediaId: string 1214 + seasonNumber: number 1215 + episodeNumber: number 1110 1216 movieId: string | null 1111 1217 showId: string | null 1112 1218 notes: string | null ··· 1545 1651 readonly listId: Prisma.FieldRef<"ListItem", 'String'> 1546 1652 readonly mediaType: Prisma.FieldRef<"ListItem", 'MediaType'> 1547 1653 readonly mediaId: Prisma.FieldRef<"ListItem", 'String'> 1654 + readonly seasonNumber: Prisma.FieldRef<"ListItem", 'Int'> 1655 + readonly episodeNumber: Prisma.FieldRef<"ListItem", 'Int'> 1548 1656 readonly movieId: Prisma.FieldRef<"ListItem", 'String'> 1549 1657 readonly showId: Prisma.FieldRef<"ListItem", 'String'> 1550 1658 readonly notes: Prisma.FieldRef<"ListItem", 'String'>
+1649
backend/src/generated/models/Note.ts
··· 1 + 2 + /* !!! This is code generated by Prisma. Do not edit directly. !!! */ 3 + /* eslint-disable */ 4 + // biome-ignore-all lint: generated file 5 + // @ts-nocheck 6 + /* 7 + * This file exports the `Note` model and its related types. 8 + * 9 + * 🟢 You can import this file directly. 10 + */ 11 + import type * as runtime from "@prisma/client/runtime/client" 12 + import type * as $Enums from "../enums.js" 13 + import type * as Prisma from "../internal/prismaNamespace.js" 14 + 15 + /** 16 + * Model Note 17 + * 18 + */ 19 + export type NoteModel = runtime.Types.Result.DefaultSelection<Prisma.$NotePayload> 20 + 21 + export type AggregateNote = { 22 + _count: NoteCountAggregateOutputType | null 23 + _avg: NoteAvgAggregateOutputType | null 24 + _sum: NoteSumAggregateOutputType | null 25 + _min: NoteMinAggregateOutputType | null 26 + _max: NoteMaxAggregateOutputType | null 27 + } 28 + 29 + export type NoteAvgAggregateOutputType = { 30 + seasonNumber: number | null 31 + episodeNumber: number | null 32 + } 33 + 34 + export type NoteSumAggregateOutputType = { 35 + seasonNumber: number | null 36 + episodeNumber: number | null 37 + } 38 + 39 + export type NoteMinAggregateOutputType = { 40 + id: string | null 41 + rkey: string | null 42 + uri: string | null 43 + cid: string | null 44 + userDid: string | null 45 + mediaType: $Enums.MediaType | null 46 + mediaId: string | null 47 + seasonNumber: number | null 48 + episodeNumber: number | null 49 + content: string | null 50 + createdAt: Date | null 51 + updatedAt: Date | null 52 + } 53 + 54 + export type NoteMaxAggregateOutputType = { 55 + id: string | null 56 + rkey: string | null 57 + uri: string | null 58 + cid: string | null 59 + userDid: string | null 60 + mediaType: $Enums.MediaType | null 61 + mediaId: string | null 62 + seasonNumber: number | null 63 + episodeNumber: number | null 64 + content: string | null 65 + createdAt: Date | null 66 + updatedAt: Date | null 67 + } 68 + 69 + export type NoteCountAggregateOutputType = { 70 + id: number 71 + rkey: number 72 + uri: number 73 + cid: number 74 + userDid: number 75 + mediaType: number 76 + mediaId: number 77 + seasonNumber: number 78 + episodeNumber: number 79 + content: number 80 + createdAt: number 81 + updatedAt: number 82 + _all: number 83 + } 84 + 85 + 86 + export type NoteAvgAggregateInputType = { 87 + seasonNumber?: true 88 + episodeNumber?: true 89 + } 90 + 91 + export type NoteSumAggregateInputType = { 92 + seasonNumber?: true 93 + episodeNumber?: true 94 + } 95 + 96 + export type NoteMinAggregateInputType = { 97 + id?: true 98 + rkey?: true 99 + uri?: true 100 + cid?: true 101 + userDid?: true 102 + mediaType?: true 103 + mediaId?: true 104 + seasonNumber?: true 105 + episodeNumber?: true 106 + content?: true 107 + createdAt?: true 108 + updatedAt?: true 109 + } 110 + 111 + export type NoteMaxAggregateInputType = { 112 + id?: true 113 + rkey?: true 114 + uri?: true 115 + cid?: true 116 + userDid?: true 117 + mediaType?: true 118 + mediaId?: true 119 + seasonNumber?: true 120 + episodeNumber?: true 121 + content?: true 122 + createdAt?: true 123 + updatedAt?: true 124 + } 125 + 126 + export type NoteCountAggregateInputType = { 127 + id?: true 128 + rkey?: true 129 + uri?: true 130 + cid?: true 131 + userDid?: true 132 + mediaType?: true 133 + mediaId?: true 134 + seasonNumber?: true 135 + episodeNumber?: true 136 + content?: true 137 + createdAt?: true 138 + updatedAt?: true 139 + _all?: true 140 + } 141 + 142 + export type NoteAggregateArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 143 + /** 144 + * Filter which Note to aggregate. 145 + */ 146 + where?: Prisma.NoteWhereInput 147 + /** 148 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} 149 + * 150 + * Determine the order of Notes to fetch. 151 + */ 152 + orderBy?: Prisma.NoteOrderByWithRelationInput | Prisma.NoteOrderByWithRelationInput[] 153 + /** 154 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} 155 + * 156 + * Sets the start position 157 + */ 158 + cursor?: Prisma.NoteWhereUniqueInput 159 + /** 160 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} 161 + * 162 + * Take `±n` Notes from the position of the cursor. 163 + */ 164 + take?: number 165 + /** 166 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} 167 + * 168 + * Skip the first `n` Notes. 169 + */ 170 + skip?: number 171 + /** 172 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} 173 + * 174 + * Count returned Notes 175 + **/ 176 + _count?: true | NoteCountAggregateInputType 177 + /** 178 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} 179 + * 180 + * Select which fields to average 181 + **/ 182 + _avg?: NoteAvgAggregateInputType 183 + /** 184 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} 185 + * 186 + * Select which fields to sum 187 + **/ 188 + _sum?: NoteSumAggregateInputType 189 + /** 190 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} 191 + * 192 + * Select which fields to find the minimum value 193 + **/ 194 + _min?: NoteMinAggregateInputType 195 + /** 196 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} 197 + * 198 + * Select which fields to find the maximum value 199 + **/ 200 + _max?: NoteMaxAggregateInputType 201 + } 202 + 203 + export type GetNoteAggregateType<T extends NoteAggregateArgs> = { 204 + [P in keyof T & keyof AggregateNote]: P extends '_count' | 'count' 205 + ? T[P] extends true 206 + ? number 207 + : Prisma.GetScalarType<T[P], AggregateNote[P]> 208 + : Prisma.GetScalarType<T[P], AggregateNote[P]> 209 + } 210 + 211 + 212 + 213 + 214 + export type NoteGroupByArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 215 + where?: Prisma.NoteWhereInput 216 + orderBy?: Prisma.NoteOrderByWithAggregationInput | Prisma.NoteOrderByWithAggregationInput[] 217 + by: Prisma.NoteScalarFieldEnum[] | Prisma.NoteScalarFieldEnum 218 + having?: Prisma.NoteScalarWhereWithAggregatesInput 219 + take?: number 220 + skip?: number 221 + _count?: NoteCountAggregateInputType | true 222 + _avg?: NoteAvgAggregateInputType 223 + _sum?: NoteSumAggregateInputType 224 + _min?: NoteMinAggregateInputType 225 + _max?: NoteMaxAggregateInputType 226 + } 227 + 228 + export type NoteGroupByOutputType = { 229 + id: string 230 + rkey: string 231 + uri: string 232 + cid: string 233 + userDid: string 234 + mediaType: $Enums.MediaType 235 + mediaId: string 236 + seasonNumber: number 237 + episodeNumber: number 238 + content: string 239 + createdAt: Date 240 + updatedAt: Date 241 + _count: NoteCountAggregateOutputType | null 242 + _avg: NoteAvgAggregateOutputType | null 243 + _sum: NoteSumAggregateOutputType | null 244 + _min: NoteMinAggregateOutputType | null 245 + _max: NoteMaxAggregateOutputType | null 246 + } 247 + 248 + export type GetNoteGroupByPayload<T extends NoteGroupByArgs> = Prisma.PrismaPromise< 249 + Array< 250 + Prisma.PickEnumerable<NoteGroupByOutputType, T['by']> & 251 + { 252 + [P in ((keyof T) & (keyof NoteGroupByOutputType))]: P extends '_count' 253 + ? T[P] extends boolean 254 + ? number 255 + : Prisma.GetScalarType<T[P], NoteGroupByOutputType[P]> 256 + : Prisma.GetScalarType<T[P], NoteGroupByOutputType[P]> 257 + } 258 + > 259 + > 260 + 261 + 262 + 263 + export type NoteWhereInput = { 264 + AND?: Prisma.NoteWhereInput | Prisma.NoteWhereInput[] 265 + OR?: Prisma.NoteWhereInput[] 266 + NOT?: Prisma.NoteWhereInput | Prisma.NoteWhereInput[] 267 + id?: Prisma.StringFilter<"Note"> | string 268 + rkey?: Prisma.StringFilter<"Note"> | string 269 + uri?: Prisma.StringFilter<"Note"> | string 270 + cid?: Prisma.StringFilter<"Note"> | string 271 + userDid?: Prisma.StringFilter<"Note"> | string 272 + mediaType?: Prisma.EnumMediaTypeFilter<"Note"> | $Enums.MediaType 273 + mediaId?: Prisma.StringFilter<"Note"> | string 274 + seasonNumber?: Prisma.IntFilter<"Note"> | number 275 + episodeNumber?: Prisma.IntFilter<"Note"> | number 276 + content?: Prisma.StringFilter<"Note"> | string 277 + createdAt?: Prisma.DateTimeFilter<"Note"> | Date | string 278 + updatedAt?: Prisma.DateTimeFilter<"Note"> | Date | string 279 + user?: Prisma.XOR<Prisma.UserScalarRelationFilter, Prisma.UserWhereInput> 280 + } 281 + 282 + export type NoteOrderByWithRelationInput = { 283 + id?: Prisma.SortOrder 284 + rkey?: Prisma.SortOrder 285 + uri?: Prisma.SortOrder 286 + cid?: Prisma.SortOrder 287 + userDid?: Prisma.SortOrder 288 + mediaType?: Prisma.SortOrder 289 + mediaId?: Prisma.SortOrder 290 + seasonNumber?: Prisma.SortOrder 291 + episodeNumber?: Prisma.SortOrder 292 + content?: Prisma.SortOrder 293 + createdAt?: Prisma.SortOrder 294 + updatedAt?: Prisma.SortOrder 295 + user?: Prisma.UserOrderByWithRelationInput 296 + } 297 + 298 + export type NoteWhereUniqueInput = Prisma.AtLeast<{ 299 + id?: string 300 + rkey?: string 301 + userDid_mediaType_mediaId_seasonNumber_episodeNumber?: Prisma.NoteUserDidMediaTypeMediaIdSeasonNumberEpisodeNumberCompoundUniqueInput 302 + AND?: Prisma.NoteWhereInput | Prisma.NoteWhereInput[] 303 + OR?: Prisma.NoteWhereInput[] 304 + NOT?: Prisma.NoteWhereInput | Prisma.NoteWhereInput[] 305 + uri?: Prisma.StringFilter<"Note"> | string 306 + cid?: Prisma.StringFilter<"Note"> | string 307 + userDid?: Prisma.StringFilter<"Note"> | string 308 + mediaType?: Prisma.EnumMediaTypeFilter<"Note"> | $Enums.MediaType 309 + mediaId?: Prisma.StringFilter<"Note"> | string 310 + seasonNumber?: Prisma.IntFilter<"Note"> | number 311 + episodeNumber?: Prisma.IntFilter<"Note"> | number 312 + content?: Prisma.StringFilter<"Note"> | string 313 + createdAt?: Prisma.DateTimeFilter<"Note"> | Date | string 314 + updatedAt?: Prisma.DateTimeFilter<"Note"> | Date | string 315 + user?: Prisma.XOR<Prisma.UserScalarRelationFilter, Prisma.UserWhereInput> 316 + }, "id" | "rkey" | "userDid_mediaType_mediaId_seasonNumber_episodeNumber"> 317 + 318 + export type NoteOrderByWithAggregationInput = { 319 + id?: Prisma.SortOrder 320 + rkey?: Prisma.SortOrder 321 + uri?: Prisma.SortOrder 322 + cid?: Prisma.SortOrder 323 + userDid?: Prisma.SortOrder 324 + mediaType?: Prisma.SortOrder 325 + mediaId?: Prisma.SortOrder 326 + seasonNumber?: Prisma.SortOrder 327 + episodeNumber?: Prisma.SortOrder 328 + content?: Prisma.SortOrder 329 + createdAt?: Prisma.SortOrder 330 + updatedAt?: Prisma.SortOrder 331 + _count?: Prisma.NoteCountOrderByAggregateInput 332 + _avg?: Prisma.NoteAvgOrderByAggregateInput 333 + _max?: Prisma.NoteMaxOrderByAggregateInput 334 + _min?: Prisma.NoteMinOrderByAggregateInput 335 + _sum?: Prisma.NoteSumOrderByAggregateInput 336 + } 337 + 338 + export type NoteScalarWhereWithAggregatesInput = { 339 + AND?: Prisma.NoteScalarWhereWithAggregatesInput | Prisma.NoteScalarWhereWithAggregatesInput[] 340 + OR?: Prisma.NoteScalarWhereWithAggregatesInput[] 341 + NOT?: Prisma.NoteScalarWhereWithAggregatesInput | Prisma.NoteScalarWhereWithAggregatesInput[] 342 + id?: Prisma.StringWithAggregatesFilter<"Note"> | string 343 + rkey?: Prisma.StringWithAggregatesFilter<"Note"> | string 344 + uri?: Prisma.StringWithAggregatesFilter<"Note"> | string 345 + cid?: Prisma.StringWithAggregatesFilter<"Note"> | string 346 + userDid?: Prisma.StringWithAggregatesFilter<"Note"> | string 347 + mediaType?: Prisma.EnumMediaTypeWithAggregatesFilter<"Note"> | $Enums.MediaType 348 + mediaId?: Prisma.StringWithAggregatesFilter<"Note"> | string 349 + seasonNumber?: Prisma.IntWithAggregatesFilter<"Note"> | number 350 + episodeNumber?: Prisma.IntWithAggregatesFilter<"Note"> | number 351 + content?: Prisma.StringWithAggregatesFilter<"Note"> | string 352 + createdAt?: Prisma.DateTimeWithAggregatesFilter<"Note"> | Date | string 353 + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Note"> | Date | string 354 + } 355 + 356 + export type NoteCreateInput = { 357 + id?: string 358 + rkey: string 359 + uri: string 360 + cid: string 361 + mediaType: $Enums.MediaType 362 + mediaId: string 363 + seasonNumber?: number 364 + episodeNumber?: number 365 + content: string 366 + createdAt?: Date | string 367 + updatedAt?: Date | string 368 + user: Prisma.UserCreateNestedOneWithoutNotesInput 369 + } 370 + 371 + export type NoteUncheckedCreateInput = { 372 + id?: string 373 + rkey: string 374 + uri: string 375 + cid: string 376 + userDid: string 377 + mediaType: $Enums.MediaType 378 + mediaId: string 379 + seasonNumber?: number 380 + episodeNumber?: number 381 + content: string 382 + createdAt?: Date | string 383 + updatedAt?: Date | string 384 + } 385 + 386 + export type NoteUpdateInput = { 387 + id?: Prisma.StringFieldUpdateOperationsInput | string 388 + rkey?: Prisma.StringFieldUpdateOperationsInput | string 389 + uri?: Prisma.StringFieldUpdateOperationsInput | string 390 + cid?: Prisma.StringFieldUpdateOperationsInput | string 391 + mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 392 + mediaId?: Prisma.StringFieldUpdateOperationsInput | string 393 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 394 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 395 + content?: Prisma.StringFieldUpdateOperationsInput | string 396 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 397 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 398 + user?: Prisma.UserUpdateOneRequiredWithoutNotesNestedInput 399 + } 400 + 401 + export type NoteUncheckedUpdateInput = { 402 + id?: Prisma.StringFieldUpdateOperationsInput | string 403 + rkey?: Prisma.StringFieldUpdateOperationsInput | string 404 + uri?: Prisma.StringFieldUpdateOperationsInput | string 405 + cid?: Prisma.StringFieldUpdateOperationsInput | string 406 + userDid?: Prisma.StringFieldUpdateOperationsInput | string 407 + mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 408 + mediaId?: Prisma.StringFieldUpdateOperationsInput | string 409 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 410 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 411 + content?: Prisma.StringFieldUpdateOperationsInput | string 412 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 413 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 414 + } 415 + 416 + export type NoteCreateManyInput = { 417 + id?: string 418 + rkey: string 419 + uri: string 420 + cid: string 421 + userDid: string 422 + mediaType: $Enums.MediaType 423 + mediaId: string 424 + seasonNumber?: number 425 + episodeNumber?: number 426 + content: string 427 + createdAt?: Date | string 428 + updatedAt?: Date | string 429 + } 430 + 431 + export type NoteUpdateManyMutationInput = { 432 + id?: Prisma.StringFieldUpdateOperationsInput | string 433 + rkey?: Prisma.StringFieldUpdateOperationsInput | string 434 + uri?: Prisma.StringFieldUpdateOperationsInput | string 435 + cid?: Prisma.StringFieldUpdateOperationsInput | string 436 + mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 437 + mediaId?: Prisma.StringFieldUpdateOperationsInput | string 438 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 439 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 440 + content?: Prisma.StringFieldUpdateOperationsInput | string 441 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 442 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 443 + } 444 + 445 + export type NoteUncheckedUpdateManyInput = { 446 + id?: Prisma.StringFieldUpdateOperationsInput | string 447 + rkey?: Prisma.StringFieldUpdateOperationsInput | string 448 + uri?: Prisma.StringFieldUpdateOperationsInput | string 449 + cid?: Prisma.StringFieldUpdateOperationsInput | string 450 + userDid?: Prisma.StringFieldUpdateOperationsInput | string 451 + mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 452 + mediaId?: Prisma.StringFieldUpdateOperationsInput | string 453 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 454 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 455 + content?: Prisma.StringFieldUpdateOperationsInput | string 456 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 457 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 458 + } 459 + 460 + export type NoteListRelationFilter = { 461 + every?: Prisma.NoteWhereInput 462 + some?: Prisma.NoteWhereInput 463 + none?: Prisma.NoteWhereInput 464 + } 465 + 466 + export type NoteOrderByRelationAggregateInput = { 467 + _count?: Prisma.SortOrder 468 + } 469 + 470 + export type NoteUserDidMediaTypeMediaIdSeasonNumberEpisodeNumberCompoundUniqueInput = { 471 + userDid: string 472 + mediaType: $Enums.MediaType 473 + mediaId: string 474 + seasonNumber: number 475 + episodeNumber: number 476 + } 477 + 478 + export type NoteCountOrderByAggregateInput = { 479 + id?: Prisma.SortOrder 480 + rkey?: Prisma.SortOrder 481 + uri?: Prisma.SortOrder 482 + cid?: Prisma.SortOrder 483 + userDid?: Prisma.SortOrder 484 + mediaType?: Prisma.SortOrder 485 + mediaId?: Prisma.SortOrder 486 + seasonNumber?: Prisma.SortOrder 487 + episodeNumber?: Prisma.SortOrder 488 + content?: Prisma.SortOrder 489 + createdAt?: Prisma.SortOrder 490 + updatedAt?: Prisma.SortOrder 491 + } 492 + 493 + export type NoteAvgOrderByAggregateInput = { 494 + seasonNumber?: Prisma.SortOrder 495 + episodeNumber?: Prisma.SortOrder 496 + } 497 + 498 + export type NoteMaxOrderByAggregateInput = { 499 + id?: Prisma.SortOrder 500 + rkey?: Prisma.SortOrder 501 + uri?: Prisma.SortOrder 502 + cid?: Prisma.SortOrder 503 + userDid?: Prisma.SortOrder 504 + mediaType?: Prisma.SortOrder 505 + mediaId?: Prisma.SortOrder 506 + seasonNumber?: Prisma.SortOrder 507 + episodeNumber?: Prisma.SortOrder 508 + content?: Prisma.SortOrder 509 + createdAt?: Prisma.SortOrder 510 + updatedAt?: Prisma.SortOrder 511 + } 512 + 513 + export type NoteMinOrderByAggregateInput = { 514 + id?: Prisma.SortOrder 515 + rkey?: Prisma.SortOrder 516 + uri?: Prisma.SortOrder 517 + cid?: Prisma.SortOrder 518 + userDid?: Prisma.SortOrder 519 + mediaType?: Prisma.SortOrder 520 + mediaId?: Prisma.SortOrder 521 + seasonNumber?: Prisma.SortOrder 522 + episodeNumber?: Prisma.SortOrder 523 + content?: Prisma.SortOrder 524 + createdAt?: Prisma.SortOrder 525 + updatedAt?: Prisma.SortOrder 526 + } 527 + 528 + export type NoteSumOrderByAggregateInput = { 529 + seasonNumber?: Prisma.SortOrder 530 + episodeNumber?: Prisma.SortOrder 531 + } 532 + 533 + export type NoteCreateNestedManyWithoutUserInput = { 534 + create?: Prisma.XOR<Prisma.NoteCreateWithoutUserInput, Prisma.NoteUncheckedCreateWithoutUserInput> | Prisma.NoteCreateWithoutUserInput[] | Prisma.NoteUncheckedCreateWithoutUserInput[] 535 + connectOrCreate?: Prisma.NoteCreateOrConnectWithoutUserInput | Prisma.NoteCreateOrConnectWithoutUserInput[] 536 + createMany?: Prisma.NoteCreateManyUserInputEnvelope 537 + connect?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 538 + } 539 + 540 + export type NoteUncheckedCreateNestedManyWithoutUserInput = { 541 + create?: Prisma.XOR<Prisma.NoteCreateWithoutUserInput, Prisma.NoteUncheckedCreateWithoutUserInput> | Prisma.NoteCreateWithoutUserInput[] | Prisma.NoteUncheckedCreateWithoutUserInput[] 542 + connectOrCreate?: Prisma.NoteCreateOrConnectWithoutUserInput | Prisma.NoteCreateOrConnectWithoutUserInput[] 543 + createMany?: Prisma.NoteCreateManyUserInputEnvelope 544 + connect?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 545 + } 546 + 547 + export type NoteUpdateManyWithoutUserNestedInput = { 548 + create?: Prisma.XOR<Prisma.NoteCreateWithoutUserInput, Prisma.NoteUncheckedCreateWithoutUserInput> | Prisma.NoteCreateWithoutUserInput[] | Prisma.NoteUncheckedCreateWithoutUserInput[] 549 + connectOrCreate?: Prisma.NoteCreateOrConnectWithoutUserInput | Prisma.NoteCreateOrConnectWithoutUserInput[] 550 + upsert?: Prisma.NoteUpsertWithWhereUniqueWithoutUserInput | Prisma.NoteUpsertWithWhereUniqueWithoutUserInput[] 551 + createMany?: Prisma.NoteCreateManyUserInputEnvelope 552 + set?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 553 + disconnect?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 554 + delete?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 555 + connect?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 556 + update?: Prisma.NoteUpdateWithWhereUniqueWithoutUserInput | Prisma.NoteUpdateWithWhereUniqueWithoutUserInput[] 557 + updateMany?: Prisma.NoteUpdateManyWithWhereWithoutUserInput | Prisma.NoteUpdateManyWithWhereWithoutUserInput[] 558 + deleteMany?: Prisma.NoteScalarWhereInput | Prisma.NoteScalarWhereInput[] 559 + } 560 + 561 + export type NoteUncheckedUpdateManyWithoutUserNestedInput = { 562 + create?: Prisma.XOR<Prisma.NoteCreateWithoutUserInput, Prisma.NoteUncheckedCreateWithoutUserInput> | Prisma.NoteCreateWithoutUserInput[] | Prisma.NoteUncheckedCreateWithoutUserInput[] 563 + connectOrCreate?: Prisma.NoteCreateOrConnectWithoutUserInput | Prisma.NoteCreateOrConnectWithoutUserInput[] 564 + upsert?: Prisma.NoteUpsertWithWhereUniqueWithoutUserInput | Prisma.NoteUpsertWithWhereUniqueWithoutUserInput[] 565 + createMany?: Prisma.NoteCreateManyUserInputEnvelope 566 + set?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 567 + disconnect?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 568 + delete?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 569 + connect?: Prisma.NoteWhereUniqueInput | Prisma.NoteWhereUniqueInput[] 570 + update?: Prisma.NoteUpdateWithWhereUniqueWithoutUserInput | Prisma.NoteUpdateWithWhereUniqueWithoutUserInput[] 571 + updateMany?: Prisma.NoteUpdateManyWithWhereWithoutUserInput | Prisma.NoteUpdateManyWithWhereWithoutUserInput[] 572 + deleteMany?: Prisma.NoteScalarWhereInput | Prisma.NoteScalarWhereInput[] 573 + } 574 + 575 + export type NoteCreateWithoutUserInput = { 576 + id?: string 577 + rkey: string 578 + uri: string 579 + cid: string 580 + mediaType: $Enums.MediaType 581 + mediaId: string 582 + seasonNumber?: number 583 + episodeNumber?: number 584 + content: string 585 + createdAt?: Date | string 586 + updatedAt?: Date | string 587 + } 588 + 589 + export type NoteUncheckedCreateWithoutUserInput = { 590 + id?: string 591 + rkey: string 592 + uri: string 593 + cid: string 594 + mediaType: $Enums.MediaType 595 + mediaId: string 596 + seasonNumber?: number 597 + episodeNumber?: number 598 + content: string 599 + createdAt?: Date | string 600 + updatedAt?: Date | string 601 + } 602 + 603 + export type NoteCreateOrConnectWithoutUserInput = { 604 + where: Prisma.NoteWhereUniqueInput 605 + create: Prisma.XOR<Prisma.NoteCreateWithoutUserInput, Prisma.NoteUncheckedCreateWithoutUserInput> 606 + } 607 + 608 + export type NoteCreateManyUserInputEnvelope = { 609 + data: Prisma.NoteCreateManyUserInput | Prisma.NoteCreateManyUserInput[] 610 + skipDuplicates?: boolean 611 + } 612 + 613 + export type NoteUpsertWithWhereUniqueWithoutUserInput = { 614 + where: Prisma.NoteWhereUniqueInput 615 + update: Prisma.XOR<Prisma.NoteUpdateWithoutUserInput, Prisma.NoteUncheckedUpdateWithoutUserInput> 616 + create: Prisma.XOR<Prisma.NoteCreateWithoutUserInput, Prisma.NoteUncheckedCreateWithoutUserInput> 617 + } 618 + 619 + export type NoteUpdateWithWhereUniqueWithoutUserInput = { 620 + where: Prisma.NoteWhereUniqueInput 621 + data: Prisma.XOR<Prisma.NoteUpdateWithoutUserInput, Prisma.NoteUncheckedUpdateWithoutUserInput> 622 + } 623 + 624 + export type NoteUpdateManyWithWhereWithoutUserInput = { 625 + where: Prisma.NoteScalarWhereInput 626 + data: Prisma.XOR<Prisma.NoteUpdateManyMutationInput, Prisma.NoteUncheckedUpdateManyWithoutUserInput> 627 + } 628 + 629 + export type NoteScalarWhereInput = { 630 + AND?: Prisma.NoteScalarWhereInput | Prisma.NoteScalarWhereInput[] 631 + OR?: Prisma.NoteScalarWhereInput[] 632 + NOT?: Prisma.NoteScalarWhereInput | Prisma.NoteScalarWhereInput[] 633 + id?: Prisma.StringFilter<"Note"> | string 634 + rkey?: Prisma.StringFilter<"Note"> | string 635 + uri?: Prisma.StringFilter<"Note"> | string 636 + cid?: Prisma.StringFilter<"Note"> | string 637 + userDid?: Prisma.StringFilter<"Note"> | string 638 + mediaType?: Prisma.EnumMediaTypeFilter<"Note"> | $Enums.MediaType 639 + mediaId?: Prisma.StringFilter<"Note"> | string 640 + seasonNumber?: Prisma.IntFilter<"Note"> | number 641 + episodeNumber?: Prisma.IntFilter<"Note"> | number 642 + content?: Prisma.StringFilter<"Note"> | string 643 + createdAt?: Prisma.DateTimeFilter<"Note"> | Date | string 644 + updatedAt?: Prisma.DateTimeFilter<"Note"> | Date | string 645 + } 646 + 647 + export type NoteCreateManyUserInput = { 648 + id?: string 649 + rkey: string 650 + uri: string 651 + cid: string 652 + mediaType: $Enums.MediaType 653 + mediaId: string 654 + seasonNumber?: number 655 + episodeNumber?: number 656 + content: string 657 + createdAt?: Date | string 658 + updatedAt?: Date | string 659 + } 660 + 661 + export type NoteUpdateWithoutUserInput = { 662 + id?: Prisma.StringFieldUpdateOperationsInput | string 663 + rkey?: Prisma.StringFieldUpdateOperationsInput | string 664 + uri?: Prisma.StringFieldUpdateOperationsInput | string 665 + cid?: Prisma.StringFieldUpdateOperationsInput | string 666 + mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 667 + mediaId?: Prisma.StringFieldUpdateOperationsInput | string 668 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 669 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 670 + content?: Prisma.StringFieldUpdateOperationsInput | string 671 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 672 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 673 + } 674 + 675 + export type NoteUncheckedUpdateWithoutUserInput = { 676 + id?: Prisma.StringFieldUpdateOperationsInput | string 677 + rkey?: Prisma.StringFieldUpdateOperationsInput | string 678 + uri?: Prisma.StringFieldUpdateOperationsInput | string 679 + cid?: Prisma.StringFieldUpdateOperationsInput | string 680 + mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 681 + mediaId?: Prisma.StringFieldUpdateOperationsInput | string 682 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 683 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 684 + content?: Prisma.StringFieldUpdateOperationsInput | string 685 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 686 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 687 + } 688 + 689 + export type NoteUncheckedUpdateManyWithoutUserInput = { 690 + id?: Prisma.StringFieldUpdateOperationsInput | string 691 + rkey?: Prisma.StringFieldUpdateOperationsInput | string 692 + uri?: Prisma.StringFieldUpdateOperationsInput | string 693 + cid?: Prisma.StringFieldUpdateOperationsInput | string 694 + mediaType?: Prisma.EnumMediaTypeFieldUpdateOperationsInput | $Enums.MediaType 695 + mediaId?: Prisma.StringFieldUpdateOperationsInput | string 696 + seasonNumber?: Prisma.IntFieldUpdateOperationsInput | number 697 + episodeNumber?: Prisma.IntFieldUpdateOperationsInput | number 698 + content?: Prisma.StringFieldUpdateOperationsInput | string 699 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 700 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 701 + } 702 + 703 + 704 + 705 + export type NoteSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{ 706 + id?: boolean 707 + rkey?: boolean 708 + uri?: boolean 709 + cid?: boolean 710 + userDid?: boolean 711 + mediaType?: boolean 712 + mediaId?: boolean 713 + seasonNumber?: boolean 714 + episodeNumber?: boolean 715 + content?: boolean 716 + createdAt?: boolean 717 + updatedAt?: boolean 718 + user?: boolean | Prisma.UserDefaultArgs<ExtArgs> 719 + }, ExtArgs["result"]["note"]> 720 + 721 + export type NoteSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{ 722 + id?: boolean 723 + rkey?: boolean 724 + uri?: boolean 725 + cid?: boolean 726 + userDid?: boolean 727 + mediaType?: boolean 728 + mediaId?: boolean 729 + seasonNumber?: boolean 730 + episodeNumber?: boolean 731 + content?: boolean 732 + createdAt?: boolean 733 + updatedAt?: boolean 734 + user?: boolean | Prisma.UserDefaultArgs<ExtArgs> 735 + }, ExtArgs["result"]["note"]> 736 + 737 + export type NoteSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{ 738 + id?: boolean 739 + rkey?: boolean 740 + uri?: boolean 741 + cid?: boolean 742 + userDid?: boolean 743 + mediaType?: boolean 744 + mediaId?: boolean 745 + seasonNumber?: boolean 746 + episodeNumber?: boolean 747 + content?: boolean 748 + createdAt?: boolean 749 + updatedAt?: boolean 750 + user?: boolean | Prisma.UserDefaultArgs<ExtArgs> 751 + }, ExtArgs["result"]["note"]> 752 + 753 + export type NoteSelectScalar = { 754 + id?: boolean 755 + rkey?: boolean 756 + uri?: boolean 757 + cid?: boolean 758 + userDid?: boolean 759 + mediaType?: boolean 760 + mediaId?: boolean 761 + seasonNumber?: boolean 762 + episodeNumber?: boolean 763 + content?: boolean 764 + createdAt?: boolean 765 + updatedAt?: boolean 766 + } 767 + 768 + export type NoteOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "rkey" | "uri" | "cid" | "userDid" | "mediaType" | "mediaId" | "seasonNumber" | "episodeNumber" | "content" | "createdAt" | "updatedAt", ExtArgs["result"]["note"]> 769 + export type NoteInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 770 + user?: boolean | Prisma.UserDefaultArgs<ExtArgs> 771 + } 772 + export type NoteIncludeCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 773 + user?: boolean | Prisma.UserDefaultArgs<ExtArgs> 774 + } 775 + export type NoteIncludeUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 776 + user?: boolean | Prisma.UserDefaultArgs<ExtArgs> 777 + } 778 + 779 + export type $NotePayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 780 + name: "Note" 781 + objects: { 782 + user: Prisma.$UserPayload<ExtArgs> 783 + } 784 + scalars: runtime.Types.Extensions.GetPayloadResult<{ 785 + id: string 786 + rkey: string 787 + uri: string 788 + cid: string 789 + userDid: string 790 + mediaType: $Enums.MediaType 791 + mediaId: string 792 + seasonNumber: number 793 + episodeNumber: number 794 + content: string 795 + createdAt: Date 796 + updatedAt: Date 797 + }, ExtArgs["result"]["note"]> 798 + composites: {} 799 + } 800 + 801 + export type NoteGetPayload<S extends boolean | null | undefined | NoteDefaultArgs> = runtime.Types.Result.GetResult<Prisma.$NotePayload, S> 802 + 803 + export type NoteCountArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = 804 + Omit<NoteFindManyArgs, 'select' | 'include' | 'distinct' | 'omit'> & { 805 + select?: NoteCountAggregateInputType | true 806 + } 807 + 808 + export interface NoteDelegate<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> { 809 + [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['model']['Note'], meta: { name: 'Note' } } 810 + /** 811 + * Find zero or one Note that matches the filter. 812 + * @param {NoteFindUniqueArgs} args - Arguments to find a Note 813 + * @example 814 + * // Get one Note 815 + * const note = await prisma.note.findUnique({ 816 + * where: { 817 + * // ... provide filter here 818 + * } 819 + * }) 820 + */ 821 + findUnique<T extends NoteFindUniqueArgs>(args: Prisma.SelectSubset<T, NoteFindUniqueArgs<ExtArgs>>): Prisma.Prisma__NoteClient<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> 822 + 823 + /** 824 + * Find one Note that matches the filter or throw an error with `error.code='P2025'` 825 + * if no matches were found. 826 + * @param {NoteFindUniqueOrThrowArgs} args - Arguments to find a Note 827 + * @example 828 + * // Get one Note 829 + * const note = await prisma.note.findUniqueOrThrow({ 830 + * where: { 831 + * // ... provide filter here 832 + * } 833 + * }) 834 + */ 835 + findUniqueOrThrow<T extends NoteFindUniqueOrThrowArgs>(args: Prisma.SelectSubset<T, NoteFindUniqueOrThrowArgs<ExtArgs>>): Prisma.Prisma__NoteClient<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> 836 + 837 + /** 838 + * Find the first Note that matches the filter. 839 + * Note, that providing `undefined` is treated as the value not being there. 840 + * Read more here: https://pris.ly/d/null-undefined 841 + * @param {NoteFindFirstArgs} args - Arguments to find a Note 842 + * @example 843 + * // Get one Note 844 + * const note = await prisma.note.findFirst({ 845 + * where: { 846 + * // ... provide filter here 847 + * } 848 + * }) 849 + */ 850 + findFirst<T extends NoteFindFirstArgs>(args?: Prisma.SelectSubset<T, NoteFindFirstArgs<ExtArgs>>): Prisma.Prisma__NoteClient<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> 851 + 852 + /** 853 + * Find the first Note that matches the filter or 854 + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. 855 + * Note, that providing `undefined` is treated as the value not being there. 856 + * Read more here: https://pris.ly/d/null-undefined 857 + * @param {NoteFindFirstOrThrowArgs} args - Arguments to find a Note 858 + * @example 859 + * // Get one Note 860 + * const note = await prisma.note.findFirstOrThrow({ 861 + * where: { 862 + * // ... provide filter here 863 + * } 864 + * }) 865 + */ 866 + findFirstOrThrow<T extends NoteFindFirstOrThrowArgs>(args?: Prisma.SelectSubset<T, NoteFindFirstOrThrowArgs<ExtArgs>>): Prisma.Prisma__NoteClient<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> 867 + 868 + /** 869 + * Find zero or more Notes that matches the filter. 870 + * Note, that providing `undefined` is treated as the value not being there. 871 + * Read more here: https://pris.ly/d/null-undefined 872 + * @param {NoteFindManyArgs} args - Arguments to filter and select certain fields only. 873 + * @example 874 + * // Get all Notes 875 + * const notes = await prisma.note.findMany() 876 + * 877 + * // Get first 10 Notes 878 + * const notes = await prisma.note.findMany({ take: 10 }) 879 + * 880 + * // Only select the `id` 881 + * const noteWithIdOnly = await prisma.note.findMany({ select: { id: true } }) 882 + * 883 + */ 884 + findMany<T extends NoteFindManyArgs>(args?: Prisma.SelectSubset<T, NoteFindManyArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "findMany", GlobalOmitOptions>> 885 + 886 + /** 887 + * Create a Note. 888 + * @param {NoteCreateArgs} args - Arguments to create a Note. 889 + * @example 890 + * // Create one Note 891 + * const Note = await prisma.note.create({ 892 + * data: { 893 + * // ... data to create a Note 894 + * } 895 + * }) 896 + * 897 + */ 898 + create<T extends NoteCreateArgs>(args: Prisma.SelectSubset<T, NoteCreateArgs<ExtArgs>>): Prisma.Prisma__NoteClient<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> 899 + 900 + /** 901 + * Create many Notes. 902 + * @param {NoteCreateManyArgs} args - Arguments to create many Notes. 903 + * @example 904 + * // Create many Notes 905 + * const note = await prisma.note.createMany({ 906 + * data: [ 907 + * // ... provide data here 908 + * ] 909 + * }) 910 + * 911 + */ 912 + createMany<T extends NoteCreateManyArgs>(args?: Prisma.SelectSubset<T, NoteCreateManyArgs<ExtArgs>>): Prisma.PrismaPromise<Prisma.BatchPayload> 913 + 914 + /** 915 + * Create many Notes and returns the data saved in the database. 916 + * @param {NoteCreateManyAndReturnArgs} args - Arguments to create many Notes. 917 + * @example 918 + * // Create many Notes 919 + * const note = await prisma.note.createManyAndReturn({ 920 + * data: [ 921 + * // ... provide data here 922 + * ] 923 + * }) 924 + * 925 + * // Create many Notes and only return the `id` 926 + * const noteWithIdOnly = await prisma.note.createManyAndReturn({ 927 + * select: { id: true }, 928 + * data: [ 929 + * // ... provide data here 930 + * ] 931 + * }) 932 + * Note, that providing `undefined` is treated as the value not being there. 933 + * Read more here: https://pris.ly/d/null-undefined 934 + * 935 + */ 936 + createManyAndReturn<T extends NoteCreateManyAndReturnArgs>(args?: Prisma.SelectSubset<T, NoteCreateManyAndReturnArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "createManyAndReturn", GlobalOmitOptions>> 937 + 938 + /** 939 + * Delete a Note. 940 + * @param {NoteDeleteArgs} args - Arguments to delete one Note. 941 + * @example 942 + * // Delete one Note 943 + * const Note = await prisma.note.delete({ 944 + * where: { 945 + * // ... filter to delete one Note 946 + * } 947 + * }) 948 + * 949 + */ 950 + delete<T extends NoteDeleteArgs>(args: Prisma.SelectSubset<T, NoteDeleteArgs<ExtArgs>>): Prisma.Prisma__NoteClient<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> 951 + 952 + /** 953 + * Update one Note. 954 + * @param {NoteUpdateArgs} args - Arguments to update one Note. 955 + * @example 956 + * // Update one Note 957 + * const note = await prisma.note.update({ 958 + * where: { 959 + * // ... provide filter here 960 + * }, 961 + * data: { 962 + * // ... provide data here 963 + * } 964 + * }) 965 + * 966 + */ 967 + update<T extends NoteUpdateArgs>(args: Prisma.SelectSubset<T, NoteUpdateArgs<ExtArgs>>): Prisma.Prisma__NoteClient<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> 968 + 969 + /** 970 + * Delete zero or more Notes. 971 + * @param {NoteDeleteManyArgs} args - Arguments to filter Notes to delete. 972 + * @example 973 + * // Delete a few Notes 974 + * const { count } = await prisma.note.deleteMany({ 975 + * where: { 976 + * // ... provide filter here 977 + * } 978 + * }) 979 + * 980 + */ 981 + deleteMany<T extends NoteDeleteManyArgs>(args?: Prisma.SelectSubset<T, NoteDeleteManyArgs<ExtArgs>>): Prisma.PrismaPromise<Prisma.BatchPayload> 982 + 983 + /** 984 + * Update zero or more Notes. 985 + * Note, that providing `undefined` is treated as the value not being there. 986 + * Read more here: https://pris.ly/d/null-undefined 987 + * @param {NoteUpdateManyArgs} args - Arguments to update one or more rows. 988 + * @example 989 + * // Update many Notes 990 + * const note = await prisma.note.updateMany({ 991 + * where: { 992 + * // ... provide filter here 993 + * }, 994 + * data: { 995 + * // ... provide data here 996 + * } 997 + * }) 998 + * 999 + */ 1000 + updateMany<T extends NoteUpdateManyArgs>(args: Prisma.SelectSubset<T, NoteUpdateManyArgs<ExtArgs>>): Prisma.PrismaPromise<Prisma.BatchPayload> 1001 + 1002 + /** 1003 + * Update zero or more Notes and returns the data updated in the database. 1004 + * @param {NoteUpdateManyAndReturnArgs} args - Arguments to update many Notes. 1005 + * @example 1006 + * // Update many Notes 1007 + * const note = await prisma.note.updateManyAndReturn({ 1008 + * where: { 1009 + * // ... provide filter here 1010 + * }, 1011 + * data: [ 1012 + * // ... provide data here 1013 + * ] 1014 + * }) 1015 + * 1016 + * // Update zero or more Notes and only return the `id` 1017 + * const noteWithIdOnly = await prisma.note.updateManyAndReturn({ 1018 + * select: { id: true }, 1019 + * where: { 1020 + * // ... provide filter here 1021 + * }, 1022 + * data: [ 1023 + * // ... provide data here 1024 + * ] 1025 + * }) 1026 + * Note, that providing `undefined` is treated as the value not being there. 1027 + * Read more here: https://pris.ly/d/null-undefined 1028 + * 1029 + */ 1030 + updateManyAndReturn<T extends NoteUpdateManyAndReturnArgs>(args: Prisma.SelectSubset<T, NoteUpdateManyAndReturnArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "updateManyAndReturn", GlobalOmitOptions>> 1031 + 1032 + /** 1033 + * Create or update one Note. 1034 + * @param {NoteUpsertArgs} args - Arguments to update or create a Note. 1035 + * @example 1036 + * // Update or create a Note 1037 + * const note = await prisma.note.upsert({ 1038 + * create: { 1039 + * // ... data to create a Note 1040 + * }, 1041 + * update: { 1042 + * // ... in case it already exists, update 1043 + * }, 1044 + * where: { 1045 + * // ... the filter for the Note we want to update 1046 + * } 1047 + * }) 1048 + */ 1049 + upsert<T extends NoteUpsertArgs>(args: Prisma.SelectSubset<T, NoteUpsertArgs<ExtArgs>>): Prisma.Prisma__NoteClient<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> 1050 + 1051 + 1052 + /** 1053 + * Count the number of Notes. 1054 + * Note, that providing `undefined` is treated as the value not being there. 1055 + * Read more here: https://pris.ly/d/null-undefined 1056 + * @param {NoteCountArgs} args - Arguments to filter Notes to count. 1057 + * @example 1058 + * // Count the number of Notes 1059 + * const count = await prisma.note.count({ 1060 + * where: { 1061 + * // ... the filter for the Notes we want to count 1062 + * } 1063 + * }) 1064 + **/ 1065 + count<T extends NoteCountArgs>( 1066 + args?: Prisma.Subset<T, NoteCountArgs>, 1067 + ): Prisma.PrismaPromise< 1068 + T extends runtime.Types.Utils.Record<'select', any> 1069 + ? T['select'] extends true 1070 + ? number 1071 + : Prisma.GetScalarType<T['select'], NoteCountAggregateOutputType> 1072 + : number 1073 + > 1074 + 1075 + /** 1076 + * Allows you to perform aggregations operations on a Note. 1077 + * Note, that providing `undefined` is treated as the value not being there. 1078 + * Read more here: https://pris.ly/d/null-undefined 1079 + * @param {NoteAggregateArgs} args - Select which aggregations you would like to apply and on what fields. 1080 + * @example 1081 + * // Ordered by age ascending 1082 + * // Where email contains prisma.io 1083 + * // Limited to the 10 users 1084 + * const aggregations = await prisma.user.aggregate({ 1085 + * _avg: { 1086 + * age: true, 1087 + * }, 1088 + * where: { 1089 + * email: { 1090 + * contains: "prisma.io", 1091 + * }, 1092 + * }, 1093 + * orderBy: { 1094 + * age: "asc", 1095 + * }, 1096 + * take: 10, 1097 + * }) 1098 + **/ 1099 + aggregate<T extends NoteAggregateArgs>(args: Prisma.Subset<T, NoteAggregateArgs>): Prisma.PrismaPromise<GetNoteAggregateType<T>> 1100 + 1101 + /** 1102 + * Group by Note. 1103 + * Note, that providing `undefined` is treated as the value not being there. 1104 + * Read more here: https://pris.ly/d/null-undefined 1105 + * @param {NoteGroupByArgs} args - Group by arguments. 1106 + * @example 1107 + * // Group by city, order by createdAt, get count 1108 + * const result = await prisma.user.groupBy({ 1109 + * by: ['city', 'createdAt'], 1110 + * orderBy: { 1111 + * createdAt: true 1112 + * }, 1113 + * _count: { 1114 + * _all: true 1115 + * }, 1116 + * }) 1117 + * 1118 + **/ 1119 + groupBy< 1120 + T extends NoteGroupByArgs, 1121 + HasSelectOrTake extends Prisma.Or< 1122 + Prisma.Extends<'skip', Prisma.Keys<T>>, 1123 + Prisma.Extends<'take', Prisma.Keys<T>> 1124 + >, 1125 + OrderByArg extends Prisma.True extends HasSelectOrTake 1126 + ? { orderBy: NoteGroupByArgs['orderBy'] } 1127 + : { orderBy?: NoteGroupByArgs['orderBy'] }, 1128 + OrderFields extends Prisma.ExcludeUnderscoreKeys<Prisma.Keys<Prisma.MaybeTupleToUnion<T['orderBy']>>>, 1129 + ByFields extends Prisma.MaybeTupleToUnion<T['by']>, 1130 + ByValid extends Prisma.Has<ByFields, OrderFields>, 1131 + HavingFields extends Prisma.GetHavingFields<T['having']>, 1132 + HavingValid extends Prisma.Has<ByFields, HavingFields>, 1133 + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, 1134 + InputErrors extends ByEmpty extends Prisma.True 1135 + ? `Error: "by" must not be empty.` 1136 + : HavingValid extends Prisma.False 1137 + ? { 1138 + [P in HavingFields]: P extends ByFields 1139 + ? never 1140 + : P extends string 1141 + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` 1142 + : [ 1143 + Error, 1144 + 'Field ', 1145 + P, 1146 + ` in "having" needs to be provided in "by"`, 1147 + ] 1148 + }[HavingFields] 1149 + : 'take' extends Prisma.Keys<T> 1150 + ? 'orderBy' extends Prisma.Keys<T> 1151 + ? ByValid extends Prisma.True 1152 + ? {} 1153 + : { 1154 + [P in OrderFields]: P extends ByFields 1155 + ? never 1156 + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` 1157 + }[OrderFields] 1158 + : 'Error: If you provide "take", you also need to provide "orderBy"' 1159 + : 'skip' extends Prisma.Keys<T> 1160 + ? 'orderBy' extends Prisma.Keys<T> 1161 + ? ByValid extends Prisma.True 1162 + ? {} 1163 + : { 1164 + [P in OrderFields]: P extends ByFields 1165 + ? never 1166 + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` 1167 + }[OrderFields] 1168 + : 'Error: If you provide "skip", you also need to provide "orderBy"' 1169 + : ByValid extends Prisma.True 1170 + ? {} 1171 + : { 1172 + [P in OrderFields]: P extends ByFields 1173 + ? never 1174 + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` 1175 + }[OrderFields] 1176 + >(args: Prisma.SubsetIntersection<T, NoteGroupByArgs, OrderByArg> & InputErrors): {} extends InputErrors ? GetNoteGroupByPayload<T> : Prisma.PrismaPromise<InputErrors> 1177 + /** 1178 + * Fields of the Note model 1179 + */ 1180 + readonly fields: NoteFieldRefs; 1181 + } 1182 + 1183 + /** 1184 + * The delegate class that acts as a "Promise-like" for Note. 1185 + * Why is this prefixed with `Prisma__`? 1186 + * Because we want to prevent naming conflicts as mentioned in 1187 + * https://github.com/prisma/prisma-client-js/issues/707 1188 + */ 1189 + export interface Prisma__NoteClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> { 1190 + readonly [Symbol.toStringTag]: "PrismaPromise" 1191 + user<T extends Prisma.UserDefaultArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.UserDefaultArgs<ExtArgs>>): Prisma.Prisma__UserClient<runtime.Types.Result.GetResult<Prisma.$UserPayload<ExtArgs>, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> 1192 + /** 1193 + * Attaches callbacks for the resolution and/or rejection of the Promise. 1194 + * @param onfulfilled The callback to execute when the Promise is resolved. 1195 + * @param onrejected The callback to execute when the Promise is rejected. 1196 + * @returns A Promise for the completion of which ever callback is executed. 1197 + */ 1198 + then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): runtime.Types.Utils.JsPromise<TResult1 | TResult2> 1199 + /** 1200 + * Attaches a callback for only the rejection of the Promise. 1201 + * @param onrejected The callback to execute when the Promise is rejected. 1202 + * @returns A Promise for the completion of the callback. 1203 + */ 1204 + catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): runtime.Types.Utils.JsPromise<T | TResult> 1205 + /** 1206 + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The 1207 + * resolved value cannot be modified from the callback. 1208 + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). 1209 + * @returns A Promise for the completion of the callback. 1210 + */ 1211 + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise<T> 1212 + } 1213 + 1214 + 1215 + 1216 + 1217 + /** 1218 + * Fields of the Note model 1219 + */ 1220 + export interface NoteFieldRefs { 1221 + readonly id: Prisma.FieldRef<"Note", 'String'> 1222 + readonly rkey: Prisma.FieldRef<"Note", 'String'> 1223 + readonly uri: Prisma.FieldRef<"Note", 'String'> 1224 + readonly cid: Prisma.FieldRef<"Note", 'String'> 1225 + readonly userDid: Prisma.FieldRef<"Note", 'String'> 1226 + readonly mediaType: Prisma.FieldRef<"Note", 'MediaType'> 1227 + readonly mediaId: Prisma.FieldRef<"Note", 'String'> 1228 + readonly seasonNumber: Prisma.FieldRef<"Note", 'Int'> 1229 + readonly episodeNumber: Prisma.FieldRef<"Note", 'Int'> 1230 + readonly content: Prisma.FieldRef<"Note", 'String'> 1231 + readonly createdAt: Prisma.FieldRef<"Note", 'DateTime'> 1232 + readonly updatedAt: Prisma.FieldRef<"Note", 'DateTime'> 1233 + } 1234 + 1235 + 1236 + // Custom InputTypes 1237 + /** 1238 + * Note findUnique 1239 + */ 1240 + export type NoteFindUniqueArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1241 + /** 1242 + * Select specific fields to fetch from the Note 1243 + */ 1244 + select?: Prisma.NoteSelect<ExtArgs> | null 1245 + /** 1246 + * Omit specific fields from the Note 1247 + */ 1248 + omit?: Prisma.NoteOmit<ExtArgs> | null 1249 + /** 1250 + * Choose, which related nodes to fetch as well 1251 + */ 1252 + include?: Prisma.NoteInclude<ExtArgs> | null 1253 + /** 1254 + * Filter, which Note to fetch. 1255 + */ 1256 + where: Prisma.NoteWhereUniqueInput 1257 + } 1258 + 1259 + /** 1260 + * Note findUniqueOrThrow 1261 + */ 1262 + export type NoteFindUniqueOrThrowArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1263 + /** 1264 + * Select specific fields to fetch from the Note 1265 + */ 1266 + select?: Prisma.NoteSelect<ExtArgs> | null 1267 + /** 1268 + * Omit specific fields from the Note 1269 + */ 1270 + omit?: Prisma.NoteOmit<ExtArgs> | null 1271 + /** 1272 + * Choose, which related nodes to fetch as well 1273 + */ 1274 + include?: Prisma.NoteInclude<ExtArgs> | null 1275 + /** 1276 + * Filter, which Note to fetch. 1277 + */ 1278 + where: Prisma.NoteWhereUniqueInput 1279 + } 1280 + 1281 + /** 1282 + * Note findFirst 1283 + */ 1284 + export type NoteFindFirstArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1285 + /** 1286 + * Select specific fields to fetch from the Note 1287 + */ 1288 + select?: Prisma.NoteSelect<ExtArgs> | null 1289 + /** 1290 + * Omit specific fields from the Note 1291 + */ 1292 + omit?: Prisma.NoteOmit<ExtArgs> | null 1293 + /** 1294 + * Choose, which related nodes to fetch as well 1295 + */ 1296 + include?: Prisma.NoteInclude<ExtArgs> | null 1297 + /** 1298 + * Filter, which Note to fetch. 1299 + */ 1300 + where?: Prisma.NoteWhereInput 1301 + /** 1302 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} 1303 + * 1304 + * Determine the order of Notes to fetch. 1305 + */ 1306 + orderBy?: Prisma.NoteOrderByWithRelationInput | Prisma.NoteOrderByWithRelationInput[] 1307 + /** 1308 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} 1309 + * 1310 + * Sets the position for searching for Notes. 1311 + */ 1312 + cursor?: Prisma.NoteWhereUniqueInput 1313 + /** 1314 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} 1315 + * 1316 + * Take `±n` Notes from the position of the cursor. 1317 + */ 1318 + take?: number 1319 + /** 1320 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} 1321 + * 1322 + * Skip the first `n` Notes. 1323 + */ 1324 + skip?: number 1325 + /** 1326 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} 1327 + * 1328 + * Filter by unique combinations of Notes. 1329 + */ 1330 + distinct?: Prisma.NoteScalarFieldEnum | Prisma.NoteScalarFieldEnum[] 1331 + } 1332 + 1333 + /** 1334 + * Note findFirstOrThrow 1335 + */ 1336 + export type NoteFindFirstOrThrowArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1337 + /** 1338 + * Select specific fields to fetch from the Note 1339 + */ 1340 + select?: Prisma.NoteSelect<ExtArgs> | null 1341 + /** 1342 + * Omit specific fields from the Note 1343 + */ 1344 + omit?: Prisma.NoteOmit<ExtArgs> | null 1345 + /** 1346 + * Choose, which related nodes to fetch as well 1347 + */ 1348 + include?: Prisma.NoteInclude<ExtArgs> | null 1349 + /** 1350 + * Filter, which Note to fetch. 1351 + */ 1352 + where?: Prisma.NoteWhereInput 1353 + /** 1354 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} 1355 + * 1356 + * Determine the order of Notes to fetch. 1357 + */ 1358 + orderBy?: Prisma.NoteOrderByWithRelationInput | Prisma.NoteOrderByWithRelationInput[] 1359 + /** 1360 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} 1361 + * 1362 + * Sets the position for searching for Notes. 1363 + */ 1364 + cursor?: Prisma.NoteWhereUniqueInput 1365 + /** 1366 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} 1367 + * 1368 + * Take `±n` Notes from the position of the cursor. 1369 + */ 1370 + take?: number 1371 + /** 1372 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} 1373 + * 1374 + * Skip the first `n` Notes. 1375 + */ 1376 + skip?: number 1377 + /** 1378 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} 1379 + * 1380 + * Filter by unique combinations of Notes. 1381 + */ 1382 + distinct?: Prisma.NoteScalarFieldEnum | Prisma.NoteScalarFieldEnum[] 1383 + } 1384 + 1385 + /** 1386 + * Note findMany 1387 + */ 1388 + export type NoteFindManyArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1389 + /** 1390 + * Select specific fields to fetch from the Note 1391 + */ 1392 + select?: Prisma.NoteSelect<ExtArgs> | null 1393 + /** 1394 + * Omit specific fields from the Note 1395 + */ 1396 + omit?: Prisma.NoteOmit<ExtArgs> | null 1397 + /** 1398 + * Choose, which related nodes to fetch as well 1399 + */ 1400 + include?: Prisma.NoteInclude<ExtArgs> | null 1401 + /** 1402 + * Filter, which Notes to fetch. 1403 + */ 1404 + where?: Prisma.NoteWhereInput 1405 + /** 1406 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} 1407 + * 1408 + * Determine the order of Notes to fetch. 1409 + */ 1410 + orderBy?: Prisma.NoteOrderByWithRelationInput | Prisma.NoteOrderByWithRelationInput[] 1411 + /** 1412 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} 1413 + * 1414 + * Sets the position for listing Notes. 1415 + */ 1416 + cursor?: Prisma.NoteWhereUniqueInput 1417 + /** 1418 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} 1419 + * 1420 + * Take `±n` Notes from the position of the cursor. 1421 + */ 1422 + take?: number 1423 + /** 1424 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} 1425 + * 1426 + * Skip the first `n` Notes. 1427 + */ 1428 + skip?: number 1429 + /** 1430 + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} 1431 + * 1432 + * Filter by unique combinations of Notes. 1433 + */ 1434 + distinct?: Prisma.NoteScalarFieldEnum | Prisma.NoteScalarFieldEnum[] 1435 + } 1436 + 1437 + /** 1438 + * Note create 1439 + */ 1440 + export type NoteCreateArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1441 + /** 1442 + * Select specific fields to fetch from the Note 1443 + */ 1444 + select?: Prisma.NoteSelect<ExtArgs> | null 1445 + /** 1446 + * Omit specific fields from the Note 1447 + */ 1448 + omit?: Prisma.NoteOmit<ExtArgs> | null 1449 + /** 1450 + * Choose, which related nodes to fetch as well 1451 + */ 1452 + include?: Prisma.NoteInclude<ExtArgs> | null 1453 + /** 1454 + * The data needed to create a Note. 1455 + */ 1456 + data: Prisma.XOR<Prisma.NoteCreateInput, Prisma.NoteUncheckedCreateInput> 1457 + } 1458 + 1459 + /** 1460 + * Note createMany 1461 + */ 1462 + export type NoteCreateManyArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1463 + /** 1464 + * The data used to create many Notes. 1465 + */ 1466 + data: Prisma.NoteCreateManyInput | Prisma.NoteCreateManyInput[] 1467 + skipDuplicates?: boolean 1468 + } 1469 + 1470 + /** 1471 + * Note createManyAndReturn 1472 + */ 1473 + export type NoteCreateManyAndReturnArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1474 + /** 1475 + * Select specific fields to fetch from the Note 1476 + */ 1477 + select?: Prisma.NoteSelectCreateManyAndReturn<ExtArgs> | null 1478 + /** 1479 + * Omit specific fields from the Note 1480 + */ 1481 + omit?: Prisma.NoteOmit<ExtArgs> | null 1482 + /** 1483 + * The data used to create many Notes. 1484 + */ 1485 + data: Prisma.NoteCreateManyInput | Prisma.NoteCreateManyInput[] 1486 + skipDuplicates?: boolean 1487 + /** 1488 + * Choose, which related nodes to fetch as well 1489 + */ 1490 + include?: Prisma.NoteIncludeCreateManyAndReturn<ExtArgs> | null 1491 + } 1492 + 1493 + /** 1494 + * Note update 1495 + */ 1496 + export type NoteUpdateArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1497 + /** 1498 + * Select specific fields to fetch from the Note 1499 + */ 1500 + select?: Prisma.NoteSelect<ExtArgs> | null 1501 + /** 1502 + * Omit specific fields from the Note 1503 + */ 1504 + omit?: Prisma.NoteOmit<ExtArgs> | null 1505 + /** 1506 + * Choose, which related nodes to fetch as well 1507 + */ 1508 + include?: Prisma.NoteInclude<ExtArgs> | null 1509 + /** 1510 + * The data needed to update a Note. 1511 + */ 1512 + data: Prisma.XOR<Prisma.NoteUpdateInput, Prisma.NoteUncheckedUpdateInput> 1513 + /** 1514 + * Choose, which Note to update. 1515 + */ 1516 + where: Prisma.NoteWhereUniqueInput 1517 + } 1518 + 1519 + /** 1520 + * Note updateMany 1521 + */ 1522 + export type NoteUpdateManyArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1523 + /** 1524 + * The data used to update Notes. 1525 + */ 1526 + data: Prisma.XOR<Prisma.NoteUpdateManyMutationInput, Prisma.NoteUncheckedUpdateManyInput> 1527 + /** 1528 + * Filter which Notes to update 1529 + */ 1530 + where?: Prisma.NoteWhereInput 1531 + /** 1532 + * Limit how many Notes to update. 1533 + */ 1534 + limit?: number 1535 + } 1536 + 1537 + /** 1538 + * Note updateManyAndReturn 1539 + */ 1540 + export type NoteUpdateManyAndReturnArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1541 + /** 1542 + * Select specific fields to fetch from the Note 1543 + */ 1544 + select?: Prisma.NoteSelectUpdateManyAndReturn<ExtArgs> | null 1545 + /** 1546 + * Omit specific fields from the Note 1547 + */ 1548 + omit?: Prisma.NoteOmit<ExtArgs> | null 1549 + /** 1550 + * The data used to update Notes. 1551 + */ 1552 + data: Prisma.XOR<Prisma.NoteUpdateManyMutationInput, Prisma.NoteUncheckedUpdateManyInput> 1553 + /** 1554 + * Filter which Notes to update 1555 + */ 1556 + where?: Prisma.NoteWhereInput 1557 + /** 1558 + * Limit how many Notes to update. 1559 + */ 1560 + limit?: number 1561 + /** 1562 + * Choose, which related nodes to fetch as well 1563 + */ 1564 + include?: Prisma.NoteIncludeUpdateManyAndReturn<ExtArgs> | null 1565 + } 1566 + 1567 + /** 1568 + * Note upsert 1569 + */ 1570 + export type NoteUpsertArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1571 + /** 1572 + * Select specific fields to fetch from the Note 1573 + */ 1574 + select?: Prisma.NoteSelect<ExtArgs> | null 1575 + /** 1576 + * Omit specific fields from the Note 1577 + */ 1578 + omit?: Prisma.NoteOmit<ExtArgs> | null 1579 + /** 1580 + * Choose, which related nodes to fetch as well 1581 + */ 1582 + include?: Prisma.NoteInclude<ExtArgs> | null 1583 + /** 1584 + * The filter to search for the Note to update in case it exists. 1585 + */ 1586 + where: Prisma.NoteWhereUniqueInput 1587 + /** 1588 + * In case the Note found by the `where` argument doesn't exist, create a new Note with this data. 1589 + */ 1590 + create: Prisma.XOR<Prisma.NoteCreateInput, Prisma.NoteUncheckedCreateInput> 1591 + /** 1592 + * In case the Note was found with the provided `where` argument, update it with this data. 1593 + */ 1594 + update: Prisma.XOR<Prisma.NoteUpdateInput, Prisma.NoteUncheckedUpdateInput> 1595 + } 1596 + 1597 + /** 1598 + * Note delete 1599 + */ 1600 + export type NoteDeleteArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1601 + /** 1602 + * Select specific fields to fetch from the Note 1603 + */ 1604 + select?: Prisma.NoteSelect<ExtArgs> | null 1605 + /** 1606 + * Omit specific fields from the Note 1607 + */ 1608 + omit?: Prisma.NoteOmit<ExtArgs> | null 1609 + /** 1610 + * Choose, which related nodes to fetch as well 1611 + */ 1612 + include?: Prisma.NoteInclude<ExtArgs> | null 1613 + /** 1614 + * Filter which Note to delete. 1615 + */ 1616 + where: Prisma.NoteWhereUniqueInput 1617 + } 1618 + 1619 + /** 1620 + * Note deleteMany 1621 + */ 1622 + export type NoteDeleteManyArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1623 + /** 1624 + * Filter which Notes to delete 1625 + */ 1626 + where?: Prisma.NoteWhereInput 1627 + /** 1628 + * Limit how many Notes to delete. 1629 + */ 1630 + limit?: number 1631 + } 1632 + 1633 + /** 1634 + * Note without action 1635 + */ 1636 + export type NoteDefaultArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1637 + /** 1638 + * Select specific fields to fetch from the Note 1639 + */ 1640 + select?: Prisma.NoteSelect<ExtArgs> | null 1641 + /** 1642 + * Omit specific fields from the Note 1643 + */ 1644 + omit?: Prisma.NoteOmit<ExtArgs> | null 1645 + /** 1646 + * Choose, which related nodes to fetch as well 1647 + */ 1648 + include?: Prisma.NoteInclude<ExtArgs> | null 1649 + }
+190
backend/src/generated/models/User.ts
··· 273 273 trackedMovies?: Prisma.TrackedMovieListRelationFilter 274 274 trackedEpisodes?: Prisma.TrackedEpisodeListRelationFilter 275 275 lists?: Prisma.ListListRelationFilter 276 + notes?: Prisma.NoteListRelationFilter 276 277 following?: Prisma.FollowListRelationFilter 277 278 followers?: Prisma.FollowListRelationFilter 278 279 } ··· 297 298 trackedMovies?: Prisma.TrackedMovieOrderByRelationAggregateInput 298 299 trackedEpisodes?: Prisma.TrackedEpisodeOrderByRelationAggregateInput 299 300 lists?: Prisma.ListOrderByRelationAggregateInput 301 + notes?: Prisma.NoteOrderByRelationAggregateInput 300 302 following?: Prisma.FollowOrderByRelationAggregateInput 301 303 followers?: Prisma.FollowOrderByRelationAggregateInput 302 304 } ··· 324 326 trackedMovies?: Prisma.TrackedMovieListRelationFilter 325 327 trackedEpisodes?: Prisma.TrackedEpisodeListRelationFilter 326 328 lists?: Prisma.ListListRelationFilter 329 + notes?: Prisma.NoteListRelationFilter 327 330 following?: Prisma.FollowListRelationFilter 328 331 followers?: Prisma.FollowListRelationFilter 329 332 }, "did" | "handle"> ··· 392 395 trackedMovies?: Prisma.TrackedMovieCreateNestedManyWithoutUserInput 393 396 trackedEpisodes?: Prisma.TrackedEpisodeCreateNestedManyWithoutUserInput 394 397 lists?: Prisma.ListCreateNestedManyWithoutUserInput 398 + notes?: Prisma.NoteCreateNestedManyWithoutUserInput 395 399 following?: Prisma.FollowCreateNestedManyWithoutFollowerInput 396 400 followers?: Prisma.FollowCreateNestedManyWithoutFollowingInput 397 401 } ··· 416 420 trackedMovies?: Prisma.TrackedMovieUncheckedCreateNestedManyWithoutUserInput 417 421 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedCreateNestedManyWithoutUserInput 418 422 lists?: Prisma.ListUncheckedCreateNestedManyWithoutUserInput 423 + notes?: Prisma.NoteUncheckedCreateNestedManyWithoutUserInput 419 424 following?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowerInput 420 425 followers?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowingInput 421 426 } ··· 440 445 trackedMovies?: Prisma.TrackedMovieUpdateManyWithoutUserNestedInput 441 446 trackedEpisodes?: Prisma.TrackedEpisodeUpdateManyWithoutUserNestedInput 442 447 lists?: Prisma.ListUpdateManyWithoutUserNestedInput 448 + notes?: Prisma.NoteUpdateManyWithoutUserNestedInput 443 449 following?: Prisma.FollowUpdateManyWithoutFollowerNestedInput 444 450 followers?: Prisma.FollowUpdateManyWithoutFollowingNestedInput 445 451 } ··· 464 470 trackedMovies?: Prisma.TrackedMovieUncheckedUpdateManyWithoutUserNestedInput 465 471 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedUpdateManyWithoutUserNestedInput 466 472 lists?: Prisma.ListUncheckedUpdateManyWithoutUserNestedInput 473 + notes?: Prisma.NoteUncheckedUpdateManyWithoutUserNestedInput 467 474 following?: Prisma.FollowUncheckedUpdateManyWithoutFollowerNestedInput 468 475 followers?: Prisma.FollowUncheckedUpdateManyWithoutFollowingNestedInput 469 476 } ··· 673 680 update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutListsInput, Prisma.UserUpdateWithoutListsInput>, Prisma.UserUncheckedUpdateWithoutListsInput> 674 681 } 675 682 683 + export type UserCreateNestedOneWithoutNotesInput = { 684 + create?: Prisma.XOR<Prisma.UserCreateWithoutNotesInput, Prisma.UserUncheckedCreateWithoutNotesInput> 685 + connectOrCreate?: Prisma.UserCreateOrConnectWithoutNotesInput 686 + connect?: Prisma.UserWhereUniqueInput 687 + } 688 + 689 + export type UserUpdateOneRequiredWithoutNotesNestedInput = { 690 + create?: Prisma.XOR<Prisma.UserCreateWithoutNotesInput, Prisma.UserUncheckedCreateWithoutNotesInput> 691 + connectOrCreate?: Prisma.UserCreateOrConnectWithoutNotesInput 692 + upsert?: Prisma.UserUpsertWithoutNotesInput 693 + connect?: Prisma.UserWhereUniqueInput 694 + update?: Prisma.XOR<Prisma.XOR<Prisma.UserUpdateToOneWithWhereWithoutNotesInput, Prisma.UserUpdateWithoutNotesInput>, Prisma.UserUncheckedUpdateWithoutNotesInput> 695 + } 696 + 676 697 export type UserCreateWithoutFollowingInput = { 677 698 did: string 678 699 handle: string ··· 693 714 trackedMovies?: Prisma.TrackedMovieCreateNestedManyWithoutUserInput 694 715 trackedEpisodes?: Prisma.TrackedEpisodeCreateNestedManyWithoutUserInput 695 716 lists?: Prisma.ListCreateNestedManyWithoutUserInput 717 + notes?: Prisma.NoteCreateNestedManyWithoutUserInput 696 718 followers?: Prisma.FollowCreateNestedManyWithoutFollowingInput 697 719 } 698 720 ··· 716 738 trackedMovies?: Prisma.TrackedMovieUncheckedCreateNestedManyWithoutUserInput 717 739 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedCreateNestedManyWithoutUserInput 718 740 lists?: Prisma.ListUncheckedCreateNestedManyWithoutUserInput 741 + notes?: Prisma.NoteUncheckedCreateNestedManyWithoutUserInput 719 742 followers?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowingInput 720 743 } 721 744 ··· 744 767 trackedMovies?: Prisma.TrackedMovieCreateNestedManyWithoutUserInput 745 768 trackedEpisodes?: Prisma.TrackedEpisodeCreateNestedManyWithoutUserInput 746 769 lists?: Prisma.ListCreateNestedManyWithoutUserInput 770 + notes?: Prisma.NoteCreateNestedManyWithoutUserInput 747 771 following?: Prisma.FollowCreateNestedManyWithoutFollowerInput 748 772 } 749 773 ··· 767 791 trackedMovies?: Prisma.TrackedMovieUncheckedCreateNestedManyWithoutUserInput 768 792 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedCreateNestedManyWithoutUserInput 769 793 lists?: Prisma.ListUncheckedCreateNestedManyWithoutUserInput 794 + notes?: Prisma.NoteUncheckedCreateNestedManyWithoutUserInput 770 795 following?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowerInput 771 796 } 772 797 ··· 806 831 trackedMovies?: Prisma.TrackedMovieUpdateManyWithoutUserNestedInput 807 832 trackedEpisodes?: Prisma.TrackedEpisodeUpdateManyWithoutUserNestedInput 808 833 lists?: Prisma.ListUpdateManyWithoutUserNestedInput 834 + notes?: Prisma.NoteUpdateManyWithoutUserNestedInput 809 835 followers?: Prisma.FollowUpdateManyWithoutFollowingNestedInput 810 836 } 811 837 ··· 829 855 trackedMovies?: Prisma.TrackedMovieUncheckedUpdateManyWithoutUserNestedInput 830 856 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedUpdateManyWithoutUserNestedInput 831 857 lists?: Prisma.ListUncheckedUpdateManyWithoutUserNestedInput 858 + notes?: Prisma.NoteUncheckedUpdateManyWithoutUserNestedInput 832 859 followers?: Prisma.FollowUncheckedUpdateManyWithoutFollowingNestedInput 833 860 } 834 861 ··· 863 890 trackedMovies?: Prisma.TrackedMovieUpdateManyWithoutUserNestedInput 864 891 trackedEpisodes?: Prisma.TrackedEpisodeUpdateManyWithoutUserNestedInput 865 892 lists?: Prisma.ListUpdateManyWithoutUserNestedInput 893 + notes?: Prisma.NoteUpdateManyWithoutUserNestedInput 866 894 following?: Prisma.FollowUpdateManyWithoutFollowerNestedInput 867 895 } 868 896 ··· 886 914 trackedMovies?: Prisma.TrackedMovieUncheckedUpdateManyWithoutUserNestedInput 887 915 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedUpdateManyWithoutUserNestedInput 888 916 lists?: Prisma.ListUncheckedUpdateManyWithoutUserNestedInput 917 + notes?: Prisma.NoteUncheckedUpdateManyWithoutUserNestedInput 889 918 following?: Prisma.FollowUncheckedUpdateManyWithoutFollowerNestedInput 890 919 } 891 920 ··· 908 937 updatedAt?: Date | string 909 938 trackedEpisodes?: Prisma.TrackedEpisodeCreateNestedManyWithoutUserInput 910 939 lists?: Prisma.ListCreateNestedManyWithoutUserInput 940 + notes?: Prisma.NoteCreateNestedManyWithoutUserInput 911 941 following?: Prisma.FollowCreateNestedManyWithoutFollowerInput 912 942 followers?: Prisma.FollowCreateNestedManyWithoutFollowingInput 913 943 } ··· 931 961 updatedAt?: Date | string 932 962 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedCreateNestedManyWithoutUserInput 933 963 lists?: Prisma.ListUncheckedCreateNestedManyWithoutUserInput 964 + notes?: Prisma.NoteUncheckedCreateNestedManyWithoutUserInput 934 965 following?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowerInput 935 966 followers?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowingInput 936 967 } ··· 970 1001 updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 971 1002 trackedEpisodes?: Prisma.TrackedEpisodeUpdateManyWithoutUserNestedInput 972 1003 lists?: Prisma.ListUpdateManyWithoutUserNestedInput 1004 + notes?: Prisma.NoteUpdateManyWithoutUserNestedInput 973 1005 following?: Prisma.FollowUpdateManyWithoutFollowerNestedInput 974 1006 followers?: Prisma.FollowUpdateManyWithoutFollowingNestedInput 975 1007 } ··· 993 1025 updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 994 1026 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedUpdateManyWithoutUserNestedInput 995 1027 lists?: Prisma.ListUncheckedUpdateManyWithoutUserNestedInput 1028 + notes?: Prisma.NoteUncheckedUpdateManyWithoutUserNestedInput 996 1029 following?: Prisma.FollowUncheckedUpdateManyWithoutFollowerNestedInput 997 1030 followers?: Prisma.FollowUncheckedUpdateManyWithoutFollowingNestedInput 998 1031 } ··· 1016 1049 updatedAt?: Date | string 1017 1050 trackedMovies?: Prisma.TrackedMovieCreateNestedManyWithoutUserInput 1018 1051 lists?: Prisma.ListCreateNestedManyWithoutUserInput 1052 + notes?: Prisma.NoteCreateNestedManyWithoutUserInput 1019 1053 following?: Prisma.FollowCreateNestedManyWithoutFollowerInput 1020 1054 followers?: Prisma.FollowCreateNestedManyWithoutFollowingInput 1021 1055 } ··· 1039 1073 updatedAt?: Date | string 1040 1074 trackedMovies?: Prisma.TrackedMovieUncheckedCreateNestedManyWithoutUserInput 1041 1075 lists?: Prisma.ListUncheckedCreateNestedManyWithoutUserInput 1076 + notes?: Prisma.NoteUncheckedCreateNestedManyWithoutUserInput 1042 1077 following?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowerInput 1043 1078 followers?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowingInput 1044 1079 } ··· 1078 1113 updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 1079 1114 trackedMovies?: Prisma.TrackedMovieUpdateManyWithoutUserNestedInput 1080 1115 lists?: Prisma.ListUpdateManyWithoutUserNestedInput 1116 + notes?: Prisma.NoteUpdateManyWithoutUserNestedInput 1081 1117 following?: Prisma.FollowUpdateManyWithoutFollowerNestedInput 1082 1118 followers?: Prisma.FollowUpdateManyWithoutFollowingNestedInput 1083 1119 } ··· 1101 1137 updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 1102 1138 trackedMovies?: Prisma.TrackedMovieUncheckedUpdateManyWithoutUserNestedInput 1103 1139 lists?: Prisma.ListUncheckedUpdateManyWithoutUserNestedInput 1140 + notes?: Prisma.NoteUncheckedUpdateManyWithoutUserNestedInput 1104 1141 following?: Prisma.FollowUncheckedUpdateManyWithoutFollowerNestedInput 1105 1142 followers?: Prisma.FollowUncheckedUpdateManyWithoutFollowingNestedInput 1106 1143 } ··· 1124 1161 updatedAt?: Date | string 1125 1162 trackedMovies?: Prisma.TrackedMovieCreateNestedManyWithoutUserInput 1126 1163 trackedEpisodes?: Prisma.TrackedEpisodeCreateNestedManyWithoutUserInput 1164 + notes?: Prisma.NoteCreateNestedManyWithoutUserInput 1127 1165 following?: Prisma.FollowCreateNestedManyWithoutFollowerInput 1128 1166 followers?: Prisma.FollowCreateNestedManyWithoutFollowingInput 1129 1167 } ··· 1147 1185 updatedAt?: Date | string 1148 1186 trackedMovies?: Prisma.TrackedMovieUncheckedCreateNestedManyWithoutUserInput 1149 1187 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedCreateNestedManyWithoutUserInput 1188 + notes?: Prisma.NoteUncheckedCreateNestedManyWithoutUserInput 1150 1189 following?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowerInput 1151 1190 followers?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowingInput 1152 1191 } ··· 1186 1225 updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 1187 1226 trackedMovies?: Prisma.TrackedMovieUpdateManyWithoutUserNestedInput 1188 1227 trackedEpisodes?: Prisma.TrackedEpisodeUpdateManyWithoutUserNestedInput 1228 + notes?: Prisma.NoteUpdateManyWithoutUserNestedInput 1189 1229 following?: Prisma.FollowUpdateManyWithoutFollowerNestedInput 1190 1230 followers?: Prisma.FollowUpdateManyWithoutFollowingNestedInput 1191 1231 } ··· 1209 1249 updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 1210 1250 trackedMovies?: Prisma.TrackedMovieUncheckedUpdateManyWithoutUserNestedInput 1211 1251 trackedEpisodes?: Prisma.TrackedEpisodeUncheckedUpdateManyWithoutUserNestedInput 1252 + notes?: Prisma.NoteUncheckedUpdateManyWithoutUserNestedInput 1253 + following?: Prisma.FollowUncheckedUpdateManyWithoutFollowerNestedInput 1254 + followers?: Prisma.FollowUncheckedUpdateManyWithoutFollowingNestedInput 1255 + } 1256 + 1257 + export type UserCreateWithoutNotesInput = { 1258 + did: string 1259 + handle: string 1260 + displayName?: string | null 1261 + avatar?: string | null 1262 + profileRkey?: string | null 1263 + profileUri?: string | null 1264 + profileCid?: string | null 1265 + profileDisplayName?: string | null 1266 + profileAvatarCid?: string | null 1267 + profileAvatarMimeType?: string | null 1268 + profileUpdatedAt?: Date | string | null 1269 + timezone?: string 1270 + timeFormat?: string 1271 + onboardingCompletedAt?: Date | string | null 1272 + createdAt?: Date | string 1273 + updatedAt?: Date | string 1274 + trackedMovies?: Prisma.TrackedMovieCreateNestedManyWithoutUserInput 1275 + trackedEpisodes?: Prisma.TrackedEpisodeCreateNestedManyWithoutUserInput 1276 + lists?: Prisma.ListCreateNestedManyWithoutUserInput 1277 + following?: Prisma.FollowCreateNestedManyWithoutFollowerInput 1278 + followers?: Prisma.FollowCreateNestedManyWithoutFollowingInput 1279 + } 1280 + 1281 + export type UserUncheckedCreateWithoutNotesInput = { 1282 + did: string 1283 + handle: string 1284 + displayName?: string | null 1285 + avatar?: string | null 1286 + profileRkey?: string | null 1287 + profileUri?: string | null 1288 + profileCid?: string | null 1289 + profileDisplayName?: string | null 1290 + profileAvatarCid?: string | null 1291 + profileAvatarMimeType?: string | null 1292 + profileUpdatedAt?: Date | string | null 1293 + timezone?: string 1294 + timeFormat?: string 1295 + onboardingCompletedAt?: Date | string | null 1296 + createdAt?: Date | string 1297 + updatedAt?: Date | string 1298 + trackedMovies?: Prisma.TrackedMovieUncheckedCreateNestedManyWithoutUserInput 1299 + trackedEpisodes?: Prisma.TrackedEpisodeUncheckedCreateNestedManyWithoutUserInput 1300 + lists?: Prisma.ListUncheckedCreateNestedManyWithoutUserInput 1301 + following?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowerInput 1302 + followers?: Prisma.FollowUncheckedCreateNestedManyWithoutFollowingInput 1303 + } 1304 + 1305 + export type UserCreateOrConnectWithoutNotesInput = { 1306 + where: Prisma.UserWhereUniqueInput 1307 + create: Prisma.XOR<Prisma.UserCreateWithoutNotesInput, Prisma.UserUncheckedCreateWithoutNotesInput> 1308 + } 1309 + 1310 + export type UserUpsertWithoutNotesInput = { 1311 + update: Prisma.XOR<Prisma.UserUpdateWithoutNotesInput, Prisma.UserUncheckedUpdateWithoutNotesInput> 1312 + create: Prisma.XOR<Prisma.UserCreateWithoutNotesInput, Prisma.UserUncheckedCreateWithoutNotesInput> 1313 + where?: Prisma.UserWhereInput 1314 + } 1315 + 1316 + export type UserUpdateToOneWithWhereWithoutNotesInput = { 1317 + where?: Prisma.UserWhereInput 1318 + data: Prisma.XOR<Prisma.UserUpdateWithoutNotesInput, Prisma.UserUncheckedUpdateWithoutNotesInput> 1319 + } 1320 + 1321 + export type UserUpdateWithoutNotesInput = { 1322 + did?: Prisma.StringFieldUpdateOperationsInput | string 1323 + handle?: Prisma.StringFieldUpdateOperationsInput | string 1324 + displayName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1325 + avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1326 + profileRkey?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1327 + profileUri?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1328 + profileCid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1329 + profileDisplayName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1330 + profileAvatarCid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1331 + profileAvatarMimeType?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1332 + profileUpdatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null 1333 + timezone?: Prisma.StringFieldUpdateOperationsInput | string 1334 + timeFormat?: Prisma.StringFieldUpdateOperationsInput | string 1335 + onboardingCompletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null 1336 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 1337 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 1338 + trackedMovies?: Prisma.TrackedMovieUpdateManyWithoutUserNestedInput 1339 + trackedEpisodes?: Prisma.TrackedEpisodeUpdateManyWithoutUserNestedInput 1340 + lists?: Prisma.ListUpdateManyWithoutUserNestedInput 1341 + following?: Prisma.FollowUpdateManyWithoutFollowerNestedInput 1342 + followers?: Prisma.FollowUpdateManyWithoutFollowingNestedInput 1343 + } 1344 + 1345 + export type UserUncheckedUpdateWithoutNotesInput = { 1346 + did?: Prisma.StringFieldUpdateOperationsInput | string 1347 + handle?: Prisma.StringFieldUpdateOperationsInput | string 1348 + displayName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1349 + avatar?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1350 + profileRkey?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1351 + profileUri?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1352 + profileCid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1353 + profileDisplayName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1354 + profileAvatarCid?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1355 + profileAvatarMimeType?: Prisma.NullableStringFieldUpdateOperationsInput | string | null 1356 + profileUpdatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null 1357 + timezone?: Prisma.StringFieldUpdateOperationsInput | string 1358 + timeFormat?: Prisma.StringFieldUpdateOperationsInput | string 1359 + onboardingCompletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null 1360 + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 1361 + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string 1362 + trackedMovies?: Prisma.TrackedMovieUncheckedUpdateManyWithoutUserNestedInput 1363 + trackedEpisodes?: Prisma.TrackedEpisodeUncheckedUpdateManyWithoutUserNestedInput 1364 + lists?: Prisma.ListUncheckedUpdateManyWithoutUserNestedInput 1212 1365 following?: Prisma.FollowUncheckedUpdateManyWithoutFollowerNestedInput 1213 1366 followers?: Prisma.FollowUncheckedUpdateManyWithoutFollowingNestedInput 1214 1367 } ··· 1222 1375 trackedMovies: number 1223 1376 trackedEpisodes: number 1224 1377 lists: number 1378 + notes: number 1225 1379 following: number 1226 1380 followers: number 1227 1381 } ··· 1230 1384 trackedMovies?: boolean | UserCountOutputTypeCountTrackedMoviesArgs 1231 1385 trackedEpisodes?: boolean | UserCountOutputTypeCountTrackedEpisodesArgs 1232 1386 lists?: boolean | UserCountOutputTypeCountListsArgs 1387 + notes?: boolean | UserCountOutputTypeCountNotesArgs 1233 1388 following?: boolean | UserCountOutputTypeCountFollowingArgs 1234 1389 followers?: boolean | UserCountOutputTypeCountFollowersArgs 1235 1390 } ··· 1268 1423 /** 1269 1424 * UserCountOutputType without action 1270 1425 */ 1426 + export type UserCountOutputTypeCountNotesArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1427 + where?: Prisma.NoteWhereInput 1428 + } 1429 + 1430 + /** 1431 + * UserCountOutputType without action 1432 + */ 1271 1433 export type UserCountOutputTypeCountFollowingArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 1272 1434 where?: Prisma.FollowWhereInput 1273 1435 } ··· 1300 1462 trackedMovies?: boolean | Prisma.User$trackedMoviesArgs<ExtArgs> 1301 1463 trackedEpisodes?: boolean | Prisma.User$trackedEpisodesArgs<ExtArgs> 1302 1464 lists?: boolean | Prisma.User$listsArgs<ExtArgs> 1465 + notes?: boolean | Prisma.User$notesArgs<ExtArgs> 1303 1466 following?: boolean | Prisma.User$followingArgs<ExtArgs> 1304 1467 followers?: boolean | Prisma.User$followersArgs<ExtArgs> 1305 1468 _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs<ExtArgs> ··· 1367 1530 trackedMovies?: boolean | Prisma.User$trackedMoviesArgs<ExtArgs> 1368 1531 trackedEpisodes?: boolean | Prisma.User$trackedEpisodesArgs<ExtArgs> 1369 1532 lists?: boolean | Prisma.User$listsArgs<ExtArgs> 1533 + notes?: boolean | Prisma.User$notesArgs<ExtArgs> 1370 1534 following?: boolean | Prisma.User$followingArgs<ExtArgs> 1371 1535 followers?: boolean | Prisma.User$followersArgs<ExtArgs> 1372 1536 _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs<ExtArgs> ··· 1380 1544 trackedMovies: Prisma.$TrackedMoviePayload<ExtArgs>[] 1381 1545 trackedEpisodes: Prisma.$TrackedEpisodePayload<ExtArgs>[] 1382 1546 lists: Prisma.$ListPayload<ExtArgs>[] 1547 + notes: Prisma.$NotePayload<ExtArgs>[] 1383 1548 following: Prisma.$FollowPayload<ExtArgs>[] 1384 1549 followers: Prisma.$FollowPayload<ExtArgs>[] 1385 1550 } ··· 1797 1962 trackedMovies<T extends Prisma.User$trackedMoviesArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$trackedMoviesArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$TrackedMoviePayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null> 1798 1963 trackedEpisodes<T extends Prisma.User$trackedEpisodesArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$trackedEpisodesArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$TrackedEpisodePayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null> 1799 1964 lists<T extends Prisma.User$listsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$listsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$ListPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null> 1965 + notes<T extends Prisma.User$notesArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$notesArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$NotePayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null> 1800 1966 following<T extends Prisma.User$followingArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$followingArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$FollowPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null> 1801 1967 followers<T extends Prisma.User$followersArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.User$followersArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$FollowPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null> 1802 1968 /** ··· 2306 2472 take?: number 2307 2473 skip?: number 2308 2474 distinct?: Prisma.ListScalarFieldEnum | Prisma.ListScalarFieldEnum[] 2475 + } 2476 + 2477 + /** 2478 + * User.notes 2479 + */ 2480 + export type User$notesArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { 2481 + /** 2482 + * Select specific fields to fetch from the Note 2483 + */ 2484 + select?: Prisma.NoteSelect<ExtArgs> | null 2485 + /** 2486 + * Omit specific fields from the Note 2487 + */ 2488 + omit?: Prisma.NoteOmit<ExtArgs> | null 2489 + /** 2490 + * Choose, which related nodes to fetch as well 2491 + */ 2492 + include?: Prisma.NoteInclude<ExtArgs> | null 2493 + where?: Prisma.NoteWhereInput 2494 + orderBy?: Prisma.NoteOrderByWithRelationInput | Prisma.NoteOrderByWithRelationInput[] 2495 + cursor?: Prisma.NoteWhereUniqueInput 2496 + take?: number 2497 + skip?: number 2498 + distinct?: Prisma.NoteScalarFieldEnum | Prisma.NoteScalarFieldEnum[] 2309 2499 } 2310 2500 2311 2501 /**
+2
backend/src/ingester/ingester.module.ts
··· 1 1 import { forwardRef, Module } from "@nestjs/common"; 2 2 import { ListsModule } from "../lists/lists.module"; 3 3 import { MoviesModule } from "../movies/movies.module"; 4 + import { NotesModule } from "../notes/notes.module"; 4 5 import { PrismaModule } from "../prisma/prisma.module"; 5 6 import { SocialModule } from "../social/social.module"; 6 7 import { ShowsModule } from "../shows/shows.module"; ··· 13 14 forwardRef(() => MoviesModule), 14 15 forwardRef(() => ShowsModule), 15 16 forwardRef(() => ListsModule), 17 + forwardRef(() => NotesModule), 16 18 forwardRef(() => SocialModule), 17 19 forwardRef(() => UsersModule), 18 20 ],
+11
backend/src/ingester/ingester.service.spec.ts
··· 39 39 import { PrismaService } from "../prisma/prisma.service"; 40 40 import { SocialService } from "../social/social.service"; 41 41 import { ShowsService } from "../shows/shows.service"; 42 + import { NotesService } from "../notes/notes.service"; 42 43 import { ProfileService } from "../users/profile.service"; 43 44 import { IngesterService } from "./ingester.service"; 44 45 ··· 80 81 let mockSocialService: { 81 82 indexFollowRecord: jest.Mock; 82 83 deleteFollowRecordIndex: jest.Mock; 84 + }; 85 + let mockNotesService: { 86 + indexNoteRecord: jest.Mock; 87 + deleteNoteRecord: jest.Mock; 83 88 }; 84 89 let mockProfileService: { 85 90 indexProfileRecord: jest.Mock; ··· 136 141 deleteFollowRecordIndex: jest.fn(), 137 142 }; 138 143 144 + mockNotesService = { 145 + indexNoteRecord: jest.fn(), 146 + deleteNoteRecord: jest.fn(), 147 + }; 148 + 139 149 mockProfileService = { 140 150 indexProfileRecord: jest.fn(), 141 151 deleteProfileRecordIndex: jest.fn(), ··· 149 159 { provide: MoviesService, useValue: mockMoviesService }, 150 160 { provide: ShowsService, useValue: mockShowsService }, 151 161 { provide: ListsService, useValue: mockListsService }, 162 + { provide: NotesService, useValue: mockNotesService }, 152 163 { provide: SocialService, useValue: mockSocialService }, 153 164 { provide: ProfileService, useValue: mockProfileService }, 154 165 ],
+45
backend/src/ingester/ingester.service.ts
··· 43 43 import type { Main as MovieRecord } from "../lexicons/xyz/opnshelf/movie.defs"; 44 44 import { ListsService } from "../lists/lists.service"; 45 45 import { MoviesService } from "../movies/movies.service"; 46 + import { 47 + $nsid as NOTE_COLLECTION, 48 + main as noteSchema, 49 + } from "../lexicons/xyz/opnshelf/note"; 50 + import type { Main as NoteRecord } from "../lexicons/xyz/opnshelf/note.defs"; 51 + import { NotesService } from "../notes/notes.service"; 46 52 import { PrismaService } from "../prisma/prisma.service"; 47 53 import { SocialService } from "../social/social.service"; 48 54 import { ShowsService } from "../shows/shows.service"; ··· 62 68 private readonly moviesService: MoviesService, 63 69 private readonly showsService: ShowsService, 64 70 private readonly listsService: ListsService, 71 + private readonly notesService: NotesService, 65 72 private readonly socialService: SocialService, 66 73 private readonly profileService: ProfileService, 67 74 ) { ··· 215 222 await this.handleListEvent(evt, uri); 216 223 } else if (evt.collection === LIST_ITEM_COLLECTION) { 217 224 await this.handleListItemEvent(evt, uri); 225 + } else if (evt.collection === NOTE_COLLECTION) { 226 + await this.handleNoteEvent(evt, uri); 218 227 } 219 228 } 220 229 ··· 500 509 501 510 if (evt.action === "delete") { 502 511 await this.listsService.deleteListItemRecord(evt.rkey); 512 + } 513 + } 514 + 515 + private async handleNoteEvent(evt: RecordEvent, uri: string) { 516 + if (evt.action === "create" || evt.action === "update") { 517 + if (!evt.record) { 518 + this.logger.debug(`Record event missing record data: ${uri}`); 519 + return; 520 + } 521 + 522 + let noteRecord: NoteRecord; 523 + try { 524 + noteRecord = noteSchema.parse(evt.record); 525 + } catch { 526 + return; 527 + } 528 + 529 + const user = await this.prisma.user.findUnique({ 530 + where: { did: evt.did }, 531 + }); 532 + 533 + if (!user) { 534 + return; 535 + } 536 + 537 + await this.notesService.indexNoteRecord( 538 + uri, 539 + evt.cid ?? "", 540 + evt.rkey, 541 + evt.did, 542 + noteRecord, 543 + ); 544 + } 545 + 546 + if (evt.action === "delete") { 547 + await this.notesService.deleteNoteRecord(evt.rkey); 503 548 } 504 549 } 505 550 }
+1
backend/src/lexicons/xyz/opnshelf.ts
··· 7 7 export * as list from './opnshelf/list.js' 8 8 export * as listItem from './opnshelf/listItem.js' 9 9 export * as movie from './opnshelf/movie.js' 10 + export * as note from './opnshelf/note.js' 10 11 export * as profile from './opnshelf/profile.js'
+15 -3
backend/src/lexicons/xyz/opnshelf/listItem.defs.ts
··· 20 20 /** 21 21 * Media type 22 22 */ 23 - mediaType: 'movie' | 'show' 23 + mediaType: 'movie' | 'show' | 'season' | 'episode' 24 24 25 25 /** 26 - * TMDB media ID 26 + * TMDB movie ID or show ID 27 27 */ 28 28 mediaId: string 29 + 30 + /** 31 + * Season number for season/episode items 32 + */ 33 + seasonNumber?: number 34 + 35 + /** 36 + * Episode number for episode items 37 + */ 38 + episodeNumber?: number 29 39 30 40 /** 31 41 * Optional user notes about the media in this list ··· 46 56 $nsid, 47 57 l.object({ 48 58 listRkey: l.string(), 49 - mediaType: l.enum(['movie', 'show']), 59 + mediaType: l.enum(['movie', 'show', 'season', 'episode']), 50 60 mediaId: l.string(), 61 + seasonNumber: l.optional(l.integer()), 62 + episodeNumber: l.optional(l.integer()), 51 63 notes: l.optional(l.string()), 52 64 createdAt: l.string({ format: 'datetime' }), 53 65 }),
+75
backend/src/lexicons/xyz/opnshelf/note.defs.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + import { l } from '@atproto/lex' 6 + 7 + const $nsid = 'xyz.opnshelf.note' 8 + 9 + export { $nsid } 10 + 11 + /** A user note about a media item */ 12 + type Main = { 13 + $type: 'xyz.opnshelf.note' 14 + 15 + /** 16 + * Media type 17 + */ 18 + mediaType: 'movie' | 'show' | 'season' | 'episode' 19 + 20 + /** 21 + * TMDB movie ID or show ID 22 + */ 23 + mediaId: string 24 + 25 + /** 26 + * Season number for season/episode items 27 + */ 28 + seasonNumber?: number 29 + 30 + /** 31 + * Episode number for episode items 32 + */ 33 + episodeNumber?: number 34 + 35 + /** 36 + * Note content 37 + */ 38 + content: string 39 + 40 + /** 41 + * Record creation timestamp 42 + */ 43 + createdAt: l.DatetimeString 44 + } 45 + 46 + export type { Main } 47 + 48 + /** A user note about a media item */ 49 + const main = l.record<'tid', Main>( 50 + 'tid', 51 + $nsid, 52 + l.object({ 53 + mediaType: l.enum(['movie', 'show', 'season', 'episode']), 54 + mediaId: l.string(), 55 + seasonNumber: l.optional(l.integer()), 56 + episodeNumber: l.optional(l.integer()), 57 + content: l.string({ maxLength: 5000 }), 58 + createdAt: l.string({ format: 'datetime' }), 59 + }), 60 + ) 61 + 62 + export { main } 63 + 64 + export const $isTypeOf = /*#__PURE__*/ main.isTypeOf.bind(main), 65 + $build = /*#__PURE__*/ main.build.bind(main), 66 + $type = /*#__PURE__*/ main.$type 67 + export const $assert = /*#__PURE__*/ main.assert.bind(main), 68 + $check = /*#__PURE__*/ main.check.bind(main), 69 + $cast = /*#__PURE__*/ main.cast.bind(main), 70 + $ifMatches = /*#__PURE__*/ main.ifMatches.bind(main), 71 + $matches = /*#__PURE__*/ main.matches.bind(main), 72 + $parse = /*#__PURE__*/ main.parse.bind(main), 73 + $safeParse = /*#__PURE__*/ main.safeParse.bind(main), 74 + $validate = /*#__PURE__*/ main.validate.bind(main), 75 + $safeValidate = /*#__PURE__*/ main.safeValidate.bind(main)
+6
backend/src/lexicons/xyz/opnshelf/note.ts
··· 1 + /* 2 + * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. 3 + */ 4 + 5 + export * from './note.defs.js' 6 + export * as $defs from './note.defs.js'
+44 -10
backend/src/lists/dto/list.dto.ts
··· 54 54 } 55 55 56 56 export class AddToListDto { 57 - @ApiProperty({ description: "Media type", enum: ["movie", "show"] }) 57 + @ApiProperty({ 58 + description: "Media type", 59 + enum: ["movie", "show", "season", "episode"], 60 + }) 58 61 @IsString() 59 - mediaType: "movie" | "show"; 62 + mediaType: "movie" | "show" | "season" | "episode"; 60 63 61 - @ApiProperty({ description: "TMDB media ID" }) 64 + @ApiProperty({ description: "TMDB movie ID or show ID" }) 62 65 @IsString() 63 66 mediaId: string; 67 + 68 + @ApiPropertyOptional({ 69 + description: "Season number for season/episode items", 70 + }) 71 + @IsOptional() 72 + @Type(() => Number) 73 + @IsInt() 74 + seasonNumber?: number; 75 + 76 + @ApiPropertyOptional({ description: "Episode number for episode items" }) 77 + @IsOptional() 78 + @Type(() => Number) 79 + @IsInt() 80 + episodeNumber?: number; 64 81 65 82 @ApiPropertyOptional({ description: "Optional notes about the media" }) 66 83 @IsOptional() ··· 93 110 } 94 111 95 112 export class RemoveFromListDto { 96 - @ApiProperty({ description: "Media type", enum: ["movie", "show"] }) 113 + @ApiProperty({ 114 + description: "Media type", 115 + enum: ["movie", "show", "season", "episode"], 116 + }) 97 117 @IsString() 98 - mediaType: "movie" | "show"; 118 + mediaType: "movie" | "show" | "season" | "episode"; 99 119 100 - @ApiProperty({ description: "TMDB media ID" }) 120 + @ApiProperty({ description: "TMDB movie ID or show ID" }) 101 121 @IsString() 102 122 mediaId: string; 123 + 124 + @ApiPropertyOptional({ 125 + description: "Season number for season/episode items", 126 + }) 127 + @IsOptional() 128 + @Type(() => Number) 129 + @IsInt() 130 + seasonNumber?: number; 131 + 132 + @ApiPropertyOptional({ description: "Episode number for episode items" }) 133 + @IsOptional() 134 + @Type(() => Number) 135 + @IsInt() 136 + episodeNumber?: number; 103 137 } 104 138 105 139 export class MediaInListDto { ··· 109 143 @ApiProperty() 110 144 rkey: string; 111 145 112 - @ApiProperty() 113 - mediaType: "movie" | "show"; 146 + @ApiProperty({ enum: ["movie", "show", "season", "episode"] }) 147 + mediaType: "movie" | "show" | "season" | "episode"; 114 148 115 - @ApiProperty() 149 + @ApiProperty({ description: "TMDB movie ID or show ID" }) 116 150 mediaId: string; 117 151 118 152 @ApiPropertyOptional({ ··· 137 171 138 172 @ApiProperty() 139 173 media: { 140 - mediaType: "movie" | "show"; 174 + mediaType: "movie" | "show" | "season" | "episode"; 141 175 mediaId: string; 142 176 movieId?: string; 143 177 showId?: string;
+25 -36
backend/src/lists/list-mappers.ts
··· 1 1 import type { MediaInListDto, ListDto } from "./dto/list.dto"; 2 - import { parseScopedShowMediaId } from "./list-media-id.util"; 3 2 4 3 type ListItemRecord = { 5 4 id: string; 6 5 rkey: string; 7 - mediaType: "movie" | "show"; 6 + mediaType: "movie" | "show" | "season" | "episode"; 8 7 mediaId: string; 8 + seasonNumber: number; 9 + episodeNumber: number; 9 10 notes: string | null; 10 11 position: number; 11 12 createdAt: Date; ··· 49 50 item: ListItemRecord, 50 51 episodeName?: string, 51 52 ): MediaInListDto { 52 - const parsedShowScope = 53 - item.mediaType === "show" 54 - ? parseScopedShowMediaId(item.mediaId) 55 - : undefined; 56 - const baseMediaId = 57 - item.mediaType === "show" 58 - ? (parsedShowScope?.showId ?? item.mediaId) 59 - : item.mediaId; 60 - const mediaTitle = 61 - item.mediaType === "movie" ? item.movie?.title : item.show?.title; 62 - const mediaPosterPath = 63 - item.mediaType === "movie" ? item.movie?.posterPath : item.show?.posterPath; 64 - const mediaBackdropPath = 65 - item.mediaType === "movie" 66 - ? item.movie?.backdropPath 67 - : item.show?.backdropPath; 68 - const mediaReleaseYear = 69 - item.mediaType === "movie" 70 - ? item.movie?.releaseYear 71 - : item.show?.firstAirYear; 72 - const mediaReleaseDate = 73 - item.mediaType === "movie" 74 - ? item.movie?.releaseDate 75 - : item.show?.firstAirDate; 76 - const mediaOverview = 77 - item.mediaType === "movie" ? item.movie?.overview : item.show?.overview; 78 - const mediaColors = 79 - item.mediaType === "movie" ? item.movie?.colors : item.show?.colors; 53 + const isShowLike = item.mediaType !== "movie"; 54 + const mediaTitle = isShowLike ? item.show?.title : item.movie?.title; 55 + const mediaPosterPath = isShowLike 56 + ? item.show?.posterPath 57 + : item.movie?.posterPath; 58 + const mediaBackdropPath = isShowLike 59 + ? item.show?.backdropPath 60 + : item.movie?.backdropPath; 61 + const mediaReleaseYear = isShowLike 62 + ? item.show?.firstAirYear 63 + : item.movie?.releaseYear; 64 + const mediaReleaseDate = isShowLike 65 + ? item.show?.firstAirDate 66 + : item.movie?.releaseDate; 67 + const mediaOverview = isShowLike ? item.show?.overview : item.movie?.overview; 68 + const mediaColors = isShowLike ? item.show?.colors : item.movie?.colors; 80 69 81 70 return { 82 71 id: item.id, 83 72 rkey: item.rkey, 84 73 mediaType: item.mediaType, 85 74 mediaId: item.mediaId, 86 - seasonNumber: parsedShowScope?.seasonNumber, 87 - episodeNumber: parsedShowScope?.episodeNumber, 75 + seasonNumber: item.seasonNumber || undefined, 76 + episodeNumber: item.episodeNumber || undefined, 88 77 episodeName, 89 78 notes: item.notes ?? undefined, 90 79 position: item.position, 91 80 createdAt: item.createdAt.toISOString(), 92 81 media: { 93 82 mediaType: item.mediaType, 94 - mediaId: baseMediaId, 83 + mediaId: item.mediaId, 95 84 movieId: item.movie?.movieId, 96 - showId: item.show?.showId ?? parsedShowScope?.showId, 97 - seasonNumber: parsedShowScope?.seasonNumber, 98 - episodeNumber: parsedShowScope?.episodeNumber, 85 + showId: isShowLike ? item.show?.showId : undefined, 86 + seasonNumber: item.seasonNumber || undefined, 87 + episodeNumber: item.episodeNumber || undefined, 99 88 episodeName, 100 89 title: mediaTitle ?? "", 101 90 posterPath: mediaPosterPath ?? undefined,
-46
backend/src/lists/list-media-id.util.ts
··· 1 - export function buildScopedShowMediaId( 2 - mediaId: string, 3 - seasonNumber?: number, 4 - episodeNumber?: number, 5 - ): string { 6 - const parsed = parseScopedShowMediaId(mediaId); 7 - if (parsed) { 8 - return mediaId; 9 - } 10 - 11 - if (typeof seasonNumber === "number" && Number.isFinite(seasonNumber)) { 12 - if (typeof episodeNumber === "number" && Number.isFinite(episodeNumber)) { 13 - return `${mediaId}:season:${seasonNumber}:episode:${episodeNumber}`; 14 - } 15 - return `${mediaId}:season:${seasonNumber}`; 16 - } 17 - 18 - return mediaId; 19 - } 20 - 21 - export function parseScopedShowMediaId(mediaId: string): 22 - | { 23 - showId: string; 24 - seasonNumber?: number; 25 - episodeNumber?: number; 26 - } 27 - | undefined { 28 - const episodeMatch = mediaId.match(/^([^:]+):season:(\d+):episode:(\d+)$/); 29 - if (episodeMatch) { 30 - return { 31 - showId: episodeMatch[1], 32 - seasonNumber: Number(episodeMatch[2]), 33 - episodeNumber: Number(episodeMatch[3]), 34 - }; 35 - } 36 - 37 - const seasonMatch = mediaId.match(/^([^:]+):season:(\d+)$/); 38 - if (seasonMatch) { 39 - return { 40 - showId: seasonMatch[1], 41 - seasonNumber: Number(seasonMatch[2]), 42 - }; 43 - } 44 - 45 - return undefined; 46 - }
+50 -7
backend/src/lists/lists.controller.ts
··· 17 17 ApiOkResponse, 18 18 ApiOperation, 19 19 ApiParam, 20 + ApiQuery, 20 21 ApiTags, 21 22 ApiUnauthorizedResponse, 22 23 } from "@nestjs/swagger"; ··· 197 198 @ApiBearerAuth() 198 199 @ApiOperation({ summary: "Remove an item from a list" }) 199 200 @ApiParam({ name: "slug", description: "List slug identifier" }) 200 - @ApiParam({ name: "mediaType", description: "Media type (movie or show)" }) 201 - @ApiParam({ name: "mediaId", description: "TMDB media ID" }) 201 + @ApiParam({ 202 + name: "mediaType", 203 + description: "Media type (movie, show, season, or episode)", 204 + }) 205 + @ApiParam({ name: "mediaId", description: "TMDB movie ID or show ID" }) 206 + @ApiQuery({ 207 + name: "seasonNumber", 208 + required: false, 209 + description: "Season number for season/episode items", 210 + type: Number, 211 + }) 212 + @ApiQuery({ 213 + name: "episodeNumber", 214 + required: false, 215 + description: "Episode number for episode items", 216 + type: Number, 217 + }) 202 218 @ApiOkResponse({ description: "Item removed from list" }) 203 219 @ApiNotFoundResponse({ description: "List not found" }) 204 220 @ApiUnauthorizedResponse({ description: "Not authenticated" }) 205 221 async removeItemFromList( 206 222 @Req() req: AuthenticatedRequest, 207 223 @Param("slug") slug: string, 208 - @Param("mediaType") mediaType: "movie" | "show", 224 + @Param("mediaType") mediaType: "movie" | "show" | "season" | "episode", 209 225 @Param("mediaId") mediaId: string, 226 + @Query("seasonNumber") seasonNumber?: string, 227 + @Query("episodeNumber") episodeNumber?: string, 210 228 ): Promise<{ success: boolean }> { 211 229 await this.listsService.removeFromList( 212 230 req.user.did, ··· 214 232 slug, 215 233 mediaType, 216 234 mediaId, 235 + seasonNumber ? Number(seasonNumber) : undefined, 236 + episodeNumber ? Number(episodeNumber) : undefined, 217 237 ); 218 238 return { success: true }; 219 239 } ··· 222 242 @UseGuards(AuthGuard) 223 243 @ApiBearerAuth() 224 244 @ApiOperation({ summary: "Get all lists with membership status for an item" }) 225 - @ApiParam({ name: "mediaType", description: "Media type (movie or show)" }) 226 - @ApiParam({ name: "mediaId", description: "TMDB media ID" }) 245 + @ApiParam({ 246 + name: "mediaType", 247 + description: "Media type (movie, show, season, or episode)", 248 + }) 249 + @ApiParam({ name: "mediaId", description: "TMDB movie ID or show ID" }) 250 + @ApiQuery({ 251 + name: "seasonNumber", 252 + required: false, 253 + description: "Season number for season/episode items", 254 + type: Number, 255 + }) 256 + @ApiQuery({ 257 + name: "episodeNumber", 258 + required: false, 259 + description: "Episode number for episode items", 260 + type: Number, 261 + }) 227 262 @ApiOkResponse({ 228 263 description: "Lists with membership status", 229 264 type: [ListsForItemDto], ··· 231 266 @ApiUnauthorizedResponse({ description: "Not authenticated" }) 232 267 async getListsForItem( 233 268 @Req() req: AuthenticatedRequest, 234 - @Param("mediaType") mediaType: "movie" | "show", 269 + @Param("mediaType") mediaType: "movie" | "show" | "season" | "episode", 235 270 @Param("mediaId") mediaId: string, 271 + @Query("seasonNumber") seasonNumber?: string, 272 + @Query("episodeNumber") episodeNumber?: string, 236 273 ): Promise<ListsForItemDto[]> { 237 - return this.listsService.getListsForItem(req.user.did, mediaType, mediaId); 274 + return this.listsService.getListsForItem( 275 + req.user.did, 276 + mediaType, 277 + mediaId, 278 + seasonNumber ? Number(seasonNumber) : undefined, 279 + episodeNumber ? Number(episodeNumber) : undefined, 280 + ); 238 281 } 239 282 }
+82 -77
backend/src/lists/lists.service.ts
··· 25 25 UpdateListDto, 26 26 } from "./dto/list.dto"; 27 27 import { mapItemToDto } from "./list-mappers"; 28 - import { 29 - buildScopedShowMediaId, 30 - parseScopedShowMediaId, 31 - } from "./list-media-id.util"; 32 28 33 29 export interface ATSession { 34 30 did: string; ··· 155 151 }); 156 152 157 153 const episodeItems = items.filter( 158 - (item) => item.mediaType === "show" && item.showId, 154 + (item) => item.mediaType === "episode" && item.showId, 159 155 ); 160 - const episodeKeys = episodeItems 161 - .map((item) => { 162 - const parsed = parseScopedShowMediaId(item.mediaId); 163 - if (parsed?.seasonNumber != null && parsed?.episodeNumber != null) { 164 - return { 165 - showId: parsed.showId, 166 - seasonNumber: parsed.seasonNumber, 167 - episodeNumber: parsed.episodeNumber, 168 - }; 169 - } 170 - return null; 171 - }) 172 - .filter((k): k is NonNullable<typeof k> => k != null); 156 + const episodeKeys = episodeItems.map((item) => ({ 157 + showId: item.mediaId, 158 + seasonNumber: item.seasonNumber, 159 + episodeNumber: item.episodeNumber, 160 + })); 173 161 174 162 const episodes = 175 163 episodeKeys.length > 0 ··· 209 197 createdAt: list.createdAt.toISOString(), 210 198 updatedAt: list.updatedAt.toISOString(), 211 199 items: items.map((item) => { 212 - const parsed = parseScopedShowMediaId(item.mediaId); 213 200 const episodeName = 214 - parsed?.seasonNumber != null && parsed?.episodeNumber != null 201 + item.mediaType === "episode" 215 202 ? episodeMap.get( 216 - `${parsed.showId}:${parsed.seasonNumber}:${parsed.episodeNumber}`, 203 + `${item.mediaId}:${item.seasonNumber}:${item.episodeNumber}`, 217 204 ) 218 205 : undefined; 219 206 return mapItemToDto(item, episodeName); ··· 229 216 230 217 async getListsForItem( 231 218 userDid: string, 232 - mediaType: "movie" | "show", 219 + mediaType: "movie" | "show" | "season" | "episode", 233 220 mediaId: string, 221 + seasonNumber?: number, 222 + episodeNumber?: number, 234 223 ): Promise<ListsForItemDto[]> { 235 - const scopedMediaId = 236 - mediaType === "show" ? buildScopedShowMediaId(mediaId) : mediaId; 237 - 238 224 const lists = await this.prisma.list.findMany({ 239 225 where: { userDid }, 240 226 orderBy: [{ isDefault: "desc" }, { name: "asc" }], 241 227 include: { 242 228 items: { 243 - where: { mediaType, mediaId: scopedMediaId }, 229 + where: { 230 + mediaType, 231 + mediaId, 232 + seasonNumber: seasonNumber ?? 0, 233 + episodeNumber: episodeNumber ?? 0, 234 + }, 244 235 select: { id: true }, 245 236 }, 246 237 }, ··· 587 578 throw new NotFoundException("List not found"); 588 579 } 589 580 590 - const scopedMediaId = 591 - dto.mediaType === "show" 592 - ? buildScopedShowMediaId(dto.mediaId) 593 - : dto.mediaId; 594 - const showScope = 595 - dto.mediaType === "show" 596 - ? parseScopedShowMediaId(scopedMediaId) 597 - : undefined; 581 + const showId = dto.mediaType === "movie" ? null : dto.mediaId; 598 582 599 583 const existing = await this.prisma.listItem.findUnique({ 600 584 where: { 601 - listId_mediaType_mediaId: { 585 + listId_mediaType_mediaId_seasonNumber_episodeNumber: { 602 586 listId: list.id, 603 587 mediaType: dto.mediaType, 604 - mediaId: scopedMediaId, 588 + mediaId: dto.mediaId, 589 + seasonNumber: dto.seasonNumber ?? 0, 590 + episodeNumber: dto.episodeNumber ?? 0, 605 591 }, 606 592 }, 607 593 include: { movie: true, show: true }, ··· 615 601 const movieData = await this.moviesService.getMovieDetails(dto.mediaId); 616 602 await this.moviesService.upsertMovie(movieData); 617 603 } else { 618 - const showData = await this.showsService.getShowDetails( 619 - showScope?.showId ?? dto.mediaId, 620 - ); 604 + const showData = await this.showsService.getShowDetails(dto.mediaId); 621 605 await this.showsService.upsertShow(showData); 622 606 } 623 607 ··· 627 611 const record: ListItemRecord = listItemSchema.build({ 628 612 listRkey: list.rkey, 629 613 mediaType: dto.mediaType, 630 - mediaId: scopedMediaId, 614 + mediaId: dto.mediaId, 615 + seasonNumber: dto.seasonNumber, 616 + episodeNumber: dto.episodeNumber, 631 617 notes: dto.notes, 632 618 createdAt: now, 633 619 }); ··· 643 629 validate: false, 644 630 }); 645 631 646 - this.logger.log(`Added ${dto.mediaType} ${scopedMediaId} to list ${slug}`); 632 + this.logger.log(`Added ${dto.mediaType} ${dto.mediaId} to list ${slug}`); 647 633 648 634 const itemCount = await this.prisma.listItem.count({ 649 635 where: { listId: list.id }, ··· 656 642 cid: response.data.cid, 657 643 listId: list.id, 658 644 mediaType: dto.mediaType, 659 - mediaId: scopedMediaId, 645 + mediaId: dto.mediaId, 646 + seasonNumber: dto.seasonNumber ?? 0, 647 + episodeNumber: dto.episodeNumber ?? 0, 660 648 movieId: dto.mediaType === "movie" ? dto.mediaId : null, 661 - showId: 662 - dto.mediaType === "show" ? (showScope?.showId ?? dto.mediaId) : null, 649 + showId: dto.mediaType === "movie" ? null : showId, 663 650 notes: dto.notes, 664 651 position: itemCount, 665 652 }, ··· 673 660 userDid: string, 674 661 session: ATSession, 675 662 slug: string, 676 - mediaType: "movie" | "show", 663 + mediaType: "movie" | "show" | "season" | "episode", 677 664 mediaId: string, 665 + seasonNumber?: number, 666 + episodeNumber?: number, 678 667 ): Promise<void> { 679 - const scopedMediaId = 680 - mediaType === "show" ? buildScopedShowMediaId(mediaId) : mediaId; 681 - 682 668 const list = await this.prisma.list.findFirst({ 683 669 where: { userDid, slug }, 684 670 }); ··· 689 675 690 676 const item = await this.prisma.listItem.findUnique({ 691 677 where: { 692 - listId_mediaType_mediaId: { 678 + listId_mediaType_mediaId_seasonNumber_episodeNumber: { 693 679 listId: list.id, 694 680 mediaType, 695 - mediaId: scopedMediaId, 681 + mediaId, 682 + seasonNumber: seasonNumber ?? 0, 683 + episodeNumber: episodeNumber ?? 0, 696 684 }, 697 685 }, 698 686 }); ··· 714 702 where: { id: item.id }, 715 703 }); 716 704 717 - this.logger.log(`Removed ${mediaType} ${scopedMediaId} from list ${slug}`); 705 + this.logger.log(`Removed ${mediaType} ${mediaId} from list ${slug}`); 718 706 } 719 707 720 708 async indexListRecord( ··· 770 758 return; 771 759 } 772 760 773 - if (record.mediaType === "movie") { 774 - const existingMovie = await this.moviesService.getMovieByTMDBId( 775 - record.mediaId, 761 + // Backward compatibility: normalize old-format scoped show IDs 762 + let mediaType = record.mediaType; 763 + let mediaId = record.mediaId; 764 + let seasonNumber = record.seasonNumber ?? 0; 765 + let episodeNumber = record.episodeNumber ?? 0; 766 + 767 + if (mediaType === "show" && mediaId.includes(":")) { 768 + const episodeMatch = mediaId.match( 769 + /^([^:]+):season:(\d+):episode:(\d+)$/, 776 770 ); 771 + if (episodeMatch) { 772 + mediaId = episodeMatch[1]; 773 + seasonNumber = Number(episodeMatch[2]); 774 + episodeNumber = Number(episodeMatch[3]); 775 + mediaType = "episode"; 776 + } else { 777 + const seasonMatch = mediaId.match(/^([^:]+):season:(\d+)$/); 778 + if (seasonMatch) { 779 + mediaId = seasonMatch[1]; 780 + seasonNumber = Number(seasonMatch[2]); 781 + mediaType = "season"; 782 + } 783 + } 784 + } 785 + 786 + if (mediaType === "movie") { 787 + const existingMovie = await this.moviesService.getMovieByTMDBId(mediaId); 777 788 if (!existingMovie) { 778 789 try { 779 - const movieData = await this.moviesService.getMovieDetails( 780 - record.mediaId, 781 - ); 790 + const movieData = await this.moviesService.getMovieDetails(mediaId); 782 791 await this.moviesService.upsertMovie(movieData); 783 792 } catch (err) { 784 793 this.logger.error( 785 - `Failed to fetch movie ${record.mediaId} from TMDB, skipping item`, 794 + `Failed to fetch movie ${mediaId} from TMDB, skipping item`, 786 795 err, 787 796 ); 788 797 return; 789 798 } 790 799 } 791 800 } else { 792 - const scopedShow = parseScopedShowMediaId(record.mediaId); 793 - const baseShowId = scopedShow?.showId ?? record.mediaId; 794 - const existingShow = await this.showsService.getShowByTMDBId(baseShowId); 801 + const existingShow = await this.showsService.getShowByTMDBId(mediaId); 795 802 if (!existingShow) { 796 803 try { 797 - const showData = await this.showsService.getShowDetails(baseShowId); 804 + const showData = await this.showsService.getShowDetails(mediaId); 798 805 await this.showsService.upsertShow(showData); 799 806 } catch (err) { 800 807 this.logger.error( 801 - `Failed to fetch show ${baseShowId} from TMDB, skipping item`, 808 + `Failed to fetch show ${mediaId} from TMDB, skipping item`, 802 809 err, 803 810 ); 804 811 return; ··· 813 820 uri, 814 821 cid, 815 822 listId: list.id, 816 - mediaType: record.mediaType, 817 - mediaId: record.mediaId, 818 - movieId: record.mediaType === "movie" ? record.mediaId : null, 819 - showId: 820 - record.mediaType === "show" 821 - ? (parseScopedShowMediaId(record.mediaId)?.showId ?? record.mediaId) 822 - : null, 823 + mediaType, 824 + mediaId, 825 + seasonNumber, 826 + episodeNumber, 827 + movieId: mediaType === "movie" ? mediaId : null, 828 + showId: mediaType === "movie" ? null : mediaId, 823 829 notes: record.notes, 824 830 }, 825 831 update: { 826 832 cid, 827 - mediaType: record.mediaType, 828 - mediaId: record.mediaId, 829 - movieId: record.mediaType === "movie" ? record.mediaId : null, 830 - showId: 831 - record.mediaType === "show" 832 - ? (parseScopedShowMediaId(record.mediaId)?.showId ?? record.mediaId) 833 - : null, 833 + mediaType, 834 + mediaId, 835 + seasonNumber, 836 + episodeNumber, 837 + movieId: mediaType === "movie" ? mediaId : null, 838 + showId: mediaType === "movie" ? null : mediaId, 834 839 notes: record.notes, 835 840 }, 836 841 });
+91
backend/src/notes/dto/note.dto.ts
··· 1 + import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; 2 + import { Type } from "class-transformer"; 3 + import { IsInt, IsOptional, IsString, MaxLength } from "class-validator"; 4 + 5 + export class UpsertNoteDto { 6 + @ApiProperty({ 7 + description: "Media type", 8 + enum: ["movie", "show", "season", "episode"], 9 + }) 10 + @IsString() 11 + mediaType: "movie" | "show" | "season" | "episode"; 12 + 13 + @ApiProperty({ description: "TMDB movie ID or show ID" }) 14 + @IsString() 15 + mediaId: string; 16 + 17 + @ApiPropertyOptional({ 18 + description: "Season number for season/episode items", 19 + }) 20 + @IsOptional() 21 + @Type(() => Number) 22 + @IsInt() 23 + seasonNumber?: number; 24 + 25 + @ApiPropertyOptional({ description: "Episode number for episode items" }) 26 + @IsOptional() 27 + @Type(() => Number) 28 + @IsInt() 29 + episodeNumber?: number; 30 + 31 + @ApiProperty({ description: "Note content", maxLength: 5000 }) 32 + @IsString() 33 + @MaxLength(5000) 34 + content: string; 35 + } 36 + 37 + export class NoteResponseDto { 38 + @ApiProperty() 39 + id: string; 40 + 41 + @ApiProperty() 42 + rkey: string; 43 + 44 + @ApiProperty() 45 + content: string; 46 + 47 + @ApiProperty({ enum: ["movie", "show", "season", "episode"] }) 48 + mediaType: string; 49 + 50 + @ApiProperty() 51 + mediaId: string; 52 + 53 + @ApiPropertyOptional() 54 + seasonNumber?: number; 55 + 56 + @ApiPropertyOptional() 57 + episodeNumber?: number; 58 + 59 + @ApiProperty() 60 + createdAt: string; 61 + 62 + @ApiProperty() 63 + updatedAt: string; 64 + } 65 + 66 + export class GetNoteQueryDto { 67 + @ApiProperty({ 68 + description: "Media type", 69 + enum: ["movie", "show", "season", "episode"], 70 + }) 71 + @IsString() 72 + mediaType: "movie" | "show" | "season" | "episode"; 73 + 74 + @ApiProperty({ description: "TMDB movie ID or show ID" }) 75 + @IsString() 76 + mediaId: string; 77 + 78 + @ApiPropertyOptional({ 79 + description: "Season number for season/episode items", 80 + }) 81 + @IsOptional() 82 + @Type(() => Number) 83 + @IsInt() 84 + seasonNumber?: number; 85 + 86 + @ApiPropertyOptional({ description: "Episode number for episode items" }) 87 + @IsOptional() 88 + @Type(() => Number) 89 + @IsInt() 90 + episodeNumber?: number; 91 + }
+148
backend/src/notes/notes.controller.ts
··· 1 + import { 2 + Body, 3 + Controller, 4 + Delete, 5 + Get, 6 + Param, 7 + Post, 8 + Query, 9 + Req, 10 + UseGuards, 11 + } from "@nestjs/common"; 12 + import { 13 + ApiBearerAuth, 14 + ApiOkResponse, 15 + ApiOperation, 16 + ApiQuery, 17 + ApiTags, 18 + ApiUnauthorizedResponse, 19 + } from "@nestjs/swagger"; 20 + import { AuthGuard } from "../auth/auth.guard"; 21 + import type { AuthenticatedRequest } from "../auth/types"; 22 + import { 23 + GetNoteQueryDto, 24 + NoteResponseDto, 25 + UpsertNoteDto, 26 + } from "./dto/note.dto"; 27 + import { NotesService, type ATSession } from "./notes.service"; 28 + 29 + @ApiTags("notes") 30 + @Controller("notes") 31 + export class NotesController { 32 + constructor(private readonly notesService: NotesService) {} 33 + 34 + @Get("user/:userDid") 35 + @UseGuards(AuthGuard) 36 + @ApiBearerAuth() 37 + @ApiOperation({ summary: "Get a note for a user and media item" }) 38 + @ApiQuery({ 39 + name: "mediaType", 40 + required: true, 41 + description: "Media type (movie, show, season, episode)", 42 + }) 43 + @ApiQuery({ 44 + name: "mediaId", 45 + required: true, 46 + description: "TMDB movie ID or show ID", 47 + }) 48 + @ApiQuery({ 49 + name: "seasonNumber", 50 + required: false, 51 + description: "Season number for season/episode items", 52 + type: Number, 53 + }) 54 + @ApiQuery({ 55 + name: "episodeNumber", 56 + required: false, 57 + description: "Episode number for episode items", 58 + type: Number, 59 + }) 60 + @ApiOkResponse({ 61 + description: "Note retrieved", 62 + type: NoteResponseDto, 63 + }) 64 + @ApiUnauthorizedResponse({ description: "Not authenticated" }) 65 + async getNote( 66 + @Param("userDid") userDid: string, 67 + @Query() query: GetNoteQueryDto, 68 + @Req() req: AuthenticatedRequest, 69 + ): Promise<NoteResponseDto | null> { 70 + if (req.user.did !== userDid) { 71 + throw new Error("Unauthorized"); 72 + } 73 + 74 + const note = await this.notesService.getNote( 75 + userDid, 76 + query.mediaType, 77 + query.mediaId, 78 + query.seasonNumber, 79 + query.episodeNumber, 80 + ); 81 + 82 + if (!note) { 83 + return null; 84 + } 85 + 86 + return { 87 + id: note.id, 88 + rkey: note.rkey, 89 + content: note.content, 90 + mediaType: note.mediaType, 91 + mediaId: note.mediaId, 92 + seasonNumber: note.seasonNumber || undefined, 93 + episodeNumber: note.episodeNumber || undefined, 94 + createdAt: note.createdAt.toISOString(), 95 + updatedAt: note.updatedAt.toISOString(), 96 + }; 97 + } 98 + 99 + @Post() 100 + @UseGuards(AuthGuard) 101 + @ApiBearerAuth() 102 + @ApiOperation({ summary: "Create or update a note" }) 103 + @ApiOkResponse({ 104 + description: "Note upserted", 105 + type: NoteResponseDto, 106 + }) 107 + @ApiUnauthorizedResponse({ description: "Not authenticated" }) 108 + async upsertNote( 109 + @Req() req: AuthenticatedRequest, 110 + @Body() dto: UpsertNoteDto, 111 + ): Promise<NoteResponseDto> { 112 + const note = await this.notesService.upsertNote( 113 + req.user.did, 114 + req.user.session as ATSession, 115 + dto, 116 + ); 117 + 118 + return { 119 + id: note.id, 120 + rkey: note.rkey, 121 + content: note.content, 122 + mediaType: note.mediaType, 123 + mediaId: note.mediaId, 124 + seasonNumber: note.seasonNumber || undefined, 125 + episodeNumber: note.episodeNumber || undefined, 126 + createdAt: note.createdAt.toISOString(), 127 + updatedAt: note.updatedAt.toISOString(), 128 + }; 129 + } 130 + 131 + @Delete(":noteId") 132 + @UseGuards(AuthGuard) 133 + @ApiBearerAuth() 134 + @ApiOperation({ summary: "Delete a note" }) 135 + @ApiOkResponse({ description: "Note deleted" }) 136 + @ApiUnauthorizedResponse({ description: "Not authenticated" }) 137 + async deleteNote( 138 + @Param("noteId") noteId: string, 139 + @Req() req: AuthenticatedRequest, 140 + ): Promise<{ success: boolean }> { 141 + await this.notesService.deleteNote( 142 + req.user.did, 143 + req.user.session as ATSession, 144 + noteId, 145 + ); 146 + return { success: true }; 147 + } 148 + }
+13
backend/src/notes/notes.module.ts
··· 1 + import { forwardRef, Module } from "@nestjs/common"; 2 + import { AuthModule } from "../auth/auth.module"; 3 + import { PrismaModule } from "../prisma/prisma.module"; 4 + import { NotesController } from "./notes.controller"; 5 + import { NotesService } from "./notes.service"; 6 + 7 + @Module({ 8 + imports: [PrismaModule, forwardRef(() => AuthModule)], 9 + controllers: [NotesController], 10 + providers: [NotesService], 11 + exports: [NotesService], 12 + }) 13 + export class NotesModule {}
+189
backend/src/notes/notes.service.ts
··· 1 + import { Agent } from "@atproto/api"; 2 + import { TID } from "@atproto/common"; 3 + import { Injectable, NotFoundException } from "@nestjs/common"; 4 + import { 5 + $nsid as NOTE_COLLECTION, 6 + main as noteSchema, 7 + } from "../lexicons/xyz/opnshelf/note"; 8 + import type { Main as NoteRecord } from "../lexicons/xyz/opnshelf/note.defs"; 9 + import { PrismaService } from "../prisma/prisma.service"; 10 + import type { UpsertNoteDto } from "./dto/note.dto"; 11 + 12 + export interface ATSession { 13 + did: string; 14 + } 15 + 16 + @Injectable() 17 + export class NotesService { 18 + constructor(private prisma: PrismaService) {} 19 + 20 + async getNote( 21 + userDid: string, 22 + mediaType: "movie" | "show" | "season" | "episode", 23 + mediaId: string, 24 + seasonNumber?: number, 25 + episodeNumber?: number, 26 + ) { 27 + return this.prisma.note.findUnique({ 28 + where: { 29 + userDid_mediaType_mediaId_seasonNumber_episodeNumber: { 30 + userDid, 31 + mediaType, 32 + mediaId, 33 + seasonNumber: seasonNumber ?? 0, 34 + episodeNumber: episodeNumber ?? 0, 35 + }, 36 + }, 37 + }); 38 + } 39 + 40 + async upsertNote(userDid: string, session: ATSession, dto: UpsertNoteDto) { 41 + const existing = await this.prisma.note.findUnique({ 42 + where: { 43 + userDid_mediaType_mediaId_seasonNumber_episodeNumber: { 44 + userDid, 45 + mediaType: dto.mediaType, 46 + mediaId: dto.mediaId, 47 + seasonNumber: dto.seasonNumber ?? 0, 48 + episodeNumber: dto.episodeNumber ?? 0, 49 + }, 50 + }, 51 + }); 52 + 53 + const agent = new Agent( 54 + session as unknown as ConstructorParameters<typeof Agent>[0], 55 + ); 56 + 57 + if (existing) { 58 + // Update existing note in PDS 59 + const record: NoteRecord = noteSchema.build({ 60 + mediaType: dto.mediaType, 61 + mediaId: dto.mediaId, 62 + seasonNumber: dto.seasonNumber, 63 + episodeNumber: dto.episodeNumber, 64 + content: dto.content, 65 + createdAt: existing.createdAt.toISOString(), 66 + }); 67 + 68 + const response = await agent.com.atproto.repo.putRecord({ 69 + repo: session.did, 70 + collection: NOTE_COLLECTION, 71 + rkey: existing.rkey, 72 + record, 73 + validate: false, 74 + }); 75 + 76 + const updated = await this.prisma.note.update({ 77 + where: { id: existing.id }, 78 + data: { 79 + cid: response.data.cid, 80 + content: dto.content, 81 + }, 82 + }); 83 + 84 + return updated; 85 + } 86 + 87 + // Create new note 88 + const rkey = TID.nextStr(); 89 + const now = new Date().toISOString(); 90 + 91 + const record: NoteRecord = noteSchema.build({ 92 + mediaType: dto.mediaType, 93 + mediaId: dto.mediaId, 94 + seasonNumber: dto.seasonNumber, 95 + episodeNumber: dto.episodeNumber, 96 + content: dto.content, 97 + createdAt: now, 98 + }); 99 + 100 + const response = await agent.com.atproto.repo.putRecord({ 101 + repo: session.did, 102 + collection: NOTE_COLLECTION, 103 + rkey, 104 + record, 105 + validate: false, 106 + }); 107 + 108 + const note = await this.prisma.note.create({ 109 + data: { 110 + rkey, 111 + uri: response.data.uri, 112 + cid: response.data.cid, 113 + userDid, 114 + mediaType: dto.mediaType, 115 + mediaId: dto.mediaId, 116 + seasonNumber: dto.seasonNumber ?? 0, 117 + episodeNumber: dto.episodeNumber ?? 0, 118 + content: dto.content, 119 + }, 120 + }); 121 + 122 + return note; 123 + } 124 + 125 + async deleteNote( 126 + userDid: string, 127 + session: ATSession, 128 + noteId: string, 129 + ): Promise<void> { 130 + const note = await this.prisma.note.findFirst({ 131 + where: { id: noteId, userDid }, 132 + }); 133 + 134 + if (!note) { 135 + throw new NotFoundException("Note not found"); 136 + } 137 + 138 + const agent = new Agent( 139 + session as unknown as ConstructorParameters<typeof Agent>[0], 140 + ); 141 + 142 + await agent.com.atproto.repo.deleteRecord({ 143 + repo: session.did, 144 + collection: NOTE_COLLECTION, 145 + rkey: note.rkey, 146 + }); 147 + 148 + await this.prisma.note.delete({ 149 + where: { id: noteId }, 150 + }); 151 + } 152 + 153 + async indexNoteRecord( 154 + uri: string, 155 + cid: string, 156 + rkey: string, 157 + userDid: string, 158 + record: NoteRecord, 159 + ): Promise<void> { 160 + await this.prisma.note.upsert({ 161 + where: { rkey }, 162 + create: { 163 + rkey, 164 + uri, 165 + cid, 166 + userDid, 167 + mediaType: record.mediaType, 168 + mediaId: record.mediaId, 169 + seasonNumber: record.seasonNumber ?? 0, 170 + episodeNumber: record.episodeNumber ?? 0, 171 + content: record.content, 172 + }, 173 + update: { 174 + cid, 175 + mediaType: record.mediaType, 176 + mediaId: record.mediaId, 177 + seasonNumber: record.seasonNumber ?? 0, 178 + episodeNumber: record.episodeNumber ?? 0, 179 + content: record.content, 180 + }, 181 + }); 182 + } 183 + 184 + async deleteNoteRecord(rkey: string): Promise<void> { 185 + await this.prisma.note.deleteMany({ 186 + where: { rkey }, 187 + }); 188 + } 189 + }
+3 -2
backend/src/shows/shows.service.spec.ts
··· 562 562 }, 563 563 }, 564 564 { 565 - mediaType: "show", 566 - mediaId: "show-3:season:1", 565 + mediaType: "season", 566 + mediaId: "show-3", 567 + seasonNumber: 1, 567 568 movie: null, 568 569 show: { 569 570 showId: "show-3",
-6
backend/src/shows/shows.service.ts
··· 6 6 main as episodeSchema, 7 7 } from "../lexicons/xyz/opnshelf/episode"; 8 8 import type { Main as EpisodeRecord } from "../lexicons/xyz/opnshelf/episode.defs"; 9 - import { parseScopedShowMediaId } from "../lists/list-media-id.util"; 10 9 import { ColorExtractionService } from "../movies/color-extraction.service"; 11 10 import { PrismaService } from "../prisma/prisma.service"; 12 11 import { Prisma } from "../generated/client"; ··· 799 798 } 800 799 801 800 if (watchlistItem.mediaType === "show" && watchlistItem.show) { 802 - // Skip scoped shows (season/episode specific) 803 - if (parseScopedShowMediaId(watchlistItem.mediaId)) { 804 - return []; 805 - } 806 - 807 801 return [ 808 802 { 809 803 source: "watchlist" as const,
+10 -2
lexicons/app/opnshelf/listItem.json
··· 17 17 "mediaType": { 18 18 "type": "string", 19 19 "description": "Media type", 20 - "enum": ["movie", "show"] 20 + "enum": ["movie", "show", "season", "episode"] 21 21 }, 22 22 "mediaId": { 23 23 "type": "string", 24 - "description": "TMDB media ID" 24 + "description": "TMDB movie ID or show ID" 25 + }, 26 + "seasonNumber": { 27 + "type": "integer", 28 + "description": "Season number for season/episode items" 29 + }, 30 + "episodeNumber": { 31 + "type": "integer", 32 + "description": "Episode number for episode items" 25 33 }, 26 34 "notes": { 27 35 "type": "string",
+44
lexicons/app/opnshelf/note.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "xyz.opnshelf.note", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A user note about a media item", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["mediaType", "mediaId", "content", "createdAt"], 12 + "properties": { 13 + "mediaType": { 14 + "type": "string", 15 + "description": "Media type", 16 + "enum": ["movie", "show", "season", "episode"] 17 + }, 18 + "mediaId": { 19 + "type": "string", 20 + "description": "TMDB movie ID or show ID" 21 + }, 22 + "seasonNumber": { 23 + "type": "integer", 24 + "description": "Season number for season/episode items" 25 + }, 26 + "episodeNumber": { 27 + "type": "integer", 28 + "description": "Episode number for episode items" 29 + }, 30 + "content": { 31 + "type": "string", 32 + "maxLength": 5000, 33 + "description": "Note content" 34 + }, 35 + "createdAt": { 36 + "type": "string", 37 + "format": "datetime", 38 + "description": "Record creation timestamp" 39 + } 40 + } 41 + } 42 + } 43 + } 44 + }
+144 -2
packages/api/src/generated/@tanstack/react-query.gen.ts
··· 3 3 import { type DefaultError, type InfiniteData, infiniteQueryOptions, queryOptions, type UseMutationOptions } from '@tanstack/react-query'; 4 4 5 5 import { client } from '../client.gen'; 6 - import { authControllerBlueskyProfileStatus, authControllerCallback, authControllerGetClientMetadata, authControllerLogin, authControllerLogout, authControllerMe, authControllerSignup, authControllerSuggestions, listsControllerAddItemToList, listsControllerCreateList, listsControllerDeleteList, listsControllerGetList, listsControllerGetListsForItem, listsControllerGetPublicUserList, listsControllerGetPublicUserLists, listsControllerGetUserLists, listsControllerRemoveItemFromList, listsControllerUpdateList, moviesControllerDeleteWatchHistoryEntry, moviesControllerDiscoverMovies, moviesControllerGetMovie, moviesControllerGetMovieDetails, moviesControllerGetMovieWatchHistory, moviesControllerGetUserMovies, moviesControllerGetUserMoviesPaginated, moviesControllerMarkWatched, moviesControllerSearchMovies, moviesControllerUnmarkWatched, type Options, peopleControllerGetPersonDetails, peopleControllerGetPersonFilmography, searchControllerDiscoverAll, searchControllerSearchAll, shelfControllerGetUserActivitySummary, shelfControllerGetUserShelf, showsControllerDeleteEpisodeWatchHistoryEntry, showsControllerDiscoverShows, showsControllerGetEpisodeDetails, showsControllerGetLocalEpisodes, showsControllerGetLocalSeasons, showsControllerGetSeasonDetails, showsControllerGetShow, showsControllerGetShowDetails, showsControllerGetShowWatchHistory, showsControllerGetUserEpisodesPaginated, showsControllerGetUserReleaseCalendar, showsControllerGetUserShows, showsControllerGetUserUpNext, showsControllerMarkSeasonWatched, showsControllerMarkShowWatched, showsControllerMarkWatched, showsControllerSearchShows, showsControllerUnmarkWatched, socialControllerFollow, socialControllerGetFeed, socialControllerGetFollowers, socialControllerGetFollowing, socialControllerGetRelationship, socialControllerGetWatchers, socialControllerSearchPeople, socialControllerUnfollow, usersControllerCompleteOnboarding, usersControllerDeleteMyAccount, usersControllerDeleteMyAvatar, usersControllerFetchMyTraktPublicHistory, usersControllerGetAvatar, usersControllerGetMyAccountDeletion, usersControllerGetMyCurrentTraktImport, usersControllerGetMySettings, usersControllerGetPublicProfile, usersControllerImportMyBlueskyFollows, usersControllerImportMyHistory, usersControllerStartMyTraktImport, usersControllerUpdateMyProfile, usersControllerUpdateMySettings, usersControllerUploadMyAvatar } from '../sdk.gen'; 7 - import type { AuthControllerBlueskyProfileStatusData, AuthControllerBlueskyProfileStatusResponse, AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerMeData, AuthControllerMeResponse, AuthControllerSignupData, AuthControllerSuggestionsData, ListsControllerAddItemToListData, ListsControllerCreateListData, ListsControllerCreateListResponse, ListsControllerDeleteListData, ListsControllerGetListData, ListsControllerGetListResponse, ListsControllerGetListsForItemData, ListsControllerGetListsForItemResponse, ListsControllerGetPublicUserListData, ListsControllerGetPublicUserListResponse, ListsControllerGetPublicUserListsData, ListsControllerGetPublicUserListsResponse, ListsControllerGetUserListsData, ListsControllerGetUserListsResponse, ListsControllerRemoveItemFromListData, ListsControllerUpdateListData, ListsControllerUpdateListResponse, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryResponse, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponse, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponse, MoviesControllerGetMovieResponse, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryResponse, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponse, MoviesControllerGetUserMoviesResponse, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedResponse, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponse, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedResponse, PeopleControllerGetPersonDetailsData, PeopleControllerGetPersonDetailsResponse, PeopleControllerGetPersonFilmographyData, PeopleControllerGetPersonFilmographyResponse, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponse, SearchControllerSearchAllData, SearchControllerSearchAllResponse, ShelfControllerGetUserActivitySummaryData, ShelfControllerGetUserActivitySummaryResponse, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponse, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryResponse, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponse, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponse, ShowsControllerGetLocalEpisodesData, ShowsControllerGetLocalEpisodesResponse, ShowsControllerGetLocalSeasonsData, ShowsControllerGetLocalSeasonsResponse, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponse, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponse, ShowsControllerGetShowResponse, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryResponse, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponse, ShowsControllerGetUserReleaseCalendarData, ShowsControllerGetUserReleaseCalendarResponse, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponse, ShowsControllerGetUserUpNextData, ShowsControllerGetUserUpNextResponse, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedResponse, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedResponse, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedResponse, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponse, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponse, SocialControllerFollowData, SocialControllerFollowResponse, SocialControllerGetFeedData, SocialControllerGetFeedResponse, SocialControllerGetFollowersData, SocialControllerGetFollowersResponse, SocialControllerGetFollowingData, SocialControllerGetFollowingResponse, SocialControllerGetRelationshipData, SocialControllerGetRelationshipResponse, SocialControllerGetWatchersData, SocialControllerGetWatchersResponse, SocialControllerSearchPeopleData, SocialControllerSearchPeopleResponse, SocialControllerUnfollowData, SocialControllerUnfollowResponse, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingResponse, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountResponse, UsersControllerDeleteMyAvatarData, UsersControllerDeleteMyAvatarResponse, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryResponse, UsersControllerGetAvatarData, UsersControllerGetMyAccountDeletionData, UsersControllerGetMyAccountDeletionResponse, UsersControllerGetMyCurrentTraktImportData, UsersControllerGetMyCurrentTraktImportResponse, UsersControllerGetMySettingsData, UsersControllerGetMySettingsResponse, UsersControllerGetPublicProfileData, UsersControllerGetPublicProfileResponse, UsersControllerImportMyBlueskyFollowsData, UsersControllerImportMyBlueskyFollowsResponse, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryResponse, UsersControllerStartMyTraktImportData, UsersControllerStartMyTraktImportResponse, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileResponse, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsResponse, UsersControllerUploadMyAvatarData, UsersControllerUploadMyAvatarResponse } from '../types.gen'; 6 + import { authControllerBlueskyProfileStatus, authControllerCallback, authControllerGetClientMetadata, authControllerLogin, authControllerLogout, authControllerMe, authControllerSignup, authControllerSuggestions, listsControllerAddItemToList, listsControllerCreateList, listsControllerDeleteList, listsControllerGetList, listsControllerGetListsForItem, listsControllerGetPublicUserList, listsControllerGetPublicUserLists, listsControllerGetUserLists, listsControllerRemoveItemFromList, listsControllerUpdateList, moviesControllerDeleteWatchHistoryEntry, moviesControllerDiscoverMovies, moviesControllerGetMovie, moviesControllerGetMovieDetails, moviesControllerGetMovieWatchHistory, moviesControllerGetUserMovies, moviesControllerGetUserMoviesPaginated, moviesControllerMarkWatched, moviesControllerSearchMovies, moviesControllerUnmarkWatched, notesControllerDeleteNote, notesControllerGetNote, notesControllerUpsertNote, type Options, peopleControllerGetPersonDetails, peopleControllerGetPersonFilmography, searchControllerDiscoverAll, searchControllerSearchAll, shelfControllerGetUserActivitySummary, shelfControllerGetUserShelf, showsControllerDeleteEpisodeWatchHistoryEntry, showsControllerDiscoverShows, showsControllerGetEpisodeDetails, showsControllerGetLocalEpisodes, showsControllerGetLocalSeasons, showsControllerGetSeasonDetails, showsControllerGetShow, showsControllerGetShowDetails, showsControllerGetShowWatchHistory, showsControllerGetUserEpisodesPaginated, showsControllerGetUserReleaseCalendar, showsControllerGetUserShows, showsControllerGetUserUpNext, showsControllerMarkSeasonWatched, showsControllerMarkShowWatched, showsControllerMarkWatched, showsControllerSearchShows, showsControllerUnmarkWatched, socialControllerFollow, socialControllerGetFeed, socialControllerGetFollowers, socialControllerGetFollowing, socialControllerGetRelationship, socialControllerGetWatchers, socialControllerSearchPeople, socialControllerUnfollow, usersControllerCompleteOnboarding, usersControllerDeleteMyAccount, usersControllerDeleteMyAvatar, usersControllerFetchMyTraktPublicHistory, usersControllerGetAvatar, usersControllerGetMyAccountDeletion, usersControllerGetMyCurrentTraktImport, usersControllerGetMySettings, usersControllerGetPublicFollowers, usersControllerGetPublicFollowing, usersControllerGetPublicProfile, usersControllerImportMyBlueskyFollows, usersControllerImportMyHistory, usersControllerStartMyTraktImport, usersControllerUpdateMyProfile, usersControllerUpdateMySettings, usersControllerUploadMyAvatar } from '../sdk.gen'; 7 + import type { AuthControllerBlueskyProfileStatusData, AuthControllerBlueskyProfileStatusResponse, AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerMeData, AuthControllerMeResponse, AuthControllerSignupData, AuthControllerSuggestionsData, ListsControllerAddItemToListData, ListsControllerCreateListData, ListsControllerCreateListResponse, ListsControllerDeleteListData, ListsControllerGetListData, ListsControllerGetListResponse, ListsControllerGetListsForItemData, ListsControllerGetListsForItemResponse, ListsControllerGetPublicUserListData, ListsControllerGetPublicUserListResponse, ListsControllerGetPublicUserListsData, ListsControllerGetPublicUserListsResponse, ListsControllerGetUserListsData, ListsControllerGetUserListsResponse, ListsControllerRemoveItemFromListData, ListsControllerUpdateListData, ListsControllerUpdateListResponse, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryResponse, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponse, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponse, MoviesControllerGetMovieResponse, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryResponse, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponse, MoviesControllerGetUserMoviesResponse, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedResponse, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponse, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedResponse, NotesControllerDeleteNoteData, NotesControllerGetNoteData, NotesControllerGetNoteResponse, NotesControllerUpsertNoteData, NotesControllerUpsertNoteResponse, PeopleControllerGetPersonDetailsData, PeopleControllerGetPersonDetailsResponse, PeopleControllerGetPersonFilmographyData, PeopleControllerGetPersonFilmographyResponse, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponse, SearchControllerSearchAllData, SearchControllerSearchAllResponse, ShelfControllerGetUserActivitySummaryData, ShelfControllerGetUserActivitySummaryResponse, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponse, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryResponse, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponse, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponse, ShowsControllerGetLocalEpisodesData, ShowsControllerGetLocalEpisodesResponse, ShowsControllerGetLocalSeasonsData, ShowsControllerGetLocalSeasonsResponse, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponse, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponse, ShowsControllerGetShowResponse, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryResponse, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponse, ShowsControllerGetUserReleaseCalendarData, ShowsControllerGetUserReleaseCalendarResponse, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponse, ShowsControllerGetUserUpNextData, ShowsControllerGetUserUpNextResponse, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedResponse, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedResponse, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedResponse, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponse, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponse, SocialControllerFollowData, SocialControllerFollowResponse, SocialControllerGetFeedData, SocialControllerGetFeedResponse, SocialControllerGetFollowersData, SocialControllerGetFollowersResponse, SocialControllerGetFollowingData, SocialControllerGetFollowingResponse, SocialControllerGetRelationshipData, SocialControllerGetRelationshipResponse, SocialControllerGetWatchersData, SocialControllerGetWatchersResponse, SocialControllerSearchPeopleData, SocialControllerSearchPeopleResponse, SocialControllerUnfollowData, SocialControllerUnfollowResponse, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingResponse, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountResponse, UsersControllerDeleteMyAvatarData, UsersControllerDeleteMyAvatarResponse, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryResponse, UsersControllerGetAvatarData, UsersControllerGetMyAccountDeletionData, UsersControllerGetMyAccountDeletionResponse, UsersControllerGetMyCurrentTraktImportData, UsersControllerGetMyCurrentTraktImportResponse, UsersControllerGetMySettingsData, UsersControllerGetMySettingsResponse, UsersControllerGetPublicFollowersData, UsersControllerGetPublicFollowersResponse, UsersControllerGetPublicFollowingData, UsersControllerGetPublicFollowingResponse, UsersControllerGetPublicProfileData, UsersControllerGetPublicProfileResponse, UsersControllerImportMyBlueskyFollowsData, UsersControllerImportMyBlueskyFollowsResponse, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryResponse, UsersControllerStartMyTraktImportData, UsersControllerStartMyTraktImportResponse, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileResponse, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsResponse, UsersControllerUploadMyAvatarData, UsersControllerUploadMyAvatarResponse } from '../types.gen'; 8 8 9 9 export type QueryKey<TOptions extends Options> = [ 10 10 Pick<TOptions, 'baseUrl' | 'body' | 'headers' | 'path' | 'query'> & { ··· 806 806 queryKey: usersControllerGetPublicProfileQueryKey(options) 807 807 }); 808 808 809 + export const usersControllerGetPublicFollowersQueryKey = (options: Options<UsersControllerGetPublicFollowersData>) => createQueryKey('usersControllerGetPublicFollowers', options); 810 + 811 + /** 812 + * Get public followers for a user by handle 813 + */ 814 + export const usersControllerGetPublicFollowersOptions = (options: Options<UsersControllerGetPublicFollowersData>) => queryOptions<UsersControllerGetPublicFollowersResponse, DefaultError, UsersControllerGetPublicFollowersResponse, ReturnType<typeof usersControllerGetPublicFollowersQueryKey>>({ 815 + queryFn: async ({ queryKey, signal }) => { 816 + const { data } = await usersControllerGetPublicFollowers({ 817 + ...options, 818 + ...queryKey[0], 819 + signal, 820 + throwOnError: true 821 + }); 822 + return data; 823 + }, 824 + queryKey: usersControllerGetPublicFollowersQueryKey(options) 825 + }); 826 + 827 + export const usersControllerGetPublicFollowersInfiniteQueryKey = (options: Options<UsersControllerGetPublicFollowersData>): QueryKey<Options<UsersControllerGetPublicFollowersData>> => createQueryKey('usersControllerGetPublicFollowers', options, true); 828 + 829 + /** 830 + * Get public followers for a user by handle 831 + */ 832 + export const usersControllerGetPublicFollowersInfiniteOptions = (options: Options<UsersControllerGetPublicFollowersData>) => infiniteQueryOptions<UsersControllerGetPublicFollowersResponse, DefaultError, InfiniteData<UsersControllerGetPublicFollowersResponse>, QueryKey<Options<UsersControllerGetPublicFollowersData>>, number | Pick<QueryKey<Options<UsersControllerGetPublicFollowersData>>[0], 'body' | 'headers' | 'path' | 'query'>>( 833 + // @ts-ignore 834 + { 835 + queryFn: async ({ pageParam, queryKey, signal }) => { 836 + // @ts-ignore 837 + const page: Pick<QueryKey<Options<UsersControllerGetPublicFollowersData>>[0], 'body' | 'headers' | 'path' | 'query'> = typeof pageParam === 'object' ? pageParam : { 838 + query: { 839 + page: pageParam 840 + } 841 + }; 842 + const params = createInfiniteParams(queryKey, page); 843 + const { data } = await usersControllerGetPublicFollowers({ 844 + ...options, 845 + ...params, 846 + signal, 847 + throwOnError: true 848 + }); 849 + return data; 850 + }, 851 + queryKey: usersControllerGetPublicFollowersInfiniteQueryKey(options) 852 + }); 853 + 854 + export const usersControllerGetPublicFollowingQueryKey = (options: Options<UsersControllerGetPublicFollowingData>) => createQueryKey('usersControllerGetPublicFollowing', options); 855 + 856 + /** 857 + * Get public following for a user by handle 858 + */ 859 + export const usersControllerGetPublicFollowingOptions = (options: Options<UsersControllerGetPublicFollowingData>) => queryOptions<UsersControllerGetPublicFollowingResponse, DefaultError, UsersControllerGetPublicFollowingResponse, ReturnType<typeof usersControllerGetPublicFollowingQueryKey>>({ 860 + queryFn: async ({ queryKey, signal }) => { 861 + const { data } = await usersControllerGetPublicFollowing({ 862 + ...options, 863 + ...queryKey[0], 864 + signal, 865 + throwOnError: true 866 + }); 867 + return data; 868 + }, 869 + queryKey: usersControllerGetPublicFollowingQueryKey(options) 870 + }); 871 + 872 + export const usersControllerGetPublicFollowingInfiniteQueryKey = (options: Options<UsersControllerGetPublicFollowingData>): QueryKey<Options<UsersControllerGetPublicFollowingData>> => createQueryKey('usersControllerGetPublicFollowing', options, true); 873 + 874 + /** 875 + * Get public following for a user by handle 876 + */ 877 + export const usersControllerGetPublicFollowingInfiniteOptions = (options: Options<UsersControllerGetPublicFollowingData>) => infiniteQueryOptions<UsersControllerGetPublicFollowingResponse, DefaultError, InfiniteData<UsersControllerGetPublicFollowingResponse>, QueryKey<Options<UsersControllerGetPublicFollowingData>>, number | Pick<QueryKey<Options<UsersControllerGetPublicFollowingData>>[0], 'body' | 'headers' | 'path' | 'query'>>( 878 + // @ts-ignore 879 + { 880 + queryFn: async ({ pageParam, queryKey, signal }) => { 881 + // @ts-ignore 882 + const page: Pick<QueryKey<Options<UsersControllerGetPublicFollowingData>>[0], 'body' | 'headers' | 'path' | 'query'> = typeof pageParam === 'object' ? pageParam : { 883 + query: { 884 + page: pageParam 885 + } 886 + }; 887 + const params = createInfiniteParams(queryKey, page); 888 + const { data } = await usersControllerGetPublicFollowing({ 889 + ...options, 890 + ...params, 891 + signal, 892 + throwOnError: true 893 + }); 894 + return data; 895 + }, 896 + queryKey: usersControllerGetPublicFollowingInfiniteQueryKey(options) 897 + }); 898 + 809 899 export const usersControllerGetAvatarQueryKey = (options: Options<UsersControllerGetAvatarData>) => createQueryKey('usersControllerGetAvatar', options); 810 900 811 901 /** ··· 1526 1616 }, 1527 1617 queryKey: socialControllerGetWatchersQueryKey(options) 1528 1618 }); 1619 + 1620 + export const notesControllerGetNoteQueryKey = (options: Options<NotesControllerGetNoteData>) => createQueryKey('notesControllerGetNote', options); 1621 + 1622 + /** 1623 + * Get a note for a user and media item 1624 + */ 1625 + export const notesControllerGetNoteOptions = (options: Options<NotesControllerGetNoteData>) => queryOptions<NotesControllerGetNoteResponse, DefaultError, NotesControllerGetNoteResponse, ReturnType<typeof notesControllerGetNoteQueryKey>>({ 1626 + queryFn: async ({ queryKey, signal }) => { 1627 + const { data } = await notesControllerGetNote({ 1628 + ...options, 1629 + ...queryKey[0], 1630 + signal, 1631 + throwOnError: true 1632 + }); 1633 + return data; 1634 + }, 1635 + queryKey: notesControllerGetNoteQueryKey(options) 1636 + }); 1637 + 1638 + /** 1639 + * Create or update a note 1640 + */ 1641 + export const notesControllerUpsertNoteMutation = (options?: Partial<Options<NotesControllerUpsertNoteData>>): UseMutationOptions<NotesControllerUpsertNoteResponse, DefaultError, Options<NotesControllerUpsertNoteData>> => { 1642 + const mutationOptions: UseMutationOptions<NotesControllerUpsertNoteResponse, DefaultError, Options<NotesControllerUpsertNoteData>> = { 1643 + mutationFn: async (fnOptions) => { 1644 + const { data } = await notesControllerUpsertNote({ 1645 + ...options, 1646 + ...fnOptions, 1647 + throwOnError: true 1648 + }); 1649 + return data; 1650 + } 1651 + }; 1652 + return mutationOptions; 1653 + }; 1654 + 1655 + /** 1656 + * Delete a note 1657 + */ 1658 + export const notesControllerDeleteNoteMutation = (options?: Partial<Options<NotesControllerDeleteNoteData>>): UseMutationOptions<unknown, DefaultError, Options<NotesControllerDeleteNoteData>> => { 1659 + const mutationOptions: UseMutationOptions<unknown, DefaultError, Options<NotesControllerDeleteNoteData>> = { 1660 + mutationFn: async (fnOptions) => { 1661 + const { data } = await notesControllerDeleteNote({ 1662 + ...options, 1663 + ...fnOptions, 1664 + throwOnError: true 1665 + }); 1666 + return data; 1667 + } 1668 + }; 1669 + return mutationOptions; 1670 + }; 1529 1671 1530 1672 export const shelfControllerGetUserShelfQueryKey = (options: Options<ShelfControllerGetUserShelfData>) => createQueryKey('shelfControllerGetUserShelf', options); 1531 1673
+2 -2
packages/api/src/generated/index.ts
··· 1 1 // This file is auto-generated by @hey-api/openapi-ts 2 2 3 - export { authControllerBlueskyProfileStatus, authControllerCallback, authControllerGetClientMetadata, authControllerLogin, authControllerLogout, authControllerMe, authControllerSignup, authControllerSuggestions, listsControllerAddItemToList, listsControllerCreateList, listsControllerDeleteList, listsControllerGetList, listsControllerGetListsForItem, listsControllerGetPublicUserList, listsControllerGetPublicUserLists, listsControllerGetUserLists, listsControllerRemoveItemFromList, listsControllerUpdateList, moviesControllerDeleteWatchHistoryEntry, moviesControllerDiscoverMovies, moviesControllerGetMovie, moviesControllerGetMovieDetails, moviesControllerGetMovieWatchHistory, moviesControllerGetUserMovies, moviesControllerGetUserMoviesPaginated, moviesControllerMarkWatched, moviesControllerSearchMovies, moviesControllerUnmarkWatched, type Options, peopleControllerGetPersonDetails, peopleControllerGetPersonFilmography, searchControllerDiscoverAll, searchControllerSearchAll, shelfControllerGetUserActivitySummary, shelfControllerGetUserShelf, showsControllerDeleteEpisodeWatchHistoryEntry, showsControllerDiscoverShows, showsControllerGetEpisodeDetails, showsControllerGetLocalEpisodes, showsControllerGetLocalSeasons, showsControllerGetSeasonDetails, showsControllerGetShow, showsControllerGetShowDetails, showsControllerGetShowWatchHistory, showsControllerGetUserEpisodesPaginated, showsControllerGetUserReleaseCalendar, showsControllerGetUserShows, showsControllerGetUserUpNext, showsControllerMarkSeasonWatched, showsControllerMarkShowWatched, showsControllerMarkWatched, showsControllerSearchShows, showsControllerUnmarkWatched, socialControllerFollow, socialControllerGetFeed, socialControllerGetFollowers, socialControllerGetFollowing, socialControllerGetRelationship, socialControllerGetWatchers, socialControllerSearchPeople, socialControllerUnfollow, usersControllerCompleteOnboarding, usersControllerDeleteMyAccount, usersControllerDeleteMyAvatar, usersControllerFetchMyTraktPublicHistory, usersControllerGetAvatar, usersControllerGetMyAccountDeletion, usersControllerGetMyCurrentTraktImport, usersControllerGetMySettings, usersControllerGetPublicProfile, usersControllerImportMyBlueskyFollows, usersControllerImportMyHistory, usersControllerStartMyTraktImport, usersControllerUpdateMyProfile, usersControllerUpdateMySettings, usersControllerUploadMyAvatar } from './sdk.gen'; 4 - export type { AccountDeletionJobDto, AddToListDto, AuthControllerBlueskyProfileStatusData, AuthControllerBlueskyProfileStatusErrors, AuthControllerBlueskyProfileStatusResponse, AuthControllerBlueskyProfileStatusResponses, AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerGetClientMetadataResponses, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerLogoutResponses, AuthControllerMeData, AuthControllerMeErrors, AuthControllerMeResponse, AuthControllerMeResponses, AuthControllerSignupData, AuthControllerSuggestionsData, AuthControllerSuggestionsResponses, BlueskyProfileStatusDto, ClientOptions, CompleteOnboardingResponseDto, CreateListDto, DeleteUserAccountDto, EpisodeContextDto, EpisodeHistoryItemDto, EpisodeReferenceDto, FetchTraktPublicHistoryDto, FetchTraktPublicHistoryResponseDto, FollowedActivityFeedDto, FollowedActivityItemDto, FollowedWatcherActorDto, FollowedWatcherDto, FollowedWatchersDto, ImportBlueskyFollowsResponseDto, ImportErrorDto, ImportHistoryDto, ImportHistoryResponseDto, ImportSkipDto, ListDto, ListsControllerAddItemToListData, ListsControllerAddItemToListErrors, ListsControllerAddItemToListResponses, ListsControllerCreateListData, ListsControllerCreateListErrors, ListsControllerCreateListResponse, ListsControllerCreateListResponses, ListsControllerDeleteListData, ListsControllerDeleteListErrors, ListsControllerDeleteListResponses, ListsControllerGetListData, ListsControllerGetListErrors, ListsControllerGetListResponse, ListsControllerGetListResponses, ListsControllerGetListsForItemData, ListsControllerGetListsForItemErrors, ListsControllerGetListsForItemResponse, ListsControllerGetListsForItemResponses, ListsControllerGetPublicUserListData, ListsControllerGetPublicUserListErrors, ListsControllerGetPublicUserListResponse, ListsControllerGetPublicUserListResponses, ListsControllerGetPublicUserListsData, ListsControllerGetPublicUserListsResponse, ListsControllerGetPublicUserListsResponses, ListsControllerGetUserListsData, ListsControllerGetUserListsErrors, ListsControllerGetUserListsResponse, ListsControllerGetUserListsResponses, ListsControllerRemoveItemFromListData, ListsControllerRemoveItemFromListErrors, ListsControllerRemoveItemFromListResponses, ListsControllerUpdateListData, ListsControllerUpdateListErrors, ListsControllerUpdateListResponse, ListsControllerUpdateListResponses, ListsForItemDto, ListSummaryDto, ListWithItemsDto, LocalEpisodeDto, LocalSeasonDto, MarkedEpisodesResponseDto, MarkEpisodeWatchedDto, MarkSeasonWatchedDto, MarkShowWatchedDto, MediaInListDto, MovieColorsDto, MovieDto, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryErrors, MoviesControllerDeleteWatchHistoryEntryResponse, MoviesControllerDeleteWatchHistoryEntryResponses, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponse, MoviesControllerDiscoverMoviesResponses, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponse, MoviesControllerGetMovieDetailsResponses, MoviesControllerGetMovieResponse, MoviesControllerGetMovieResponses, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryErrors, MoviesControllerGetMovieWatchHistoryResponse, MoviesControllerGetMovieWatchHistoryResponses, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponse, MoviesControllerGetUserMoviesPaginatedResponses, MoviesControllerGetUserMoviesResponse, MoviesControllerGetUserMoviesResponses, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedErrors, MoviesControllerMarkWatchedResponse, MoviesControllerMarkWatchedResponses, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponse, MoviesControllerSearchMoviesResponses, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedErrors, MoviesControllerUnmarkWatchedResponse, MoviesControllerUnmarkWatchedResponses, NormalizedImportItemDto, PaginatedEpisodesResponseDto, PaginatedMoviesResponseDto, PaginatedSocialUsersDto, PaginatedUpNextResponseDto, PeopleControllerGetPersonDetailsData, PeopleControllerGetPersonDetailsErrors, PeopleControllerGetPersonDetailsResponse, PeopleControllerGetPersonDetailsResponses, PeopleControllerGetPersonFilmographyData, PeopleControllerGetPersonFilmographyErrors, PeopleControllerGetPersonFilmographyResponse, PeopleControllerGetPersonFilmographyResponses, PersonFilmographyItemDto, PersonFilmographyResponseDto, PersonFilmographyRoleDto, PublicUserProfileDto, ReleaseCalendarItemDto, ReleaseCalendarResponseDto, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponse, SearchControllerDiscoverAllResponses, SearchControllerSearchAllData, SearchControllerSearchAllResponse, SearchControllerSearchAllResponses, SearchResultsDto, SearchShowsResultsDto, ShelfActivityBucketDto, ShelfActivitySummaryDto, ShelfControllerGetUserActivitySummaryData, ShelfControllerGetUserActivitySummaryResponse, ShelfControllerGetUserActivitySummaryResponses, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponse, ShelfControllerGetUserShelfResponses, ShelfResponseDto, ShowDto, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryErrors, ShowsControllerDeleteEpisodeWatchHistoryEntryResponse, ShowsControllerDeleteEpisodeWatchHistoryEntryResponses, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponse, ShowsControllerDiscoverShowsResponses, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponse, ShowsControllerGetEpisodeDetailsResponses, ShowsControllerGetLocalEpisodesData, ShowsControllerGetLocalEpisodesResponse, ShowsControllerGetLocalEpisodesResponses, ShowsControllerGetLocalSeasonsData, ShowsControllerGetLocalSeasonsResponse, ShowsControllerGetLocalSeasonsResponses, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponse, ShowsControllerGetSeasonDetailsResponses, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponse, ShowsControllerGetShowDetailsResponses, ShowsControllerGetShowResponse, ShowsControllerGetShowResponses, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryErrors, ShowsControllerGetShowWatchHistoryResponse, ShowsControllerGetShowWatchHistoryResponses, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponse, ShowsControllerGetUserEpisodesPaginatedResponses, ShowsControllerGetUserReleaseCalendarData, ShowsControllerGetUserReleaseCalendarResponse, ShowsControllerGetUserReleaseCalendarResponses, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponse, ShowsControllerGetUserShowsResponses, ShowsControllerGetUserUpNextData, ShowsControllerGetUserUpNextResponse, ShowsControllerGetUserUpNextResponses, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedErrors, ShowsControllerMarkSeasonWatchedResponse, ShowsControllerMarkSeasonWatchedResponses, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedErrors, ShowsControllerMarkShowWatchedResponse, ShowsControllerMarkShowWatchedResponses, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedErrors, ShowsControllerMarkWatchedResponse, ShowsControllerMarkWatchedResponses, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponse, ShowsControllerSearchShowsResponses, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponse, ShowsControllerUnmarkWatchedResponses, SocialActorDto, SocialControllerFollowData, SocialControllerFollowResponse, SocialControllerFollowResponses, SocialControllerGetFeedData, SocialControllerGetFeedResponse, SocialControllerGetFeedResponses, SocialControllerGetFollowersData, SocialControllerGetFollowersResponse, SocialControllerGetFollowersResponses, SocialControllerGetFollowingData, SocialControllerGetFollowingResponse, SocialControllerGetFollowingResponses, SocialControllerGetRelationshipData, SocialControllerGetRelationshipResponse, SocialControllerGetRelationshipResponses, SocialControllerGetWatchersData, SocialControllerGetWatchersResponse, SocialControllerGetWatchersResponses, SocialControllerSearchPeopleData, SocialControllerSearchPeopleResponse, SocialControllerSearchPeopleResponses, SocialControllerUnfollowData, SocialControllerUnfollowResponse, SocialControllerUnfollowResponses, SocialUserCardDto, StartTraktImportDto, StartTraktImportResponseDto, TmdbCastDto, TmdbCreditsDto, TmdbCrewDto, TmdbEpisodeDto, TmdbGenreDto, TmdbMovieDetailDto, TmdbMovieResultDto, TmdbNetworkDto, TmdbPersonDetailDto, TmdbSeasonDetailDto, TmdbSeasonSummaryDto, TmdbShowDetailDto, TmdbShowResultDto, TmdbTrailerDto, TrackedEpisodeDto, TrackedMovieDto, TrackedShowSummaryDto, TraktHistoryPreviewItemDto, TraktImportJobDto, TraktPublicProfileDto, UnifiedDiscoverResponseDto, UnifiedSearchResponseDto, UnifiedSearchResultDto, UpdateListDto, UpdateUserProfileDto, UpdateUserSettingsDto, UpNextEpisodeDto, UpNextShowDto, UserDto, UserProfileDto, UserRelationshipDto, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingErrors, UsersControllerCompleteOnboardingResponse, UsersControllerCompleteOnboardingResponses, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountErrors, UsersControllerDeleteMyAccountResponse, UsersControllerDeleteMyAccountResponses, UsersControllerDeleteMyAvatarData, UsersControllerDeleteMyAvatarResponse, UsersControllerDeleteMyAvatarResponses, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryErrors, UsersControllerFetchMyTraktPublicHistoryResponse, UsersControllerFetchMyTraktPublicHistoryResponses, UsersControllerGetAvatarData, UsersControllerGetAvatarResponses, UsersControllerGetMyAccountDeletionData, UsersControllerGetMyAccountDeletionErrors, UsersControllerGetMyAccountDeletionResponse, UsersControllerGetMyAccountDeletionResponses, UsersControllerGetMyCurrentTraktImportData, UsersControllerGetMyCurrentTraktImportErrors, UsersControllerGetMyCurrentTraktImportResponse, UsersControllerGetMyCurrentTraktImportResponses, UsersControllerGetMySettingsData, UsersControllerGetMySettingsErrors, UsersControllerGetMySettingsResponse, UsersControllerGetMySettingsResponses, UsersControllerGetPublicProfileData, UsersControllerGetPublicProfileErrors, UsersControllerGetPublicProfileResponse, UsersControllerGetPublicProfileResponses, UsersControllerImportMyBlueskyFollowsData, UsersControllerImportMyBlueskyFollowsErrors, UsersControllerImportMyBlueskyFollowsResponse, UsersControllerImportMyBlueskyFollowsResponses, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryErrors, UsersControllerImportMyHistoryResponse, UsersControllerImportMyHistoryResponses, UsersControllerStartMyTraktImportData, UsersControllerStartMyTraktImportErrors, UsersControllerStartMyTraktImportResponse, UsersControllerStartMyTraktImportResponses, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileErrors, UsersControllerUpdateMyProfileResponse, UsersControllerUpdateMyProfileResponses, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsErrors, UsersControllerUpdateMySettingsResponse, UsersControllerUpdateMySettingsResponses, UsersControllerUploadMyAvatarData, UsersControllerUploadMyAvatarResponse, UsersControllerUploadMyAvatarResponses, UserSettingsDto, WatchHistoryItemDto } from './types.gen'; 3 + export { authControllerBlueskyProfileStatus, authControllerCallback, authControllerGetClientMetadata, authControllerLogin, authControllerLogout, authControllerMe, authControllerSignup, authControllerSuggestions, listsControllerAddItemToList, listsControllerCreateList, listsControllerDeleteList, listsControllerGetList, listsControllerGetListsForItem, listsControllerGetPublicUserList, listsControllerGetPublicUserLists, listsControllerGetUserLists, listsControllerRemoveItemFromList, listsControllerUpdateList, moviesControllerDeleteWatchHistoryEntry, moviesControllerDiscoverMovies, moviesControllerGetMovie, moviesControllerGetMovieDetails, moviesControllerGetMovieWatchHistory, moviesControllerGetUserMovies, moviesControllerGetUserMoviesPaginated, moviesControllerMarkWatched, moviesControllerSearchMovies, moviesControllerUnmarkWatched, notesControllerDeleteNote, notesControllerGetNote, notesControllerUpsertNote, type Options, peopleControllerGetPersonDetails, peopleControllerGetPersonFilmography, searchControllerDiscoverAll, searchControllerSearchAll, shelfControllerGetUserActivitySummary, shelfControllerGetUserShelf, showsControllerDeleteEpisodeWatchHistoryEntry, showsControllerDiscoverShows, showsControllerGetEpisodeDetails, showsControllerGetLocalEpisodes, showsControllerGetLocalSeasons, showsControllerGetSeasonDetails, showsControllerGetShow, showsControllerGetShowDetails, showsControllerGetShowWatchHistory, showsControllerGetUserEpisodesPaginated, showsControllerGetUserReleaseCalendar, showsControllerGetUserShows, showsControllerGetUserUpNext, showsControllerMarkSeasonWatched, showsControllerMarkShowWatched, showsControllerMarkWatched, showsControllerSearchShows, showsControllerUnmarkWatched, socialControllerFollow, socialControllerGetFeed, socialControllerGetFollowers, socialControllerGetFollowing, socialControllerGetRelationship, socialControllerGetWatchers, socialControllerSearchPeople, socialControllerUnfollow, usersControllerCompleteOnboarding, usersControllerDeleteMyAccount, usersControllerDeleteMyAvatar, usersControllerFetchMyTraktPublicHistory, usersControllerGetAvatar, usersControllerGetMyAccountDeletion, usersControllerGetMyCurrentTraktImport, usersControllerGetMySettings, usersControllerGetPublicFollowers, usersControllerGetPublicFollowing, usersControllerGetPublicProfile, usersControllerImportMyBlueskyFollows, usersControllerImportMyHistory, usersControllerStartMyTraktImport, usersControllerUpdateMyProfile, usersControllerUpdateMySettings, usersControllerUploadMyAvatar } from './sdk.gen'; 4 + export type { AccountDeletionJobDto, AddToListDto, AuthControllerBlueskyProfileStatusData, AuthControllerBlueskyProfileStatusErrors, AuthControllerBlueskyProfileStatusResponse, AuthControllerBlueskyProfileStatusResponses, AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerGetClientMetadataResponses, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerLogoutResponses, AuthControllerMeData, AuthControllerMeErrors, AuthControllerMeResponse, AuthControllerMeResponses, AuthControllerSignupData, AuthControllerSuggestionsData, AuthControllerSuggestionsResponses, BlueskyProfileStatusDto, ClientOptions, CompleteOnboardingResponseDto, CreateListDto, DeleteUserAccountDto, EpisodeContextDto, EpisodeHistoryItemDto, EpisodeReferenceDto, FetchTraktPublicHistoryDto, FetchTraktPublicHistoryResponseDto, FollowedActivityFeedDto, FollowedActivityItemDto, FollowedWatcherActorDto, FollowedWatcherDto, FollowedWatchersDto, ImportBlueskyFollowsResponseDto, ImportErrorDto, ImportHistoryDto, ImportHistoryResponseDto, ImportSkipDto, ListDto, ListsControllerAddItemToListData, ListsControllerAddItemToListErrors, ListsControllerAddItemToListResponses, ListsControllerCreateListData, ListsControllerCreateListErrors, ListsControllerCreateListResponse, ListsControllerCreateListResponses, ListsControllerDeleteListData, ListsControllerDeleteListErrors, ListsControllerDeleteListResponses, ListsControllerGetListData, ListsControllerGetListErrors, ListsControllerGetListResponse, ListsControllerGetListResponses, ListsControllerGetListsForItemData, ListsControllerGetListsForItemErrors, ListsControllerGetListsForItemResponse, ListsControllerGetListsForItemResponses, ListsControllerGetPublicUserListData, ListsControllerGetPublicUserListErrors, ListsControllerGetPublicUserListResponse, ListsControllerGetPublicUserListResponses, ListsControllerGetPublicUserListsData, ListsControllerGetPublicUserListsResponse, ListsControllerGetPublicUserListsResponses, ListsControllerGetUserListsData, ListsControllerGetUserListsErrors, ListsControllerGetUserListsResponse, ListsControllerGetUserListsResponses, ListsControllerRemoveItemFromListData, ListsControllerRemoveItemFromListErrors, ListsControllerRemoveItemFromListResponses, ListsControllerUpdateListData, ListsControllerUpdateListErrors, ListsControllerUpdateListResponse, ListsControllerUpdateListResponses, ListsForItemDto, ListSummaryDto, ListWithItemsDto, LocalEpisodeDto, LocalSeasonDto, MarkedEpisodesResponseDto, MarkEpisodeWatchedDto, MarkSeasonWatchedDto, MarkShowWatchedDto, MediaInListDto, MovieColorsDto, MovieDto, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryErrors, MoviesControllerDeleteWatchHistoryEntryResponse, MoviesControllerDeleteWatchHistoryEntryResponses, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponse, MoviesControllerDiscoverMoviesResponses, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponse, MoviesControllerGetMovieDetailsResponses, MoviesControllerGetMovieResponse, MoviesControllerGetMovieResponses, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryErrors, MoviesControllerGetMovieWatchHistoryResponse, MoviesControllerGetMovieWatchHistoryResponses, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponse, MoviesControllerGetUserMoviesPaginatedResponses, MoviesControllerGetUserMoviesResponse, MoviesControllerGetUserMoviesResponses, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedErrors, MoviesControllerMarkWatchedResponse, MoviesControllerMarkWatchedResponses, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponse, MoviesControllerSearchMoviesResponses, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedErrors, MoviesControllerUnmarkWatchedResponse, MoviesControllerUnmarkWatchedResponses, NormalizedImportItemDto, NoteResponseDto, NotesControllerDeleteNoteData, NotesControllerDeleteNoteErrors, NotesControllerDeleteNoteResponses, NotesControllerGetNoteData, NotesControllerGetNoteErrors, NotesControllerGetNoteResponse, NotesControllerGetNoteResponses, NotesControllerUpsertNoteData, NotesControllerUpsertNoteErrors, NotesControllerUpsertNoteResponse, NotesControllerUpsertNoteResponses, PaginatedEpisodesResponseDto, PaginatedMoviesResponseDto, PaginatedSocialUsersDto, PaginatedUpNextResponseDto, PeopleControllerGetPersonDetailsData, PeopleControllerGetPersonDetailsErrors, PeopleControllerGetPersonDetailsResponse, PeopleControllerGetPersonDetailsResponses, PeopleControllerGetPersonFilmographyData, PeopleControllerGetPersonFilmographyErrors, PeopleControllerGetPersonFilmographyResponse, PeopleControllerGetPersonFilmographyResponses, PersonFilmographyItemDto, PersonFilmographyResponseDto, PersonFilmographyRoleDto, PublicUserProfileDto, ReleaseCalendarItemDto, ReleaseCalendarResponseDto, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponse, SearchControllerDiscoverAllResponses, SearchControllerSearchAllData, SearchControllerSearchAllResponse, SearchControllerSearchAllResponses, SearchResultsDto, SearchShowsResultsDto, ShelfActivityBucketDto, ShelfActivitySummaryDto, ShelfControllerGetUserActivitySummaryData, ShelfControllerGetUserActivitySummaryResponse, ShelfControllerGetUserActivitySummaryResponses, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponse, ShelfControllerGetUserShelfResponses, ShelfResponseDto, ShowDto, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryErrors, ShowsControllerDeleteEpisodeWatchHistoryEntryResponse, ShowsControllerDeleteEpisodeWatchHistoryEntryResponses, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponse, ShowsControllerDiscoverShowsResponses, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponse, ShowsControllerGetEpisodeDetailsResponses, ShowsControllerGetLocalEpisodesData, ShowsControllerGetLocalEpisodesResponse, ShowsControllerGetLocalEpisodesResponses, ShowsControllerGetLocalSeasonsData, ShowsControllerGetLocalSeasonsResponse, ShowsControllerGetLocalSeasonsResponses, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponse, ShowsControllerGetSeasonDetailsResponses, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponse, ShowsControllerGetShowDetailsResponses, ShowsControllerGetShowResponse, ShowsControllerGetShowResponses, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryErrors, ShowsControllerGetShowWatchHistoryResponse, ShowsControllerGetShowWatchHistoryResponses, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponse, ShowsControllerGetUserEpisodesPaginatedResponses, ShowsControllerGetUserReleaseCalendarData, ShowsControllerGetUserReleaseCalendarResponse, ShowsControllerGetUserReleaseCalendarResponses, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponse, ShowsControllerGetUserShowsResponses, ShowsControllerGetUserUpNextData, ShowsControllerGetUserUpNextResponse, ShowsControllerGetUserUpNextResponses, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedErrors, ShowsControllerMarkSeasonWatchedResponse, ShowsControllerMarkSeasonWatchedResponses, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedErrors, ShowsControllerMarkShowWatchedResponse, ShowsControllerMarkShowWatchedResponses, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedErrors, ShowsControllerMarkWatchedResponse, ShowsControllerMarkWatchedResponses, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponse, ShowsControllerSearchShowsResponses, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponse, ShowsControllerUnmarkWatchedResponses, SocialActorDto, SocialControllerFollowData, SocialControllerFollowResponse, SocialControllerFollowResponses, SocialControllerGetFeedData, SocialControllerGetFeedResponse, SocialControllerGetFeedResponses, SocialControllerGetFollowersData, SocialControllerGetFollowersResponse, SocialControllerGetFollowersResponses, SocialControllerGetFollowingData, SocialControllerGetFollowingResponse, SocialControllerGetFollowingResponses, SocialControllerGetRelationshipData, SocialControllerGetRelationshipResponse, SocialControllerGetRelationshipResponses, SocialControllerGetWatchersData, SocialControllerGetWatchersResponse, SocialControllerGetWatchersResponses, SocialControllerSearchPeopleData, SocialControllerSearchPeopleResponse, SocialControllerSearchPeopleResponses, SocialControllerUnfollowData, SocialControllerUnfollowResponse, SocialControllerUnfollowResponses, SocialUserCardDto, StartTraktImportDto, StartTraktImportResponseDto, TmdbCastDto, TmdbCreditsDto, TmdbCrewDto, TmdbEpisodeDto, TmdbGenreDto, TmdbMovieDetailDto, TmdbMovieResultDto, TmdbNetworkDto, TmdbPersonDetailDto, TmdbSeasonDetailDto, TmdbSeasonSummaryDto, TmdbShowDetailDto, TmdbShowResultDto, TmdbTrailerDto, TrackedEpisodeDto, TrackedMovieDto, TrackedShowSummaryDto, TraktHistoryPreviewItemDto, TraktImportJobDto, TraktPublicProfileDto, UnifiedDiscoverResponseDto, UnifiedSearchResponseDto, UnifiedSearchResultDto, UpdateListDto, UpdateUserProfileDto, UpdateUserSettingsDto, UpNextEpisodeDto, UpNextShowDto, UpsertNoteDto, UserDto, UserProfileDto, UserRelationshipDto, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingErrors, UsersControllerCompleteOnboardingResponse, UsersControllerCompleteOnboardingResponses, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountErrors, UsersControllerDeleteMyAccountResponse, UsersControllerDeleteMyAccountResponses, UsersControllerDeleteMyAvatarData, UsersControllerDeleteMyAvatarResponse, UsersControllerDeleteMyAvatarResponses, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryErrors, UsersControllerFetchMyTraktPublicHistoryResponse, UsersControllerFetchMyTraktPublicHistoryResponses, UsersControllerGetAvatarData, UsersControllerGetAvatarResponses, UsersControllerGetMyAccountDeletionData, UsersControllerGetMyAccountDeletionErrors, UsersControllerGetMyAccountDeletionResponse, UsersControllerGetMyAccountDeletionResponses, UsersControllerGetMyCurrentTraktImportData, UsersControllerGetMyCurrentTraktImportErrors, UsersControllerGetMyCurrentTraktImportResponse, UsersControllerGetMyCurrentTraktImportResponses, UsersControllerGetMySettingsData, UsersControllerGetMySettingsErrors, UsersControllerGetMySettingsResponse, UsersControllerGetMySettingsResponses, UsersControllerGetPublicFollowersData, UsersControllerGetPublicFollowersErrors, UsersControllerGetPublicFollowersResponse, UsersControllerGetPublicFollowersResponses, UsersControllerGetPublicFollowingData, UsersControllerGetPublicFollowingErrors, UsersControllerGetPublicFollowingResponse, UsersControllerGetPublicFollowingResponses, UsersControllerGetPublicProfileData, UsersControllerGetPublicProfileErrors, UsersControllerGetPublicProfileResponse, UsersControllerGetPublicProfileResponses, UsersControllerImportMyBlueskyFollowsData, UsersControllerImportMyBlueskyFollowsErrors, UsersControllerImportMyBlueskyFollowsResponse, UsersControllerImportMyBlueskyFollowsResponses, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryErrors, UsersControllerImportMyHistoryResponse, UsersControllerImportMyHistoryResponses, UsersControllerStartMyTraktImportData, UsersControllerStartMyTraktImportErrors, UsersControllerStartMyTraktImportResponse, UsersControllerStartMyTraktImportResponses, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileErrors, UsersControllerUpdateMyProfileResponse, UsersControllerUpdateMyProfileResponses, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsErrors, UsersControllerUpdateMySettingsResponse, UsersControllerUpdateMySettingsResponses, UsersControllerUploadMyAvatarData, UsersControllerUploadMyAvatarResponse, UsersControllerUploadMyAvatarResponses, UserSettingsDto, WatchHistoryItemDto } from './types.gen';
+33 -1
packages/api/src/generated/sdk.gen.ts
··· 2 2 3 3 import { type Client, formDataBodySerializer, type Options as Options2, type TDataShape } from './client'; 4 4 import { client } from './client.gen'; 5 - import type { AuthControllerBlueskyProfileStatusData, AuthControllerBlueskyProfileStatusErrors, AuthControllerBlueskyProfileStatusResponses, AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerGetClientMetadataResponses, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerLogoutResponses, AuthControllerMeData, AuthControllerMeErrors, AuthControllerMeResponses, AuthControllerSignupData, AuthControllerSuggestionsData, AuthControllerSuggestionsResponses, ListsControllerAddItemToListData, ListsControllerAddItemToListErrors, ListsControllerAddItemToListResponses, ListsControllerCreateListData, ListsControllerCreateListErrors, ListsControllerCreateListResponses, ListsControllerDeleteListData, ListsControllerDeleteListErrors, ListsControllerDeleteListResponses, ListsControllerGetListData, ListsControllerGetListErrors, ListsControllerGetListResponses, ListsControllerGetListsForItemData, ListsControllerGetListsForItemErrors, ListsControllerGetListsForItemResponses, ListsControllerGetPublicUserListData, ListsControllerGetPublicUserListErrors, ListsControllerGetPublicUserListResponses, ListsControllerGetPublicUserListsData, ListsControllerGetPublicUserListsResponses, ListsControllerGetUserListsData, ListsControllerGetUserListsErrors, ListsControllerGetUserListsResponses, ListsControllerRemoveItemFromListData, ListsControllerRemoveItemFromListErrors, ListsControllerRemoveItemFromListResponses, ListsControllerUpdateListData, ListsControllerUpdateListErrors, ListsControllerUpdateListResponses, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryErrors, MoviesControllerDeleteWatchHistoryEntryResponses, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponses, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponses, MoviesControllerGetMovieResponses, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryErrors, MoviesControllerGetMovieWatchHistoryResponses, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponses, MoviesControllerGetUserMoviesResponses, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedErrors, MoviesControllerMarkWatchedResponses, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponses, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedErrors, MoviesControllerUnmarkWatchedResponses, PeopleControllerGetPersonDetailsData, PeopleControllerGetPersonDetailsErrors, PeopleControllerGetPersonDetailsResponses, PeopleControllerGetPersonFilmographyData, PeopleControllerGetPersonFilmographyErrors, PeopleControllerGetPersonFilmographyResponses, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponses, SearchControllerSearchAllData, SearchControllerSearchAllResponses, ShelfControllerGetUserActivitySummaryData, ShelfControllerGetUserActivitySummaryResponses, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponses, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryErrors, ShowsControllerDeleteEpisodeWatchHistoryEntryResponses, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponses, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponses, ShowsControllerGetLocalEpisodesData, ShowsControllerGetLocalEpisodesResponses, ShowsControllerGetLocalSeasonsData, ShowsControllerGetLocalSeasonsResponses, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponses, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponses, ShowsControllerGetShowResponses, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryErrors, ShowsControllerGetShowWatchHistoryResponses, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponses, ShowsControllerGetUserReleaseCalendarData, ShowsControllerGetUserReleaseCalendarResponses, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponses, ShowsControllerGetUserUpNextData, ShowsControllerGetUserUpNextResponses, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedErrors, ShowsControllerMarkSeasonWatchedResponses, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedErrors, ShowsControllerMarkShowWatchedResponses, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedErrors, ShowsControllerMarkWatchedResponses, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponses, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponses, SocialControllerFollowData, SocialControllerFollowResponses, SocialControllerGetFeedData, SocialControllerGetFeedResponses, SocialControllerGetFollowersData, SocialControllerGetFollowersResponses, SocialControllerGetFollowingData, SocialControllerGetFollowingResponses, SocialControllerGetRelationshipData, SocialControllerGetRelationshipResponses, SocialControllerGetWatchersData, SocialControllerGetWatchersResponses, SocialControllerSearchPeopleData, SocialControllerSearchPeopleResponses, SocialControllerUnfollowData, SocialControllerUnfollowResponses, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingErrors, UsersControllerCompleteOnboardingResponses, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountErrors, UsersControllerDeleteMyAccountResponses, UsersControllerDeleteMyAvatarData, UsersControllerDeleteMyAvatarResponses, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryErrors, UsersControllerFetchMyTraktPublicHistoryResponses, UsersControllerGetAvatarData, UsersControllerGetAvatarResponses, UsersControllerGetMyAccountDeletionData, UsersControllerGetMyAccountDeletionErrors, UsersControllerGetMyAccountDeletionResponses, UsersControllerGetMyCurrentTraktImportData, UsersControllerGetMyCurrentTraktImportErrors, UsersControllerGetMyCurrentTraktImportResponses, UsersControllerGetMySettingsData, UsersControllerGetMySettingsErrors, UsersControllerGetMySettingsResponses, UsersControllerGetPublicProfileData, UsersControllerGetPublicProfileErrors, UsersControllerGetPublicProfileResponses, UsersControllerImportMyBlueskyFollowsData, UsersControllerImportMyBlueskyFollowsErrors, UsersControllerImportMyBlueskyFollowsResponses, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryErrors, UsersControllerImportMyHistoryResponses, UsersControllerStartMyTraktImportData, UsersControllerStartMyTraktImportErrors, UsersControllerStartMyTraktImportResponses, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileErrors, UsersControllerUpdateMyProfileResponses, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsErrors, UsersControllerUpdateMySettingsResponses, UsersControllerUploadMyAvatarData, UsersControllerUploadMyAvatarResponses } from './types.gen'; 5 + import type { AuthControllerBlueskyProfileStatusData, AuthControllerBlueskyProfileStatusErrors, AuthControllerBlueskyProfileStatusResponses, AuthControllerCallbackData, AuthControllerGetClientMetadataData, AuthControllerGetClientMetadataResponses, AuthControllerLoginData, AuthControllerLogoutData, AuthControllerLogoutResponses, AuthControllerMeData, AuthControllerMeErrors, AuthControllerMeResponses, AuthControllerSignupData, AuthControllerSuggestionsData, AuthControllerSuggestionsResponses, ListsControllerAddItemToListData, ListsControllerAddItemToListErrors, ListsControllerAddItemToListResponses, ListsControllerCreateListData, ListsControllerCreateListErrors, ListsControllerCreateListResponses, ListsControllerDeleteListData, ListsControllerDeleteListErrors, ListsControllerDeleteListResponses, ListsControllerGetListData, ListsControllerGetListErrors, ListsControllerGetListResponses, ListsControllerGetListsForItemData, ListsControllerGetListsForItemErrors, ListsControllerGetListsForItemResponses, ListsControllerGetPublicUserListData, ListsControllerGetPublicUserListErrors, ListsControllerGetPublicUserListResponses, ListsControllerGetPublicUserListsData, ListsControllerGetPublicUserListsResponses, ListsControllerGetUserListsData, ListsControllerGetUserListsErrors, ListsControllerGetUserListsResponses, ListsControllerRemoveItemFromListData, ListsControllerRemoveItemFromListErrors, ListsControllerRemoveItemFromListResponses, ListsControllerUpdateListData, ListsControllerUpdateListErrors, ListsControllerUpdateListResponses, MoviesControllerDeleteWatchHistoryEntryData, MoviesControllerDeleteWatchHistoryEntryErrors, MoviesControllerDeleteWatchHistoryEntryResponses, MoviesControllerDiscoverMoviesData, MoviesControllerDiscoverMoviesResponses, MoviesControllerGetMovieData, MoviesControllerGetMovieDetailsData, MoviesControllerGetMovieDetailsResponses, MoviesControllerGetMovieResponses, MoviesControllerGetMovieWatchHistoryData, MoviesControllerGetMovieWatchHistoryErrors, MoviesControllerGetMovieWatchHistoryResponses, MoviesControllerGetUserMoviesData, MoviesControllerGetUserMoviesPaginatedData, MoviesControllerGetUserMoviesPaginatedResponses, MoviesControllerGetUserMoviesResponses, MoviesControllerMarkWatchedData, MoviesControllerMarkWatchedErrors, MoviesControllerMarkWatchedResponses, MoviesControllerSearchMoviesData, MoviesControllerSearchMoviesResponses, MoviesControllerUnmarkWatchedData, MoviesControllerUnmarkWatchedErrors, MoviesControllerUnmarkWatchedResponses, NotesControllerDeleteNoteData, NotesControllerDeleteNoteErrors, NotesControllerDeleteNoteResponses, NotesControllerGetNoteData, NotesControllerGetNoteErrors, NotesControllerGetNoteResponses, NotesControllerUpsertNoteData, NotesControllerUpsertNoteErrors, NotesControllerUpsertNoteResponses, PeopleControllerGetPersonDetailsData, PeopleControllerGetPersonDetailsErrors, PeopleControllerGetPersonDetailsResponses, PeopleControllerGetPersonFilmographyData, PeopleControllerGetPersonFilmographyErrors, PeopleControllerGetPersonFilmographyResponses, SearchControllerDiscoverAllData, SearchControllerDiscoverAllResponses, SearchControllerSearchAllData, SearchControllerSearchAllResponses, ShelfControllerGetUserActivitySummaryData, ShelfControllerGetUserActivitySummaryResponses, ShelfControllerGetUserShelfData, ShelfControllerGetUserShelfResponses, ShowsControllerDeleteEpisodeWatchHistoryEntryData, ShowsControllerDeleteEpisodeWatchHistoryEntryErrors, ShowsControllerDeleteEpisodeWatchHistoryEntryResponses, ShowsControllerDiscoverShowsData, ShowsControllerDiscoverShowsResponses, ShowsControllerGetEpisodeDetailsData, ShowsControllerGetEpisodeDetailsResponses, ShowsControllerGetLocalEpisodesData, ShowsControllerGetLocalEpisodesResponses, ShowsControllerGetLocalSeasonsData, ShowsControllerGetLocalSeasonsResponses, ShowsControllerGetSeasonDetailsData, ShowsControllerGetSeasonDetailsResponses, ShowsControllerGetShowData, ShowsControllerGetShowDetailsData, ShowsControllerGetShowDetailsResponses, ShowsControllerGetShowResponses, ShowsControllerGetShowWatchHistoryData, ShowsControllerGetShowWatchHistoryErrors, ShowsControllerGetShowWatchHistoryResponses, ShowsControllerGetUserEpisodesPaginatedData, ShowsControllerGetUserEpisodesPaginatedResponses, ShowsControllerGetUserReleaseCalendarData, ShowsControllerGetUserReleaseCalendarResponses, ShowsControllerGetUserShowsData, ShowsControllerGetUserShowsResponses, ShowsControllerGetUserUpNextData, ShowsControllerGetUserUpNextResponses, ShowsControllerMarkSeasonWatchedData, ShowsControllerMarkSeasonWatchedErrors, ShowsControllerMarkSeasonWatchedResponses, ShowsControllerMarkShowWatchedData, ShowsControllerMarkShowWatchedErrors, ShowsControllerMarkShowWatchedResponses, ShowsControllerMarkWatchedData, ShowsControllerMarkWatchedErrors, ShowsControllerMarkWatchedResponses, ShowsControllerSearchShowsData, ShowsControllerSearchShowsResponses, ShowsControllerUnmarkWatchedData, ShowsControllerUnmarkWatchedResponses, SocialControllerFollowData, SocialControllerFollowResponses, SocialControllerGetFeedData, SocialControllerGetFeedResponses, SocialControllerGetFollowersData, SocialControllerGetFollowersResponses, SocialControllerGetFollowingData, SocialControllerGetFollowingResponses, SocialControllerGetRelationshipData, SocialControllerGetRelationshipResponses, SocialControllerGetWatchersData, SocialControllerGetWatchersResponses, SocialControllerSearchPeopleData, SocialControllerSearchPeopleResponses, SocialControllerUnfollowData, SocialControllerUnfollowResponses, UsersControllerCompleteOnboardingData, UsersControllerCompleteOnboardingErrors, UsersControllerCompleteOnboardingResponses, UsersControllerDeleteMyAccountData, UsersControllerDeleteMyAccountErrors, UsersControllerDeleteMyAccountResponses, UsersControllerDeleteMyAvatarData, UsersControllerDeleteMyAvatarResponses, UsersControllerFetchMyTraktPublicHistoryData, UsersControllerFetchMyTraktPublicHistoryErrors, UsersControllerFetchMyTraktPublicHistoryResponses, UsersControllerGetAvatarData, UsersControllerGetAvatarResponses, UsersControllerGetMyAccountDeletionData, UsersControllerGetMyAccountDeletionErrors, UsersControllerGetMyAccountDeletionResponses, UsersControllerGetMyCurrentTraktImportData, UsersControllerGetMyCurrentTraktImportErrors, UsersControllerGetMyCurrentTraktImportResponses, UsersControllerGetMySettingsData, UsersControllerGetMySettingsErrors, UsersControllerGetMySettingsResponses, UsersControllerGetPublicFollowersData, UsersControllerGetPublicFollowersErrors, UsersControllerGetPublicFollowersResponses, UsersControllerGetPublicFollowingData, UsersControllerGetPublicFollowingErrors, UsersControllerGetPublicFollowingResponses, UsersControllerGetPublicProfileData, UsersControllerGetPublicProfileErrors, UsersControllerGetPublicProfileResponses, UsersControllerImportMyBlueskyFollowsData, UsersControllerImportMyBlueskyFollowsErrors, UsersControllerImportMyBlueskyFollowsResponses, UsersControllerImportMyHistoryData, UsersControllerImportMyHistoryErrors, UsersControllerImportMyHistoryResponses, UsersControllerStartMyTraktImportData, UsersControllerStartMyTraktImportErrors, UsersControllerStartMyTraktImportResponses, UsersControllerUpdateMyProfileData, UsersControllerUpdateMyProfileErrors, UsersControllerUpdateMyProfileResponses, UsersControllerUpdateMySettingsData, UsersControllerUpdateMySettingsErrors, UsersControllerUpdateMySettingsResponses, UsersControllerUploadMyAvatarData, UsersControllerUploadMyAvatarResponses } from './types.gen'; 6 6 7 7 export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = Options2<TData, ThrowOnError> & { 8 8 /** ··· 232 232 export const usersControllerGetPublicProfile = <ThrowOnError extends boolean = false>(options: Options<UsersControllerGetPublicProfileData, ThrowOnError>) => (options.client ?? client).get<UsersControllerGetPublicProfileResponses, UsersControllerGetPublicProfileErrors, ThrowOnError>({ url: '/users/{handle}/profile', ...options }); 233 233 234 234 /** 235 + * Get public followers for a user by handle 236 + */ 237 + export const usersControllerGetPublicFollowers = <ThrowOnError extends boolean = false>(options: Options<UsersControllerGetPublicFollowersData, ThrowOnError>) => (options.client ?? client).get<UsersControllerGetPublicFollowersResponses, UsersControllerGetPublicFollowersErrors, ThrowOnError>({ url: '/users/{handle}/followers', ...options }); 238 + 239 + /** 240 + * Get public following for a user by handle 241 + */ 242 + export const usersControllerGetPublicFollowing = <ThrowOnError extends boolean = false>(options: Options<UsersControllerGetPublicFollowingData, ThrowOnError>) => (options.client ?? client).get<UsersControllerGetPublicFollowingResponses, UsersControllerGetPublicFollowingErrors, ThrowOnError>({ url: '/users/{handle}/following', ...options }); 243 + 244 + /** 235 245 * Get a public user avatar from the user's PDS 236 246 */ 237 247 export const usersControllerGetAvatar = <ThrowOnError extends boolean = false>(options: Options<UsersControllerGetAvatarData, ThrowOnError>) => (options.client ?? client).get<UsersControllerGetAvatarResponses, unknown, ThrowOnError>({ url: '/users/avatar', ...options }); ··· 461 471 * Get followed users who watched a scoped movie, show, season, or episode 462 472 */ 463 473 export const socialControllerGetWatchers = <ThrowOnError extends boolean = false>(options: Options<SocialControllerGetWatchersData, ThrowOnError>) => (options.client ?? client).get<SocialControllerGetWatchersResponses, unknown, ThrowOnError>({ url: '/social/watchers', ...options }); 474 + 475 + /** 476 + * Get a note for a user and media item 477 + */ 478 + export const notesControllerGetNote = <ThrowOnError extends boolean = false>(options: Options<NotesControllerGetNoteData, ThrowOnError>) => (options.client ?? client).get<NotesControllerGetNoteResponses, NotesControllerGetNoteErrors, ThrowOnError>({ url: '/notes/user/{userDid}', ...options }); 479 + 480 + /** 481 + * Create or update a note 482 + */ 483 + export const notesControllerUpsertNote = <ThrowOnError extends boolean = false>(options: Options<NotesControllerUpsertNoteData, ThrowOnError>) => (options.client ?? client).post<NotesControllerUpsertNoteResponses, NotesControllerUpsertNoteErrors, ThrowOnError>({ 484 + url: '/notes', 485 + ...options, 486 + headers: { 487 + 'Content-Type': 'application/json', 488 + ...options.headers 489 + } 490 + }); 491 + 492 + /** 493 + * Delete a note 494 + */ 495 + export const notesControllerDeleteNote = <ThrowOnError extends boolean = false>(options: Options<NotesControllerDeleteNoteData, ThrowOnError>) => (options.client ?? client).delete<NotesControllerDeleteNoteResponses, NotesControllerDeleteNoteErrors, ThrowOnError>({ url: '/notes/{noteId}', ...options }); 464 496 465 497 /** 466 498 * Get paginated shelf items for a user (movies and episodes)
+256 -34
packages/api/src/generated/types.gen.ts
··· 497 497 followingCount: number; 498 498 }; 499 499 500 + export type SocialUserCardDto = { 501 + did: string; 502 + handle: string; 503 + displayName?: { 504 + [key: string]: unknown; 505 + } | null; 506 + avatar?: { 507 + [key: string]: unknown; 508 + } | null; 509 + followersCount: number; 510 + followingCount: number; 511 + isFollowing: boolean; 512 + isFollowedBy: boolean; 513 + }; 514 + 515 + export type PaginatedSocialUsersDto = { 516 + items: Array<SocialUserCardDto>; 517 + page: number; 518 + pageSize: number; 519 + total: number; 520 + totalPages: number; 521 + hasNextPage: boolean; 522 + hasPreviousPage: boolean; 523 + }; 524 + 500 525 export type UserSettingsDto = { 501 526 /** 502 527 * Time format preference ··· 757 782 export type MediaInListDto = { 758 783 id: string; 759 784 rkey: string; 760 - mediaType: string; 785 + mediaType: 'movie' | 'show' | 'season' | 'episode'; 786 + /** 787 + * TMDB movie ID or show ID 788 + */ 761 789 mediaId: string; 762 790 /** 763 791 * Season number for season/episode show items ··· 846 874 /** 847 875 * Media type 848 876 */ 849 - mediaType: 'movie' | 'show'; 877 + mediaType: 'movie' | 'show' | 'season' | 'episode'; 850 878 /** 851 - * TMDB media ID 879 + * TMDB movie ID or show ID 852 880 */ 853 881 mediaId: string; 882 + /** 883 + * Season number for season/episode items 884 + */ 885 + seasonNumber?: number; 886 + /** 887 + * Episode number for episode items 888 + */ 889 + episodeNumber?: number; 854 890 /** 855 891 * Optional notes about the media 856 892 */ ··· 865 901 isInList: boolean; 866 902 }; 867 903 868 - export type SocialUserCardDto = { 869 - did: string; 870 - handle: string; 871 - displayName?: { 872 - [key: string]: unknown; 873 - } | null; 874 - avatar?: { 875 - [key: string]: unknown; 876 - } | null; 877 - followersCount: number; 878 - followingCount: number; 879 - isFollowing: boolean; 880 - isFollowedBy: boolean; 881 - }; 882 - 883 - export type PaginatedSocialUsersDto = { 884 - items: Array<SocialUserCardDto>; 885 - page: number; 886 - pageSize: number; 887 - total: number; 888 - totalPages: number; 889 - hasNextPage: boolean; 890 - hasPreviousPage: boolean; 891 - }; 892 - 893 904 export type UserRelationshipDto = { 894 905 targetDid: string; 895 906 isFollowing: boolean; ··· 960 971 items: Array<FollowedWatcherDto>; 961 972 pageSize: number; 962 973 total: number; 974 + }; 975 + 976 + export type NoteResponseDto = { 977 + id: string; 978 + rkey: string; 979 + content: string; 980 + mediaType: 'movie' | 'show' | 'season' | 'episode'; 981 + mediaId: string; 982 + seasonNumber?: number; 983 + episodeNumber?: number; 984 + createdAt: string; 985 + updatedAt: string; 986 + }; 987 + 988 + export type UpsertNoteDto = { 989 + /** 990 + * Media type 991 + */ 992 + mediaType: 'movie' | 'show' | 'season' | 'episode'; 993 + /** 994 + * TMDB movie ID or show ID 995 + */ 996 + mediaId: string; 997 + /** 998 + * Season number for season/episode items 999 + */ 1000 + seasonNumber?: number; 1001 + /** 1002 + * Episode number for episode items 1003 + */ 1004 + episodeNumber?: number; 1005 + /** 1006 + * Note content 1007 + */ 1008 + content: string; 963 1009 }; 964 1010 965 1011 export type ShelfResponseDto = { ··· 1907 1953 1908 1954 export type UsersControllerGetPublicProfileResponse = UsersControllerGetPublicProfileResponses[keyof UsersControllerGetPublicProfileResponses]; 1909 1955 1956 + export type UsersControllerGetPublicFollowersData = { 1957 + body?: never; 1958 + path: { 1959 + handle: string; 1960 + }; 1961 + query?: { 1962 + /** 1963 + * Page number to return 1964 + */ 1965 + page?: number; 1966 + /** 1967 + * Number of items to return per page 1968 + */ 1969 + pageSize?: number; 1970 + }; 1971 + url: '/users/{handle}/followers'; 1972 + }; 1973 + 1974 + export type UsersControllerGetPublicFollowersErrors = { 1975 + /** 1976 + * User not found 1977 + */ 1978 + 404: unknown; 1979 + }; 1980 + 1981 + export type UsersControllerGetPublicFollowersResponses = { 1982 + 200: PaginatedSocialUsersDto; 1983 + }; 1984 + 1985 + export type UsersControllerGetPublicFollowersResponse = UsersControllerGetPublicFollowersResponses[keyof UsersControllerGetPublicFollowersResponses]; 1986 + 1987 + export type UsersControllerGetPublicFollowingData = { 1988 + body?: never; 1989 + path: { 1990 + handle: string; 1991 + }; 1992 + query?: { 1993 + /** 1994 + * Page number to return 1995 + */ 1996 + page?: number; 1997 + /** 1998 + * Number of items to return per page 1999 + */ 2000 + pageSize?: number; 2001 + }; 2002 + url: '/users/{handle}/following'; 2003 + }; 2004 + 2005 + export type UsersControllerGetPublicFollowingErrors = { 2006 + /** 2007 + * User not found 2008 + */ 2009 + 404: unknown; 2010 + }; 2011 + 2012 + export type UsersControllerGetPublicFollowingResponses = { 2013 + 200: PaginatedSocialUsersDto; 2014 + }; 2015 + 2016 + export type UsersControllerGetPublicFollowingResponse = UsersControllerGetPublicFollowingResponses[keyof UsersControllerGetPublicFollowingResponses]; 2017 + 1910 2018 export type UsersControllerGetAvatarData = { 1911 2019 body?: never; 1912 2020 path?: never; ··· 2444 2552 */ 2445 2553 slug: string; 2446 2554 /** 2447 - * Media type (movie or show) 2555 + * Media type (movie, show, season, or episode) 2448 2556 */ 2449 2557 mediaType: string; 2450 2558 /** 2451 - * TMDB media ID 2559 + * TMDB movie ID or show ID 2452 2560 */ 2453 2561 mediaId: string; 2454 2562 }; 2455 - query?: never; 2563 + query?: { 2564 + /** 2565 + * Season number for season/episode items 2566 + */ 2567 + seasonNumber?: number; 2568 + /** 2569 + * Episode number for episode items 2570 + */ 2571 + episodeNumber?: number; 2572 + }; 2456 2573 url: '/lists/{slug}/items/{mediaType}/{mediaId}'; 2457 2574 }; 2458 2575 ··· 2478 2595 body?: never; 2479 2596 path: { 2480 2597 /** 2481 - * Media type (movie or show) 2598 + * Media type (movie, show, season, or episode) 2482 2599 */ 2483 2600 mediaType: string; 2484 2601 /** 2485 - * TMDB media ID 2602 + * TMDB movie ID or show ID 2486 2603 */ 2487 2604 mediaId: string; 2488 2605 }; 2489 - query?: never; 2606 + query?: { 2607 + /** 2608 + * Season number for season/episode items 2609 + */ 2610 + seasonNumber?: number; 2611 + /** 2612 + * Episode number for episode items 2613 + */ 2614 + episodeNumber?: number; 2615 + }; 2490 2616 url: '/lists/for-item/{mediaType}/{mediaId}'; 2491 2617 }; 2492 2618 ··· 2673 2799 2674 2800 export type SocialControllerGetWatchersResponse = SocialControllerGetWatchersResponses[keyof SocialControllerGetWatchersResponses]; 2675 2801 2802 + export type NotesControllerGetNoteData = { 2803 + body?: never; 2804 + path: { 2805 + userDid: string; 2806 + }; 2807 + query: { 2808 + /** 2809 + * Media type (movie, show, season, episode) 2810 + */ 2811 + mediaType: 'movie' | 'show' | 'season' | 'episode'; 2812 + /** 2813 + * TMDB movie ID or show ID 2814 + */ 2815 + mediaId: string; 2816 + /** 2817 + * Season number for season/episode items 2818 + */ 2819 + seasonNumber?: number; 2820 + /** 2821 + * Episode number for episode items 2822 + */ 2823 + episodeNumber?: number; 2824 + }; 2825 + url: '/notes/user/{userDid}'; 2826 + }; 2827 + 2828 + export type NotesControllerGetNoteErrors = { 2829 + /** 2830 + * Not authenticated 2831 + */ 2832 + 401: unknown; 2833 + }; 2834 + 2835 + export type NotesControllerGetNoteResponses = { 2836 + /** 2837 + * Note retrieved 2838 + */ 2839 + 200: NoteResponseDto; 2840 + }; 2841 + 2842 + export type NotesControllerGetNoteResponse = NotesControllerGetNoteResponses[keyof NotesControllerGetNoteResponses]; 2843 + 2844 + export type NotesControllerUpsertNoteData = { 2845 + body: UpsertNoteDto; 2846 + path?: never; 2847 + query?: never; 2848 + url: '/notes'; 2849 + }; 2850 + 2851 + export type NotesControllerUpsertNoteErrors = { 2852 + /** 2853 + * Not authenticated 2854 + */ 2855 + 401: unknown; 2856 + }; 2857 + 2858 + export type NotesControllerUpsertNoteResponses = { 2859 + /** 2860 + * Note upserted 2861 + */ 2862 + 200: NoteResponseDto; 2863 + }; 2864 + 2865 + export type NotesControllerUpsertNoteResponse = NotesControllerUpsertNoteResponses[keyof NotesControllerUpsertNoteResponses]; 2866 + 2867 + export type NotesControllerDeleteNoteData = { 2868 + body?: never; 2869 + path: { 2870 + noteId: string; 2871 + }; 2872 + query?: never; 2873 + url: '/notes/{noteId}'; 2874 + }; 2875 + 2876 + export type NotesControllerDeleteNoteErrors = { 2877 + /** 2878 + * Not authenticated 2879 + */ 2880 + 401: unknown; 2881 + }; 2882 + 2883 + export type NotesControllerDeleteNoteResponses = { 2884 + /** 2885 + * Note deleted 2886 + */ 2887 + 200: unknown; 2888 + }; 2889 + 2676 2890 export type ShelfControllerGetUserShelfData = { 2677 2891 body?: never; 2678 2892 path: { ··· 2687 2901 * Number of items to return per page 2688 2902 */ 2689 2903 pageSize?: number; 2904 + /** 2905 + * Filter by item type 2906 + */ 2907 + type?: 'movie' | 'episode'; 2908 + /** 2909 + * Search by title (case-insensitive partial match) 2910 + */ 2911 + search?: string; 2690 2912 }; 2691 2913 url: '/users/{userDid}/shelf'; 2692 2914 };