From 1bd2fa25e2214e0318a8a0d4cd4c4c513ddd800e Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Sat, 18 Jul 2026 06:45:45 -0400 Subject: [PATCH 01/31] feat: draft hero landing on the index route (#4055) Co-authored-by: Julius Marminge Co-authored-by: codex Signed-off-by: Yordis Prieto --- apps/web/src/components/AppSidebarLayout.tsx | 8 +- apps/web/src/components/ChatView.tsx | 492 +++++++++++++----- apps/web/src/components/Sidebar.logic.test.ts | 71 +++ apps/web/src/components/Sidebar.logic.ts | 92 +++- apps/web/src/components/chat/ChatComposer.tsx | 48 +- .../src/components/chat/DraftHeroHeadline.tsx | 114 ++++ .../src/components/chat/MessagesTimeline.tsx | 5 + .../chat/draftHeroTransition.test.ts | 123 +++++ .../components/chat/draftHeroTransition.ts | 82 +++ apps/web/src/hooks/useHandleNewThread.ts | 3 + apps/web/src/index.css | 71 +++ apps/web/src/routes/_chat.draft.$draftId.tsx | 33 +- apps/web/src/routes/_chat.index.tsx | 117 ++++- apps/web/src/state/entities.ts | 5 + apps/web/src/state/shell.ts | 31 ++ 15 files changed, 1102 insertions(+), 193 deletions(-) create mode 100644 apps/web/src/components/chat/DraftHeroHeadline.tsx create mode 100644 apps/web/src/components/chat/draftHeroTransition.test.ts create mode 100644 apps/web/src/components/chat/draftHeroTransition.ts diff --git a/apps/web/src/components/AppSidebarLayout.tsx b/apps/web/src/components/AppSidebarLayout.tsx index aefa9ab9f418..07ec0dc90778 100644 --- a/apps/web/src/components/AppSidebarLayout.tsx +++ b/apps/web/src/components/AppSidebarLayout.tsx @@ -1,5 +1,5 @@ import { useAtomValue } from "@effect/atom-react"; -import { useEffect, useRef, useState, type CSSProperties, type ReactNode } from "react"; +import { useEffect, useState, type CSSProperties, type ReactNode } from "react"; import { useLocation, useNavigate } from "@tanstack/react-router"; import { isElectron } from "../env"; @@ -56,8 +56,6 @@ function SidebarControl() { export function AppSidebarLayout({ children }: { children: ReactNode }) { const navigate = useNavigate(); const pathname = useLocation({ select: (location) => location.pathname }); - const pathnameRef = useRef(pathname); - pathnameRef.current = pathname; const isMacosDesktop = isElectron && isMacPlatform(navigator.platform); const [isWindowFullscreen, setIsWindowFullscreen] = useState(() => { const getWindowFullscreenState = window.desktopBridge?.getWindowFullscreenState; @@ -95,7 +93,7 @@ export function AppSidebarLayout({ children }: { children: ReactNode }) { const unsubscribe = onMenuAction((action) => { if (action === "open-settings") { - const isSettingsRoute = /^\/settings(\/|$)/.test(pathnameRef.current); + const isSettingsRoute = /^\/settings(\/|$)/.test(pathname); if (!isSettingsRoute) { void navigate({ to: "/settings" }); } @@ -105,7 +103,7 @@ export function AppSidebarLayout({ children }: { children: ReactNode }) { return () => { unsubscribe?.(); }; - }, [navigate]); + }, [navigate, pathname]); return ( diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index f5ea5bb1eba8..77951e7079ad 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -53,6 +53,7 @@ import { useRef, useState, } from "react"; +import { flushSync } from "react-dom"; import { useNavigate } from "@tanstack/react-router"; import { useShallow } from "zustand/react/shallow"; import { @@ -201,6 +202,7 @@ import { } from "../state/entities"; import { environmentShell } from "../state/shell"; import { ChatComposer, type ChatComposerHandle } from "./chat/ChatComposer"; +import { DraftHeroHeadline } from "./chat/DraftHeroHeadline"; import { ExpandedImageDialog } from "./chat/ExpandedImageDialog"; import { PullRequestThreadDialog } from "./PullRequestThreadDialog"; import { MessagesTimeline } from "./chat/MessagesTimeline"; @@ -212,6 +214,14 @@ import { resolveEffectiveEnvMode } from "./BranchToolbar.logic"; import { ProviderStatusBanner } from "./chat/ProviderStatusBanner"; import { ThreadErrorBanner } from "./chat/ThreadErrorBanner"; import { ComposerBannerStack, type ComposerBannerStackItem } from "./chat/ComposerBannerStack"; +import { + DRAFT_HERO_TRANSITION_ANIMATION_ID, + DRAFT_HERO_TRANSITION_DURATION_MS, + DRAFT_HERO_TRANSITION_EASING, + MOBILE_COMPOSER_VIEW_TRANSITION_NAME, + MOBILE_DRAFT_HEADLINE_VIEW_TRANSITION_NAME, + runMobileComposerTransition, +} from "./chat/draftHeroTransition"; import { MAX_HIDDEN_MOUNTED_TERMINAL_THREADS, buildExpiredTerminalContextToastCopy, @@ -256,6 +266,78 @@ const EMPTY_ACTIVITIES: OrchestrationThreadActivity[] = []; const EMPTY_PROVIDERS: ServerProvider[] = []; const EMPTY_PROVIDER_SKILLS: ServerProvider["skills"] = []; const EMPTY_PENDING_USER_INPUT_ANSWERS: Record = {}; +function useDraftHeroLayoutTransition(isDraftHeroState: boolean) { + const transitionGroupRef = useRef(null); + const composerAnchorRef = useRef(null); + const previousStateRef = useRef(isDraftHeroState); + const previousComposerRectRef = useRef(null); + const animationRef = useRef(null); + const attachTransitionGroupRef = (element: HTMLDivElement | null) => { + transitionGroupRef.current = element; + }; + const attachComposerAnchorRef = (element: HTMLDivElement | null) => { + composerAnchorRef.current = element; + }; + const captureComposerRect = () => { + previousComposerRectRef.current = composerAnchorRef.current?.getBoundingClientRect() ?? null; + }; + + useLayoutEffect(() => { + const transitionGroup = transitionGroupRef.current; + const nextComposerRect = composerAnchorRef.current?.getBoundingClientRect() ?? null; + const stateChanged = previousStateRef.current !== isDraftHeroState; + const prefersReducedMotion = + typeof window !== "undefined" && + window.matchMedia?.("(prefers-reduced-motion: reduce)").matches; + const mobileComposerTransitionActive = + typeof document !== "undefined" && + document.documentElement.dataset.mobileComposerRouteTransition === "true"; + + animationRef.current?.cancel(); + animationRef.current = null; + + const previousComposerRect = previousComposerRectRef.current; + if ( + stateChanged && + !prefersReducedMotion && + !mobileComposerTransitionActive && + transitionGroup && + previousComposerRect && + nextComposerRect && + typeof transitionGroup.animate === "function" + ) { + const translateX = previousComposerRect.left - nextComposerRect.left; + const translateY = previousComposerRect.top - nextComposerRect.top; + if (Math.abs(translateX) >= 0.5 || Math.abs(translateY) >= 0.5) { + const animation = transitionGroup.animate( + [ + { transform: `translate3d(${translateX}px, ${translateY}px, 0)` }, + { transform: "translate3d(0, 0, 0)" }, + ], + { + duration: DRAFT_HERO_TRANSITION_DURATION_MS, + easing: DRAFT_HERO_TRANSITION_EASING, + }, + ); + animation.id = DRAFT_HERO_TRANSITION_ANIMATION_ID; + animationRef.current = animation; + void animation.finished + .catch(() => undefined) + .then(() => { + if (animationRef.current !== animation) { + return; + } + animationRef.current = null; + }); + } + } + + previousStateRef.current = isDraftHeroState; + previousComposerRectRef.current = nextComposerRect; + }, [isDraftHeroState]); + + return [attachTransitionGroupRef, attachComposerAnchorRef, captureComposerRect] as const; +} const PreviewPanel = lazy(() => import("./preview/PreviewPanel").then((module) => ({ default: module.PreviewPanel })), ); @@ -339,6 +421,7 @@ type ChatViewProps = threadId: ThreadId; onDiffPanelOpen?: () => void; reserveTitleBarControlInset?: boolean; + forceExpandedMobileComposer?: boolean; routeKind: "server"; draftId?: never; } @@ -347,6 +430,7 @@ type ChatViewProps = threadId: ThreadId; onDiffPanelOpen?: () => void; reserveTitleBarControlInset?: boolean; + forceExpandedMobileComposer?: boolean; routeKind: "draft"; draftId: DraftId; }; @@ -979,6 +1063,14 @@ const PersistentThreadTerminalPanel = memo(function PersistentThreadTerminalPane ); }); +// Errors surface through two maps (draft-keyed and thread-keyed) whose entries +// can race around promotion, so each write carries its time to let the latest +// one win when they collide. +type LocalThreadErrorEntry = { + readonly message: string | null; + readonly at: number; +}; + function ChatViewContent(props: ChatViewProps) { const { environmentId, @@ -986,6 +1078,7 @@ function ChatViewContent(props: ChatViewProps) { routeKind, onDiffPanelOpen, reserveTitleBarControlInset = true, + forceExpandedMobileComposer = false, } = props; const draftId = routeKind === "draft" ? props.draftId : null; const routeThreadRef = useMemo( @@ -1035,10 +1128,10 @@ function ChatViewContent(props: ChatViewProps) { ); const composerDraftTarget: ScopedThreadRef | DraftId = routeKind === "server" ? routeThreadRef : props.draftId; - const serverThread = useThread(routeKind === "server" ? routeThreadRef : null); + const serverThread = useThread(routeThreadRef); const markThreadVisited = useUiStateStore((store) => store.markThreadVisited); - const activeThreadLastVisitedAt = useUiStateStore((store) => - routeKind === "server" ? store.threadLastVisitedAtById[routeThreadKey] : undefined, + const activeThreadLastVisitedAt = useUiStateStore( + (store) => store.threadLastVisitedAtById[routeThreadKey], ); const settings = useEnvironmentSettings(environmentId); const setStickyComposerModelSelection = useComposerDraftStore( @@ -1103,10 +1196,10 @@ function ChatViewContent(props: ChatViewProps) { const optimisticUserMessagesRef = useRef(optimisticUserMessages); optimisticUserMessagesRef.current = optimisticUserMessages; const [localDraftErrorsByDraftId, setLocalDraftErrorsByDraftId] = useState< - Record + Record >({}); const [localServerErrorsByThreadKey, setLocalServerErrorsByThreadKey] = useState< - Record + Record >({}); const [isConnecting, _setIsConnecting] = useState(false); const [isRevertingCheckpoint, setIsRevertingCheckpoint] = useState(false); @@ -1218,11 +1311,45 @@ function ChatViewContent(props: ChatViewProps) { ? scopeProjectRef(draftThread.environmentId, draftThread.projectId) : null; const fallbackDraftProject = useProject(fallbackDraftProjectRef); - const localDraftError = - routeKind === "server" && serverThread - ? null - : ((draftId ? localDraftErrorsByDraftId[draftId] : null) ?? null); - const localServerError = localServerErrorsByThreadKey[routeThreadKey] ?? null; + const localDraftError = serverThread + ? null + : ((draftId ? localDraftErrorsByDraftId[draftId]?.message : null) ?? null); + const localServerError = localServerErrorsByThreadKey[routeThreadKey]?.message ?? null; + // Draft errors are keyed by draftId while server errors are keyed by thread + // key, so a pending draft entry must migrate when the server thread loads or + // a failed send would silently disappear on promotion. When both keys hold + // an entry, the most recent write wins. + useEffect(() => { + if (!serverThread || !draftId) { + return; + } + const pendingDraftEntry = localDraftErrorsByDraftId[draftId]; + if (pendingDraftEntry === undefined) { + return; + } + setLocalDraftErrorsByDraftId((existing) => { + if (existing[draftId] === undefined) { + return existing; + } + const next = { ...existing }; + delete next[draftId]; + return next; + }); + setLocalServerErrorsByThreadKey((existing) => { + const currentEntry = existing[routeThreadKey]; + if ( + currentEntry !== undefined && + (currentEntry.at > pendingDraftEntry.at || + currentEntry.message === pendingDraftEntry.message) + ) { + return existing; + } + return { + ...existing, + [routeThreadKey]: pendingDraftEntry, + }; + }); + }, [draftId, localDraftErrorsByDraftId, routeThreadKey, serverThread]); const localDraftThread = useMemo( () => draftThread @@ -1237,7 +1364,10 @@ function ChatViewContent(props: ChatViewProps) { : undefined, [draftThread, fallbackDraftProject?.defaultModelSelection, threadId], ); - const isServerThread = routeKind === "server" && serverThread !== null; + // Promotion is data-driven: the draft route keeps rendering while the + // server thread (same pre-allocated ref) starts, so live state must not + // depend on which route is mounted. + const isServerThread = serverThread !== null; const activeThread = isServerThread ? serverThread : localDraftThread; const threadError = isServerThread ? (localServerError ?? serverThread?.session?.lastError ?? null) @@ -2063,6 +2193,16 @@ function ChatViewContent(props: ChatViewProps) { deriveTimelineEntries(timelineMessages, activeThread?.proposedPlans ?? [], workLogEntries), [activeThread?.proposedPlans, timelineMessages, workLogEntries], ); + const [dockedDraftHeroThreadKey, setDockedDraftHeroThreadKey] = useState(null); + const draftHeroDockRequested = + activeThreadKey !== null && dockedDraftHeroThreadKey === activeThreadKey; + const isDraftHeroState = + isLocalDraftThread && timelineEntries.length === 0 && !isWorking && !draftHeroDockRequested; + const [ + attachDraftHeroTransitionGroupRef, + attachDraftHeroComposerAnchorRef, + captureDraftHeroComposerRect, + ] = useDraftHeroLayoutTransition(isDraftHeroState); const { turnDiffSummaries, inferredCheckpointTurnCountByTurnId } = useTurnDiffSummaries(activeThread); const turnDiffSummaryByAssistantMessageId = useMemo(() => { @@ -2226,6 +2366,7 @@ function ChatViewContent(props: ChatViewProps) { (targetThreadId: ThreadId | null, error: string | null) => { if (!targetThreadId) return; const nextError = sanitizeThreadErrorMessage(error); + const nextEntry: LocalThreadErrorEntry = { message: nextError, at: Date.now() }; if ( serverThread && targetThreadId === routeThreadRef.threadId && @@ -2233,24 +2374,24 @@ function ChatViewContent(props: ChatViewProps) { serverThread.id === targetThreadId ) { setLocalServerErrorsByThreadKey((existing) => { - if ((existing[routeThreadKey] ?? null) === nextError) { + if ((existing[routeThreadKey]?.message ?? null) === nextError) { return existing; } return { ...existing, - [routeThreadKey]: nextError, + [routeThreadKey]: nextEntry, }; }); return; } const localDraftErrorKey = draftId ?? targetThreadId; setLocalDraftErrorsByDraftId((existing) => { - if ((existing[localDraftErrorKey] ?? null) === nextError) { + if ((existing[localDraftErrorKey]?.message ?? null) === nextError) { return existing; } return { ...existing, - [localDraftErrorKey]: nextError, + [localDraftErrorKey]: nextEntry, }; }); }, @@ -3963,7 +4104,16 @@ function ChatViewContent(props: ChatViewProps) { } return; } - if (!activeProject) return; + if (!activeProject) { + toastManager.add( + stackedThreadToast({ + type: "warning", + title: "Choose a project first", + description: "This draft no longer points to an available project.", + }), + ); + return; + } const threadIdForSend = activeThread.id; const isFirstMessage = !isServerThread || activeThread.messages.length === 0; const baseBranchForWorktree = @@ -3981,6 +4131,21 @@ function ChatViewContent(props: ChatViewProps) { } sendInFlightRef.current = true; + if (isDraftHeroState && activeThreadKey) { + let resolveDockStarted: (() => void) | undefined; + const dockStarted = new Promise((resolve) => { + resolveDockStarted = resolve; + }); + const dockTransition = runMobileComposerTransition(() => { + flushSync(() => { + captureDraftHeroComposerRect(); + setDockedDraftHeroThreadKey(activeThreadKey); + }); + resolveDockStarted?.(); + }); + void dockTransition.catch(() => resolveDockStarted?.()); + await dockStarted; + } beginLocalDispatch({ preparingWorktree: Boolean(baseBranchForWorktree) }); const composerImagesSnapshot = [...composerImages]; @@ -4234,6 +4399,9 @@ function ChatViewContent(props: ChatViewProps) { } sendInFlightRef.current = false; if (!turnStartSucceeded) { + setDockedDraftHeroThreadKey((currentThreadKey) => + currentThreadKey === activeThreadKey ? null : currentThreadKey, + ); resetLocalDispatch(); } }; @@ -5101,6 +5269,7 @@ function ChatViewContent(props: ChatViewProps) { contentInsetEndAdjustment={composerOverlayHeight} onIsAtEndChange={onIsAtEndChange} onManualNavigation={cancelTimelineLiveFollowForUserNavigation} + hideEmptyPlaceholder={isDraftHeroState} /> {/* scroll to end pill — shown when user has scrolled away from the live edge */} @@ -5123,134 +5292,187 @@ function ChatViewContent(props: ChatViewProps) { )} - {/* Input bar */} + {/* Input bar — centered hero while a draft has no messages, docked at the bottom otherwise */}
-
From da3c2030f710c4e1243035613eda94f6526afa1f Mon Sep 17 00:00:00 2001 From: Maxwell Young Date: Sat, 18 Jul 2026 23:40:34 +1200 Subject: [PATCH 15/31] [codex] canonicalize client timestamps (#4112) --- .../src/orchestration/Normalizer.test.ts | 73 +++++++++++++++++++ apps/server/src/orchestration/Normalizer.ts | 63 ++++++++++++---- 2 files changed, 122 insertions(+), 14 deletions(-) create mode 100644 apps/server/src/orchestration/Normalizer.test.ts diff --git a/apps/server/src/orchestration/Normalizer.test.ts b/apps/server/src/orchestration/Normalizer.test.ts new file mode 100644 index 000000000000..113b6e1baeed --- /dev/null +++ b/apps/server/src/orchestration/Normalizer.test.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from "vite-plus/test"; +import { + CommandId, + type ClientOrchestrationCommand, + MessageId, + ProjectId, + ProviderInstanceId, + ThreadId, +} from "@t3tools/contracts"; + +import { canonicalizeClientCommandTimestamps } from "./Normalizer.ts"; + +const clientCreatedAt = "2031-01-01T00:00:00.000Z"; +const serverReceivedAt = "2026-07-18T00:00:00.000Z"; + +describe("canonicalizeClientCommandTimestamps", () => { + it("replaces a client command timestamp with the server receipt timestamp", () => { + const command: ClientOrchestrationCommand = { + type: "project.create", + commandId: CommandId.make("command-1"), + projectId: ProjectId.make("project-1"), + title: "Clock-safe project", + workspaceRoot: "/tmp/clock-safe-project", + createdAt: clientCreatedAt, + }; + + expect(canonicalizeClientCommandTimestamps(command, serverReceivedAt)).toEqual({ + ...command, + createdAt: serverReceivedAt, + }); + }); + + it("replaces both timestamps when the first turn bootstraps a thread", () => { + const command: ClientOrchestrationCommand = { + type: "thread.turn.start", + commandId: CommandId.make("command-2"), + threadId: ThreadId.make("thread-1"), + message: { + messageId: MessageId.make("message-1"), + role: "user", + text: "Start a thread", + attachments: [], + }, + runtimeMode: "full-access", + interactionMode: "default", + bootstrap: { + createThread: { + projectId: ProjectId.make("project-1"), + title: "Clock-safe thread", + modelSelection: { + instanceId: ProviderInstanceId.make("codex"), + model: "gpt-5.4", + }, + runtimeMode: "full-access", + interactionMode: "default", + branch: null, + worktreePath: null, + createdAt: clientCreatedAt, + }, + }, + createdAt: clientCreatedAt, + }; + + const result = canonicalizeClientCommandTimestamps(command, serverReceivedAt); + + expect(result.type).toBe("thread.turn.start"); + if (result.type !== "thread.turn.start") { + throw new Error("Expected a thread.turn.start command"); + } + expect(result.createdAt).toBe(serverReceivedAt); + expect(result.bootstrap?.createThread?.createdAt).toBe(serverReceivedAt); + }); +}); diff --git a/apps/server/src/orchestration/Normalizer.ts b/apps/server/src/orchestration/Normalizer.ts index bed166eba45d..24c65900b296 100644 --- a/apps/server/src/orchestration/Normalizer.ts +++ b/apps/server/src/orchestration/Normalizer.ts @@ -1,8 +1,10 @@ +import * as DateTime from "effect/DateTime"; import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; import * as Path from "effect/Path"; import { type ClientOrchestrationCommand, + type IsoDateTime, type OrchestrationCommand, OrchestrationDispatchCommandError, PROVIDER_SEND_TURN_MAX_IMAGE_BYTES, @@ -13,8 +15,38 @@ import { ServerConfig } from "../config.ts"; import { parseBase64DataUrl } from "../imageMime.ts"; import * as WorkspacePaths from "../workspace/WorkspacePaths.ts"; +export const canonicalizeClientCommandTimestamps = ( + command: ClientOrchestrationCommand, + receivedAt: IsoDateTime, +): ClientOrchestrationCommand => { + const canonicalCommand = + "createdAt" in command + ? { + ...command, + createdAt: receivedAt, + } + : command; + + if (canonicalCommand.type !== "thread.turn.start" || !canonicalCommand.bootstrap?.createThread) { + return canonicalCommand; + } + + return { + ...canonicalCommand, + bootstrap: { + ...canonicalCommand.bootstrap, + createThread: { + ...canonicalCommand.bootstrap.createThread, + createdAt: receivedAt, + }, + }, + }; +}; + export const normalizeDispatchCommand = (command: ClientOrchestrationCommand) => Effect.gen(function* () { + const receivedAt = DateTime.formatIso(yield* DateTime.now); + const canonicalCommand = canonicalizeClientCommandTimestamps(command, receivedAt); const fileSystem = yield* FileSystem.FileSystem; const path = yield* Path.Path; const serverConfig = yield* ServerConfig; @@ -47,30 +79,33 @@ export const normalizeDispatchCommand = (command: ClientOrchestrationCommand) => ), ); - if (command.type === "project.create") { + if (canonicalCommand.type === "project.create") { return { - ...command, + ...canonicalCommand, workspaceRoot: yield* normalizeProjectWorkspaceRootForCreate( - command.workspaceRoot, - command.createWorkspaceRootIfMissing, + canonicalCommand.workspaceRoot, + canonicalCommand.createWorkspaceRootIfMissing, ), - createWorkspaceRootIfMissing: command.createWorkspaceRootIfMissing === true, + createWorkspaceRootIfMissing: canonicalCommand.createWorkspaceRootIfMissing === true, } satisfies OrchestrationCommand; } - if (command.type === "project.meta.update" && command.workspaceRoot !== undefined) { + if ( + canonicalCommand.type === "project.meta.update" && + canonicalCommand.workspaceRoot !== undefined + ) { return { - ...command, - workspaceRoot: yield* normalizeProjectWorkspaceRoot(command.workspaceRoot), + ...canonicalCommand, + workspaceRoot: yield* normalizeProjectWorkspaceRoot(canonicalCommand.workspaceRoot), } satisfies OrchestrationCommand; } - if (command.type !== "thread.turn.start") { - return command as OrchestrationCommand; + if (canonicalCommand.type !== "thread.turn.start") { + return canonicalCommand as OrchestrationCommand; } const normalizedAttachments = yield* Effect.forEach( - command.message.attachments, + canonicalCommand.message.attachments, (attachment) => Effect.gen(function* () { const parsed = parseBase64DataUrl(attachment.dataUrl); @@ -87,7 +122,7 @@ export const normalizeDispatchCommand = (command: ClientOrchestrationCommand) => }); } - const attachmentId = createAttachmentId(command.threadId); + const attachmentId = createAttachmentId(canonicalCommand.threadId); if (!attachmentId) { return yield* new OrchestrationDispatchCommandError({ message: "Failed to create a safe attachment id.", @@ -135,9 +170,9 @@ export const normalizeDispatchCommand = (command: ClientOrchestrationCommand) => ); return { - ...command, + ...canonicalCommand, message: { - ...command.message, + ...canonicalCommand.message, attachments: normalizedAttachments, }, } satisfies OrchestrationCommand; From 5c66110e269cc5a852763e5f06a81f2a763d3181 Mon Sep 17 00:00:00 2001 From: ss <69873514+sandersonstabo@users.noreply.github.com> Date: Sat, 18 Jul 2026 13:50:33 +0200 Subject: [PATCH 16/31] [fix/feat:ui] Make selected menu checks blue (#3234) Co-authored-by: Julius Marminge Co-authored-by: codex --- apps/web/src/components/chat/ChatComposer.tsx | 28 ++-- apps/web/src/components/chat/TraitsPicker.tsx | 145 ++++++++++-------- apps/web/src/components/ui/menu.tsx | 46 +++--- 3 files changed, 131 insertions(+), 88 deletions(-) diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index db26fa55a739..6ec2e631d198 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -95,6 +95,7 @@ import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip"; import { toastManager } from "../ui/toast"; import { BotIcon, + CheckIcon, CircleAlertIcon, ListTodoIcon, PencilRulerIcon, @@ -273,16 +274,25 @@ const ComposerFooterModeControls = memo(function ComposerFooterModeControls(prop {runtimeModeOptions.map((mode) => { const option = runtimeModeConfig[mode]; const OptionIcon = option.icon; + const isSelected = props.runtimeMode === mode; return ( - -
- - - {option.label} - - - {option.description} - + +
+
+ + + {option.label} + + + {option.description} + +
+
); diff --git a/apps/web/src/components/chat/TraitsPicker.tsx b/apps/web/src/components/chat/TraitsPicker.tsx index 91e14f20a91f..714ee4239f39 100644 --- a/apps/web/src/components/chat/TraitsPicker.tsx +++ b/apps/web/src/components/chat/TraitsPicker.tsx @@ -16,7 +16,7 @@ import { } from "@t3tools/shared/model"; import { memo, useCallback, useState } from "react"; import type { VariantProps } from "class-variance-authority"; -import { ChevronDownIcon } from "lucide-react"; +import { CheckIcon, ChevronDownIcon } from "lucide-react"; import { Button, buttonVariants } from "../ui/button"; import { Menu, @@ -297,67 +297,90 @@ export const TraitsMenuContent = memo(function TraitsMenuContentImpl({ return ( <> - {selectDescriptors.map((descriptor, index) => ( -
- {index > 0 ? : null} - -
- {descriptor.label} -
- {ultrathinkInBodyText && descriptor.id === primarySelectDescriptor?.id ? ( -
- Your prompt contains "ultrathink" in the text. Remove it to change this - option. + {selectDescriptors.map((descriptor, index) => { + const selectedValue = + ultrathinkPromptControlled && descriptor.id === primarySelectDescriptor?.id + ? "ultrathink" + : (getDescriptorStringValue(descriptor) ?? ""); + + return ( +
+ {index > 0 ? : null} + +
+ {descriptor.label} +
+ {ultrathinkInBodyText && descriptor.id === primarySelectDescriptor?.id ? ( +
+ Your prompt contains "ultrathink" in the text. Remove it to change this + option. +
+ ) : null} + handleSelectChange(descriptor, value)} + > + {descriptor.options.map((option) => ( + + + + {option.label} + {option.isDefault ? ( + <> + {" "} + + + ) : null} + + {option.id === selectedValue ? ( + + ) : null} + + + ))} + +
+
+ ); + })} + {booleanDescriptors.map((descriptor, index) => { + const selectedValue = descriptor.currentValue === true ? "on" : "off"; + + return ( +
+ {index > 0 || selectDescriptors.length > 0 ? : null} + +
+ {descriptor.label}
- ) : null} - handleSelectChange(descriptor, value)} - > - {descriptor.options.map((option) => ( - - {option.label} - {option.isDefault ? ( - <> - {" "} - - - ) : null} - - ))} - -
-
- ))} - {booleanDescriptors.map((descriptor, index) => ( -
- {index > 0 || selectDescriptors.length > 0 ? : null} - -
- {descriptor.label} -
- { - updateDescriptors( - replaceDescriptorCurrentValue(descriptors, descriptor.id, value === "on"), - ); - }} - > - On - Off - -
-
- ))} + { + updateDescriptors( + replaceDescriptorCurrentValue(descriptors, descriptor.id, value === "on"), + ); + }} + > + {(["on", "off"] as const).map((value) => ( + + + {value === "on" ? "On" : "Off"} + {value === selectedValue ? ( + + ) : null} + + + ))} + + +
+ ); + })} ); }); diff --git a/apps/web/src/components/ui/menu.tsx b/apps/web/src/components/ui/menu.tsx index 07e27d23f46b..e9ee42c8f65a 100644 --- a/apps/web/src/components/ui/menu.tsx +++ b/apps/web/src/components/ui/menu.tsx @@ -147,32 +147,42 @@ function MenuRadioGroup(props: MenuPrimitive.RadioGroup.Props) { return ; } -function MenuRadioItem({ className, children, ...props }: MenuPrimitive.RadioItem.Props) { +function MenuRadioItem({ + className, + children, + hideIndicator = false, + ...props +}: MenuPrimitive.RadioItem.Props & { + hideIndicator?: boolean; +}) { return ( - - - - - - {children} + {hideIndicator ? null : ( + + + + + + )} + {children} ); } From bf76535fe4da71d8de7b8bd5ffa0d2086b7af8d0 Mon Sep 17 00:00:00 2001 From: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Date: Sat, 18 Jul 2026 17:24:13 +0530 Subject: [PATCH 17/31] fix(desktop): Validate WSL node version against engine range after probe success (#3621) Co-authored-by: Julius Marminge --- .../src/wsl/DesktopWslEnvironment.test.ts | 24 ++++++++++ apps/desktop/src/wsl/DesktopWslEnvironment.ts | 46 +++++++++++++++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/apps/desktop/src/wsl/DesktopWslEnvironment.test.ts b/apps/desktop/src/wsl/DesktopWslEnvironment.test.ts index cdb3fc782861..895d246e3689 100644 --- a/apps/desktop/src/wsl/DesktopWslEnvironment.test.ts +++ b/apps/desktop/src/wsl/DesktopWslEnvironment.test.ts @@ -16,6 +16,7 @@ import { formatNodePtyProbeFailureReason, formatWslShellTransportFailureReason, parseNodePath, + parseNodeVersion, parseResolvedPath, parseToolchainReport, probeWslDistros, @@ -173,6 +174,29 @@ describe("parseNodePath", () => { }); }); +describe("parseNodeVersion", () => { + it("extracts the node version from a nodeVersion: line", () => { + expect(parseNodeVersion("nodeVersion:24.10.0")).toBe("24.10.0"); + }); + + it("returns null when the version value is empty", () => { + expect(parseNodeVersion("nodeVersion:")).toBeNull(); + }); + + it("returns null when there is no nodeVersion line at all", () => { + expect(parseNodeVersion("nodePath:/usr/bin/node\nresolvedPath:/usr/bin")).toBeNull(); + }); + + it("ignores surrounding noise and trims whitespace", () => { + const stdout = [ + "some preamble noise", + " nodeVersion:22.16.0 ", + "nodePath:/usr/bin/node", + ].join("\n"); + expect(parseNodeVersion(stdout)).toBe("22.16.0"); + }); +}); + describe("parseResolvedPath", () => { it("preserves spaces and apostrophes in the resolved login-shell PATH", () => { const resolvedPath = "/home/test user/bin:/opt/test's tools/bin:/usr/bin:/bin"; diff --git a/apps/desktop/src/wsl/DesktopWslEnvironment.ts b/apps/desktop/src/wsl/DesktopWslEnvironment.ts index b38675f0e1f7..c6c274d8500b 100644 --- a/apps/desktop/src/wsl/DesktopWslEnvironment.ts +++ b/apps/desktop/src/wsl/DesktopWslEnvironment.ts @@ -32,7 +32,11 @@ export interface EnsureWslNodePtyOptions { } export type EnsureWslNodePtyResult = - | { readonly ok: true; readonly nodePath: string; readonly resolvedPath: string } + | { + readonly ok: true; + readonly nodePath: string; + readonly resolvedPath: string; + } | { readonly ok: false; readonly reason: string; @@ -222,6 +226,7 @@ export const formatNodePtyProbeFailureReason = (exitCode: number): string | null const NODE_PTY_PROBE_SCRIPT = ( linuxServerDir: string, ) => `printf 'nodePath:%s\\n' "$(command -v node 2>/dev/null)" +printf 'nodeVersion:%s\\n' "$(node -p 'process.versions.node' 2>/dev/null)" printf 'resolvedPath:%s\\n' "$PATH" cd ${shellQuote(linuxServerDir)} && node <<'NODE' >/dev/null 2>&1 // The server bundle externalizes its deps to node_modules, and the WSL Node @@ -318,6 +323,16 @@ export const parseNodePath = (stdout: string): string | null => { return path ?? null; }; +export const parseNodeVersion = (stdout: string): string | null => { + const version = stdout + .split("\n") + .map((line) => line.trim()) + .filter((line) => line.startsWith("nodeVersion:")) + .map((line) => line.slice("nodeVersion:".length).trim()) + .find((value) => value.length > 0); + return version ?? null; +}; + // Captures the login-shell PATH after the shared resolver has loaded version // managers. Preserve the value byte-for-byte apart from a Windows-style CR so // paths containing spaces or apostrophes can be forwarded as one env argv. @@ -404,7 +419,11 @@ const ensureNodePtyImpl = ( const transportFailureReason = formatWslShellTransportFailureReason(probe.transportFailure); if (transportFailureReason !== null) { - return { ok: false, reason: transportFailureReason, fatal: false } as const; + return { + ok: false, + reason: transportFailureReason, + fatal: false, + } as const; } // No node at all, even after the shared resolver repaired PATH. Surface @@ -457,12 +476,31 @@ const ensureNodePtyImpl = ( } as const; } - if (probe.exitCode === 0) return { ok: true, nodePath, resolvedPath } as const; + if (probe.exitCode === 0) { + const rawVersion = parseNodeVersion(probe.stdout); + if ( + rawVersion !== null && + options.nodeEngineRange && + !satisfiesSemverRange(rawVersion, options.nodeEngineRange.trim()) + ) { + const range = options.nodeEngineRange.trim(); + return { + ok: false, + reason: `WSL Node.js ${rawVersion} does not satisfy the server's required engine range (${range}). Install a compatible version, and restart the desktop app.`, + fatal: true, + } as const; + } + return { ok: true, nodePath, resolvedPath } as const; + } if (options.allowBuild !== true) { const packagedProbeFailure = formatNodePtyProbeFailureReason(probe.exitCode); if (packagedProbeFailure !== null) { - return { ok: false, reason: packagedProbeFailure, fatal: true } as const; + return { + ok: false, + reason: packagedProbeFailure, + fatal: true, + } as const; } } From ebe8afb1df357423a0e036b388af3e739d640205 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sat, 18 Jul 2026 15:44:06 +0200 Subject: [PATCH 18/31] Refresh splash screen and favicon branding (#4120) --- apps/web/public/apple-touch-icon.png | Bin 75497 -> 113787 bytes apps/web/public/favicon-16x16.png | Bin 1003 -> 2126 bytes apps/web/public/favicon-32x32.png | Bin 3121 -> 5661 bytes apps/web/public/favicon.ico | Bin 208875 -> 283825 bytes assets/README.md | 2 +- scripts/build-desktop-artifact.test.ts | 6 ++++++ scripts/build-desktop-artifact.ts | 14 +++++++++++++- scripts/export-brand-icons.ts | 12 +++++++++++- scripts/lib/brand-assets.test.ts | 22 ++++++++++++++++++++++ scripts/lib/brand-assets.ts | 5 +++++ 10 files changed, 58 insertions(+), 3 deletions(-) diff --git a/apps/web/public/apple-touch-icon.png b/apps/web/public/apple-touch-icon.png index e0e1b9659b83e527b991094b50bb8d1fd8f87af3..3eed25ea6b7850fc2594ac509e91c29f1710f708 100644 GIT binary patch literal 113787 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 literal 75497 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%0D*?&h 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

    >_glvUqWu*CR(U}o1G{g*~ZAmL($054K9qj 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 Xrs|QSIH7Nc00000NkvXXu0mjf#%fYq diff --git a/apps/web/public/favicon-16x16.png b/apps/web/public/favicon-16x16.png index 673d84599981c10c9a819c4e17e817b978ef57b7..a3431b8c6dfef80cb22f502cc52e4680045dbe7b 100644 GIT binary patch delta 2125 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 P00000NkvXXu0mjfEmqER diff --git a/apps/web/public/favicon-32x32.png b/apps/web/public/favicon-32x32.png index 25bcc95d4aaa0639e93247795ebd57a9b947434a..862f7629971facba7a28ca61dc2a491e30495973 100644 GIT binary patch literal 5661 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 D_v5rp literal 3121 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 LNkvXXu0mjfv>i2c diff --git a/apps/web/public/favicon.ico b/apps/web/public/favicon.ico index 36975b99782755a6bc000c800cbeb54aa258a063..750da22602eecab3f8cc8ffae34d6b4a0396084a 100644 GIT binary patch literal 283825 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

    WSHY%EIP$mZtM*tt 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�yj(wY-}l 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≫Y!OBCk z{B?a6&P%J-kG?))*gts*Zq*kA`Js}H!39fN(rbHfJfr$9g(rN|vIALc=F%A2bm#aq zSNYnJ10T33?G-D-K`u=W#>?c|tqY-4<|8i;+Du{r5+o0}uAC4^tJHU;T6jXP456*% zT9!1PeEMni=DP4Wpe$@W3P@Jdrqm~@^&kIZ{0Dd%%8&bao~(L`BXyf|{xRskH2-H& z^W*N(otN$;N?$AffLUt#w&e=>{O}7dm(RbDCP;^jO9Vb5g#15(9=ORis;>DGG!On| z7tRB4;HKYC?EKId&Vj!C>L0vtH*xcb`_kP3__Y%!y}B1@-$Pz)f3AuAH@*CW{rQ$( zVs%f4#yj`v;N2bYACBLjZzsCnZneh|xdY$0Cx08tcHoC{^hdtlo!49P*k3yv;Pd6!O+Nsnu5hcyf#b9}?lR#J852m>^U;#!4a>JM0?hm&|P8#4EG6wk|xk ziyiX|eZ8{XwNrd!xUVN(iBcZDvw)VIs!N^=|Ff`q7ZoqoB0p8^Y=gZ7n6I!g71T$G zM`%_~cATkqN%;t!_)^+w{0JRy62}DOUUJXGG;&k-D>PC%%C}-o5ri8;FZpdXaBfXl z+@Zl?9IW9~={@EhV49;!58SY46~3%H6Lo-evL1Vb8*0zOYoLpS1m$PM6g{3Sjt2-W zM-~7aXeXd>X>!%TuYI#RRMuBOS`ki}7GMt5@K7CQveGEF9Nk!3;@i}Tj%zbVv9Rf^ z{&$9pN2yG6$NsuAc~cX|7J9&8X5c~+(0(c>3#J1RWH5u|vfgOrX#J^Dsy;ME{=Dj& zz;AkNtKO0gpXyO<3}mH;66i5nt51%~+F4Ln3m+eoe|a*1{r@`Ic*Js~hZPRi**SQN zE`n)OdK)ZfiTx+zD3<}vM&m1i-*cbHlKl&ktOn}0ao!Yu!dpKMhFUY_7N%WAs1>=Izt-Mq;Lp|4yUM4HhtdspG#Qu+9fw=` z3CZN&LvrpXYE%1PYF9={qFY**ausvU!8toZz7V#+iKfgG){KJczx!0qp?QjWr{_x^bJJPM~i-di?)+jq8sDw$^^@?OcNeqZ-Q`JqvUTno+ken+N9TU|#ee?Nx!~L{yzu2`kFs%zWSik0Cl=0~Emi zSCWID#xDH(Y>0)g=y@Q2#Y05lU5O81OXJ_G@3b7jL*mguZ~m$;{iDs$crtP+*Q~fF z@utw|?T+1}&<%p&XApxRehwE-?RKw_GogMdFPTX{qXWjD}8fNzqU}Z zDPi2~yd@*CBMd<9&34bjQ6``Qp5&X-$@MWBKJCD-7Q1S0@H$+cxPaHG&+}QR=Ro>x^Xh8ZY3m0^M)J)@ z0qU*wU-Bv))cy?2s|b$#Bd}>py^SyYQ+d^=^hWnauYNq`kS-FRpK0(y}N`v=udUo%Pbu;^i3`lEnu^CQ&IU20c}lKQeB(ZBt*dI|J` z&9dz1SqR*-f0YQjpp#WyI2={^Zc!$~n@YRV$~14RedSS3^;x=J9}(^&Uxad%XA-ftl=odirT2TsjR z3xWyfU5R$9wRalwIpEKJ@u$AHt<0!VW=wYKczBS^m>d8}*qM#zw1DT)K*?ywLf@xc zhSb9cw6PRN(1pZ&Rz4?O8{?~w1UPZ9zu1>X>V4uY$MQC#x2bBFO_Y2BF*K||9t<1=0$K0FZx>@Hu z_`u#pa3Lw+-^@1C#8kOi82v1e(cyx!>SOAFsd3wGaPF_B*2W(c>pJqoW3Q;mVdRgwSF#O&nGSYF?EJoonqn*cI7Lo6IBH z6$$B8uNE{)>|d-ujptr?phX}*@RI~MdNsPoL+-iI z)2~fJ7pj0Fz1IgU_S3_v?<1GzUpeRbsp9=V{kdasmUG$U3B}>FP$~Tw%4^a5^sy{P z{-Z1euCXEUrnikCCmY`6y;0^{691H{GyC_&AG0th{+JU5s~0{& z7OY+7rJoG&8UTS8(bq{GQMY-sm$xXNTuVazE1DIMhc3u?C1FH%ZL%1<|tb1IeXSukq2s%=+&!1mPHr z>FHh#?|D~x@t!Py?lNVkCzov+V8^)I0KTk&zhk_WidM-l`ek{LG=UiNxw2U|C#zvm z#~C}Z5nM9g{-)TG-pV!o4zvp&JN2UX8w6Bv1vDFPe!E_R995DWdG)XJUD*C&_>pHWL~e#MlbGFThNS*`KKn(lxTj5R*RnZ*TB!|} z%TAtUc9ARBd3m*roBBVBZ+e8W;$A7+Rqd8}mC6ag$zGjT2hd?*e_rIdWvy!mW`P;s z5#&Dz*d^^%dr%osE|Vwd8UF~a6+&7v{)xORhUvH7o$~p*1g66M=8@=k7~< zX)v4%?4;wnzm7KrXm=(xp1*vC_+6k6YsbFM7|>DT&!dl)zro#?9!>h=+bikua69u; z!n+?`Z3WnP6u{NFmQUuxJ20|?Y5ZBZ_0qTU8xMW5A6F87Ht0?Pf8>sXd*dhITfi;R z5Qb&d#zFDNEX+GAi62+_De3Em7N|2L8)SFtWp$+r(IMl$zlS<$I1OD_DL&RpRR~ zTkSUY9d z9K8=#k5*cq{5&Q~D*%@?lmTauiyphWqiTEK3iC*hORpJWr6T} zl^X}jleEH93yh;L zQt|fz__BKN0r;fvd_N!3m2nuf(TTw-=-eX?-Ou6{DC?F zmJ-*SrCz=CWb^}G|Mk?Pz(+QtXm;~&Hh*l-mOs*6^47z-dO(^UX&hny8NBYq(ZgKX zdPZ-2HQ@4!W-@vhlgYCuOfpr!u%>0Dz3LdRO9nny>Vki#w&ThpgU0jq!AO3Q9*1tD z=XiNfwb+S(<^(&jjnI=Db*HZT$YoZ(ae0oB$tPAN-#-EdjjqwrajZcp> z#IK`%rA;}};A>ff;X`S!iN({6dpe_`?JMKb>Je80m;cM$AC>Z0-%@<~TBi6IC2#QZ z*g?fFGe(}z0*yzfaRei=05o|*LFOICPk#N&cfE7}&!*|$^iFiboEwJ;``$str!tc7UFYPVrf&f}fIByXon+*# za4+{~Kl4*Rzn#Ims?ULY&u3HO+vG=N-rxAHmhl;{S36%+``)c~$)jKk{2Qz_Qh#8?Gtiy9tZJA=K>%tjc7h#62-|f- zOdPavXlXG+5B02xjZWji+Y*nE4}=9kHBSv*whk>uuL*2o05S8G7_4pby1>Ww=%!22Cz?)P=yN80fe*@wM>iHL)q*iOrJd zI^m%Xz}nPLolL+?-8cl*Osy+xp{ERqVMr#=>bMZrNGdu5CfVgctlYdha)z!MV3?cx zpk3}s3_~=&zCN?}Ou|e?sBoz5dTZS^ehLgM5xjV2aFS|Z#{p&I42_ooVoqK|Bz>8@ zjDz&W{-`fCf+%Hpyl(2d3v-qP&{(Flrr#y?DtE<4khfF;lq&&~36l*!bD?xwN8n6O zK~>jxlRoIg{;+MF+MfbMpfr!F%rbJR3A-4~p>Q%~dTk3G_qj28u@?JUnd!C$=B8z& zJo?+`1LQnrsgish56zO=Iv=_^{(3pci(VHF8fg-CJ(up9o)$?2c1n;KE%7U02{P|Q zC6Lw?{Jh%Jbd-;!T0Ylf-I1@6q<EHtg3%MuWqW%VOBYtKT_m;Jy` zrW{%^$q8iEfAs@8FB>k6u9E=p#=DZXtDKCo`3Dw2HbbwL`Rq73k$iH~DzBZH;fpa@ z1^XkClDu7MOWp~d0lSYt9sL8f)3@YHdu7yAUt|5FzsdR?Ig*F*WUum9f5r~4HOh7g zcfEm9(&{7A(>3$kj+<<#;6ERV{ss1hiYUeBBkob;jd})hauyFJ? z!--?1CzQ|d4Mn?+9~s z`mG+MUcqIl8K`$&9G`{@*|k!3BT!P9gTtMPPb)y<-_(^pG|OkAS$o461nI9iS{617 zZi%ymHs!pg)V-rXw5K;i@HiJ75fk%BM&}+(?X27`fkylbn|2BiL3HeP09YD5xE5L&$V+^xhqwDz%4A%YHZBX~hTg0- za->)fk1RAr$ z75dKL(^2`3)s8;uJkriq{2S~QfEJR<{r>v@PIrMHi{Bq+0XjQkP)WPA{%Zjye81Fl z`j&oI=MP#F$84M0Jd6YV2k7NC)4#{!BLrXRv@V?48B8N}CvRWV5`B*k@HA<`2CkR# z#NP}BC-4sH556Ec662o*dA2$T=w&_Gg&tK%9s;EGn_7D7{~mThYB-4yv;|=Xrs_HO z;TNuX3`FmND-h`tkgqkW{*$YtmZ0wTjXO4{fAb6f#~0ojRBlX8X;IrXgbO=+8<`b6 zpt$=^S=4IKv>YK|x01WLhMg*ZS@>x)fKpFm{oshZH~dQV*&!ji4y+f7)hu~+^bP~XFGpN6#{)V$$A0Gd}{vyBI4>g{@fL#UsAy2G<@QeuO z6Ow!9o@N2Co%nXcl{=fe;98#BxXl}=q+I9uK^^~Vb-wZ_*~VcPj}<6)bL?#%9h8^* z2=kPsd>Ng4FB4v8d=mV;v!Ql)Hg6pA;*E#CJw~(t9p+JRuFhgDOj?s`Rs1*O9?4a_ zF6H;24-gJDlc;xz4m|llYsX;?;5^t^n%v9gqye8v_>mjJTT+G$$r=tPS{k4bjw%E< z7*HfXaWn{+{#z2aB@GD39qaC7giK8td|7rpl-@`X8(1;)x`1!!ic-Rndf-Mp#@87h zXgPx$71{Ff3KeO>tyFRfU`W+j`*R@WRYr+t>$w?Jz6SWVOk7RIv4u{a!B7_#i}H(1 zTKI@gm^De6CTON4>5Fw&HaXY0B#}coGG(9&zEGQdmL+g=Ep|;Hv%F1}=T@07I1X8c0{Gm<=Ek_P_6{n) z8|RXbe_Nca|G{!q!dd@%T-+czYWoDv(UZx-$KVY{HIqLlfRY-X(Tn~^^FR6Aam%yR zuRb}$DHebawA>hY+`#oP5`gs){}fa<>`*_CeU zLiXh77>U6T&?A7I*vjTbU8vxWtvp$l*hz2Hf3#EV|H`;1<)KAb4vHS=rPbGjW@UPz zK0!VE1+XxY#~}HlCjx)L<++rCW;$>#mwPYq14y0GbA!jAp1_Vhl7EZ-1N2fD06$gx z!TspDT<4?2_zP%fU!X~6fx+~0v$mfZ;Q&W0c6<63`{glOJ3H1Y3z`a5r#>uvt;SWs z`PNA9_Ix2@d*m4(o2Yo+h?^ruXxnpH52r5L0?&*vgpuVfmpYophOASFWj_C4#J(?;`Hjz<;aye_!;;czeZB#xYoZoXFTbxmoAu9LrRGVqOeD zl8wu?a?iqXZsnJ5u)NN&k{JNetY7|UkneQ6Sb-qPIQ#nOzQ-;z#J1GKn-XGS0Wjxn z+f1YJ#EW4ZMsI<_m*1qfPKuK}CDd6A@u;jEjpm^T-2oQ`vNN6AU0Ze@`m&LA%$Jh_ z6xy3YS_IFO%NQz*l(C&E$Dxw+}foX^#89W7JRap`x1T4r#4Eic5<3n&33bq9#}~ygZtBK zIH&e$b_PdDJ@%7KlIz$SaX~7F^(U!!$wXQ@sXv zE3UAVRbR1gT2HdOW*5s)%H(+<@^EFsBb5hc>d(NoEG4mmQf|LKLdc`l*jz6E?1~zL z)pOmgRDW5Ht32~uxaXrZ(8B_)K9G$YMx6RJJfBt>lR)p_L z)$ba;fH!-kJb_~)AHl3oCii?y*5ia@RJjF?R1n-?to=Qp3}ls)90aJj`KOym2EXwt z{|Nif)}GbJiGzz`)jjy78UewqLHiv*ce{a-44XltAsV>Ig>877sJJ1em6=M3)CJu=1p<{06+jqL_t(}J%8Zu zn=+3)hx@sRH{{$;zmF22wD(c(Bgku-KF{P_+JC~E{$!`hL(A&FysP1Qc~|(N*bN(r zVkfH__%EvvsjUmfJ+zR)r-dxD$n2k;KU6KmlIe*6FO>QWaHc!xEoB<7 z_ml6`J>=34thnmgM$3Ls!}J#F#H!Ec(ONJWrGJm!4zSk@WsgY##4cAh9yhs)E=v-) zIj#h>*ivHLi(Rk~Fv4|o?zv+prgDr&fh+)QTsCzAb0T1JC3wW|nJI$EW%B4{!VG>; z<{4b8A|EprvYzQ%xh0tRuDXFMy|4DxRr@Z1JoH&Nn_EptDIM`h!{#}G5@+P9 zE`d8`C&v6rHkYokBu~&4=mG3A7Xb0EEdQu%2<#=j1bx#CrYCmv;%C8S`e&zH>nk|+ zztOzZ%Y#-=DvpzRo>UAyCMKe{qWpak-zw8GYQg0vT?DcIFGU7}>n0k+ zeq=AaJUrLa^2L_Vo$ZKABJpiW|oj_3f&^#+G>#-QPu1u~X= zNZ;6e>%}|CxqtQYH`874XFv0~=Pr7_uCi%X4ruNxJNGl)r=Q*$ocm~+XDQ&9U-Zz&Ui?rUJr=p{l}vr_cdkJj3e zfkL)H7MwS0=|Kw(OQARj?t|6qsV9NazB$%VcW$vbX3WOwhhwGo82+Le7EaP=)1pC7 zE=Rj+hd_`|+lKspiPner<5B+EfPEH!SRK?~`u8w~GjzEz(@U#1&twYiS@86U}H-`{M5QK{%d7|o<0&=l!XO>XjAJ; z1_$O0^((e_dw(w0qC)`2M#JnQ5FbmEr}rn&b$QYIHU}$ z-yWd*(y}t9{-bBp zD{_?{0hRAd;AbB>mwvadUJOr0elZY9KAL!E!RybxZ=(OX*6XMGRp^7x^Rs^AEKXc8 zJ3K3h)$eI1ygTP?`BVQEFmQ2k9e zGIFGw@CV65eJ%J=jT^D)z=$W4t7F-Wz1m^@V*yYBRrv&XQvlS} zX*n<9t0A}L?Psl+t=+CTlCQ76`NHkYLg0n65cpe{{^}PmP{Gf*Pyd7S13v}%{8N5L z{y+Khzwmbg8L(L0Fe(jD0rj6+I?0P76d3rFKumFnlwX*r>frDw)o*f(gI(p5}H+4d~IxoD1Gug+S z+wU#UvR<@q3sp_hgEc@ z_gj^3hXt1MvyHYr!Ps_yZWeL1&#EFU;7h(ClD8s{zQ3jnqI!6H~c-A=X*)DfS>NKkt1*Z?$LSW zcN#e(^81GQe9I0v=}-R^^GSCuleJ-n2x4#2JIm%Wj??(A8xPsZj~d@)BBJm-c80Ss z5bC^H69KtyST+7ex2qnNt#rpYuf@rEd$jV0w3tO_9txIHaB?5GEPO%%ocl+g{pT;<2HL)gd=zRE z7pYB7^;Qm%aJF)eod9e~R(`wIzsC3LK#jdEZ^Jc z>h1E4>f(3&lIZASDZYk)q5Abw*gM;+`w~Z(%W9c`%aw$^nEmh4{{Vg&dM2Nf05D!o ztAUkSW%WgyneKJ>=Ad?tx;yPSIQNP54}5+Lh<5riuZ#7t<1PXIka>|E<3PZUK!+6r zS@NOX}sBa9vO8wArxMe9clm(Jrrc=K4!2?Mq&o#zh zX>Vrpi(XlOSSS?NIQ6g9>>}N;D}JN6WOjUJH#q8Sde~;6?y38r9I^7PkBv%98yQ{# z&B|xtRNBE)NhZ!c2dIuwHt2T7C>)1g`(FbK{V{#S8X#!Z@EWl25~V-eJaSb9YR6N@ zw3A)Y1~`7e^v5_xvyZ*T=wl|2gcm9Ozgg@QnWN}`*#F5>cQbP+=ueafrz!C20G_%3 zJx?FjZ)owwNGceVKI^%D;+i!|L z$czK|dQ@m}a=X|oR@6b2ADLVEBOdKWaF0$iFqa65|1iELGIrh-`v)*vA^#%wU-Sg232`GhGS}~;DP}}-AaUWAEJG`utz} z;sxNj#W^#4+M%Z?D(Xu4C5}%wzOK00F&M5q(Fa{f-mbJ?`Z?j~q4ams2YglzchRVb z^ayCW@-hbQuoKy>nrIVLCnKIR3(jJI^lNGQ=xHgLoN1a^#@|z4gpXYHLABX{M-~!+ z`xY+cXZCIY#$l;(Jx$qaIYmF{&BIpS4=X=Sz=!3(ADwZ^W+z@X-Q$K{^jk@q;MTux zTv&fuNn09Z`lK6mg0dr2J>!}Most42fa%(eMv(SM2k?_lb(V#ZI10D%yv7LCWaV!% z{vJZEMDB&7_qo|S`O0ZpT}f*j9RhDt?ChvKdsl$B@dp5sM36?>ar z(i6AM8=m!Ad(>m;uq<%3)3$nIUHHoVs9wS*Eg)yz;qA!UNLt85pys>aJ|87LN+QiR zGXWi)&n3_QIeg=#+kmq0ZB3N6SpIF=1g~dcgA(zS{q;yi{yoD^$i%7f`!}8~q1s=YW8j)qgROuH#}o zaIV=z+QY$mpyoBu<`$@q(k0vJ{|XRIX6$In72h^+S2f5MUJ9j}~3<`INbIez~k+W7Cn;lZ&7 zYyW0hxbkQxTK^BJH`D(mg_IH&061MRuFL%Tjyo!J)sn^dy-Dxq7v3-bLramRje7~Z z!nXKbfN-JA@t*jV$)6L@BQUW51F+yPe)A@X(z@bTOW?--JCW^CK;$NK&&R$EqxpE`V~~sSWyY}uLH=<7Zey<=h#!;vGKyUz z*kh+k9X;~8DXCdEUMME0(pyg{YmcViK3 z4xYg~UgHrwEcvYDSHfL&!~~G}=*jP^LUK_A>nfC`lHHzEdP#vP$ zhyHJ;pZwPOMBx9-NBk`FgBH!Ny>t|u`}+L%K6`i2qk-QY?zYbT&8Pnze=+lnYdP!H zB7w3wANY40~|d# z&k_fL?^U9H{=WO#-eY0$!RwEu|7NGxxkoH^&Vxy}sR3id5no0>Xv^|052S+zEdZ7P!_!G1Lopys)Jy{o1W2%%?C=Q(ZisCni)(vrD+S8MwPwb*R)6rd zJK&$rpL+U2>r5WC%QC_GhhNwjzE6FS8~ls4JJbcr)w<*NIKT{phYv{UWbLo4H`p;p z`pUmv0=4vHdRw7E$PL;NKO2Z-^&D~%COos`CSOPPCV#M6!FkpKe>i#B^u$}|#LKOIe(N@)i z-fUKex0A;$dezu8p8IvRpVc^MA<-mfiTh~dwOu1B3wh)f#&GSI{n|w0#9Zs%1 z@D`CX02xi$7bkO;k6*L}f@Zne;MMM)Y;6!Nv0UzLset`ks`W~Gvx~v5jyH|G*~OZ% zOnhV(7Fb|Y2J4P&hUZ5!C_TH9KsB5x(DV|RlL5L+ftsd(qiJJJT`lF^fV0ccig{{5 zu(I+!wL&Mb4%RLlV0w1D90O%~=n;i3=(vYIeWn07AG5WyF?G35r%!$H{J;;B{QO74 zEc0^T*M6945!dUShC}>cUw-qYyU>68voE{5Ehhrc{MDx~LPwE7?P+Bvlws{n zFAMhQ&>6fL$GsR=K1BjRfF=3FqNoRyy}%3*B0QKCstOzWN2d zaw+ip5w==uaVX$OHONsQ6*8I;VrtOkph&z^fJt&AM+pQQz{Jmz47gn!E$0!@#)Z)` zJ&Na@DI-Z%ef$mgGTtLV-(%wLVH5c*{Ve{jO5UrUGjf|;nF0fM19}N{C%LJ5sXHee zHB6GPej-qW!#ckE^=P<5Uyym(Em;1|8gOov`UntCFo$o@0%su1XN z0(f-p4|e`_dna)M;2z1dfPYILi(9Qz04w??AgUboY^*)mt8fnw>2!gxS8zR(RUY%G z=#3-%qTlL(7s!>#XQw^F*DRYT{&B!DLg!_vj;s3VOk^BCf}U-4+9IR!Z-DQQTi`Cs{NOZ-0S~N@q5jU zQqJCO@Z`set9O}x>ZAsU-3?CZTCqzO9@f86fh{g+p@z`}w{@}tcn7xyLAldW#- zG#dyna?-*~@yf3M_&@6MLLul_*a+6R|COI80i zFTL*Xdfk|p)YtN?|3n%7s4HQ4Wb=bRMK3ql&<+rWqJIm%%D>F`XKrp{cS<|V+YIbZ zB3D~LjsfT^zE}OzHgOahtSw=30uqx-$#?%>@2*8J+TZ^MF_FKT;* zZv|1wOHIhLur<9LYp@>lCZiPISq~znR6CT*1wvK%V33O$ ztS|auAKHqaQ5eiIFmb_LL;Kd=Bp)=($?VjWmenAZWduaEaa-4=gdBZ_Hb4bFENK+2 zorf{}Ij1w8wsScRI6BEus)3&0>|PZ;mS_Ibss)DY&C=-ExShQXt=lWr4*3BZq59=H zOL7dJyS|>Rz-Kr+P~{^>60{?9!A=+G>pD)|M1iIZUd9t_ZZdKaT3;6us}lHl$;axI z^_hLZYvrzBy&mc=dzcI@)SdBF_7c$DeyLB-^o2KFnK$GVdt`@i{f{<-SuiSxbcNc3 z-IWW0TXI!xO1@$zEO$q7?39Jqcp!w|n0M=+I~tt(3+>adocH{6uzx(B3r_Xxs*{0a zkc-K=!S#8NRZ}FmUiCYS=E(ScglKkqRLj?Pcx0C;#X_VWeP0`sDD>L;uUTaE9!&uq z$;H3Xg~a%qzB_po@S*DUGFS$$iAOV?{Dd5=01J+}>fxUe^`i(iVIM)aoIDi=yoM`- z8Vc-Z1RU`+CMVk{=%~K*U|#jOTTV`} zqPfZ0(tp^o+9)Wg1z8A|`V?@K0{%Gzcbm@oL9J@{&hAm%3@qf@^X)5v{P#)rjzBi~ zhh}&m=67VD4e0O4df@HZm-@~!u@OoqS$!=VoKxu465nQUe4An51Zz09K>Et^wHL7w z`po=rr2T3iJNM>^$ULK;8|-u?b&OYp9{J(80UUi=yL(MEz3<@vm0xOQp>N*WYz=Om z07daL?+3F87U)V1_GC9*9cLDvhFe&t+%3cOXd+m-4Kq4JYmq1bW3jX*!3&C4SXzE$ z3lFMgsr0a=^@0hSi^Jyx;AQc%KFop`r?(De)}EqFJF08NQJq{W3U;PG%7vm}b`lA0 za|i~vaS)lic3jOoe0$ACbSAVjLp_`=C6HdCvUaXw(BQ0)i>dFTkN|(c;Ke70p2_z( zLI44_bkrMF6Fb?IP~e7-(hIR^`c_vV6a%LFLIy1H=62qEt6ugE@RC>!jWAMAYXtXtM-|KX`qW8{Y z)DKNIvGV=dMJv!_wJ&K_YShVF+EJr4zw15 z*9xD;z~rW!r3nrdzg2e5{K8!_%5|GP?#;cooHX;z)$hIZZO`uotbXu|=OT~d;_rUp z0{Gp%JDvLFu2+Xy19)>C8u@w?$lATynB>iXe9)QI8?Ks9QF`WUnw{v3SJ}Z|E%@m( z_`{+<>>{gP`j)uj7%M#?Zv-E(lO$O4uQAg=35*MY=1R4fq3-xsm2aoKOTdwC5}!M= zt6;FZRB&F>GCO2}-%AdDLDJ2D=jU6=4Qf)op8OJc>>Njb&VtKu_OhMZ~aHA zWb|$HqI{2Ll;85vO**wa^K&QYS@q%%O5*6*^na_!qnE6e!Ga+f!%=}h5Wnx0rgiR; zzvM1O%X!bs6rgP$5AVtPXUd%X&eYC_twgii^ivCdd;Z$yb~L0tKhXahL^@FZ8)p!8 zTywILZTxK>GLL)n*I1{_lsMO`ydH^*AFm#*TpCx(XWk8# zfAz%ATIJV;#w||zz*&};@x@-PTt=<{eQj2&Zxi(60Dheh3E8b(tSA^^UN$bANUsea zkSSw(qZ_>{JPF5xLGLWlyxomU76tui#k52m;rKFit>Bf< zGY^ATszCKfm0$3(`cP^z z$$~-Ud0TfWx}MG3IPY*Tyyrs_zu9xCPAc$Zbqp^iT%5Xx8J zH~u|#a*dZl&l-+%6}oE#63pZ~YQ#o*jC%b))IZSe8h-MM~gPA@M_ z_OEhSu~+>pSR&U``Nvx(z5GLz{j=cc#Lsv~FfGgr&a-RdTro14jJa}22k0jQ6=0Pv zSNni(vMU>hdbE$1=}oRp;m5j?mGf|C?yeSyRtlZ}ZD8`({%b*G_}Z4LoE%tbE#R$v z8*9}Q3td-}gQI-Y?{!%+X}i>~0HVaV1X7Wcou>#(T`0=}MH~(9t{7)xye+3*bc8Lw zwonC4zBI(>cOCXr|)0STKXkx+45LyCirlMgCGEUbWM{{U5*t>&s z1eRxzaeFI(b6??J_`t_=(~sU7*o-fL>8Q*c8WUkNOEOG;nlmfoWNsby+=1&z!|?rj zBzp^WNB9RqB~Z__Yzpj@9WDmH89j6+q&b2qq-Uv<`eGe89FlOT+2o@(4Wtc@2d)|~ zyvYnrrkrO&BnSxwN8rY^p!!0g!yDl1rDD>myzFShBMSOcJvf{wy;8dJ=-v?~=PEH&ZHMiNKQ= znYx0P8AVU~t7;eUnY~=AJAU8vvgZZ|tNO9;6(gu4z@^QL!?J*70h%;!vU4RSR1jog zyE2U)3Io3~mT}zYq#!`ZOhkZdDPyqmr?Nn1{Cg|Uj?U)Ab!KD~V|D45%aOi~zlVCY z*(j5Kp))?Q?hJ305NGEL!8l6b+SNULdyGQhh7$<0%gJt%drtaje4Wo8c_aM$$N`;q zViXFn_qy=ehem=HOr`~TNf74b2k6_Qw{bWqa{c)5$@RsSmjR;>4e$}(2@u~WpZk7) zJh1b9=Jv@Z@%7xB|8gaIbK_ikB0Bxff(3FG5_6NI_P4k>+F8{{Zflp+9*;hH$)g>- zjr+o8@9B;RhuM*E`Pwec>E}Cm+ z9%Y46j)1T+yJ16Pa(eSXlp8nJ{~hY^)EAL0^D*s$WB)cj_3M8u6oMl)=B>y-!rtL$ zVHV#^&ix0!@Yi2?9Q<5+u2s*^dH(-j>+VZ;9DkX52L8ym`JC=!yN@u<`zhmt`iqJG zVbJOsYOY5f`@08kxBAoA=+C)VfA;mP`S+xon>}lpD0{@eFSu$0TH@bs)t_&o=|A#v zcP2k!kwE?L8MD0ox`ACmQ~r_<$^3tYCa)MEbamcu3Ln8t=4nF#^7Jx&%0LOQH=E`OiFJL-+VWswiOYdmtK<~hyVtue9l4=6%kDuBR#I9Ndp z(M)~QB%2UJS-Y^KC$u>Pst)#xrUu9KXiWjW1W^4TiTGHlt^`r&N{Tv3$8JV(H?S}O zZ_+F@-r0&=`Lmm|jc|4%$@p%O7x|!2t{C$yn4FFY8X#O}#T9`Z`Ek_*4FXMD-eM)} zhS5XltriVLm_={`g(fu5=r>@_wM-Fk2HfP<%SXHz1pvs zHkKyZ{N(|9TS!=|$n_x;MBo!C?P2LybN zPL*;q82nHdO%l`a3lz(I;}Cg8_&Z!Wkc290c9zN zUd67Jce1<7)R!UbU^xlMNtU&LYqo4WIPY9oxjjO2pxhcui_ksw0c>snw6nMI&&_HS z&a?N%bF z*vs7XEc=CyRCDWpTjo6*h-mq9$wJDykm|yYqtPHbvpJ~$Hb#QikF)BbR|`53kqwm$AxFgYXJrse}SYt0`Ye? z@_WBE|DE}5AddOP5jroEnSE$uB%JWGF}ZHc=BoGPdfC|%2Attt(Z3tWQ~pipN{pl7 zyYwT2)2g+C-KQha_77kas@t zm$?}v$-Okq_la^J9%@c5@T|Y6x$g_cR)5l23G8PJXx3_cZin0HHt=`b-_QEr2FJfN zesVTII4W_B4QB$=g4^_@dB%w9mr1JFYlv)~32?b@H6YVEb9K$C*1M9DR9=TsB+rD(;CZ%C`;X;E zpErZ|?n}znN=rD)oYOQ5+_G>Olj>pT31q;#F+xwy`p-%|on-Lfx|v|hM@b8wa<_5O zZZ@h<^{f1o?PKbJySuu(GWojtGNEtgh6e^(iGU@*x-M9MmgP~wlk>-(5&d|5_j6Wn zC=P%D?u=Nw(wn)?YM7%Jz4L>;DxrH^T?7 zSJrFt)gl*$EiZd`(mnR2CSsS{j|S-nYmVlUdh{uL&4dL!o*tVw!Xtq^(chaz&rs&3 zC#y~4&p1OQ5J!MHa2qF1v1odr#_{%?fP?!4%WTMzP%KjV=QevG>%~M7b}Cg^qa9r!s~e-IF z$w(@p2ebc8;d^5K=u-OOgrJNQEY?p2c%=p7;K`qlLG!)g2Y-~$_-q6SSkd%$x$13I z{z(j3rTlQRKIh@<>QC*is4tT{KiO!!pX?qpz1~^eo}UX4`Whe>gaoB|t^cT;tRRc| zY2Z?FTv|W27QE};jNIDRS!Se71n zL}xbiTd4TQJ#Z?3U-EcRlz9)7c_k!4QuW@<%`r8}z@9qBW z1ysko97VplW;rPn$AjJ3MO4}G7GIO|YN&=AAcjYVRv1PfSc!m-SB{skxw~1-@L!=0 zj@)rVk-vE7IZds%U%2fwq2Aiu_8Q1H+Bct7J%s(G>S1NQvXVQq>>`G;j|=p)Gsm=@ z_-dfva3}n7ozR1f3VhAU0CWs{DbsE)&*&uOJBC#F)uw}DhHv$)%fw{il0_zfSB3E3 z@Sw003kt-qt=|Zeht{Dgl>mz~4aY5L76nM}t^L4#m(J&N ziFM23^)Fa?c9`NrP8+w=e>#GLG`SblMfUBzw|toxCtsERYHQqlcj@dzpC;njT5VE5 zlu;{9+ibp zR)bfol<#J1+2K|^-$<9Q9K7Z%XN7A5M@q8?J)4(atsl@yz3_|v!i(nyzBb!E^^ELc zbM5t)kAXmHw*)U7r^3MIG=YH%nk5GI+{pKaf`A_D*@zf^j zpVEALbr*PUbs^4^Q~x|y$!~VR4t#F-t-7OcYd`k2_d~62(yFjF_BWR??!=1nv zqxrwB_4%xE+;p${WAbU;s4^69_lKLS4g%A@`$VjuBi;bRHHL(&vTw-SFI zrdZmY=JDBLXXy{~6KBgk3_t5ncoTs?`da-4dM^oW$&SC{zmvWLyqoUkyX5?{FMRdI z+ZnwtUkzJ{a#v5{EP%Vs>NtYS4-8gcu_wJ82%Qw9_miFDer&-OWnK`Bv&M(;-%YY< zKDrwOU=p-6X2!2>RL85w-uzps-JQF>wN&}ncKKT30ROdOmv61!?nkfx#`qnZ=dUl` z=#B&VYib1IUwV@>G0MU(^A1o8+(YA8_EO`}s@N4d(3ockY7FC&ke^NPpdlnMo8yw> zb4t5Yfa2&Qke_*I0GyI_0)($$n8Renl+-XkZJD^r@tFdkZdCtxZEP+7rc9V}*J()* zMU8^XQaeW*!Q`6oE0vFv3DLEVZ6a`&G6{H@4~fz%Gkkhs^|~<%G9kj~fpW+hB`n|t zFVhTqYFgtP3Z3i99LCh!p)8fCbx=KxK91C}#{}qnKy=5)>S^mU`KkYF^eVpf*o=`I zUIsG09>Wrymrx3RGJxt?=yLRhZiaQ;s4}pZjjv;+3ke6YR6o>zlP8oN8qYpg$}b1u z+~{7HjE1uAi~dFWAc=nScaM{a_73bG{h@bRQ}dy@_cGwShuph^nr*y1@E-ZTJI1p! zJsj4ZYkRMsHi4m=tJ3(Zbk(cAE@%4MgC3y!@<^bm6NeRivivKIKqjBmczAcQETuRm zs~^3O!a2&fRL7sMZ4D|n?vB0j;V6`E_qrKMz08NK@ll|%ddh54JC^h+kJY@UL_~&l z-PtY6__IH;z|TTD*$6GES0z1d@uBX()spomROA*tC24POSk zjtX=(3*Be>AL}m;oB-sHhsNs&`A5T#2KRx}Bx`Sl0zMNA#x8dDS;Z>{gxtV)T}}Anjn2+4g4E6 zDiK`vYK+(uI7;n>?p*!I;w|9c{mQ@l^LM;+-yffJcZYlWC+mUf$Q|XQOaRIHV<8sx zCmG)DAEv@*=^xr}OckAlLuv2y=--e0!Q|h)q0p>V|9SEsZf6z%!`N;GzKzm-BOd{Y zGtnt6>%w`7-wh%ZKiuGFnKR7qqIcq7wEQ_^oS-lGka*W-V{z#!@gPH3;;|BR?nP%D z&2Nn1I9ScO%rC_&<5zzM$9$?DVZW4R*$~yf#@OmvAV&+nSKkfbe^OWvrt!bd1_WNB zS+Dwt5_9=8Hl)4rt(~Qr8kJ&rX7`dRX1XLbt)mI+@JefH=p72l&{GXmH#rJS&=Huc zR;(sm?Y4HV7LdlSI<&x3tPJ0Z8k9DrG7C^~>h)P-1hqL44e$#_?7SBXl%fKI+av6>L z@}bM%r7g3!BkU}K-#`aI0;@rGxHc)P72+Uk;6AMMgZeH&E_R5uFGs4O7HJT>=if#P zZEbd72c}us?W*y#!-7uPj6s>$H?f~A3N?5xz6O-o^fpenYHtt7QvzChJ^aGG)uofM zVvie6B(gF}vJ)rW-ee~rh~3G4Sa1ZPTHshc*Gj-(nOW@JGP$(ORNd!sZSbI;9AxHu zrk)$jf931w7@UP`wEizxA_ZjKz1zRu^34B>?H9L!7YF^hho&ijJd~kk%;UVBx6b{f z|H<|zfuBg9h@T+uFSS3>Udqn>z0ds3tnvPDFMZ*wS~&cj=RbFH+;XIQ_*i3IEke z4gx}~^-Ok9mS#5!-<|EF#cQqpE9&LtZSUNF^AG;xlP7>5_aF05IOnF57;Yb!rX&Bm zgZ>EoUVp~wA2eUzBhWvP|ACD{B%C`}+IbhtbaH4rfASSY)cF#dTVO65Q0#kfO2ng)J5KgW{9^pgpYX24ERnxMd<(!M>>~pc-=gvG zUqu@M$b!ITpzgD?dCisigExx6D?G+cz@w9(c6eF7q-`Qt%Pj$11Z_KQTr+VsL)hTQ zJaEp3baGJr|4n|XsD*%h#+R`>k3KfMU6P<@mWB~LGHJ3AI#N+|b4< zVCN%weFhL9b3Ojc2agTrh>!ELtb19m-HYdUZ6PJ8ew8`pU)*X5@bxARUvYFN^ z%Rd_9u?J7JJznlmKE3S(Z0Dn!0mm(z;WND~$AwL>3D%uE%ahjRXlp$xtJG0L1`^m! z5?>}b2C-JQlGT5W`ZLIyg^7rJ&^@1AP9CHWE5AJs;$vY&kAVw97krGH<@2&42=sLc zX_)WQ_&6ys`qY1RI#!=?|3B2de~e|xb>CO_b?;2?&Mx;Ymm-@K$*r|SsqN6Ai%Bs;v-rj0Q@>B0 zbEZEuH3t zC&8Rq6oH$aL%|B((ly)0bwkn{kms7`(sQJLF}zs6*tk~>uaB>9USB)+ zj_{834zI`4_y}(v&2Iw!NAbICO#abhf9sKZi2qyfdf)qBjC7BG=ZB>D@2}Tpy2Y@Z z-b!*<+WlK2!KyCf#nyP~FIH6D_(Zjr7y1kV$YndU`MT&Hzq?pjKOjBoiNlrPq2k6o zSbr{BQ^CYj-HEVrN1pb_o7QZ#zo$d^NHjbZ8vR6%MFNy0JlC; z8K08A%{PZvqjP_4`0e4QckU;Cb?g1wY54K?zyCdw>xUYBUVXfJ!+*HtU$63^&iQbq z{qplQQ%CO(!yWn|QqSfv`os&(qUvS%4p;txR}f{DRrJ&$OlAIG_q2fYFE+TI$+;(g z`1gYFYPvFgAh<*Mm!oXsvV}{Qk&mVr+U43o8NZEoXg!Mq+1Buq*5u?|u^$-TsC1mr z7@0$`u6NCVFPL8em>984ng+WdxU~#}+7ZvInSt8zwmd1<0*6c626}22mJU529k<-z za66FFii6=zD#^Fo0~^5;_}1i;fg@@lJR+yjkq&;ZGXRcPT4oWJ?z)?FFnN#gWFz1#UgN#7eMEEvT9=O9d z@?9T{EuTwtknja7FaXa21XYxkzdOjlv+_EjqkzF2{>{+JJ&yr~?)FPQ74Z^qXSDzh zF_96tS=9z}G0fDql7QvHlgsLMf|EYV>U}CE1BI@TG5a{);1+SPnGLcn3^`Z6iD{|i% zSs`~8JgPTv#m!tBp}jIL+#;E^3A)an0GOaNQy9UGSA=%~$19oK#G*LZ`VFn(cDjC! z-HP57M@uU-E16MLzWh&kmOS=bg3Ome;M=OE5_fQw{W`5T>yu6&m| zE1*}+S{O*h+bY8Bmj@Mb@|Y%qH{*Z>b2ZKVS5Ok{4;ROSr7$J z+6J-R-b6DB=vR`KmCoUpb6PeQ8QM1LusF7i9c1@O)>`x7CZBoeI}o+o0agedWoU z3Bo%01>mrADA_5HZeZtUVsmu8=o1vZjki{gaJz%y^|9{ZuZ))IM&sOfj5ikd1>V2# zuJ3>HVd!si4}Nq%(LXgK3Rn`ZMBHAhM@{7R4y$vD|uf{6SbSw7}o~G!d zWmrkTeha?jiz2brTVT0AV&d1n9Y&%OzHZF-d~+G(fjyAn7S2uf|50!MIlNZDBst5+P5#4 z9h}l$vQ@A?(nZz}IJc+_uEFQII$KWTa<4kH5qz_2b>dpMR(?P^mez0Qsa>Xi7YZK} zc?OrOHuVc%F1>cZx%eLs;@#F9sUcnI<|Oev#*4;nSG}OTWhofza-H) zJLw#Qp1lT-002M$Nkl8-fEcK^%v6@f#2-jn4izO2mfuU4bJ_@6WaeI)#us8m1$e!u$+5w*g|JVLvu-n1K9xfVPeuJMQ)+mUs>o@g+iHs z^kYP9=U(v}q>6?+{bZz_ebWpP%+j=ye3f!yz=(m1gt)U%Z z_@3*Tvlmai?c?_*6nk0?E1pAq{*CqPYPR^po11S3zuVB?qPgYt`T7}t+@ElJ|MdEx zua{)mg707l`gz|Q_&)X^@X7R-J|3#KkL&frja*j#*El|RjrdQe&(s>%%kREY-3rLn z;uI+f4f8D{f4;2n>Hp!9c-s*W9Cn6Z*9v>2%0R4B#3hp|>FdVm3sMH?ys^~UyRVy@@Sm%SE0}Qv z5(L}~*%0*JOnRL8IyF5t>FPCePgGtG04sN*QAF)SRuL)eXcZnByhuDaYHch*m3mZ% zQNa=#>puB0p%uNM`I%0bA+Q00=dL0+p6{4nhdNnEFzvLo@S1y$nTyR%(QxlX6-6yt z2k7vMH7Haw$hwzX6eEUFD77*HsHm6ad#)((YCKp}o_G|a<-g0da16cLLw$$VA=7qJ zV7Ife?Mmc;nygq8~&pFsxV!L|UNUro*f7xZNY(te|B zt4eskbHnA=BlHISPn*~AiGHXsqDkQ$*-JW2(A6`ZHa2Zz?fXGjSx;_s4pZRNek3`E z`1qBd_ZDF5iF)@lSx39YYcr<<_XUN%q)IkzwAH_Mt0S7jsWASfHcjPnTu@Fp`E&k z;o~x&*g5l+r(VoEqc4gab1TZq>)i;R_lJx8`jyQ(cMXN-BCqTOP84qn5zx-dJ^%N8 z{N3+)DB+i;^?ZLO;)KB2>-a)M;o9fO@b~P!V%H02Rx*5<50R+%=D<^rx{S;7P9NIS z$aJ8<>arER=GOcge6JSz9fL=mJ_O&TsLOaDKS}e64Ww`-a7zON`p2-`dXQ7&k#;}U zJ~jZlkGji)8u&f#F^%-iztj2^;Bz0pmL&%_@LqAQ_?9r{Y3AE$l=efW4^X3r)a zrR?YF5#^;Q?C_$OkDh>3GzT@~5&1yWzMjdeEB1+V<&ZY@8ZDNP3;Jw|OBGuP|dtoPp!mWOHZz9eJ??5YZM3&b7KJp zXC1MNr;#BkLjeA0RONXQ1-=A?$J|FPV=ntp(!rCVkgIiwD+)?4T(NxiP?a8@T@O)xe<0+yJ@`1(tFK!wMV) zX$o3TLu(>(57(Ly(l93tEX7{#Z}>#z0Ch<-bbyy`p%nI{}B;=4G-8s8%)fM?-&jV&~8m zx?4mzOk-;|J4lj84rkTE8Re1DBR#Efi5v)rk4fzbvyhaITuMHB#dO-gcR|K63>H5z zUK=aRcdZzF$))1;Cpn^Xos9E5HB>->2;ja(OSjQEB(u&$PY)H9t2~UznT4@tBOzDO zAdX1o$%l!q@rOD!Iq1sO_**@vWgbeAI|2^vuHn#BkvCLE)tCaj}|Fga0H$(kpy(2;l3(pw@?eO#0Z$ySde1c~Z*t^>J;LCwxVt-S-=LEwrI_0xsAgT8}+EBQ)urQyQ!Azb#{ga};J zdxDrwHd`u@Q0-6qTLQoC(69ph3Y=u>hem|Y2$Uo`$9E=Fy1s~3&{ zH38?VI<9K{pbRt}7LhBs?Xx302dWc-Jl2M0q7|u$< zAsH$?9$2#aZdYRs92hF)(BCp`eFWUj)i} zW@>DQ4wxJp3-qIfE&AJ&PN_1Kz}NE~QeFhs#lUGoSlB5mIM#zkVW($U=+sFUO=%x_ z)JDI{pOX~8T_%@&1xW~_oht9Xp23&?q>mcDWfXLXt@Pk#_Z&B8A*|3``hn3+st;z} z#zQ+d79YzBng89kemivRw!3uug>EYb66kq*OUKIJ`ggzNV_STR-)I>LLjU3z?g3i4 zQ&dhOejllfnpnF=|kHj%lN5G}^sK=?OHe$Yxg7RaerxkVxI?}ypy zl?HvjN$J@c_>jr9@7g~u_2zl=iQ;iA4D>%YFYXT)ffvO*@x33tzrjGp*ZX0#*xG)N z{akCVrEBTPF!u)i)#T`;`2OB=Z|Io|`nbatp$r803-+P?%wx%e?I=LE@@rPqjXtm4 zL2wG*eqZv#pXAh9QTBne2j!4WPl(L3x<|eS=t&d!)_ngIp&t)c$b1+Vug{TV){hS| zsSi3w9~e&vuhsCMH1AJZ0Q8PvU%ZWT(>VZMbFt`anSHefE08tMI8s`_Nc_#r&Q0Uo z&wlJ*zE`($Tv(agPF1(ys?L)p@Lfax1*hx{XW;fhG(EdsMMuCeN1MMFKoaF%EcT@h z%Xk2;Git7Zk6Sl3GkM(C=Wi^SF7)DMh);jq6haB(V6oTtZu13K;t zW{`3*{O$N)ZYDUf@+PpM;4Q;7Iv|5jFsKc1lZ*oleV9SbLNGXiUzuTW9ksHC_KI!J zmPQSmUf~O2c84?}9@Zncfo zW3OA`j|?*pOzAMNrT=ob^4x-^ut|@2VCRY9pAAK}Eqzb@HaiopYkjRW;CA;|qOXD} zpsrPj+t~WuYwhS%?-IbRoeOe^HsE2Ih?3zc9M1Yp<7>Sxs!bn<6I|*s1a3Kw93HiX(6+M|s-e0tc^d)PbpJ>J8U41XX0YOvqJ?{_MC{zJph ztdpE`+P}WuaEm4DgQTd{FraxyI;!ZMPSMD zt(jk${HE+sH^4QPrV2y80eo2O1F;k1n-w}`p65ynNl~Qdg7{getQn4dZfo!9Ns&5%za*6XKAv- zc+$WcD8me((!mr`wtPsSWJPDuLTUe!JW=w;IR%Z_;CB%;tyI&K6vFW=jw=9D6b*H0_|(U_kMLfhoU{_?IS=d8)vKrXu=FYzTW8k( zs5ay2sz0(BiB=XgcQv$LwQ0N^2R^-9(EsND<>5uaT=kd6)Xh=1xg}4c$ zmBF_Au!RQ5=LD;0#^!`%3)FtcRHIld!;;N)f5K(ROr)EPukJg z74yr|`;NclrX2v38s$URm;VeXd>1?UgwN71I>$m1l11zIH2+A~?%bSRYk1E8qu>AW zA^0298@-*Lwprxv2)*IySL(fiInLOR``yxezThU`hNQ9AOD3xe>nHw(@H-y5`&PO?(5EF9QEN_vz&uT(i3TYWun6fWqg?|A~&sY<(94B+ntkxXGrw2M+1# z09>H(G8xa?S_+B{HhZW3@+qnb9k=1rN{3l`R9!&_C+oO16biVTbGO|?pH(UYUs1$RR-;B49QXvb{1 zfa?~7)teQf4Pah5|4buq4s25lyH)P>E)v5J4rrHN`GkJ`V3BhJ)g|7dZc$$ zdiLI-=<8$U5oz?E={DFq4n4^n2;XDCOs_Pgx6f_#W0%rSWrSWDQF(owbKX9O^|gES znOhmDdl!F@>Ax*>{8oB%8~xbjN&R_@4I98GAE%y-pEQ1bihdk=yoY^#Y~|lDR}y&(|1Rd!?~z9nA^+q5olH6@=+JNd$^1+4}2o6-3-JBGfvpoKXLlr>9tsWbeO>a6qw z3)u^@lU0KSYRCsoVSF>}Zw>w3)&E_sy0E&uw)|OlaF7pD`yac!g5l=z6D1h8V<}Yb z9V{?5H~`hi44FI-=u|S9sd*PXH5u|NW9j-3GyKE}`kw2`3(vm-G!!M}ik%n)*Cz!%g^ zxWmWt02Hxx5T20IbJ)uaDdo+?hr*m4Kquds<$tLPDv!sZW+E>ykZ%Ov2Jw9N_$mbZ zm7pXm&!fT#mA72DvR;Ib9hV5oV`eJ}c)@Bz`{*GLzJcKmaMx{V_mEp989H0}{BrgH zS159^!|4eRpB`5eu2u-L&J_tLy^OSbmvlp)f3-U*V*l@ayP>QjZJ52%A+hxUN}E*rLS%(tk>5 zyW4)kl+KuI5xV-_8t+f9B#=a z-4Xf~?Hv)`>4RS3lkbSVgK)R~)7STo4DOO}()jer`~L0m9v--|qjAubHx2eX948t6 zYc&t}k(gUK?kezSe)wOcy@2{V_t}r!=OJvZ49{fXjIRP`XxbXN-z@V4{fGrY<^u~< z0y}@WIKY}22)(ys>>v*h8qE`OBA&Oz_1{?+=Tf!CKF) zoCQ3A@?_26t30kxcCsH#^MkzF{uj$1UH-{|NN#!0inkTM5DbsecIl{0obOiXWFylC zZXHFlo)lj@$2}0=(0#!=ZUa>&zOyJIG0=RY&lyS&eMWUM722#u;)CKU56GQb95zv;jx2pcD3$O?1) zXhH}w!JPA4G#JlJXzKQRco(S-*bq+_Q zMcgg`jy_na3>jXYrD8+j1&L|U@XYLB3ipGO@yxg z2kP-a3lsRkalpLQuTW3?J+8n`Wb7jTv zaYjCB>#xmjd?y%Y#dp%jLw}9+)CLchLa*w?e zh2A_64Lkph25aW?PE z%)c}4&Sz+_S)9>K6Y$U!vQ*)bzwJ zcm;hTQv0|OxXxE$i!l}4s3r%E_}ZyZ?Ak>2t~Mw|bkdoeo#*rpbgbu8^}sw&z_2G6 z{s5eF%BKM?Sjk7ypXX+Gf^Q5>!DZkq9>xK1|HJYhEWdKoFMpu@spZX6R2b6&qigU~A_*=~2oN(KtRpws z5y;?|-~uur@3IO!-rbX4v>!J5HU`$iw^I})W@@VRgPN|)r1PD@_tnJmtBYfxvjb`% zD}See!O9jtv^6d(Zk|H$L^P~`02ttLC7i8orNclk_*I9E$;lzEjriE=5$5<8wIC?N zZuQ<_i$;Vkb`&!7R90*{GG+0jZmW2=+Y!L9w}E_kZ$Xvd-?mb0u+{G3i~zUU@rcCF z$uEKLX^N@7#Sze<4(kW0T~9m$XZ2rLZPb3a34!=XKIgiX;joB=YN7P3XdNlZL+3nI zf7%hbSm#T?b2TVOqzYVe2Ez!E2RI3g10(SoLN;-J)dXh9n^$Gi1T5`HsBZr<{JEUs z=C@YKa&y!o+^VR01M4yZ5uv;+*S^-r)?JC33<5~SZ6jEpB(&x$u&J_$pa!F-`J zjSAoS;z;u5%c10h@wIX_xvgi1IB=qG@Fg(Kl3lD>ZlX*K$H1!`q|pO(xHSu+E`k7U zmQOsR`@Du$wKYtqUorAwX)y;d5B{L_BHO!*n8jX~ksc@xgzBh{DpO-SO9 zf93~}c9hc~=WUj2M~pt@JHFwbi_ZOx4}6b14gTO|PPGRvP6#&}eVE_&p-x$!6PRCt zd}zQsxp)QEmyPP>sgE?-$USx^?900|=A{&*%y$$oIs1zij`z!5)c?4_&sBYLs=MvS z<2f82?n?*t0r_*|D77$=Ul8vyw_bA33f+m`AM#sdeVqH_<||HTQy%-lfBfO=KzDX9 zJQIMJMVl|u!or)@<`?#$2Ga|oug7NiCvG3iZb=$G#Zo9l z%he%&yRsjq?GkW7dP3z{N&=U^!v75d*+JeBsOI!Q1Kh*QWi6 zec^PjJg`3fWYy>e7WY4H6J^9bedrWw3aJ_mgsFnTIzU71!57_1Bn%2as*$QY)JS3o zQKQvJd>Hs_4XXLg;0;^k&@t1CK>{Da4{$Xr=zv0sgGuGV89t-Ca*zLkc;8U*E29;7 zNWWejir#SInN7uyA2l(!QTfV4*h6IsCRTKjcu&59dtJS^I*)QxW$U+{@?s-;aUvCK ze=(EjzuA2cs$9fn>+3I$te+y@Hn?an7Z5Z)#5DFfWGO;;h#ng7Bg!jZS-uVR zZTQqD^B$I;sC_!((?qp?JtDp2>U6%xNp4=hJshgPP7m+(gJAtU(>O9MvH-mul+WvC z_Yc({tFwEClB<3tPH#0}YJV-jmYs$EX%!4?ZTU^Q=YV~YJ4QJeb5%4g$>$}fq}0A4sqp?BXTe~Sm%Cwg6C|vBQWnA z8Ae~_P^(gpROIdTlLyCY_v_~Ozo*K)KqfpqUWqX7TQ9ID)qPA!4gEExRUUe<(p>c)wtvrk=|;1<{E_8Px-afG%SS9(edq~gm=%VW z4Ti6ro?P8nO_k@+#m@6q@f%Oxd_scx;s?p2;rZLq{*^W|P_rx9iV9SV_-eDuXLsOD zuo|~G$fBbt;MdmX06vBxOL11b^0X2@?hLI~L=k)sQ{c_S>+eCcvY%P|*1L{BN9{B5L$;>jyIe1ZCg}T23+N2`!rI@j z_)*w{NO|+}Gy`tIjMTJsIavWdbLrXoK!j~v2m*>vHFA{cB|z}oI0#pLZ!BJn2crAs z6Ph6KdyU&G1h4TWxwn_ib@;-ZjEC8j44uPSn40#Ef4C zJww>&99L~cD(soG=-ypY{gC5&H97ay_>60VaP~SfaLiQoz#VoVgwK&E05GT~QY+RT z&l@l!?Tyb)Zw2UEWu>ndS{eTiDuQIycIODxWhZTAT21eP|KaI_A6L0g$ESbz0C?m4 zeyw-sf9D5&@S{j7FT;5#z6CmO@M|P*$HSoJE`ROZndVH=hz82ifOD-vG9KM!J`ZT`3 zcJD29Hs5}aWf6^7MN zfbkM=gH(Cb2Y-8TfA#JAH~`t1(_-i11{Pc*f2pFh-Zt3L_wt^ zE~02WbcKd5E0%+->*Z5s>UL2)f%KzxViRDSdnyeT*<`?hD8fnQRSs*h2z|_EXm)gJ zHRYEM#E^UFq?SRWQ%gSkZK!JKdBuyLGX^t9uzM!L6Nm@LqtZY!Fhgs))M$i&LFQKq z)=SXvlxjgXe6w}jymSGsbEktGE03^G#`gK?El$93(9z}zzmSBIQLSNoV z3jcVy)Fm1%tM$|`>r>j(in7bwTx;;U`+L^?u9at*!0_Sb4XwYJOV;19$XCVL0h8B7 z$)5>W)E*&YQ#~J>Y5~ z=@+@Sz&(58v^gURD}SqhS8r-Lv--?CMHO*zGJIoJQl5N9vaN5?+eSGg+;L|J(l2WMSU^2GQ^fYxMh{u6V#Pwq#Gdd{C@pHMibOzmrMguPHAVA7`fLH zJhGAbMpD+Vo{)7u9}K-Oh92`@ACL|yaVD=dOD<*8=*J9xlKkTU)NO;otMx(1?Sq4x zo=>NV|Hvo)$>Tcg_ss6qnf?R8Z4MUqMDmTikOv&AHBlcI@?7@tUiWXvqzJN|3zlAs@d^X?_PfOP|0sx)Un91N2#RX1! zQ&7bpB7URX<0Kz*4DjSix=otp;g@0!@U0gG$s75mU}~t-0JpQ&2D;jD!5ouWp)(+6 zAen}y@Z`bS05ql=B}j>EG`OT7aM(_Qsg;=3vpYn>K+qDxg(A?b49CLp$I>!#frDg% zhM_i`i7rSx7R2H~(t`j>vviJ?TOTC2x;JF_9z0yIVk~^;@aQ}Q^yj zO8*S$f7tK`hpp!VzfdEif2UHQ{?Xc9&^vx*?w8FS1SazaXX0O$EN=gqe^FjHt|4`(wQ-FFeMnydPL*z(ks8!HKY4>V4?R3ij zH`C|xY2bhRkf!V(KoFp zH*Xrk-S!5)yaIn8dWWEQ5c)F&_S|rn&Mt3PM|jV1cQ8@M+E}gJm#J@7tlA@Zw}CvpXh-yNzDzmKrf2*!o_}X-elvX)_+S6tfB(>* zI1K;#)%hBb7q=A`9YY5y!yCK$PBl-Ef3q9xFHdd8%_*xUVqE_8jrl)PzmslQav+X? z8y<|#&hMaxu*X7Hkn}DnzRWA>ZzysMY@T7T7lzkm9x0-K4*Ie z*sXTkEKNkCG|)NgHXxpPO`ij|I!)bhJTMclPk`Pz7}Np^yx)gqAhiF!SWX-tG#~uP zvF72*XfSOPd+=v_zMkdqlOIl-}(a} zipvy=R-9@GTvI82ikT4W+=rk6WZW!Fiig7rDQj}@FMTFRbU;wUs_n`3vz1{5 zKDL1PC0rm)0Pc1Qd`vAPd<_N@Sk1egiBt@DHRs-?H~LJ1idkGpQCGg2S-W>N%mfCy z@_dKn1A`+6to9o04%Trp{uH<7b6#&T47LfIaLTuGE=hz4=X5-ge7A5! zJa9xg5jbzh^t97-wfKgb2-o9;1o0~$wbn#-&bS34KHxsCemHJGiLuZt@E$)7D~}0j zl%CQ8v7R<%>jR@hF=x!;p&y1CLtKM3OxOmPyLxe{&?}N&@$~hep04Y`!WihWa`lp5 z8(S#Vqh-8tYscyro$auGGO6Tx+{th19J_r<3+d+Eq5^XIKWiL01eDY+%!2j1+s1H< z-c(8XG0~Ehv@I(1ozBr3mGMK0<`yyQ-} zAV(P-heGmIt*wk6fW8xcBZ%*}=6{&fQ$Ke3hd!_pkipP4e+d1)%uRrXGX?$u|3J;X zRKZL>_5r3ce!YB4TGcM8f3>^KtPmS6JPInXBM|w3_B#bVfB(FDFCVbHGJANLzfxNbMfa{%hjOC+B9n`zi9XAb0nS${Y>oWQMzu^Mwq>38)!{n_CoRD~zL#xcv# z6)*gpNd<bcsI5EZzqZ*ECc2d9e9BqSXBpv%Z zx%JZF`T%p$55yV{7EMlEG5Ck+{ox9~ZX0d|*$0DP^YZ2T=*$Q^K>jBA{^XUP`|y{b z|C_)3TWJX7zgwC!nR;L99A4~^$$Q-y{-VVu>+*@}r-ee5_)7l4*-4y=zRaCoUnfNdUvvwI^Omc2R)^{rJ)I-F#{z8z zMm}6ez7zCJ0)}==bgr`UMgMynkF|=KTY}QF43C!c+A_AFSkr~dMeh$aSJ+RO*!(<; zWl;Fr?OEBg>f*}UN&_CTpTLUxh@Ww`eyA4IOZacO@2?)X>Qxy%qT>g+1 z;M;MVDS!$%g$v!5$4t?TY9?LU?z{qcbAR?vO!@TO|BD* z*WrXf{8}5;;Z!M#PDO(-%xby9A5zEBps8xaN@b$@afjRTL-2+xHTYVW&Ufj~WB8Mk z0!3JXxm$sa$pak4ZuzkSpAak0&FX_0H$~0gua(mIiJlht-f&mcDPDKf`vXbX{&ywF+c!@`l z7gdHve=2`U1q1I51G?AvY?=^p*42u~GcJ%9ObBebPm4`6HL}uUw1ut0EGt9r0$^GEJI{fVDo&;O`rH54B zdmsAlM)U4{>3bXX+kSi@eKqs6P<@(@{^phsIDb~#+}lu|U-}hC{pdxt325U1#`RI4 zcWhiSCsF;}I|gt?@d171nTuH;@T`x~Eg$7(d>y@a6eulK-klhF2cfEIT~dG1i{V7} zKQ|FC+pb7|oKScAl}{NDja$F6w=Mh{x<<+wjE8ywKKeM>IB~6jJCHO!#_y$jwHLrW z{h;G~2yZTr?{N#r-6a0W{QvpWz@Pf@e}3h;#346-E$NlL?qX;7_qbL-kF^c?ZWL`L z!z#Vb%kG!Dgzn5 zQg3P@oLW*-1nR&X9D5!=!83xE`L1_@vr!B%Sb&Pa(Y2ld?L5i~#VP*IzjPIcRVv~o zz&1g~%VyvR`=xx_LCIXN)8h&kx}jo+!TNEh>;SN{GPU}~Wl=&MF>=e&lCkLU7kNVrjf4x%x z7pRpdU*yxuTO&S#BcG~=?HB~`c{^1)+(Z!QksMh;CH3}V5V2GzWY7j{;97t&b`xrYkD#8 z*rn&)`I)B&YChoirTg4{;2a@LrxW>kYUY8AdN%^e5x`9{%)pD#1(}(aYndNG3%-K@ z(na;CrH5|m^KA};VoH30SscVCK7j~@NV=d4+8s)N73>@E>s3ec<*V_z+i=|QA2;lh zK9ip#=v(r~P}io<^I?3naqbGHF3BVkUIpf#SA6T2QRzuln;pnyNusm**8}2NWAJMp zPqUA6zgK_0xdQ*sSD*gEy~OYCf9}KAzSg!t0Z6~;O%{B@l&@V-BQ z+5Gs+6 zR5*e`dt0|Q#Qc^X)}bbe8fs6sGTJ=T9a}a zpd_uN&O9Q;{+z$|9f+bsF+nAdF&vqT+FTaZb1J$ErQfd4uT3sD&i&nw{%7yH<(>Q1 z`ce0`==i>^ek(ZRpROlPZ`(%`{KyeFAl}qNc7Nu9v&BjE(FXBBa_*1vAMtgrsedCr z9i97yFZ{;iuLD2j?{g0kPhVM2Vo-xq;8*?ry5|1T3fEWN^Yb=3GU!~>%;VXGp1*4ErsG0mDvhB&gE^o+0-U>cP!6-hrPzW>YC8al% zSG$g$PtN_N^p>#NIQRWeeCHD@wR7K6ucw=EXoG(MJe~E?xRo~vnq%M$Pp1=nnbJK3 zzAAxvo7I0Z-!?CyDL~DN?*p+>IK2}~jry3E!k*9aBZ?h6a=tSR8g6D}@(ZO@=@5lt z7OkEyo33zm_3e?{phoYN>esWvu#NDOC6jAmO0p32;N>#-Qu-*xQ~Qp_|6g=Nk7K03-3aI_!YTZh*bK53(f#&=HZ?! zjDMpngeb>bzB}X;(W@7D-aa#*&R>fMjYEz}5lA;tEU;eyW~-45v(d3e(fH(`H!yDS zRhYJg&ZX$;Rqz?2_5haR{l3`cl+Z&LZ!wy#a4*XWO-+VIZwj(D%={>5-m^X9|p z7pD8*{h{RR+t=sTF4Zsac<-g*aIN8eDEam2H2e?e2N$O!kM-uEKkcEvZurU5AG_dJ zm*3rn<&QjjW%&$S+?foUVz}rg>tLjl^nbP=q0ei(gm+0npU2R3%Dj3IPB<` zP{E?lT#}+=0zI{oIPDr2`Je`0XXOUKkMrtRwzwvshl0_Uud@UuXhZ(UA#y4rCUz? zw@pY7;m={vRJ>8&$dc1%{?+BF>VGP}7&X4^oD{iQ6nUb*L*;RF0*-Cqx!*FfsZj zz1{EvA^)(=ldr6OWvKGmd6*+}C^l~0dB^->y!%g+7f=+kPFV{|nMU-P_TtmeHA^*vtw#ajp583*p~Y3@lc zF}PXfS00z#yTgECOL7$G1@AoZnQtTbQbz$PkLq7ZyNz4|A+WBi?IPm(G`hlc)quqJ z_K*v5Jm1?{z8=@TVYadAGxS`f9x0G^XB)qlk`J*ypRTo{r`B8hYg))WC@cDYA#gL7 z$2wn#dgDXcvVR`_gXX3?$a2KL+PoNeisaLuj}IioZ~vD+d=>hY-+S(}qZRm={6g!M*dDP*&!%gG9M=NxLAX7g%i-!^V0ywu)G~pR{Kzp# z%M88NUJy_miP&MeCr@3x=-iMPi7sto{GvTDNdN#q07*naRBzz)Q3hXMj@4i8eb_&M z`>9qg4fzezpoV>MIclCEYn!593opcjh`kzJ8wp;ST-iAY#GmK5F7a-SdF?rCvw5#u zP2hEPUi~`I4qgPG@>Ljj`tNn_RJDBe%Ifm}U7lWk@tKkPDl4BFhSW0Tz)Nki3bBH1 zK~V?`6Rrz%SOd;hB`U!E+}ZzY@h5@*2OmDP7$g*KUNw(}e4rB8`m_$Jsa~Rk)@XhW zU4|QA1~daBRrE9{aILV5ajM}D7~lr_I(IQeUt?<|YZ%%xK^IJH$P5Hi9D2=v2s99S zM~1B*4QSPE(NIpRz}0OwAR694ybjwXr*;>*t`!#5LIQ#Uo(Sch(6sX4BkK*v%6g)5 zyLB3A+llg}`-f2J_(8CCaj(kieF+8bq0gCEfTC`=*eP4o+_?#0PQ9gkRI1wN<~+A9 zxKj)}E7PgrJ^$Ex)k*9`$3R&5w6eDJiM3iLVhuwDgeNP1w&v1xAct`BO`>l`J~f84 z(TB-HKU@2g)tdYnPY+|Z(j{ol@`q%hQO@19K*x`4p=zmDrZ+tFp06e~xQzz!;C?3ojF6D}2%LA+wKBn~IpZDRPpo7V-`KAlz$usW^wfc?1kpG+gC~aK0OVj{`2e-+Azr@5;4# zx@<_Rcy0j*Ab$&s=W$5&3$G3~#bPwYBYz#ga~^zCMCy@HWEuYR#Cr%A%a$ZNW>!CH zRr-Nn#ShM{j31~mAoYu0`TRfQfBU%l{};~vvcC~=4BmZzyaoN;7yjyp?uGt6&0kFi zKp(#;zK~Ibo`1M+$S3Hd7e48O{;5xeQ$c!2ALvbS7(RqAX z;aiw@_x8_q4)q9XCjJs~1VnmFZaB*`5kFEo6XewVP_j#i`e8l^xIrxQWaa$oQ25P8 z(nPq>mDgYoYVa*?ku{{-CdU9iV~;HZcfmdMX}hC%__p|!0Y`HKcR1D75TDuxPAxdk z@+4=V(|!v zw;)DVs$2ejmL!T8b@5+nXF{nhnuUH?3?`kN20`5NB>5g>=PS>}|LhKy&ptC+ZGU?C zu>0d@=IyVxwNqspD#%ywEwTbM-D?sMmYKL2hD_IyAHtRK)#=U5*22a6o0WzMH(8ym z1me#!<-y$sk4@B6U{Wo>=vcanAeuG&9JvMvGwzy;J}$317}@po<6a9=uCj+JMI)+DCzVfAM2y}!PHboM6r;}Z4E|N{-~?R zus8yh90SD%+L3`KR=^$d0hEn0U39^Q+pd%SdKUx{0P6=HS1AU6voqNAuk$brF;PKv zYu}}DMUf^QzWHqWtotm{har$(IK&QR;5N$3U*4YPepftJu2Me zk^yjBCxZk;&iG{|(mIVd6M13j>j5JUo!S_`N1_@S$KVmTXH*>0()%duWOT`ECO&s^ zx?dDxkE2+#rJUF(vo*;JvtZ{eNHY4&FzRBp1-4%Gp#7J{hEz|LKP&i2>%n)ZFR=2R zVqSM@qt-cG5TgAS#mhC0(xR;k%}Uzt>fbP%GIVdh$YJ3L-1^K%)X%@T^J_E7=>yFfH}KB=^{3wH*CGp#=7IWI@V7Q^3WMz2+rxU6 z#yss#g;nSSujd7T;h3WkjyVcxwY~@b)o?1VCMn9w4;<~!`f$+&99auhQ{YLzm4E3D z#7TT#E1hxV^XjR4!>*0`7It3GRNtyGjJ_E58{vk(;g1}CcEtFg=aW7_-_{z}&&5AV zw<5QSs^5wCIOl$O{u|%%4DtJ;{ZAhd|HkugX&wTvW~=i-WL#&?!g8}1Ch0K+%wBDf z9n!Yp>S8hUwt`m#D}DjA>Com&H(zlqho+Zzk@E(IE`JshQ#X0xe-Ckkl|7Kw& z^~fdo{wpkL4PnYiHo(X{6Z{n{PXd04(+U6_jV%FwqagbREGfY+R5oL)JeaB_EDWDe zwEO<$ndRV_`RekYx2x^$(`k7f1@=w~G&UH{aTTyb`|o|^jScxd^4FetsD>V?ex^hJ zDc$739nTSGCfw}i0(6N5+8fc@r%*95;UJfea6iA#^CKk(ctnC?e;I2iPqL;^)U z7C*z2Z9wPbp1@}`9J)?94+3z;PC$mhiyj6I@v-tYL3cYteU|jl-42E{0!Q5zBrD}M zgHH#Ofd@teOkrMDI(Tvz2lC_Ij?s6yPL#J-O)JlJ)7mW!JlZ71fVl{wb2YJi7sbG6 zu#|r_CS4|4Vl4a;LJ6uvWB@7BM)~ku`PACu1|y>nX|0F+myKeSM{~A77Y413jNkA z>a;OFqO6@qEOyoNeeS(~^!SYk57R;Q(w`t{Oqie+I3hE(i_Xvzmkghyay(aK)~wOe z8ehjv|KKtO+K=35eCgi>+|CqG0xF*X+-GD3FY+ZIg~{rhh>xTjcJgS`6MW9vKErnw zLk~pSgW9<~UnSLteYq$)4&g#{juMseue%k8?)eeyF)76(#}=Bxhr(Nwku79*vE<8o zBNj^6o0dBi-#HjN9Y5tMNG)4EYRd2qx#g=cqg@K~E*}mdS$P}PNMv5YUB;{9M@sWc z>N77Zp(@~bWXf2>(f2Bk@gT6CviV*$tCRa{-5b4b`F%3{27Qk~o9;iln&A7Ot6K2t zC*22c!1pbCkAy)6HsAayN_5{6-s&>a4hlBpWRltA$ z=pWX%8s7WxiQoU&^~l!#-~93?)UWqUPLGGgOH1D82x(k`NNCm7Em#0MPo6WrUwc9ton+uRSZ5-X7VA2S?!SA zDF3Uw&xeD^R(M#OsvQTzgQ@HcT7K#j=G|yqFzsk0``N4ZOpoI@ta$h@u!L+Vv%59H zJ^FJkbQxCVfL@*hw1ap~Wu~NJ@7Ph;7M(OY zR*3zBy8(_l9Z(zpOzmrvX%+gL9sx)HZ?r(STK3?UtMGH`^21*S?!-@C z`7-HFzxni2iof=2FFdLaQW!M+S;%|e^7yJpDDu7Lx$XXJ{>VWla?Xmhrr-^(2{-bs zAO(OyoY+t>jMjk;gIU8cqHF*iVDUUI0Y=zhpfmK{GLY4XEpg#z8QMsG4#S?n=cqjB zmHtJraq{q{mcv=5S|omgCmetXYL$U|%VhQR<i<-kpnoO4!=Da3KR*1jy9vB}_R6FsUGZ1RZ@t^GxnAn${_fFUN9CQPw5Ke;HJ<52z~BSB-awwai5tlYJ``iJ zaoyrtVO(|&^tfW>!Dpn+zzf|iqt10>MMX=A>$d7~gp)}|gF_XGxTsMgK6bZ&cK?66 z-akf?nw}8XTfa2G`1F|<^F^4<{sp8 z+a|!IAwex*eVepssBO?t>P`pt!L*qK7FHXgkHrIV>VqjTc}GEg5^dI=D6xH{$k^jb zZ0^qP)ai%U?^o=BU^q>t3=)E;J8FnJab0`2ex6ElP0w6LcG zPug2?DgNa9`%f=|^)L8|qRBtDa$}MMPg*O*uXdNpdpiQ0h**ygIZ1CXOl z9vA-ot$*ci*3@-iy~Uup$0f0cuKnO-rE~5lzWDZ1j~domAD$1+{b2WC9Mn9jEg!U_ z?kn|L;Y;+Yy$}bjUT))c#OMrsNPVzz3!<3&H7_MwNYopkcBLqL>9J7g`$4~DFvI@+ z>^D+Ta_0mmnmmZHdf%9W@GIf9?zH7w`SICsD`2m?^Wx0~3;VTy`|w!}e)`{DJB@4r zj{fq|S3BOhxc2tpT8jfP`ueqb=@{q1({i|Y=Vg3Xr*-CHcUMVWLq@E&vEmMWL@Nkk z$4uVLmc-x0Ru!b%W*O^CvmIEEq`)}( zmJcmxOg~r`dd2Gku2SI7Eh_@?%-@kl20bnoO1B56 zg`WE{ljRUZEsibK4>fx>0y1)+J0T0c8pjoXcH(nYKz+XFw530(xwH9 zVH>MKOYi|hUO*kFRACy~fp>iHfqWfDa4mR`Bg4{}XK4AiF*OBrVB!bjk1%j8^n{-= zf?VyVLKvLZ2jZ6sO8LrncYUQCMEbEd4-!-!zHDxxH%JGP^7z2DhY5^MN2-nQz%8DA zfKNK(mz)eh-}#xzoG+~@z8Z}B2)|D6GVqe)%$2-_xqEH6Qm}yT-Iz%MiErqO<31aJ zmLIA?kxL&a=P*4wkRK`f{%~!&(xULA7uxeu^(6VB9>gY4yYMJ0^~3L{1q(m5lEVGX z_`{0}h5U+dUOVkz%#vY5?JOQ6(^~)MGSLaFACpx71GD>Qt1a~xFSe&eiuVD0Y|D{6 zVW$?ov)Fj@V#|p``(1xV^o^Yx@vNj>IG6_1W0(^fVW!E@>P5~<;R`NBNX|95;{xCL z-wADMH~Ik={%)crCrel1$Pwdlgp6iqVdFJNLjsSk_U;`^-m~hZP7_J}w|?Si`W8k+ z>mqp5x0)9$Or;N$x5rcxkj}~@=mYV~qx!iYIcOZ}sl}JLtfH6ox2DbRf#drd>B)8X zf;*4oXJNJe(teXr)%%3@f|Jvl1 z&Cge-x2BTEE5lcZXB}p#xI9xm&yM~woCO}u9==>^zO5Xr)Y1=Muf)5dahz(Qu;B{#CF;2)pJi4@* zboJBs6qg|Hi`S})fpwy|He4&g^|em@T>@GPpq{2O4r4?N%_h8g4{iN`Q^W5r zE_WCk_h&c&J?S~xbV{GarUlLoI_TEa!QmEI2j%GvBI)-BtqBH0qjW6)LHV`wQx1QO zC({yW7m>T;*Nj0Jm<~$r?7+CoU{?y^zg0#zX=lUHdNT;LbL&bqAmWvyS1TL(a+xpf z=vh$64bV=d*Fx{X80eV;Xjko80ueWJQ8K4?@vJDt+#!cv<7TL}!v!L?H5 zzBsxW%y4()t+@)yZ>guou@NoDKyUypd^ni-Kz?^^wo>!9J0+ZzPW2?%%=qAY3%7AX zT2OUFt#US+%je{=FC68TbzD zutY|v1MLMdEZZ9oU8*@ktWF+3jr!HXi*_XEm*qO^s~iHGS}c<@M|vEARv39$eL9h_ z{^R%wNT1?&^U-m=m`R=*C&3*DfrYG(Ff={@@k6C!nW)9TI^->M_&4j9g7ozcL@o7D zOT9oVH6HLi~{n!WSwNx*9C(0Ih8$rsoa&RmpXZjm8;|7~P7`>5b47+5m_}~B>=&{nFg_h5k zgrlXI`QVUKTIlaM5U>=_IF#HqJ|iE%dpRF^Ao|+&z4ZY0js2U>vM6F*wQfj8gpKh;a(Uu<%*^F&T2&x3m}5|4YM5(sB3mo9}r}12>yPzs)1<{b&*heVa@4j`y${acR9~pkqoe2QvzC0c$KX!8d}TBXpbzBP&F$5^ zhJNQ{!%jN>WOQ84OQ&&5kR1l>b1eo7Xd&#oOpg4>}K^WT2^FoeeCOI%`W_?iG`l0E`PR9j(uGN=o=mv*CczE?U*9sib^Si!z;XPNrS(1IL@B~xDuJ%Y`-42$%f-cs zJke*W@7CwRVF>a4;rodXgThfj66m01fre%wov1v_xniXNLm$AEZy{OM5eFe0h1Lb| zh@Eu-KcsldP36z#i4$!1`>ZYSpJG{EJOP7AgEqm5}FC$9-TJw_#||LLKFa3 zHEf6c`YHQ1~ExHQW;<@0;P3&hmHph^Z!0Fi8q!??_}?3g=rN zK<>fOwQeOcVe1=(jT7ljA(!$ajq1_P&G-rf*)4GQjjzVlR{y-?rEp%t59w$wjS6%w z=ZD|(H{3}(mJ6cRvbk2pO zKTtCp2i{Q_z(!wYHXq~F#cGSe2sgdP;ZFLPM{2@+g3ZxkE4`)sF{Hb%8eU!LFbEF~ z<0|}rb1i;xUK7!h7Fyr~SC!I}+xksAM%I4hr1)#$+6~qJV!Uzfv~Wp};nV8We}V$? zCw(eYyO<}9MbJ)bpVEtgyb~V@z7a~fY%p|{8Mk0TY4>z1S#WBCGt#%zTVjYKG)Jf0 zmA_d83#D6|(BM@-6^+UfEK06|6N*S*CaM1%c?Sou%v*o47M0P& z8^o+p!HGvYY8O6{oWe}JCklc+qNCL7oSwd2jj1D{!~SqF>jpFIT&tpDIV zF0FVtqP5{J$44I(f8XfphgAOy&5bXrel7IYz7AYM=SM-ve$q$s7UCM8wz9~z$$q5m z5BwoV`vnQgbRxvOTb4J2%gH8tZN=BJoX{nYL?Qv^NunvQgCBfr^z^(;HNuNrWAp$_ z`IRJ1`L$@?_!vtM=I-^bZ=K}Ws2tK%%FhG0nP}SI!c{qnqf9B?}WW}&ZNY0khnC@R6d?eL-MQb0c^^H%h? zcmFcZ3j(~Xt8wB4^YC_S>+<%6z`PFEf)@Jw>-*casQG@?=~o*MyyLzyC;?T;>f zX|Nc)Z#l;9=imN#_xpeR+T!-_p7Qmf%kK94H1-Y$pgn6fVQx34wsTwCxfET&2|)MS zOnd}TJ0LV~nOq=r*Z8hx5ID-(_~z&w%$M}w0(&e)E%<~f0u083N`huW4SgWp38opq zphl(RI>N9H6(Cl~2MHu*?UQkNGkK!&{P-<=^52 zpyf!exFTcdURi&2=sME1gNnNb#*84tvvfg>uN{TjLHoH8ZU;jjs4ws?f#}WU(n_f< zj3ZnK@%QsfP$ez_GzvcRfq~h&f4JIVI5%Ic&kLs=Ny%Lf4{ax(>Vu?rEy(dD#i+*7Ya^l4!`m6X-8fj zO<4Rq#iLlQ17yC8zn7=au8pG8BY+iBJU@TFJ}b#TEG z;&zhzG0pE1P@DQSoZK5$h`!mq6#GD6E%#f~op|Yn%DZy{)#Qb$Ome`i){0+_7t2Kj zsdig?ISIj(0lYgPMCqjvCs#w^`$zY=)s}IbrSCZ~pDZ7S-r{u;A1EvR!VH_M$?CcG2Uz$avjNP>GzG?kIcd@4a;`#b^OMagDYyNP8QuHPCaau5? z{aQegf6X1okojK{*di=CB)#?HBp1CSWUz+BOF{>IW9_ce{9*a5Ri5N%>DbZt1)+lR zDZxj{0`jZ2J*)Q!O%`l3t|j>SeYIIB z*(eQX$7e0^>%4v#aS#vR!Pz?NRd_j`fxr3gXAWMkk^h(Y6+l6Gx&roOe&5<9Fpma< z9sS2^Gy5P=ea*)AzVYzixx91B?S)_aci;8@+~o%@1M2zT`oDjp)RBq_ilg$>r6gDk z(%6!&qnIUW0;<=+Ibp%5p|!LDyz5ySf0jHTy}W18;F*_%4tY5O+_P+1x-Ji3WvLub zU|UO9Y3ZT79p3INz*|xyaK)5};B}VX4#qAX6||1Pm2YXF?mSCmU`)`iuPj}p2GZF# z)5#_{@1P5-6^{)@30={D_y|8(%ub$=JIPbUKW+L*{1S@%Y;%XbRsoZVX8A&12>0{C zv`fxN`Q!6Sz zqUmLt`0Gi|~|nlyi82CRLQV>vp?iG&XG zOL!_58VAeu#8KKz27+I`*f`(O|1v%5BIVf9Z(Aw$NWwxPEnwtKa@(gL0YVN=1Vi@) zIOP5-9+GFrCJ*LIniuc{a_^-Xw5u`=DF{RJPRz{4fuO(~rbyX4=Z(cP{;E$uJG6Q^ zxiNZ@_3My0;@w_9@j;k*72)wnpzpx7jk@zVfa3cxX@EtW7Czo#7+U^K46tB5m&ew? z2j~)m9l?40aoAG%Ep6=JlTJ6!@{#qw7ELRs%E!E`eQ*w4uDEMFobmT^xp{*l2h?Di z#vkoX?V2TxTRxK~wz2jcq<$e6E00lWG++3USc)Gp{skp+G;Q*2371^E#0wwL{|>x{ z9R@RAqC}^DZSX6k0=inp6BZogpXWv2SoyMq0@7JMI9h67e~g{C2xJf_e+Vx+>;X$^ z0cP~G#coBRzl~a8KXxm@75We6*?Y>j#XKjT(q}4Pb{|R$aMK6NH?n@9k5-OGzJR~o z+m-{pPx9E#^M8+-)>6Qf@$bMJ{h`SvriGuJC0yCVk;SK3NO|aCXZ5279z^Kzpk@xcLG(d* zah!IK-e7;CVh#h-tw2|LaceFh@Y~C40mGj?~nGnVQOH&k`eem`sPYp@u%; ze;)+uYkV{4pbvfNp|t>6zg_w_j#>z;{t4}Z7;3O@4n6IByep_a0@LWqT>E^CfIWi!Iw=(W<6bQ{qi@Np zc(BqlerOgjx4ZM32``R&GmL(cY1*%GlRS)*PcZ1G^8pSEr`6wa_7h24Cx?svSH#*l zSiKv>iQZ2O{GDg|NY>(qd19hDi%2^9?*q6^juroodZ;nrgr!tGJC@*~IY~~?>n;G6Y8NjRD z@+=kRU)u4r z5gGO!@hoWE8UKD}q1`@Me~)=U(Q8tmE=TOW~V&uvhko4-@5NPZZjNp(P)j~HEICR=2qD4_N}#l z#$ml^=A{4!DM6QZ{47(m^A`RV;}FR|NgE30;mq>w@fJsLvd^{kuS@MAZ4KA>R&rz` zR6s}ObxApOw#($}JI0XtZ%}YAx!4GC*Umi6t4(m^k|SHfm!l(CPyb!dhqMmaJ3S@* z8Ov`3M=Y}-Xl9VVWj2@KJzCPih>6cme-{dArS$0in$gFLgY%kDlV&tOqZ?cOhkZwx ze3_3=V1e8!{Q#i{V`{*`;S#(*mCL%3dU)oU0l)_qCqj#-STQ4k9kyyExMu!?+;3Yc zX1_%H_oZ<{uQzkQ4wcNkm0v?B{u7jAz>EvljS z3mBG?bccN)6-E*T@4zQ?5DuPVFa^XwDgMqx-_JXr%q9x;WrZ@a z%HJ(*z;@Dt!ZVxT1NG!1JqCPY?QhcpqMf6L)V^#5eqrs!>a=Bii(Az>n6#}e+>`9_ z?;trWGFrbJpGy4X^U+4sP?# zTjL;lOLy=_&(dwdbgL<)X1q32dKRWuGz&##^=`OCmo|zr{He!Qg1k z_?#29isxk==L7L9yzUK54|-#S`!6qC;6~Zv2>h-4o#j1rZp)I_e;YI^`PWS zhwi6tT&ZDnlojo&C3np$lk-|Xv2iH*B8k#$r3Dr{X0$JI|BtlY0H$gU>54^Rcw6^W z-g!&kH*^1+tf%Oc55!NnNXIx;i>UB&p5h>hF8X9I4_PTn=y6If$J*eS{wjdovYCk9 zTfaFews~D;JV`r#N=f-Nb6d*VVWsH62YKNiBgX>zB-`r^&Vm&`%pcy_XQ3pXN4!Ve z<#=rwj!32?-5T>ncwLeL&-=-F?J&^lDfDix{~dV`UcoE58Z&}VU3h5t zSy>`r!r74U4z5iNUd6%z{5#>H@gJaGF=qX?@Zu>+75H+p-;4L>AKK3IIAJ#|-HEmW zq~F5Ml-R#A%RkF&v5_5$mJuf1%I8)pA6U?5gT{Aq1XhCdYEY*QurCHP#rwbG-|T+y z&!fw*x(vAgWAVSb_y5_a+&A1Wx_<(9BTxA;l?Ui`8q=y{n9721he?6W;ysdJ>1Hj= z!N$l2OrB&3f5MI)q-V6skAGJ8CHMpr4y`i!0vrhd>zfQ|-@l^+S0Tm@-b zVmFc@=7eBqin*H)xu!fTtVuJY^POWtuiTcucG?Flb4?p9~ZWTCld%>6t#^p!^t=(iEXqD}ln*D}~`k3Wb3$2Z40!C{h7F z?rUpT=biGi01vIc!=!M0xN->BPBs+J2aytuT1a+GlpxFwthVw`FpQAeU#$cJ6Ruhp zAq%KEswqwDTmM?BwFV;KERn}J?!#=kV=V*wAD^VVQBmU$EYM7^_T{Rln(7SJ||+) z_;MVSZ?yQ3^;2Q;y|;e&Gxrky^Ey8LdgN{6-EWrj0>*?gLFjkxze!8|Dy&_Bc97mq z*hr^Gi3V*tNt0PrJoBkG%=ije;6{B%*&~~EY3voTmfm$(m|#>4)`WWBPYadq7>gl%J?-EZZ{sLGK))47NBko`0Ve$J zelCRlYZejACxI=#&X#gNIkwtxDSqV%y@kfuxxuzZYNZ;OMP}zeQA<`vD^ufteDJ&e z$5`i``#JXqF02wT=s&zT>mUBp@#5z=(h2S>7+71NIGRePJ#|x#f%AbZ@U1}y7&u6F z>=j7RnP5t$SVUlT?@aaj&xA<|w8vAClK2@%(FO6_2!&`VlV}aF z1la3|3p8a^K7f}m+f33z;9Gv#4_|2nD%}SHG7Nw(;cYWsq{zui99xdQ#w2~i&tWr5hjT>plhNSotlha;W$dJCJ@QoW<|CuP~k+c{h z(Ja3+wfo9+?UQQbl}GN1D;@m*GAS74Ro0%8rG$9eRa-x|C|~q`>OUc8`~WvVU{FNM z5A7rEJ+|7^_lj6_BzyeG*Wk_qm}!oNE!6fi!%#kuk6x?)jC;wQ36T4bz8R$HBz>G3 zP5Dak=D&6SL#qXCEC)B$zVm}Kr*atYB!?}^B^@Udsos$vL#n=^Vft(R*kW%R;Ox4R zyT&(7#8GPBa>BEqmOhZ59j}cS@=q-#9og8g%&h(bLckHV^=m1Q)GFqI#nPW-keKk6 zjs?To$8sH%f@i>0N||dhF8qS4q|W8edrp36#&zZdTj+BO-pvaPv&nbROE^e@;f;HX zm6p@N;_}lzz+MOm~ zFMS|ef*Pd$2lB0>u_fXCgxO#;HjdSu{#VxGP1+ktcY;L;x7_VodT$VUQIBLUO#Qweo>9qa+8G ziIJkwhmqPtzM8w~fe&gE4n>5~atT`Izu{C5j&!v4g*@*Ia@53?dEuWcF)&JYRkmE9 zGOS$bw{h~VBVR|HtbPfv$&LjjT2E%CmFR!oFm7S_0LJ0a(gz%$2xBYHgQ4FOAGevO z?eLG&&Ykg}+PG;Yf^R1>M6;nYJIVMQSxrySa^l(On!Tl#fW>z|(7q+Ef&ER!uOskj z<_QP~Yg=gXF`cynXSx9)&!;0pS`U#dJ-gJU87w~SdX(@)V8R+o=p!`m4)h&(w-0A6^~W?Z;Lc1@*BR!Tc+^nk(W+7i z>6n}t&RXT@s7HL%wJ`@ zfdM*)&q7sL`YxXw%+nFPFEHpO>Dc*jm%LKDG#&u?47+*e(|Ri>(4t5b^0)SE4?+>Ut~9~RJ=@kgl~4x&vi zINU=Y(C^q=KQLRhl{=@bh(Rm30^!OT;BGb+&;kq~&7lQO*vUsiEEq;lvKQG~>ab47$`RMur%pPmGy}+A!r$(L^?!)GBJowSi<}6JEWS$%KlZ&G z6vS`4lyBVI4jt*(I1qng>5nKel7>&>a;IJ1TygY%bJ4-rz;c%GkMhDF^RxZ!{D^0l zXZEC9JdquvyRqEL_sg_T{P*{}P_lPZ!<{TDz&mEC|D=apT+cJ}qiLbl4&CZ~2lbRB zc!jeMu+9;CrGIN~@0a>5EAIo@p5-Hd^raw~TkyO6MFj8j2gb_TR)_UNBO=Gr_{e2P zBvQ0?a$;AT{NK;ITEJg(TYX@mpR@M|v(VR0bhlCp56acj7jg_%7QS=(Ucj2acuY)! z)n#DupD&(sr_cO^`%m3}?LUqxjNPyF|2svTuyl1y+O;$h`R5U~Fx)l298@qKyD84) z<4ZPS*4)LRI&@`v#kmwelj-7sqE>qIgaQq#2Gf<=(NW5U&!d8&E5U+5`W6pM;R8Y~ zbcH8gKyPr8AiB**@68~pKJ7eh${*x~U`F~*`Pg~a4n^|82k78xE_Y?f=Mkbjq}7ye zk|sR48VB%ljPrrOBpD=Ye@**4D~x9Li;AOa$_z`~rj;0$l{V@9Oc)5~i=cas;SA3UtVtKjK1WC}r z2^Jhnp7###j)R)tyMEz9@ST1qdS9dVdQK=-3wH;W?+mao+IT9$2X0+l72zIxHE{BjA zp%!_z;906~)vY=o=-2jrVYSouD^5EXk$cMpCOqM;iC+ud8}4Zb1rGJ(LV2Nd24(IdSos;h)UT8Ls3bd9#6;_FO9;59yL)E(Rx^W27$fqxltXzk6ux#HT*fUg+|dnv zKt9#5k$moPcmL)9{6O)*N7Vnje)RH_1IKqJzR1rb1K*1%9;{X)3_$(h(N*jtf&ENN zAAZtsf3fx*XYDOv#(R2oxY9A+vj=OdU*#8EM~iv@W?3qo;5fZ=WDB_HO)J& z%e2iCwrf%SV3cfZd$iw{Kpb1?85=xv#VKWMH8jcIvJi$rsRUWx6+Nh-I%c5w1?f95 zc2@P`c-2sx-Ezl4HTfPjsCn@Cx%Y!gw2!2;lXkX>ub}Z{DuZJHnA`l^LXT^TpN* zGgoz1P+UiCGbhYZT{&(2OotHygHrNsu%^I4r&~u@hg+Q zWZ>sS!nbE-EqKNeMFE~K!kOqX&tz-T(Ol#25-yEz_3B7X9cKqLLl};Wl;Dw->iDmL zGpl#XkvH)cN3iU5Ag+7>PpC-{ z{8Y#v`HAlc?7|7qYl)A?F5^m@b3O-@TuqvIm)0)MRv`PpPQIhw?X#J+e6#O_Z?t?H zpLkwk(%o6EngE`=$ssQk^i$D}!7c}ZK)rBMpceyQjOw5{SULyU!ry{R-}(S}=u?)znj^m*_az31*18 z^bDSpn~52SgGGCxpuKbC*ipum3s@Rh9EG7VHgKH8ckJ}V=&~acTy>%5_t(4EXEqLN z*xm0bJ$Ze|lm+X<+&lCKa(mfE-1Cl*oKHr>y*{C&r02j2n0|(A#!JJs6 zde=BxD8$bT;2z;p<7}yAN0vMN5i!^a(%0mlP;vn-`{Q$H)|WM6-Qsi1+>!t<=b6oW zN?HNGW&8^QPpEd_%nxOkkju>EndN$R>HJBhm~GxHPYdwJZVXRJ#|h#lsr4m4dJbTR zgxE=Mi>6o6$~&Sa(Vt+XBY_#XrG4m;hi09e_ps5sEg>A1q+i=f-+3u8%M(|l zytIB6N%+=ug8o`}YeVz#)$nRmxi_1a4$nF^(uZjsy0mr4^~4XHtQqrrvQiA9P5=g_ zZ=r7vo?C5h)K9+Uzxk1O-F)p+N+TE~^u2rk5BqQSpZ;3ML>Z}Ly!Ae|j_(qNc2hbG zVt^V=5Sm-7gQ(!dR4a1CEIuy*ipE2!)$u#eKu+>Y9}N@NfOIYK9GFyZV;2KY>0GBB}M^#K!%E{$& z1U0dAsI?7bZK<97Fl$G}`dTGfYObay25Q9|Bx1Rj&xH$wz64L8i4-K4AVcaz(!tJ zcBIzCkMV#bfjKU!7)uzYmkv1^H4f9bP5q+Xk$i0$U!>Do|BqAuczZeZFE31JOJxPH z@C!?NRv$;G)^kn(#P{im9OEboX!F9qM!!n(rBWP*u<4<3&myU$hoz9*2(=W$5JfMg zptqPsGG3MSzwi^|6v+@#d#iZ*Y4YO@Wnup5=}nFp!ADI3dz$(fyWV;s^;?#$z%$?t%6 zL8I^0Ai&R{owK!Xob~glpI8(I+c5S`@*~yES~|-aOU))=CuxA*Y0!9~|DE-Jd9pa- z*He-HANjG8;{Z24knUInu#RFXDL%uQI90j#?V*UuE{grG+0yHKmAY-e{Iue>QuwGkRA5bU=&0 z$q6LY2;N9X{j#qnUrtbD8CfXzQn|>lAYJX|+%b??Fu`tmrq8dfxWyafP1ATsV@J_T zKspmk|5mmZf=~B*Mz7`h_OTrQzCOwOsjL_8%Z@j8&hmXezsoS?O9e3QoT#p2mkQc{ z;Mb9u`p*s6%i|Z2SA;&}VFZ}@&xnJ^*^v-WjF2oY3%xl+s}pwofo_iY-w!3YSm|U# zR@;@vi~j0`pIZdh^}hoD9|yqw219)L5AcszkVq`gTNv|-=mEsu2k^QG0EJ*`s!^5r zbApSYt^mNEnqD%t9lK;*C-ZWPG7r9+(4C zD4u7XmVT3P)A> z%sUZP--(|WT6X4(f{2J5#FwKGGcMt`NL=*#B0$lHOmAkxF@Y|KILdU1gQkQX>1zeD zL(!!AdGb|SJL0*GzY?e)a7%>+7GFWv5HYuVKd0MH3lWNK<=_Y?RW>JJ927H*%Y`AN zba?&=j?&9UTKLsZj`$k&55KuJy2YT2-pzV7%Z3W`qH>oYz45{1lFBL2Wd~Hrp`!nd z+ApJGlG{iQj|{PTiXo~V0 z`XAIEw6;wtC=Xf-m-Q3#VDXdW*!dE1?p z#{!cV>S@Xc$Ho(5Q7fIm#y5=~j!km7^eo>ZgSiaskaIn4)|-9)Sxh8Fl^ukWjJsqI zF{jpEMzxmQ(dwz`&-NV$4laNrW($;B0fz;s7LB=2{Xaks(7dc>n3I=;wLp+Qn}5v< zquFuRN{{1J+Z@-t7k!lMkzVoYJEOS)^W48tUie48kUW^vwUEGQo+wLRNU<=v?c>6W z-pzW;%Xr2=PV1&cE!TYPV7W38V3c3%jS0{;Vhsepw4jTI~#zBsh2JMD%Ydv7Qe#)7SxI17<9%_nK&u5RAj~B zT}%843r0}eP^C`!QSsK<0%iG5h%32xnGmiFXHd)ij#2K?n13AFvGA97MU^*q^H%v^ zEM93efYiwys5KmvGi9ey5LovU?wZ(RrIW$xYvPv<%`wmN1AI)DE4h!8=gAJO5tFx* zXOyWEmZ8Q)YH4yJo%)yjPU_z$9ARLhxXcUx#&Rdh4zGsK0&62Q zM~|U#M3RHjDGyg3Zw~yT6NF{yc|4Adt4B80ZuU8;{~P30)Qmk^B)p-!!Pp0I&Szmr zmXBcR30nVmcvKJwx4yQVG1bfW=%N!8{lr={HcCgNjnO;EC&1gKSCRa*#s}$GpW-+3 zqk&`Q0eqGzX#$Q#Ztque{jdaj+0LNKj>8sGitt-BQ*fAeKw6%x-Rs6>zJhD6QKG45 zY9Yz9=0b~29|@YiALf@y(Mo!3?Y4AmKrCKMP)WTL^q~ch$lsA}!UfGjUMn80nOXl8 zj>I)7p8es(;)|?5hww>aZ~K!@qiOA-zb4@m>QMZlwSomQ*&pm)>i;a~KUN~rvJhH% zd8f~bl+DL%1z1FrBfz-VN{1OY4QCV@vpbv^s6MkVHGyF+e}jItq%Yt_F8Z(jp_dcQ z5FTY!*1{To4L|a7HrR3zF9(9VWA-Nt%F(^R>J;9}JN*4D|1FCqA4^XpZ2L#jjcHv8 zy@q@{Fpe~LJL!>RShlzWyY!%h9Rca@;bKo56ZPQS#2mk%ki;jP9oNY{8Mf&taA@~z_WU37x1~{ zKrcRlWhV#LD3yt!xj#g*t>4oX)w+7(FlYZSj#JWClJU`&du(}K^G3xMA|IC-q zP|$jDAKWH+nkc?iY=d9G4;Y-9g7-`e@>pzvz_Xhg2Tz_+DMA!@c?Zi zjD4&0OoXwLnco%(?4mvebmwPjf+WS@2~IK)1#dmJq&vy=)|A0z{#pPRC_NV^7(*W% z3pj?ag&t-PZOAl%W*|!8e%eD=J6sQq0?{Te)W!z{+Fb}5uq%gGD%I0Z*r_}8_vl8W z{5<1nAZ^0=61v6E)X)VJ6YwJ(o&x@udclMYqnH-YBLOK73wHLvwXiAKn4PIG<%{Os zgW;egFr$QmYcnrwlpza5O)OX%e`G(h3ACN%E*=+JQCa$JXu;CJS?$nB-|_|0LNXuH&TE$XA)T=Hclo72 z=O-F3#%a9lmq^TpO?TmG2RadKhN{MXA$0qy9F zQRbuc159tEP222@6@S1bnuXNbGfLylXH;4%zjQa0pLsvDc62c#20e;zmX$4tJV2$k-wwf zn$nd{DLcdON%O zgRQzM3>Xc5$f&Q`U0?h$JBYG;#_Ypm?jg17@_R0SazK(>zk2H-EFXPY+)(+8FZfP& z6ZgEZc08#t*C*Y3dKXBC-MP3w={{+a{z|T2E`NfDtUSt*#w{LW zylbA}|KznNSEF-3{i8qinNy|v9o-C4zcoIB+Wn-B$0Lhxxf1#ju0Z?SwJ!{yZSx9C6Q;!ljL+e5mcJAX^__;>&DKUx2amg)I{8`W+2iy!AE z{4kDC0B>?eBgV7&R{-dv0NO;KdJ`Nk!?ecd zX8Afk9vU@3S#V-NyDQqoWWrB+= zeFgjiet_Sy01A((y>lpQF8`1PAJT8DG#30Z-%BiYl(Jf?-dEhIzB32&oD%HO0Pir?^)z5^en{vn-qP(nATYypm0PMh8aj3Y0#3`5LcOL_a+ zqW~LA2ca(|FTQcz_Cfu~|DAAy9j9Q5BhZ5Pdg~8Q%53~tejZXZ6D^p0|A$oXb8F9s z)0%$<@>_YQSI|yq_c$slX!5u`OhyE;{g8u7KE{x%!pWNVlgq-*r}qx45SAIG>~EK*<%j?7R-# z(SjPx$&Bps@R{K!FMwxp_V_7$=2htg0Vzi4BIygG(^-EWdJi1z74<3KXpSHvV+6OQ`owekdJd#hl znfPeW(AqIJX{fG`sC@rhqzmNh;FqLJwP-w_hSE5geDih-#Y~Sz#W(ON9Sbcj2Cn6D z0{!oxBjeTL=&jAG^MbNIkscMeZ>MsJZ%Cz$(}oa7|08SX5FB6((~jT0kFyLx<)o^D3GnwQCxZ2fV9}%W z76B)T9h4hvtjvX1*H?|RI=?XUfgS(sg7YQ(>VjKQ{Qk-_gBMTQzrXe2vv>XacfShj z`(X9^s5cVt?EmA%o4)A$KX4!S{5BBbb&B>VlnG=)g99|v${O0_g|6faUXf0;`H1!~ z3zVZK4d{TKlN5?)>^6}6S2UM^9XbI#LQ16ElR+&$16f&$8LHmFh}n>yB!Q8?8Wix? zS>S5Ycj;|s%t&nt6p|yrQD5x?@dunJM5lKWl7h3dwtj4~@VAWn_Fat>WUabXNszbP zeAa_sp1tDK4oXcEcu2YM=}m3rairq|Gz+x#qZw2-@O$I{=tr#uh#hU~12j8O(LD1v z1C9eS9Tbj<-J8OBH|U_0FIqh<{TGA&yBhvF5{_UU85NYfosaU4U4pS24+6nCXVnSKg+#?2k6Aj#zoJJ1)F@^-9n4*tb;y6jx|`1L_mIvasv7Ed*=wF z@gvJWSlD>;$fF@fKN|}x1$wjp zd^`tp(3tXV^5LyOxwCxYaDZbOiRVw{q2;yFtuw&kndVR>?DzasBaB;6lS2+(>Nh1? zKW45F8#CNle9Q)OPTt_uukQoB+-vo1F#i=(q~6M2h`hFQZ@C)i{J~3;vj}5@^d)$Y zacRK;`xU`*AcZv#16ZvtXxk1;gFxv3PFxsUVRCTvUl56Q{d%6~$EjZrj^Er| zERbXQ-Df0cHatmBc{Hi?>?3O-v}j~@aE|`8FuHU-IDGKYRl?8j^D6*Y=s^(Tgf!_J z8@NS;9{IvbQo8{T>YKjfdj#QDbGhZqphy44y%vZV;W9$ouTdg&K|2C?T|ZD$I|u_T zlX6|%eTVlSUnsB#<@I<9cE`EB{LIbtY+|kek6hBo(3%zv&=LBY_2>P}%no|ipBVjV zpN`IlEO~;@Q*)r+JzVxgryhKOGp+*0b!003p-DycqL+2R2k`G}vO z(H*r$!oP;aEnz;vLz5P)e<~EfTX};rWJ?!G_bfbMu%U-YeA4;n*XDx`bGvrS))P*? z4;9ZmOmaU;dgdp|9`S}jlHeH297*@FY^S!*E2HPQY6bP|<(B|yht)ew<9Olv%JG1F z7hk!sw@SK;YZux9#at-$Iw169wecnN-?_LsIQSwlz&}sujd$hw|Aob0@Bm=zpFS=H zQ^ol2oe%DNu<4@_o5Tgubj|==X`nFVjR}^8Rp2okDyKidVJKj5w9Q>dm_m3~n0n!W zK@IRHeG*WMVHSUq4d0Ns2pzM6jd=+rKp*61;}Mfns$3RUFbh{F#h~_D^>RL;ywEnh z?&9czO^~Z=SBJi(oj4jKcQ=MN>hr*W4(GKE-JCo%7dw3`zhX*s&=uV1)NTXPjxA88 zqa==68@qTbs9tTPWiCiKUw$pJ*IsJuf-57QM~e zyana#r`Wzr28hz!x#9~#iZ79430)z_2<~!e!Zq}MZcl}Th-aEblM~b1QXZ#xq|=C| zHxt8!jWz`&z=5*`h<7j=>z52rN!$tjjO3FPMeqA0v#mT4q$k9q7uFsO_6+JyzX;mG zuZ7+qWBNU|aXwidy^|+!ZJ<9TnCVE#cb>T;MOz5?XG+86xT(K9n=^xsBVz`Bv7Q&6 zU1bJ#n7RTMewByWF+D+BYq3dP(Ie`^r7;F!urKn0wVC?Kbgm^gex7Ri8Ld?AMsDXu zawur$P{m*X8eus=){kJ6Zi(OW>xR;JN$y3`N90^u|Mjj&w0NtB@tOJ>de)DOJIz&%eOL3$k z9rc);Hf$z1eoi|y`SKE+;&G4?KFRIb&h40Ixlfqik#y*T50tmT4256=zjS-nNfd~0};>sv>DaO|W<5k=a;*)m?kSFRFlQm5_`eQ4oz^uC6#jSulS z1gV}K!azSwjuoF6p81f=QA9vawaW3Pugw2OY_l&4L}{`DK*<%UPk2AQRi3qjdE3`; z*%E!j4^paoIs^2H;q zO(+A&n{!L+uYMiY2iT#POE3Fg+PF-and1L)e(CS6d4cEAthM~D?2Jjj_;NaGUwn}E zliYnHorwCk;hKnkR&NafPoe+9*Igkb?NUEj6~>BR{8BoDUVJ(&_xTKux^z?afVEv=m! z{WeCjVEn(t`WN7Q5KA1vqx>#`zDoef&y{HB(2;DG`OX80SgD!sX;(P^s zp}H{i0lHmnR>2p>t8Nh4`G?hFP;henDgS5gA=dG~2L4(HfNzlh_x>%vU%7wjUZ?8T z>$mc(x*gUZgf zHiHqeN=K<9@inaw-a(MUG8mD-I2jbwqcTOC<_Wz{96+q`nU;l?)Ro=AQ1xD!T&bnR z7n_Sw0)J`yrK<0EhSu=*epG#FN5+I0TDb>!gtfzP(=Ot5pk(dFGgo=+=f{=~N8_Am z)OjjeJ55W+&qFMJ$dMZ9_3T#p_&G>z{n?_%68=#ig_-c758&g}e+=13?c>b{`osVq ztaLKnyu=f%Jv(`U?9#~yNzy{bOK3{3K2ov_JcnlFE7U4*;I9MkCX-GplW9LxEPx|G z%bY$_p?YX{wECvVpJ?hIt6a_>Dl4BI`gsRE>7&shO$5d@T8+_KLwn#C6u|gf5BCWJ zdi&nWA16m+x!`M|xB4(IRzlu^VgMVOLT()rX1EwB?Cw{2^~oqp?; zCTriAhY{qoRzymensn6u1f#Uzp<}g;<1CM3iK|nSq(}?APJYy`9`j}6J0n~Yzd=9X zbK+1@25rvslKEr(+)Dc6d8dU~IaI0t>p9&h%WJ;q6pw?S$1&AM|2r%HFt@l#j>}SB zcl3t-YCfsW*27He!HU|!2?{MHj)h~D5c;dyQ)5uBj zr*D-#G_!73{X{y{2<#9pxbn+{oJbz|0Dm(r`2H0?g|ZEp5Tm{;?6zci6_9iQ*^3Bf z1Hs*0Y%lJv6k5M71mDRKxL8WJE_4?Q+T0x$Nw7mYaM|9d;Cwk z@#ntV_+MK5mVfrEotvkMIdY##F@2j$oFq&)h9=-DdycSepoZ*#72Z!fCls(WML0W6blq~$<`S|s!hyU{I<@&tloAK-CqaHr(vx&q+>qIk=M;dsJP?Hd6OpKs(v@e3C z_<{{~`~~T>W2?bO$$-<3u?->WVCAgKHz&N641GVz6TW7EDF#E_^&RoUGy!P;RP{ZjD?bk3ND3&8<92_BMh^3e#CR_fJ0ksSm!C^J16r8&*FGYa~T) zKkFl2J0^UaC#`ysIr`5JSEerL)<68L8M zN0wYiXZ`R*JP+uV((nTmcgE9JlUX?@{qND*f^^*`l#oRQKcQTu*U@1L+(V9pZ^FHt z^fDXZ(kD>0;0XD9v7eHAg=*Osf9Zc|d^rsBQBl^uQ9MeiLjNSCi-Jf>U6y>1e?jE3 zXao4Ar)UFf)GZ zy$c2SQ+k65@ehTCsCyPsE8pJ7e)#>LOVNF^#gXa5 ztKm}L>7&zS3;KoZV%B!pjr6tN!gG;+qdq#W$h))Hw|Vj5Fn>t0#fKdU_P|o=;T`{0 z&+}o$zx+_#Ntw90lChw&!-3^f;Z{HTbl>V95=nlfd(1cd5A$I4h=1>s;(+X}Z6p;A zz|q=B?ON-uOp+2Dl|3ye{wMNUY z{?U&o)8&8dUi#WX(Kb-MkdT!ILc(WaW=V#vYw`1__{Oc=QXF(vy^p>x(} z3Wgm5Q=IzM0Oci`kP0xM0cVg$LUo2~>9?DSP)>krQ*^shLEv@Raahe)YBByyeYz_~ zy*_`VD*?QAc#RY|0_mCD1avn{aQr<}aN4P`iIB5GARo6mQiANsP&Sc}{t_k%2M?ejB4b7r_ZjncX zEXY6n^A_JTF1RF*^0Ci2=fsrJ@c39x9#<|i@QV0Nj@kf{b}M%`8jhe&9d{e79L&MY zO71d`GSb2)jSnm8KCZ^ zFAH#XYIilxw88ibxAsW|-=f1hiw-1EdI-lq%-@hoj&7&%q@QtV5Wu+f)gQh)NlN({ zC1v0pKAz8AXvo6B$ADuFiQzemTj7r*As)hUl=nx#6~BX{Ao>osKLFee2oAwREcrl} z4~Kb@+;38=^6ZX+yI&@p_=-b1VDd~dQ+tuN6qFsDq;LG3N5lMRJhIqiK9bJO*>nf| z;`T3Yy`1SiF6XNjcz1qrbH&rl+3{5MzchHUkYPrDbgjH+$PLba4LoR4=zU63xR;*; zmcZxZQln!d&6dA;D#VQxN|k^9%a&!5}}U zW~a(F$rh8K-%r(RUhQ12BgRgw5{cl`$Cl5a>(yPI@*FEk{{f?{$-Fysj15l$Yvn%ryQn1E2c1T1w!t@dl*KtwTG=7;MQmBBMIi}PP;GqwZZkg z$=IT)U#k{C)Jkpn229`*e2k$IoudQc+>&<6-yG2%4}H`GPq&M~Bc7FS-v+)HS6nHg zmN_Ofjsfw>CTUWoL%~+SGW4HeA6vSK;`ro>S0H4EQYQn#yHPjzG@0eva4`N=5=G za_UrjlEU))aOZ&iq1wus)5DVZQ9~WTAuA*x(|m0F%!1;TIZ(Om5Se@#4}_Bgpm8h& zf|~;DSt(kfG0HmO;9CkKx>(4&<6*AJ~ ze9AB{kPcBXq>M`j?BNm=K-6{OEv@kZ$Du1ZWqy@b&$Jn8{OMEUB)*C2DjsO|1lJ$%1v+_OfE;{0B2n^BD>8?LB=iM z`@jr*!bec%sse8DA)M5Qei|Eo80tq(EkA}V4`USZDzq2A zAH;s`Yc`6%s*8{GS;<2c=xRqJd`wG#NPibhdMngF1Q#j3?apQqJ3$mUbSbe>)Q)cyL#P^xKKpYFZjgFZO^A!E9@nQWt zuy|e4^Wb%G{E;t~Jce8Oalc0kgWT$Sgc(P<=(%0PA7&nuq(@I%_z=&YCtkE;vt0-l?kJ6Ors8NTn8@>T`R zuk{u{UL_o6P(e?Hvz2e{*oiafiuO3+%g7BH&jT;?5pMr(7_fYt5v+hGM+;YDzDMXW zbR5*7+J{~rst4#}EDZGLf?Ou0tO6^0zh?4zYJY9i0zZ|lRt9IM(sn`or&cHJ*U>Ji zTX9F9$Vl=B2Ic(&!@v8&Q$O>;FMO_W-!9K=R^oAvmEmM%Nryv7X|(6D4k+dylfZMA zEp?F!uEPNk*q~^(np}ct20`>`Sh+Kim^y?WG{GZ8uo8}e$bcv$8@LUNb!QIFW@1fe zc*==kHxFL*N`GVbW-uhhqOg=3(b4Dxg`*9s#yhQO@}>Zm5od}S9fe?mEl;eZEhrKR zzMF#sSvdsyHil5~TTFPPM+bv`TmKOgl~4T02G-NR3cQQsLi*NWtM9zF_AiVj;43?A zr||ORWp|v}e+wI#g6P1nl!(%LgJNmA#)mD+s`!*mrgop)=C)~*fp6n5K*x^^2B<`V zl+aPP*4{KIAPmh|IMc`*oX2_w^dm*t)F*})I_YqjOi|(I_EkR{TNCjede_=}0KZ8G zpC^`n$lZXH_@kz_`rTrTGDGnpPZjBKJgl55?i4^Wd_p;;<;zq)ip3-hIm*C7KEX}7 zMnF?%q~DB^NV`=&`#9dptK%6dNv(%+0F|$zp8({pFr0B0YG<50G5yD82&8B$@V;V! zd-OnI5)3BX$eR*;i?|A?i7i;d!wlM>34GpW9)OD;0((CNPd;F{A^Gp&Cu-9A2Y;1< za&k*)Tm)x@Xna43-;Fa9$HMxbMZRvtcBzbt&zO%D6k(K49Du;*ZCo*>J4w|Ea*cr; zDI4=P@NYNB1AH%SynE4s=m!@JDG2jpb6F}M=3`>@LswWHB{MT{w9kV0pYgGtDM2uTW zTpb;O4)a%dH?#x!?~+yR$&G##^?*2=5yAX7$O2&DNr(PZ{nADnuag~s691*b{2kthzq5fu|7P9lVZMfsej(DW^fN!hQ>M1a#6}a9s=YdmNELgdj z%45f_Yvp9okvv=u%;3$nrl(Gs?}v?k89so!r`X95OoIb~*2yitl50tL z9t|RheiC5SKDGGc;3%ziS97&%?@BtY(iEXw0Rnqc2x73{$FnoL~*bm*{^x@(iKE*CxO+t^{lY zkBC{gYkr53@BoJ;g|;U#0}fDO;4zg9|5)*eZP%zXeG|IuR8&C9ReQpQ zAP`^K@P5-*e<*FD{rVta!xyT0;JZ=ID>;= z?LC67kZRNjv%vqPZx{+Xsm*oJ4jBOhHdB9)&7t)xa9t~#QR1m55A9)pqb8M0CP{An zLmmw;0z}ROUs05bXG?YDJmrtAHtLNl`jh^b;SGMt$qKoO27cdW-R+|z`Vsg#i}f5( zrpixkEEv~j0wza2XQW)>jT>rz4wZhzd9tY-gh4nOVCT#SJUEJ$E~9K5e$gdOEl+vz zh%c@O?FiB2igqX@kq^v+k8>vY`&%hoB&w1G3ht(-~#XKy)HG3+c zdh7YV%!*dk& zJRxD+1()~pW)wXJ~eK641aZM*oNN8PyNrU zz_q`z_Ri#6|M9!rA2Aqj|0rqS_2L8f|M*+(>~xA#?{M$=jbDA`-8X*w_!Fl+Vmem- zJBvH=R!#$kD_sf13-jNc9%t6E$|$VE=?}YaP=r*|8r5yzeM<^5?&gQ4<#AA48 zulJ4N6^gJT-;8^?sl!1radyc#slm(uCk1dG6&r>aOzCZMy3Xyh&XMv{O4rhNoTY1R zwlmSs9h@7tfb08bvX*!5|C$`R1vp|>CLYK{vi!4FFa&$3u#ECD-T+v^PgVq^au*LT zj@udf<)F?r5pMTygXf&jkah!;LELf{ov z3f|+RAcdY&&LRB+Ufk_wZOAXzb+G_P!Rwpxz#vyZ+Lsi-5=sV~@*&WUnQ&5v_!%^C z4AfBZVZbXaQI|#2Z=^6{T;985YbE3ES$#D-7J>dX9$2HX3gA)PvL7zDk`#Q(0!j3}WJBfsnc3UNdK2ic z4W8eem(aIytp)F6#t`K07(RA0;TW``&C4_xs!Qb^!*<1c0M@VW9jC-^@=gjL& zjW5nIY`>f|KUTI_=_krrw8jEpT@BcY;3s_(Gg{2;%nEwE6Trk7fH~4m5)WkEC=2+R zbEWTWA>k=2{k?Ne{JL3(pBcXDUhOue^0P%sI@*~wq~i)m+7wc1thfv(uHwTAP3gs7 zgHzfS==CCpZap9!D@4ne(O<>)s38OHQUf>>JLI3ydeQfrE>wq^&qH}!9ui@Xer3d` z@CPVEY;ejmfzsg^@MOeiaH)bYjE3_-TqB@})E*f!D{m*RG>p5%Yvn;;r($gF=CT(x zI(pwVIN@2iw$6c4EH<8#c+{{FA?XxYXN<+i+dE54)21Y1H$c?Z%*tU{M5mU5SUCn^ zB)KzT<4_xw@rWzG=nzHq=aNB)7jG?`$h#a1g^IE>;4qrhQ8fIMC@&{3j;WRtwMRex z5tN}fd=Pdvgj0(3UuB{gbK#6~u5`#*VbBM<%&75aKU^x(5eBIwuK_Y|3{T^c+r%*D zXQ-djN*jkxtmgLb)+>i&7*bKLr7w`ok`!q&Q#$r{3Z-OrjFS{NijKiFj#LrrC%?`2 z!zPs9=S;bRw%ItVm(r9&^WE?=>?|-&p?!x@{yT9VG9Rf{`l4_B)?ESe9VS;u@#1Et+ zPYU1$hAIQ@hjB+=&dl(4St(c0pGHrTj-9&DUg^Ia{D?Jg3H&5S2ZA*-!2|cD841Ud z81mnRM)y1@RR;b^3_Ga1!n2?_z}NColPc+zRPEtx9LWV1(eP*NC4l0t;A)Wm3cuSC zejHZ#nD?3D*_RkBD;^Hns|2_QhiSD#qTTPcp`Bi+FYaAk9CX!eUsn^rG3 z02eQCmkgpc{0V8d!1J03>NLYZ^U*vv6+Oe#tVrLBI|dn%7NP>#2?LbO!wQm#T1z04 zLnfxDeqlKoc9X6NIEHbh0N=+j05Fte)#u{vdnRmG`B1aFK>aa@sZv>dfc1T#H7vVQF`(MX4*G*LbT zZelpoS>$s-C~v=&tDM$`aZ3s>Z&J$NvsP<-tW7vf z)>8i6W^Ut_(-QA&ho^1nUA_>0m`qxNOvD6;`5ZD*w&P;$(Rx65K^y=BJQHAt2bB$N z5)CV{if7$4QOi(wLjVRNoB>8hPMy?|L5sDhfdl~v%(&7QLOeMRkj9T#br{ZrE92MWsPaL=%MO8eMapg&T;=$SCRr$!jOFZfJ z_z2%}78vD;JxrLXDNmIv5)Ukw;a%!BOTjmjlyCU0+6ZbzL0QPHje|22Bsm=^x;<`H zlEd5Yub2h?pgx0wE!dIqw4(~Q*)>|mH{uuM5nYl?<7IZh1Mr ze4Q~NDlN!!t$R;Iz z9O^^fO@FY^7%wZ*SJAO}1dAp7-qyhCFTqprD~uR)xR1mTM*1S$&5W#6Zg3Fcn>j9L zr|a`o4y8CLj zNO53C7>0`W6-)_m1fg(*3y0@jJJ;_?!wZP0FSnQhJ1Giv5Ny3DMfqsQOk@;xU+KC# z-MpQVfBRauDJg$Dq^Eb5E*V>^p*vH2$?mdjrH%$#Y3}X0Pft}G)r_n3b?;m-m&S*& z`hhtK{iFX1$!_fTfbs~JHZFEoGL8V|^~eN&AS$5_AaWZ;jw`4zWrF9FGet3a%GXXn z13^ZRl{xowor8<7fNSST0mIW3WV{62cYNxDKXWOEj~{>89~aL3i;d5GOuxfNv2~X~ z#v)I=lc5+1NBwsVm&Aj=X?SOME$0=on_rx~0YolKmjQR89O*J&0p2%tr7g!C%)NQ< z&7)PGzGn7TI|BIG;lVH5D2N#F0kY#%TR8`@9N`La{EDoimM@};y`|t~(9WZNw@fYrAR^Dc4 zpX6KV>3?nQ!Qi)Za26g$0D(Y$zuzaH;t#{tIq7%QQlvFk-Q20!6JO9C9ljBiu#&!G z$g6Y^R?jBgnyH$-dGj57J`NE&16WsO}id zRiAq*IO3N!E~TrW-#Y)`dpz_XzVC;>;?T3Dzj=DAl_F+WI=; zxdT>4il5`V0}$le;*XeG8H8z*HXfMU^v1Jnax+#eEZriI|{wYd+E9G+H)-6xl@eCJ*O}rv*_4N#Mv~svCiBE$fL80W0 zX7%YzoIrcZ!~^w79TSf9f-_WC20Y{gJdRLp@f94)z*%t_?1z;S>c$)rT9-FUzaP_=q_3O|l0gix z^#^khAUj7*N%|pjL%tt9{PeXKbLYO|!kepA==W{E=jHXni7(b3_&Wk~-#qy%%L^6x za$y+$t@5qcN*-vx>SM*9gUL{YdZtalH-h00`ylEE<4}>Vb}8RD3VaGac@rG!A@t1p zW6;jr!D+3Pt0x7mAe9e?+4>|X6Te}5dR4l zJ6qN+(il8~zbWx!w)(x&(Ldr)=Y{yl_|ywW$dN}6&irpm@EQFAvU0Tci%%A|mwu5$ z-wZ2!z z@q7Jxsfg#9nE>v7q(YfbbAu0XCnGbu@sn|w8$M=cDqX+nS^m9nW=?+!<>M8;eT%=3 z{!~T@@JiT`mEkvP&d>CCz-_V>^qHg6MJwg*&a;7LVJFZd^;K_4_Fn8v?v@y~J;n?gWehV&sFxBqQr&%87T zfTN8~@<{$S)sJLoR>z%xzFVx2f90w6T$F3`mv?U!6xW>x!~Z0gwV}I*kW|6D!96Sg z@!DPs{A~AZx(fO9_)Mm9I^FO)|4!L?d8LHzI=`;?)gNuYko=|HYdn5QAz14#A?v%} z{lI7c*LS-!$3M~h?bqM<>0f@+_Qm(N{>S%w`yWJJE6Xd@tqh^`i$W6*53LY`j-Oui zB|@CRs1- zZb}!7IzR?jfSrb1{3Yayr+>yj9EOomEBj`p=JIx`dXujDfqQ4;!}xct|3egz()QWY zC`eb+uAFpfa3C1}F0tw_RN{}|Q)+FkL0#g*xZS>N=HvL*LE&APo-f*-aTvTZY)H@6 z>DcPCbsKm=8KP5b?wo7jI^^avR-(iaP9DWERFjKVP!ok&1$+DW8nbCLh9`z01Wa@C#dCER;Vv4DDea z<)D(A5RPKI%48-&Z*XUS1^6|Sw-ud~OMvA;cB6zqznThovf@A4u^0x2F3F6i7-Z5A z_$M^^YQ_%0!58v3fQ-h3Zy98hGpS9Xe>2m?L@%5_aiJoC)(ei&bNJTl=HGQLaWBJvse%7Q>~7t#xL%OeNH zweB&v90RpSD|Wuc@45A1i|3s9odD4jJ)55!yuq%5#-%U5r8jJZtnV4^lEEhsyJfUW z7-1GxewPP#7VR89_P>}NSI|=oQAzr{a4CeZ<5GLd$=zWi`aRT8K)(_6+@;Q?e!F4? zUcI=b{M55!^>pIO{RmfqHFUqsjS^~$( zf%MN;J@Hl9IgfoAaV-%1QgJcW-GV<~|GA&-}PPh-piYM{+NMQe`(>fpMC1x-||^^^IhNdP4D}$um0XYoBVY0vE+^Szd8Bu zTE9-0Dh#O=j2RedV!=imxa4YbWP*JZCIkv+W&=_o$Vzt@1|HA9(^TO7xK%dedPfOE z55j~=Jc^8Xb`p-nILwrt@!-jC2*=Fj#&m6Edk9sS==gI%5D$W(;S71C^bDv8Y|_Wn zkRFG^3~g)P8n+4rqde11QW!sA<>=UI+N~!|$pZ>bJ=F?8kQ41upz_2aIX;$kbx z9086voXTM`jhX_8=dJSC3aniQJkaUg@0N!GD?qh%W$nS=&S_gv&?#^SiU$rU7r+X; zZc^$Ux*SxFQm*=FN5E&X|2Zp}lK2|MsTjZXd?T4`$>+ehQsYN*qB0J_F!3wfl(sug zbi)J++(!Wi1CQa(HJ(zCY8MVju72@mw$v#cp~4F2yTLS}xO3}&&tf$ha#QdF{>xno zZ6l;ZN=7P&zK@h%hTi%Mf2}>6N!Reba2ARqI3}5+^xEp%$DuHs(av}{0 z$PP>^<#{*M$I;M8?Z8k6WsIY(a!yw0@NH!IPR4PQ8cX6O52Vwx`pPZfJj1UA-pnv92DaJp(af94E!_r3K0racVZKB~T`uPA34LJPWmOP(bU+=an z4B?m;qd~uZ-?gnp&h7Wk>$?kZ7Am3rNS4i)4@Xz|0H_FJNK`;&rH9NI`_Yip841pNVoR>RpaZKuQ;2w zz|VZ_%;p;L-&B0lTfQpe2;et<`2B|k5vfUm?lw4U=MSNY6$Z$Kr@n`H0-mkUY@7m~ z8J*5nfSn=N{wnPRoT*n+@So}U72v7YPyOu5FFAkw&Rgp%|I7FO&VS>+>yG}tZtlLs zu<|A5yPfUlKmC)R`Rkwm%zV@Rt*sw_$0sTb=tSzSRb!wFI=Ja_308|0ohFLQS_hio zi_W4FeffA?S;;+sj@a)fB;(SQ?Fg_Hm?s|kJWM>y{Llp2$5)#6D8F!GsJ8)|1wmxr z;J{Qxji6S%0paXBT!?bv&F6na%vndTX5+jTW0JO@NXU)&({9I zu_-hRMP=>GqG#Q;$%-N5%wORMgIrP1b~J>X;R-k9AlPpLPA^R`rnJnH9)s4(i1$IT z>HVlxf{)_wZaX{^=<8VR!hOgEQQW53q)3v21cT@>Y@qmr(~iWGz84e_j!>=spojv0 zOw|&<#i4~GWUfwfAUiZkO1e$>3r@YYaMWGh2;WW$ji-XqHx?7M2SuN^Jnrdzt2?FfZ-acqqc}>) z?&PwgwHmsGg71xmzH#hGJ^cw*X)N2kTiYWhHU(z5n1W_^+};L0$AsPSnnd^4Td-JpCNCa%eb6jE(xACmwn?;H-~wrB70z z=$niPcr!!pN^lQOVC#5h@o?70XCIC$)J zPp@>ybFOwKMI6U1<}o<^v3ld|kz-@|w31igF2~5yal~STZkR`sV;cwPma+)_K;AP; zw;vn_%O#38stlsd6Xbbp`6tj*>e*pldf--wr_^o(o!K?wTPym$L2k_}Jw~^q{P1f> zbX^8r=%M1{!3PZ#!r1l*G+)vNI{lw92CDB6iIRamG)da0{0dxW-UaXmE?nm1_zwBj z@5Vdg9rI*g^DT~w+J0#D6>)`MhNBZM)0L#s*?AbB53$7Z;G@_suU-)MH0=U%l3pf) z8T>7wKZpZbKzNKpK7}iB2L%0~^k|!b(FaNBXP2dchftNZ z+4B&T16lze3x;>4T-_A;+%xBQS3HK^y`Dqg7q zx?9iN9s&y)_51om*LH7}#NXB0YE{t7<@fU~Zj}a~xZVGN^G|-P+=r2riX(!f_CYH} zFFbs9x&nT7bY_1o*ABp1zEa>249~bV=xq6yD=F}|Pxn_}_(b(zEk6A6*ZsB67)#xs zAgufe^8TKz%YVQ8k>rJse7yBfT6ef__~wr$|3&McC2Q+dYoCekVdx0asmRiCM=fwX z_zkg$GnBa|2mm(5Os_nDahv;I#hgLtsY+P9@Lz~umx63(W-%%Kg! z1VCK`Wj3HZ0+)%bo@Ir{oI==WMpkc^{#TT<$;u&wTy)CLrPxp(xyY0o!me&ZP+z{R z)i3g9eA`NuvK^(4RDNqK>Du_G@n>upqQ;YO8%|}woas{lcY*^0wRRqS!ju(#FA3u^ z5B0k_G(uG4F3G6FgYT%7!0o0|{fzfSkd;jc8z?qCbvSy+fQPZXeq1S()F(QIg>NbB z-0b1dJmkh|yl=O6rqPAA#k{C^*l?4?0}pW- z0JvYJ%IAdHTl=*oUlB3I)P^f(gZri7k{d7=M#*h-!1 zv7jA>#*=On`3J&-vD(873^f{|8DQCMGv^;SW_z0a@+vA&+FDVuDU-L5H zZZv$GfeshKJm?3B!EjWn4{ei^8iS68D|ndF;?&wZl`P<}<;LF?;uN--Q7QDTCU1i# z9Sl$b-lGH$q2{^d;H4X;IYL_&j>ro(BOmi z?QG6KUOs_l0#fIZlJUyhBje)=Gb{t&j4SJ>aP=$FKg3qMr=7apPhf#JHdsT?z@KFA zEQhii3^MHx4#-}!-#}(3z~qQA(TKZqN9XHSiXoh??5Jngd)EfHDi&H#zOm^Py6iEP zzJ~tsQnEO3HaKI)Xm(b%vy8Bz!9QIDJ(6 znMpuqhxPyN<*X(ALDRGt{&W2`@U!XJ-BrQq*?v360qCxFS5xru>2Vv_`L@pAT>Z5h ze&rimFSY-pk9@CV2>ASo!-*LFi3|FvxBbZK2mj;GW&g=9{GH=ZpZ>nA)k&@_Z+@Rv z0)_K1%C)QxR^DEW2-5=k#<4jB2yhQof(Oi2zv7?ZIpy;ZincVIwKCzUCbM)?;wrc> zZfztUdOu7gR#Kgo@ESn`xT>`wfo52S5?~B6Du|HrGF`yh{;5ggVR*gPSH9P_=f$lO zdFUN?tsQ$dj7;ocKoOI!Q|P!22`n2?-NXa4C;*47{0p@Wg$OyZ>B&QvpGpE)pGL=k zl|uoJV__2xL)LikBU)GiGx7ry6j{iJYDyjTp%{T|uw^Dt8*(8OP)QkJ8u1Mz;_7jg<7%c$sJ+~5jw4;Qu6BMxw9hkGN{Q_7@)e$#iMeFqhe@X+j;k&G1D)_Ox zbnT3C%fLSzl(BF^?gY!YBEVpQS^sVPGaQu)yc>T1i=$xaQIEz?)M(xmluNs<9JL0V zakF;O=N!yd)`H1S+=1$cd3e(Q2aZ1QzKcq5#L5)#RQgk&(Gh?gm{tYEVbD15Z~u7r zi{Rh+J%8gre^behz`Nc%UI+iVy?=mOlALmT%$q{=xYf$eljYwCjwPiB zdCr&K=$NBr6~;gDP6j&2rPO)O=ZH_r$Hx`x0TK_soN^r*GAltZfCFR;54GF+10R(R zcVI68Vt5Zsf{u`s0(u7tP$-DY_-O4(NTz5UaLnVraQc5JnWXg-!$-U#t>TGZSwHpP z=`!#KNK=x(j*i5mb_k*!N#hs)7T3=FxrDc={wlwBl2T9ymJ+eWO3k$U|o*qA>b1NLUJfz*4C|-#&NB9EkJxpU>JEcc`jY z51SIh|9m~XRXFr`GE6-12_&Zi*3<{k0ffrIjhUGq*=8rf6G6S!&K34lD)4!{yKogQ zfb%P!(C+)AUf|ahq|)WTc~cV4uQiekyw)KuyMb3%M(XDUcX8UPumjKCnyWwcRoX}V z^4W%O+Hn=BOMy>BN9O^K5-K7*AB8IZcS773%P|XNMm<%#*QaMU)>0gxyVr+nM6Gwu z6l)m;E0!_x``T{Lhkme&ln+e0c)g`SOMjeam-U z|MXpJ-}CwR{q`>(cR#b)JiGjX=8i$yl#7W5=(t=|8c3bh8NPMw1)Et@i7`5xaRfZ! z5k^5C{n#3Lz@dT%?`t@SXA36rJZ$q(VE963Y&ad0q|l_rKxc^uN}&;2u2m^rcXXj> z=aQFsrh4Y->rU-(o(U}2GZjHZV)>+Cl#hD5Ef1Uq1IBc#A-iM~fhc(Jt)aC;>bnBh z@5(*#taxaXCc=nscRoKqS;-On&MTEBT!MlO`4WpyHsZ=5r`(G8-K11Gye^|mfENxg zjN2KPmeT8^Md46z!O%y)-zA4p5e?W(CEZD2OMQ|Q&VA)ZZ@dcex2hv2!NwrgiKm_| zAvQ6b(!rp7nF9~44~`?5krXBWjWBBg>+!Y1+P^_OI6E;z<-=|8;s>cKQ+!fm;M@-J zich-64Jlj?mAXQ|RafHq)X|V&2%JJndgv&)KD=~X8k>Qk6i~S_SpBqO5jP@j}N5NlYU)d<#xjSJ=Z-~v^+b0y;m}g1F3SprH^PM4=1HJ53-e?9RV11tYhc_|kkUpjaxKd$JX+MAKS8ypVi)yV2A z!_J4KP3@8crO@5(*2@3#?B(t;5E&iW%&K@M(8{r;tfQXUfu;!VzzBR*{*|LO;BV%? zHGUn)c<&m2&|Aw2oL?hAmIH6&BI#85x`Co{x*HcdE5Leiedid+yq*GF;#qK2%(MOV zK|52w!fd?JxltUK*n{ok()jB&!w8#_7~m)vboze~dWc3-*lT(!kE?>TfO<-9C4l2@ z>t&Gt1b&!sxiOmTng3_a-?MQ3j29He26oWfP1I|DmYC<9myM~XFEyJrIfc)FXATUob@FfFqUu&1tY(Yhj@G9P1 z3cbYRub|%@rrwzc&eSdNmHm}m<=rS=-M68cqCgyBC#tx^D3Bw{fQ(riCZ2K*Swjf# zMo$t)A?B+^cRoyP*QdOSbh~UKd+3#$^UZ_{3X)d>SM3Ugv-^s-`ZG+T;`eRZIkrLz z<>w@=mH?7#q;|&>F4vuQ^HzZakk_Wjl0hqX1Q`ztGxDT-ihweK$FzZVx6FXOb?dIt zTISrZA6*&WDoLY$7C;;>zGVQQ5VoObeCTzOgCC&~fZg4TqjrhH8NNJL`{7Pa-?3m( zVQFhuAt%l|^*@AAx~&Y2km4c~JZ&eQZ_+O-gQQdYT}Gcu;3V;eoAiM1CWX>kINs-J~V@9?uz{IeRiCIEqyAf?~J$3;ZtzrMreBCON^8>pB8_p4dqAI6Nt! z_xYsIr+i8h1a6^_;@uJtmptSFilqcrd5Z3=C6Xwkybj^ZLTRpJ&AW3cPo$ebxlvqLEzh6p4~B4 zIamFQBh^p8`quw>Y{w2Xgc{JGC!wrNBDsgMyW3N&Ey_#%IDjPl5MD7Xfn>$Nvzj$`2+lr^J$ctX!?< zk8?YtQi2dJ6?gPka>nrnd@RIwxgMnF?A#1aY8>DQz_?)TZZhKU;?4-^?|A&uK|3Y? zZZ8~R z*LsD;Bu@AWBTnFqzFel{eHckC!8gMZF+Y=Yi3i^fa-8sQf|ZXK9ND}|ZX{jnC;1_3 z2VvJB{}s^Mc|_`zG8lhJ%&9A<`Wm;>cb^%wfHxnwIc^*_K?g?@i4ZFwFzgIfqPVffbX zBm?8;tSBmQ4X8p5gDVXL!w2LN%7(=}x||)C;019N1OF(`gxC77O*K@^J za&v`KP#{-L_LLui4HJZ0yb=s4VyhPiMCBnw8D#2>XHgXjK!gm_Q2|qMPy9IiJcad> zDPUXi5X}S%>FKrATf{BC&|Brp8uFv&x=OBZ;V9z5>X|lX&=n<|{(GYj8?W}lhrB7F z%ku})o=|^3HQ8WcDic_WesMFySrhH_%OM%@&}mJ$(WL6Jkxt$o}|Pds$C znE6H_)Bh5<1@sWMnvwdWyAamW3>ra>P?Ga7jPdM1G%57D>0A2!&~C=DB9#%eYCrR)7_-W-Z`>!=NbWZ?1GrMtlif<)lE49Qby26jbp*zl^_meBZ%-G}Ke_ zrl#~pq;k{|YTSpP6@+Rjvg9c6x!^WO3C?w z$M%GF9K^GIe&u8Qoh*AcqbxTCOd`JraZCRQm_gUiyae}}ExyGEQc@p3zdIR!8;7jf z3*{1*kzg|#gp@g1g5#e8 zpKtbUe4m5EB{+AQ_~zf#GJ`zuapbE4KAa$#L`+yXfV&$UDGEiKXuQ@?rm>b~Ua zwWnS?T0p0~G2iI-xwutO>?dyy7nPGf>1a%t zr1FtfaRlpY|genT|W>6rBJV^rXz}zM{ z91iTv@1E#Y#flE=@o(VsS{ojsfhewz!im??S5XZ;@wbVvG!Vp1W zC0rZd#;7vkC~7OWE3;16rR)^?Ht9T2YN7!4IYTEv9SPF^zS3!jU|9k?DxEN+hZ&IH zom+|1&^}(g1ka&wK`((ALaWC`N2ZGThf-mbxgRcz!H==w({Q_(y9Z&yv*Ne>1?f}D z)5@L@M$y_dvT><`0mj`CPt||d6eNr*S~m2u#Dg1`fZNnpkdC_+YNu_n3g4jqDnRv5 z?Xz~#e}kUQN~JH!59BJ>Sn1$HX#ai_;xi1U;&)^I9#T<(&z5` zgv6@S74!i!E+yU6TCMs=*6&`jDLQ60lz+ri2Cn%_(8}y&JPfLalKvkw zTZ>#NqH8pY{q97=G(sO_#EyeOrdPqx-y3GN>oo_;%+`6o$*JejWW&nu(i0DUC6?QZ zEBq^3OA}7QQ? zO#j{Akc#-b)jGlX{|$CoQVGAo4>$#xH&!lh)YFJk##U0I z@4HdoJ%oNB-SR4z4oS|t{%wTN{~I<>9zqf_;yrpbCB8)8R=|y9!ngGQK#-lhRPfA| zvy*m)L4E%GsO7oD_tcH~0(fKPM)$bXJZm~mA%%kk^yjQ8dH7`5d0zIAe{lY5-@xX7 ziXEtkulYG7fEOBN*1t@emvFaz>)-hre*WHb`5L4P*|}8k{O-Cln6LZQoOTV@XQv7r zfOI|YWE>&>n=?PS`i(#Cm+wsea`J&6Tp`P!YWP#HVD>Bj{42lxtCx@T|Iy}a|Frw} zhOK8?SC=<7ob#~nbAOHrom4ipkCH7DjJ?)@7>*(|`Y8Wxl=e|3(-S=78PEQZ;Uu)(2vIpr3i8&~c*w+1{o|GdNcH|Ck3 zdJWP#6CftAwXZ_qR2H)#oRuOiASiXgr_Vl)MZ-yF6Kjg$&!Ejif9zyEw{#;ZTpN=TIK**K z=!bgg$JqF{(Hf~96wNqEfz#Nol(n4bhqMPej?Gx(fjg0_eQql_5+*Cc`B?u`(g`m) z^{;?A^a3cUNCAC46KJo>x!u36Q7M<(@I1mrD-Q>AZ23^zi6{MzPEmo}5imYZo$5lN zhZX2@hqK-aT)j(yoL%xQMdg|jn6h&sIOmqJ2l^y)grr;+s+ZQ+N|)%&GzaQZBM`S} zyf7FX3)EGnbkrSMo^mNwxPCU60SiV+a7w+N{3WG;>(>ZP1>{X_ny2tF=UaT)GB`A8 zQ#-n9C)CW+(SHTZ$gUJRt+Mvnyc0e*sgV5FCKscy6JtCe8V9N)PT+Wi5jYHbfh~Sq z9^wyz;lk0(LqC#3wU@gTGh%69bc~)u#VhQii89J7nK=cx&cI9HhvE@p&h79Dyg(Cp z;1y=DU~Z$O_U2&v-MKi$5|hINg@^6ixerGJ@nGD+yAj8c@myr^bjlr(g0!<>@ZF8D zlfZ5A)HwBAba3tu<#9Q>GWx@&J-J-i)Q01DFDlZEc-OtBJu~Z#OVViApMVEMGjDBW zk2%#QHMdp6WjhSpUgE*;3p)eu!{QY9o(@Y0`)Iz3{Mv#C!nd&FS>m#K`te*?i6?Pu zfB7t%?j%bdN^(iY1%Hi==fJQrf{0hVqb!=aLrHxwK!;Ui3)dW z51JB)LIVvRZpr}3JeDy2kz~S?OYq1N&jY^-;2Tdj{(Nu`Q&NIYl1hr;OpkZ=gTB^# zJzI#LN>vl202C0o#8ci=I{l{n0)r}i$du0^45L79BtG%rC@8))xpoD)YI7jKbndEL zuHqHKPr|wBx%o=Q9e|@7^QM403+2&^4Qt1KET313TAl-Xq`;9#;_)c+3xjrrVAt1- zFPx!o6YI#I3p&qpWzgD#V=}jP6iF?);i!F zF69VLacMH(ZoGYsfdZo(YYpRq!A!x!C~1OPV01>xPu{WRhYMC-jK96I&!DGdDZ=F` zyE6cKZf||8alPJq#c86$y^L>1YYL^O|1t`p|KKO}0z*HK!mmD1pY^gLJ(mb6<90gE zs6hzy-=J2$3h`*?_8ox3tK(zQ^Z21Z))G%jPyGdQU#Sn)I}(L($JV86#d8LK^rAbi zpk;g%ez*S{hU-ms1y3XRp7B2fI+qLOd;9n;vr~}&b?>udy$KM59CGpoyo7jW&5`I4Q0^=wKpdNHz>ypUw%FAV%*j;wQOG0X z%pQ9~1^AZk?UOGJcL^9L_8P#)&=uc9vSN_jAwRj$u-`!agSdk4n#*jCl*Qi{=TnyC zR|94!!% z^7dYsP)F}^X$i++WY{?xsXu!0jmVhKzTl;dcj*IplU}_jc(@-2Ck5U`|2^rRh+ED4 z?jEWfrkRy{Biz=%_~4~o<$rnQrNOO=^mXj-b2_xMb`*j*g5yRHoKYuU<>DBm&b_U8 z%ccy~3y=N!_PioadQRbfT%n3|!?2>|C?bR#j1YA9EVl|g`si8o0qC{$`rsBgI}8K9 zbs4Y}v@sXd7JUUA5-0qbn6A*$iF$c|i^%+3a4tSEZ}u(yN&hdq6sm((>Zx^=g-eMc z?VmerW&d}3?*k@Rb`^Hs`>MLT)asT>Gm58eE6fE%Xxjppv5bpE!OtKmdCEL+Y2Htj0lw=$Il=` zJ7`8Vqt;B#O!uq(opW!GO(5AX`M_ht-2VEVch3F)@0@ebz3&ztbzko7>Ye&-fxNi2 zJ1p_%ti%9c=7&v72VCN3-2~GAif@xj!QOjyUn=w`vL}{GaLT!%@N`gUxw03k^#4TP zw)_?aXBV_z7Pj`AD&F-*J*fc?E*%)p3BG>NDV`oMa~b&fKsx8}KX&lDYTtO<%zs1e zSE{f0+7G<_e{X;BpT}N5Mfg*l{Zpx*0piQwyK?)3hfZhZk=+?%-~TJSe{*`K{E})` zc6aO25#@+C;BJa|jKSB-nhb<;V|Ph9wCpgjpv$2c9Y|+63lG$05o5m z&N^d$ulWfh326$0EyqzeprE_ zOMnpqtN>03?|>cODlir!BM1HpagoRsuwT3XUL60_%W?tNE2XE3KZ;gBplp zAfAL@Gg*{EFZj>FSFDy36Z}}yuLrycE5;g;a0hCO!%9v&_U>f6F>&Ld_;j#|WZ}ss_S>y0#20_IZaLZd(7=Id$@+a0o-?W*O_1^J4<0|MQ z=22t>4z_L`ux0Dw&nQZG3M1?(WQC`&(5Jblb8oMbAUN8$dSy;I`j{?b%GF@RW(Mc` z@7cB-vEnUI00xIAssPknHbrxi;5W8V6b=$zSLNDnd^FL*B*p@GpSJPz@cB6~E?t)Gq6|yTPa|pl>n~ak4R|EmAP!pxfiD za2?~Iy|^4D2(XKfXSdk+_%fKrt&@(VGoj0T$Uy$FQ)>0IJ zQy*J>5}esKz*i1W=K>k+O^tt!{ulg&a#^`IfEpsm&L1?=etZ?w628rk<-`&`pJ}uvq*PdLHbW|aZ@w>@C z&YoxMDOY+&@heCa+`b3)HD?^n-l+2-AFzAC$-Fu^IjHlCucpScIe2Tax32)c>A+u~ z`>LH};m7BnoPF!-UiRMz&6-jgoPjDva+w$%>wp=eDM#2{V~WM#4+p`2ns?|J zaOy&zZhMX2E+A5ZlYuaOh*RLP_bYP7TOax=S6uX@UPb3QYoG1JUZ;x~9{a zPIevbH}E%%A@Daf-NFZAnmG;Uf<=Sxi^Yd$CUh=P=}{(OsHseH>m*m)a$s}=-W~tg z8#G-Jpy2GF_DbNhc@>1o`6pFnnFDt79qEdxFo8bgUmR>&%fnuw&A>NFBjtaMi*sVa z6HfbU1wR}oL&nk`me2y(3vUQroRk|uq5fsl3tZ~e6F(8_k`9dDNxQREk*ENv6EA`8 z*jvt^clpOjzCs6Y3vL~Up%Un8g5gG_p8;3A!b2T;QV&}Tg1om^udvsdq2P#rObg&B z%Z5PagYUmBOxu~@LL}VMw9pqG@+JzFI1Jo%DF=egmo!K9$iQ<%dy0Px6L3L)ER(MT zUuC@G&G>IgIM}yQTzUdr`!az(#$*dhYpn>7lMK>c^wp~1h{tB>fI~Bp{^Kj?Eh#T* zkqUISURq@?{(P0=fSV@O^fAF}_%0=ZPW^RU@KsM&$HxOyvv0msvNFe9DoQLKLS|V>;#$FT_`rAH$K7sIxqouW_01 z!q3(Uky$&``gPdk5qirDME2mIzWfN#MCd3`-U4;Sk5}!_0=jS~fpxPMCBTbdG3~eE?+cLDh`^^0 z!oi%8Egp6I&de{*7ARn?dS?#G!SsNe6}WN0D0GYCxflgAgMdQQ002M$NklH2dpP2daH@)lokGAiB#Tzc;^V~T5++_PFbA9<&eC3G)v8!|z5$GbXEcDrRqI(T{sK?vMkD-#`<6J;lc&qR7QH?ndu z+VRI>NrJDT+d4G1>$NP3S)ks0YHK$mopp9w9UXo){675{22vOTL`_ZSL|DOK0<(_) z!@lV-adilVNskp5^k>~^&!Q}hC(5Lp3_Nj#od{UGyg!W+#^c7_R2gW?GDUG|_>3`3 zFuTWCTYd$Lxb0iVfEp||D=`*?+8y0O2se8h+aL{bEm*&QTULPO!8+bzzp}f3@jxBv37Hk~mO=!u!ZsqhAY9XWTw4<#&I|kbEd_M!Y)z zDfB%z^a9_Dkv$@CNDqozrT)BGR%lT{I+)f~0PodbO!~Nc`}el1F&2Q~quEXlfpXFZ z2DP)N;XA(Hp?DX2fq`Jq`W)`F0*_gNyGKSEe>s?bmr$7#qV!?l84#65p7e4o^cVE* zU8xkT{8sPJ<{)nleq(ee<)vj>Q4H+*!&Zp5i3$!(&QRs-L_dnD*AP=`js>7`cxk3! z3!wK$o6n?11k?sk6hUky;!^U>fC&OW0S;iPIMj_y$9+P5V+dmu+=6stzxBoy;T!7j zLVYlOtDrmK6=nQ2eS4L-IMnQsj5ipy&v$_m2)-T!5x;jYs9BJn#2pEH@=Nd*(8Xk7 zsp@1aXuGjnKa47F}HZNibS3O_lyZ5HxoUxinI)~gn-I)Y_kUlbeIyG2iP$a;4u1Yzukos|S zm4zG*1+}C32gLwV)5JXa(IK9izwmePXPt!SN03&OaE^9}NuMnzlS3c*)B1?{uK2UE zZ$=LKMV5j>xH(nJmpN>g1x2B5GS{S?R!V^_ zEbQ#>&c^T$MEhJp`!648%{d@HE;eU?=0GuJCC?EBwc;Psrk=sC^((=x9^5_C>QjE(a!@tzm4>5vIM$ z$T~jj=<&S(FuD@Of=AojEoKP!0LE{i*^y%~41jHKnq&Rj&;bnF(TRjuXk10iD%8F43AYw-u4s2vn zCWK$&G%S!6#j?U>L<1=6vYG(dL(+6>WnbwdKLJa=Vh|j4rzznWfFsQ(Q;c%JC>`&^ za!Up}CfvUIY*Ip@BLFqMAt4Izbh^G96V7p(!jbN3nUki_>msl)xi!leT=rfC=SM?i zBBMw(B^^GqYe_yRVr^o|O2L<_21ADq<{9Fe-%BpDaM;j=mCY8%2PIq*>OV%%I!V`` z=H_!Otq<#~uG0HuOJQ1Sdy3%KdXR+DS(8n3kWGJ+By~}Rie6eOQ|JY2P$!VO0!6G! z{aB}~f4Q>T7C%}om3ng8zNPgaBRIfKhc$8zopMXN^L4F~SiW5kUBL7!xS%qAOs^nU^s*ijSsOP>TY*5#m!D4L_lu6XFlJXe0-AN*$jF zBFawq0I_U%yrBJJ=mj4{<_Z%PWLu>#7va@E~U$0Yqi}4TLrj*nf znGZ(uU-g0rle5v3hKzswu{cZ=UMw?0>)!QLU>!dId%GRQ3qlJ0hRFm_-qjMoc-qu( zH>s=OJ>R}q$i{-R%xEaT=)o@>{+w3V`B|fX5^(8%i8qp3;Ldq}=Fh6qF9iCsAMX|g z#?w`tiK5z+eDnrDfj9TAFb{`2!(n19PTD_Oe+joudpYtQlLBbDPAeC@jC?yHxEo;7 zk89$OMJdsImV}Di!bTSZx9R@^|6{f*?aG2_ROUcd{(_h1{porX3*VkanEy*Q*P1=# z`xymf)rh;ud3;Cw7O(&g{0hA^JGrDwtv7j!0;%E2eObyuT9au3z3}~s+CNsj5iB8H z4r_}4iO@brc*ik{{5V<{ZWLS$44-v!R$!nlE%shVJr9R4wIKNG(#? zM^lcK|HRZgXQH>*@3&v}!zQXnbs6B?8eptL&^K9;<-i(;uLNJ?P2ePQGC}N(D3gI8 zhg{S(1BB(u8v~}V0}X~JID1n%(b(fz)&Y41mRb;Q0Y(VKaM#d*-eAasb2@jV6D#3- zbPS$(I=?)yDmc?|v&^B7fqO&GDy_%BPY_wT5!#T3_wT~CiO00oe5l<(yqVqujUNZobAytK#}*8@ zz`rjd1;#Kemo$H2v_fwpGE+PTtc?=z8Vn0m#G0l@>y{3B>=_cJUl%$i&Rl?9RrV$I zlX+qgcbUe+WUS$a+L}_@fut*Yf9l^OKZ&r+1a`m<45I)xr`q4N{}OK^1Zzr1unSHr zP;%%6tO&Sg8G*gDv_x%M-r+H#MFnn9-kk8PtQBt2KHxHz6t5FL0Uz?gRt8)P0&<;_ z6pD|8j=H3R13{ljcv^Ey{Y5ZHxLn04iUH*i|J)01EhqlOs%tu1tiUCFmo1!I_1MZ-)89XpnZ5(WdFFnTaSI(_?;Iv&TGA{|!n29fqyriYsE5!AvQN z0Z_z&_CwW=JL)qog?`HmJ`Rnw1V^!&D1AMcz#l*{7y7l3&gr1Q6JFCjqhdi6g`tdB z`hO_F5!_uZ?*$=l z5O7AD_&>Wf_5f!fVgeSFGY6h#vjJdhZ0!h6DWqJCA}x=-#wHT@fh&uBxv1yRL-kzX z!Op>rIY+V6gW0SBFAnr(5@2f~n=POxi?5#pKQLPS^0^u0*y$)UdFRa8<7bcav%P!L ziI~r=t3J2c|H<4xa`!{kZ|<4zd-=t$z5aprTTJy^E4Apg<%L~2r1r7577V@=Q4b?# zhze|Ss7Bxr0P?F?LPv~@0n*+~8X$+D1Vy2U1z-Se zlnF0&KD!eFre8@1#mPIw+_cbowrvKf7Ayuiv=n@c8y|s8`?M5%Ff9aUZ(s8dt;{KW zpC7%mRXW1u-f}{Dnwl>YSQ+Z7ohaVM#4q6}y)CFe3X|4z;7zWu;brZAgF=)OE(hrvP4|ycx0=E5r*ppMHF>I+kFcQl!IRQtt0Msmokg#c_@I~hnntj+RcH>XR)~H z(Vz%j3F-0UG(wkqH8j3M}^ zKMt9fKHP<1nRvk zvr!bmSn{{d3j!>3zC1^mXA*9Yg%7;KfI8s$$wfGk_%Hc%s4ruI{Ho**Wd7@TWFEJ* zKX2j(d3v_2Tk-Gt@nVlNvc)X~!C3bKjnOeIW5P54WZZCL-imcb@*7C`rzcTR3tl!t z_>;cfQRn=4yd1{q0F_)^myuBrk9@WMS3-TMf0>hhm3lb*&r2Uc`Us>kF65Wxnw%f89vv zX|N1k42n&I@h0?cXeY;fD!^mUuiT+i^*In_`-*03*h%G7PI&L zkTXAOezcr)&V2tHzxQ>=KV-g-D4$iX`dL+)Pbz~6Gh;auRQe|Kl{ec;qp}Z z!f5G<&#!z>bdTMB*X!-rd;^R+qB8n6QCN*p3Jq7`&RGx#_A2h9(;X&qJltiLziPTE9I@ z!q~Qy-lXp09$*bq5DyL6I`GsBMt<$ex62KiD&6_Rfe3D8bgU=a%6NL7!B20572k0f z2+2@hb!g5*eOcFB#T4clR+}H~5sx64EoTTM9+RkU3m_|NjX}L77?i$Fur^aOqg{r6 zWyl%lmbUj+NPk6D4dUX^o3?_oM zqc|rVGzVAqwcc?Mw9X5#vR|%g_=YJ;$J+!3R*>d0hknFmk&|>_WE+AaM!VAPv{PNv z4&k z(;bGj%mhI!u0ek$_@f?(KY~revlXWO$k`JISq?2V#Gmn|iVbQBfQ-{kd^rq=Wrc9E&Mk8YpPK(;Fi}Xg9m<`sH{T2be#A%-caoL6 z176|t$pYB4>x$n9^}Fg91Y$4K`ZG=lCG$n&Q<_ZiHF`9G?zxMkJD3*uoDM7MeyIO8 zMaLVMxQ@+4P&)@7?m!Vgg;V(5K(9MtT1!HHtQNP&L5Y-+fRzW%5;xddaJu9ot4 z9zmagUkYa@R&86;ISQ@7|8St+GRrxHvHYtUWhjg#gGvaQBc5Mg2&)Ep!(~Q=hl!JP1C?8&j59Wkl zFl|u@r2a}j1>behgCbWx>_0P|JvyW5?055IdFkVDj&pL*M;v(f?dIWM+1fsBU!t@*}~ybZC@T22zh`P%%*fJjDt@;KWyz zuK~t7G`m(O1_E~-k>s7gtuV3C#jRsN8TLvGplIB&5k{f|iQ%7tiGa}wF}>;W=~*8h z_PZ_UVD?h$IaGK9ik29g1OmOzxCYs+3pDyLw&~okA6kl!*^8%bu zMkitr=ps0@-9}t-O1Sc(x4SA5GW4j2qmVdT_b`w^zuhWf9I z=q8;$mXDa1j9L`H0?`aWq4DV;_(2W5G1T~3SXpP7<{k0nuxtW69#+Oz1AW^}B%U1R zQt0&REfEx&jxbnh(K0Pt>W^(k(-)Jn5DufF0XRd`QMiK%-htl?E3l(}g-L%jBpup) ziQpnQN4qKTQrVVqft{)@{e%T=Q`434FaB3)5rH^K*IZ}5B)}^DFZi0ahzJxX4BI{o zP29kj|Jl#t&Y{XeMv<84cws&Y&SAf0&F`GApM0jL;p*jv(i_-jBwQT&bwnD1Z-;q( z({lx}`)K_z$xD2D#4AMP=LOm|;yM2F@ZARr^=?AIizwIy^svPjMn4`X2I7B}84?4f zUj*j#YXQUwv}=r`9OOz+ST6A{?%`1Gfe%Of8;LLDe=3l#jTAQEQ{pbu?gjK3{U`94 zS3u-z0jVzncv=1B3`7C}!K%=O@y!*tP{qR1((<5a2ul4a0Wf?Xh+3RUIvhGw0ne|t zsvw5TtZ4e@{dmLvl}dlodLA}xTsrXUY>F1Z1^N$&Wn&=i&8UwBkgiiW^8U1+hMQhS zkjIqcoJ}>ITUZnb$b48Ub6&1%ud>vIM4_CX{52a1E4`hWYuBXi|WviPd~!?`EE``h0B$eX@M z4)=YwnflFt#8v+z^v_!IN51S|yk+&u1^1=Zui4u8nyt)SuDrSOvVY9#k2}zR`;bA8 z+_H`VIZ zDg(b*j(NhEBTbK=T~0K;>+F#_@^gHyCjM7F<2PqG>{Nhrv!ZptQ~qa2MT3_q#Y$Ox18)L~AgQ_o26N?DpuL=A^$N7IVkFZDpJgbuGDRM ziDO~VslT#(EOCjn8{-CF+};H&IXx-(NS{KdCf=0-@~}cY66hzw%JRDJe{(sc+wlFz zdfqDp>!phd;-h|RI#?#Af*+&Ij&j67z#nCtK_(qPe&w)UjQ^EAe-uPWlF#%iE$M*9o8;}ypdh!2g+KM|@e~UWW#PrEFJgh(v^n?y z1*ZT`NJnt)H{gj{7utbCtlGYts1}grM3Sa+J}5Y=^j?a`nzwMEp2or_xe1RaVNY|j zpuC(2VjiD+{Z$&=-sS@tmXh{d!&CY+N-};6i;tEdUD*R{Y?L{r&lD0{of9ub=&8 zF7Wx<+CQtl`i-xB`|UR!{Id5xcc1f_|3X*&FO2t`NBhXmhn7}9bUFFbcYe(y@Bg}w z*X&E9h00fC-)y$bckKQ@FBL{Iu`$JLN4XB6H7~F^I%i~HRSJff1DeV>A{gShBNMwk zysP0^`3*stNZ!JrpQj`Y=ZC_;8~9W8wu1&L?wlPcOwes(!d-Y)=Wm-_eO9C#2pu2p z1bGR*1#7|Ej=jl_0jmNm+^CM?LhPJyc`&(Fb$SV->dAzKA#`_vu+NStApAO3M<)`$ z{-um6#&{VUNhh(6JV#y;Kz#Q|Q(Rppg#4bjrhGgw)(b(f1V)PGq$LcBiQeETjM-28 z#P1oBx^J%)5vc@tFoa)13<$my&NA>>l++ux)U}Ru!bKf+99Fi+{NYZ-VoE4sbj!-H zu7!zB&6UmyO41dLUdjcdN`yhlPNU|36GoXpI1yODIarL-{CqjDhOLB4!D4VFFzlm2 zP@IKfWyEj5z!Tt3Sh1fC<>;`5fIk;Ut>P& zOHRv;NnX=^kTPbZdxP{6{8O)JAyyjNUMs{E`le5Jx)fIQO)MeM>HlSX^~Y^Ayc{;n z!I#1~X^JoI4F3iH$5{CR5L{iIF=1~VF_UTkpJ0;&Z+_gSuHkB7C4R&U&~TKDGZM5U z;aCxRkyrEMA9Z{$N2C5=l3sbs3shF>vDW02?P$xbhP~~FNKw-3vw7rr+4c$oqs^7z z(i=K2&fzDn$-FFpr-GolM3{vC^U%a`m%jk!7$t!IAU!SaXb_~!UhrXA>hZy{D7+)iwo=I78JMvxU3U9op8|9{^ z!`T7tH~iJDm`wYBr|c>{e5GW#8a?>0Yq@SQeqz!=(NX#->-}5S*Xsf*N`Zgs>uXoS zDgH*->N*|jzry??9S(hJGPGVQ@u+1ifa`A#tpFbeVtk0;<^2svxM89FSKR|zOb~= z6Z}xduk?Xe`_+0CxR@>`v*MpFIPqV6-~Ml%eZ{{vv%fj}3)Pn=A9(veXy4DxeF;H6 zC!N&sbJ~66H$Qam>;Cz#uQrc<J-`ll* zI>={Du985#ZvD#VnB4+1b1QR0&97m$Dk+3EQ%4+{vJ7-qUb5RRD}b>~2p9-VpZ~UB zNz8BTYulIsy}G}r`FGh2*84P zH&K`z?bJp=5xga#aNGWFc2F)G8Gv=RA<=OCDCbGN${0v1 zOE?(nrWXagC#17QzBo*giO}sT{{{FB1i0gUg@62|m6Ro&qz*9*z|4; zwOmKA1VM+9&ajy1o-!AQBmR+P{$gmM>wA)oatviYTbnZ!p8>T5st{Dm!y zRxh}Y`F2K~t!q9lL|lOhGvViNo&4_jzMf5Be4~23l9A3zVEkij9p0&6usgy|@sC40 zrmPj^eLZqg-}=J`hm``Heh`MtM#`3!CzhVTjmoA%2MZUMFe3rXBYK4JnDVur8?=iM z8mws(==8JA2zSZWg^qAev?SbRui=GO@Q`usc)#T@*s?XkLq{RP_CWk5<4kZ-3=NK- zx0U#WPXu4c<~J(|<6uzfNq#73%REtLyn>0Er0pi+PU6vK8(N+Y3IaIeOy|GURs|$y zMIwhs%g^H$Lou*p8+;0uer~GU$!4~ra zCdzp^6~c2dmy{F!HROrn&&?(k^^|h3+(E?yKaIf8faj-q1djT-rS)e%TTnKriqZ*Pdq=*aSQ9d{uWfT+ZWB%S z1d4>X70;L9vuOo%;UWS&VZ0yPmsShr{k8dIE(YJ2PiMdvhV$8M#yIZPTXP8(05j{V z;0ulYw`Uyi#{9pVdEw8y$~!CfRT|&*ssyv}~uzW>cTyD!)sPal2HPfmZgd{243RRt_)|&*0c2Tak&kczLl=jkyTu z%=SRaZ?D4`3C6moEfd%lQQJE3ol*rCj5#;pC=|*VUfg-n+FWYPC$9Wq=jjakj$grI zA}%z)!+s^qMH(yC;UDfGXWiPAd=A`P994mjAH9>6884Vhl`->b1rK|ud!{?YMb|p$ zSTLl0*~3e$1F~Wi#;k%_aH+qz%^-jIbnYhxuUfHmK~C{|v; zPq=zX{KxXZIen54Ci8;#E3EB=#-6z5e=;bDOI~3xna2-}>uVK)-99yL?*a*%Y58a$ zLB%kv^^iSt!R2aWfIVTgrRv>7>k@x_`F61b_qu<7aC8019QqCT435?{*6|Yd`sK8| z#=lzTP(=Y&w|MTrM&xL})yIcBIq~|C!I?E3o-(d9J;JNSibKkUkZmkIg4^alCf+qH zu{rNqC@*I>BIvZoM9RrlTAe3+!b%Qo+0veg_J1+WS=jYw1~RVq4;Ch~zdeh6k><9k*f24<^eMX#))z3&y&rv2{a_eOIvrGK=(EClr)PD57-EY~w zJ^ffSp37&(CgsMbc(OLl7)Z-yA_I&IBvnDcKt8k%x|^=;=E_KNn*bZ=&IR;yIvf!Y zoPNchv%kYAHe&j0NTaehy{-&kjnC2?gbfC21|0E^TiD(|kqNu~&=cz-z%c=5GJ#lm z^TeI84W=q9Yp=nxv#q!t`4!>9jr~mtzrA{QqWLrli?c`gAPk5g7-~5hHdp^E_zAtu z8G)QLJr6G}&!#8Wg83>uv>Y0|e%ZkZC@a#hNv@>B9+`y)e zvUjx{{6>S;>p{wi&z?b;i$GNHA_!WRcy){n(+UYJmdKxV@!<=Zt4;Hkh1Yq?yL-g?{LUEscj*t2-Fh&Y?|-|LED< ziNv=%K3`U(UhvgTuI;%I6r>o1lJJKw9NMZ7|MNO8HghQo!18Ym?k2|2)|s}e3oEY+ zq5gQO+n}!U684l2ojR0O67qj&+}z0w@%g$2z-O>NT*Gckcvf~bfGB?6ah5<|hTd|+ z&)RYd2FhvXjRUs$7q=D;8Pb2^*y>ToY-;MuX}czn4TPRR_SkFF1U%fC&uBt~;d-=u z0iCaItOHMiiCzQ`Zt?g+Rsr5Qb!THo2+Lu-KNPkegoeZP?FIcPSS(Hn&%om>A~y$) z!T|1ZLipesFY91=M3lA6weVp&tob1u5e^Cf_rZA7?N4 z@CfFyrq{HwbtvS+gS9H~@#EwC>5TA0HW?Dab5=>)|Dhmg*_x65q5l4i&z2x409RkE zE8pL{a&tV%iRTzUK(;z^-ah5db2zVnj%hw}ggZ(7@m;ulU|I6NlRZ|~@*ig;K&Kry z1Tf#~k`7x}13_)mZ=Fpu9i8-#-1zc8O#g3qnb zwJRxt{^-7}Y7pd|`K1}?wT)UfQ-Cke7gDbI!F)Co1I@nntf9Qge5Ul?e0?qZ@MgzHDdTYHo8b z_U4;ES@|c?8T15VsQPkgu)IjVq2HuULC3l@)Z*#|_iAu+U}D zYrMK*B9PkhW>cnwVSpz!6BWcyCnBW9Kjq1UVR|^i^?iJvZKcEb1!8i~B;9+8gX3x@ zg6Hx2P67dE9sfOFUQo}##dOTO(1nI6FBLGK&-aC4KAB90I?*$~qPH<;3JM9~(?i`D z%Y-!rg{q+h?{7o7 zF%4#c?18od=_S5iHCIcdP!%qR1WC?@~@6YVmGKK7Ox!WGsTL;oc_ z5sc+nVLkHW!@>G-SggDvR}cL^)KJvHul(uto`%z>_bVMR^Y6?^?}J(+BZbe|+Ee#w z?OmswLMN2a8NY3wvZBqjUc3r@t})w=fRpi4W9`2lXBARB-eOfjm!s1VYEE>tIH)6F6Xq10}ffq7KBTwDfoPEUlzsEk58n#nIT+IBzP4U zdQ-~X)0Eo8D;bznvm+@Wz``2%(&Spq>(&0(}!*^my!}puiTO6V2Y537*ZLIA#c(T5mL-+Oy$#X2>P>fOm zi1S`h{o0BDT63;mEr124dhofJw?y!{ zI1+k$Za5=&Z(lkS1Jk*WN%(zS=Tl9Auisb92>y}Ut(mXfb~QWq!kN=Q_}c0xD!*;- z`;q&;{fGYE+_BEnKV<%byFH%y7rdH(vU*?tYu}Q7@X8luPyeH*&rV^pVqPW~(Q^jgWG;yk(E8JfFr2V{H0+6`)|pSaO<1zH4x&9LT+=heed{$R z@t^EIHB^SR>?bt8MOav8G#{Rl?oc|Jz1Bh)2Z~B+9gKf+$W&q`{9rtm35&knvnk|JI{jc62sTjG-D6D$MkndaZ|%=22@EGeaAn32r)?eaQ@$52z;V{`*fV8*8Y9tk zGW^6XM?C@3nwn1{*r&NPyeHltHjt5*FxW&&h}f?i{LCJsYg3LC+#o6)PX_}l2$#aZ zQgC_CfT=#sz9EW~qaDq}l;THxe0@9sZL2G0AxZgc5*TnnI}6c;!;l3En&53wNq|Gz zy#OYZEVw{7LZ_7yA@9!@+YxVfV=NFEgqVMEL+`(r9-}bPc+Qs__Mb?w#l~X2lCts| z-Wl&?q}$?bLqWM2ebP@hmM5-3jt|CI4m7^#1qr;MW@xKKz0&qPGxQpH5^ z=n1;#LaR#o_XL^InrrDuKb96DbU}GDU={>RN*SEdcGPiL*IIiVx{d+7pLLW|>Q+nU zT2hZmV`6r5!fg@{I_p%ezpPuOq!#;93FMbUe18{+aK%lk;pN@&;ATOdvI17e{4caT z8>mu3ao_^m)(O}@-k(VR+u3%yD}8EH}&s${BZpqSIziMhm}W$&m_=tUw@vO4<|NKs5s6< z#eg+tx}Z5K0HC(DPX+UnjVJ26F`<^VcF&Gy)UIBc5s*W#GDa9jJ>grN4DvN9z@ZEO zu+V3cYERl@Ze`Ypz@GtDq3?5ZuIl8J{%lc+@y}{`wIKg&wk>$AQESbnKv(Nm4dHvU zFBkuPAD(yB6#A(4d)0f4+t;go!_0#pD58(re;WPV5B$`bbKgGu^73~R^OwwNAO0n) z^PgJXW9PrR@-xY6Y6$Qjo8Efo@02&Ee`xQ#*73253I@5aN+wL1Ff|i_WnU-!n!f?9 zZ0>F<LkD&5dX&%9#K;SI)$Q zKNbY9e9nf0`K`%>ABX=afyO^A@W062gbx4f7*%nLM;AA$G37sV zC()HsFEEA`_8xNrY}(v9;<2?M?S#NuQI>EbT2lI1qi(uX7UJ)ZOcK6NIUV6S#jS(0 zp{Ys!38Ca`1!EomDI%l*PiZH?Gu{jS`5szuPI7d3${xHruQuV|Lolb1nyiR{3zz3> z!XWNGbhjz}r-!c+2}k`i@GG8Wa;l`G^|)!5qWVy5kVjK=SACnD@WrEfV-= zQg5lh*3Iz@q6Q;#Gf7sBBx3)X3t;m_W)3*qzTUg*jMRTk z1?z*fYesq-P;mC5s$A3?qcTnfVus1|N_}0*fBV>@*)!1XNk3lsS_UfkLt(F-72&ji za2Qq80Z(&|AHWTHL+xiij}w1dy$6|FvjFs=cag2goAm#A&=W{l}5yJz06H|W9IEeQzM+x)k)^@rBK0Sl&!5PwJEn5)( zTrgSZ{_r2=Fk0@Or<;>yF5#G+edB-^!y&rU)H^1<7K&j3eSz`kh;-@$* zEv~OmL#S1GV=HZ|64QQb+v~gF?24qg-aVgzMKO5Hcf>i+c?E&;XJB%sU}zn1h(c1(j?IO-v==Mbj`Wk=u!#}Z5BYSw z!o%S+UtamyS#ey5Bk>W;J?nsl)gBNF5SZ-M_5|`7lvi-1{*He94@}VY?Rv8ceY`N< z+)W8T^a9#uLC~IOoF&i~IMkQ{&m%YmcSiC0sJFRj%_d}f<+r*|fYWPDp2GMQupZNXfA*UTKBH3~PSKl!h5Kr~ ztL48oE_R54I=m)y)^!a@fOTk1pt)ry8jn-kic5TPji9(bY*NK9hdt^I>*KKpto>iJ zYu1t88AfVB$Rm^toZi?}yvmwA2G8mF9LNPWr32nVwH7!=^(`cRI0G=`P$f9`4QP4x zU*5l3A>8))ZN3vSSiDFNfI^oG;4Dr@;oi-8LrmW>@ms#VrXvf6i-X`jE3+2Y7gY{8 zv>SqQn!YQ5S>2ToHvHP(fnx^}8HbNG9$S-gGYcmKLl94Es+ewj1)M{VzP^WprLgK( z`Uh?tm{d{}h|yy;9Y+(}(fV&=5h6V-3AwZ*;$QQpf5$Q&u^4s*zG(Y}>$AX59RGv0 zr*nf~_doW-H!poKseen#8)kvjHe%dRXi{}R1AO$)3Js&n7*!piLm7o8M@Z`g@URDJ|R%Z&i)sUq>PS43t9vm%7d(<@IKt?%B?d~!7` zv5dXW3fS@D{0hok^cDfuVMD0Krt+koH$CL@phVwNLWtW8;rM(>>dAM%u?$vwDIDrT zkV`NOoSOpe1v?ghZZ?YrHxC53X~%*-y8@>E)+wG(3mA}@Nut=8XRbe^3IR8ZX@8kx zA)Z(woI%o|(%?9%v}_$O9AcCB9A)hB6hV>;<`dthHte8T@rC3nJanqo}y?!2efi`^rQHYb3u{hSZsyHKH zTZ*5VPNapg5aA=`@Za^b()Q_gLi_Xm`m`V%>bZ4<+r-i%I2TbF9P?MxBUVS-Y1OyW zY-6^m<2ie3sU#lby)WSzzdrnyjRocOx_6Eht+;L&w;Q%2`EcQkmWS`weSG;fx)}Nj zib78Kg8G9ac57gaYcH7R)@%I;`cuayt=$Zd^&qHE1_k3mUti+Inw}ia6NhC{z}yMq z11HI(E{dS^4=4(lZx`BiQ|gChtuA!xzovYHdo3d9eDB_jV)#M-@mS(>qpFrSI&AAg zk1kXuGEOT=v}GM|AyWPlJ;*&OF)Qrad{KeE+u7+;M^lZf9SL8}sxFFwT}=AmGsfey z>oZ32cxEj5&*c6L28uwtk|X%dY$oZ=4S_MR&(%DIz`1%QQM^|b`rn-U`;~j1ENaJU z`)A(rb9wY@_QU2~?|a2NzWdFGUNyMZFweXHWD6)y`A>#;-t$jwftP*fYwuk88-JxX z{ZaG7=Bd@q=|?eo-hRV}%`Z>iF&#JJ@|CPOPRUN6|BMhevN0`~faw0x=qLeqr0*Gsf9Hu{)bhnqYI5-Hu+q8U z%LBt6$;7u;G5$N!Lu@O9?R!(UoT68p6~5;4Aa^t7hH`MnA>lbXSXX$9xCQt!X*u4P zc*kiSrcx z(%oCBH-jS6Ew%snZGtYTz-dGJL&Zd3=?h}tQ+jrwgv<*B(+c#0)9#M4(r!{udp1nL z1%HF0#L@a64)w2xaF>F>7?_EK*;7c^qNsUXpYpXr&pO`u6*Z-tLt!X*3+2OvulZ8z zEQ+C@4+1{tU0nFQj?c|}d`}fY<;PD8Rnb8di;=i1SQZN4<_yd1I3HgP<0?Q#yDvB6RNcf|n6S(=1?OWuU9sCe zMYtV42MmIqmGq{@yNW^-^LCLE=D;(-l6RGNoL$n<%_(;s?JOxh-JCBO$-Fm%CF^?F zgTL(ii{EM(+JyL6Mmb^&0}Edw-Qlz`*@2& zxvnGQs#jF_)?-idlP1|LUb>k#DY z)k4y(#50+72>wQtN;)&?j8VK*?TLV&$*Za0vwgppKa*A)l^DEWg)j8>OiRPn{TYC{ z`)6M>^Ey+^y=Cqt(atcRegDkO%HmJFg0BU>(7b7*`Ht+(AAi+1{L#cb@BXt|K>F}` z_h;AwFPn`&dFj{}CDV_aA2-|IoJ|j#$EGj%rq@q@X8P0SlgDBh=erPD2{(4FNVc+P ztuV(lSb(<>ElMv_WjHaDRB-1RiwQqd$+~G3va!ya;5eZ$798j4%bt<2mzpaz_7~B> zRvUtI^{O%&!*}`WA1n|0`ArVx0ncEk7d(Szebdr#+=!=e%PRn|?SXYrFfl9rN=R?) zw<@@}W32Qn(7TGUH%%+Z>yENv`K%`v)YiPmPYb=6F^NUSSaMrOkpy%n>dm2j5m8BZH z5>{rlaLj25R-6%HFaFpoaG{k9rC*l#T>Mf9q;`t4BkN-{ZDAcA>!Dt;XS9rh#( zR`?vTu+HGH2RO>j;| zXg!EORR1iLzZU8<@$HL1^X2Z^vCfM<#bYU?x8dgn3a+Nd)>o<}O@aa;7PCz16$I=O z^-aieGqm$EzpGe)H$%A-qk<1hTMAXS-Zlkd|LJPDTIj!}aHe64!;p>uF7*34$L|X8 zCja7At;5gY+vO>Tc(r}33y1SE>mZ8)JCb&^{YVA2&AdNX*Dgm6k2POU+xFu(l-{rr zl4|rG#dj5>nhM?+!toF#Z%!!CfVla5KqlqY6ILs~QP6^O4y~;J#y!$h00qMi%-DjW$Ui!|sbLmU(Yn!V12WI-!z3JaGFPYx{ zhM(k)^^RG1jhTKcm-xPVDe;C+3dHZyOR+HhD?{NBnJ;DT1rzLUqMcV~cTU39{e>Y+ zdmk?*-5ihHwseaD6R34e?9>Y)j&y&VA> zK_P5a8QmB^=zN`9(-JnP%UZ53IpO$eq!odrt1AIkSOYB4aUZbed@t)C_IZ~ z#_yh;T_D?6jt^YdZo>90YtHKTr(TnUFC>(?Yn+DOb_jl&e%i@Goc~ zaeJrAV`0lU*tg`zPP+;q*5Rp;O-rAKTQ2H0r(O-#wh7^e99k{#i+wvIaC|#=r#)@= z&As~gam%Rc5gJ9s)^%mPte6Nsb*ylWw6)+`j$s%-BlR|+_vufMGkRiu+YGqx1;hCA z^;IPrAsy?WjKXKCd*g;#r1Z^FX9hn$Yji%1Lb*e_w6>O?`Pe2E>3 z497AZ^bHiv0>6&`8U#fx*O9>%o3B@t8p26yNDhqRbg#aO54{3LKgM`Vd-Vm_EylS6 zG9EO150zE$G>rS$_bcjlDrIAw`EpV|=}FF%)P>G^zHV?f_5$4&QCrfB`lw<8O*Pee zgz;Bt(eFafDyj5)lo37_K_4|FJ+4wW)W}rgYGHB&yQ%b|LIr$MfnJR(eZ_~>G&11* z>OpCrnU$HZth{q8oB8+E4@Cd=S55TsO3NPo#c$)r(mDI%zubQ3FP;7USAFu6J)%7C z{v2CC`u2JES2b`nUf^W_}QX-+xKW zp_})WFFce^|1SjkG2>upJ(Iyq#;hP?Cbq2bb2-!(1T4niKUTesAOPwmp+4ofzDQRZ z?63}nv6EU;d|_xRI7Q(QI^s@ONF4TqRpW**Sm<28GZNHH{FS~iy^f%Iff0~&)FD9p z+t}l*beE;Pb~9>7`B5-balv5f)7wH7!eLr%S*Q7@pyZ24a!T*$Af6BxGVIYSMzX@r zz-8?wbom_7@zSy>PXiO`Njy8|%@KDK7FodH62g6&BUdB-tQdPj<^q#86oYt4tpo4D z1`A0ih|0Fq2DcU%emgMSrq7rD@~-1e&^Gss7q%Y@<0W?~k(9fx`EHROI0{5A`9`b& zB^+NVv^Cs7L^mEGT@epLr_~ak+HT@c{bRvR9Aydzq`-^qKU=Ou=(c52fjoVE_dbhU z5AC)@4DlZ!@B}8r0ic+8ocl2pZy{P@JRDn0IsRBCc$aj&YXq2@y7pt8pYtl9QGdmA z+7%}s0qVHR{9ZKW^CP#-W=u?gei+XgV?HOJhRLFscrC90kZaxG$iFR+-b)nv4GHN# zPtSaN?J167%mKfTiye-u*nK+N{!1zM^EFiDqk zkFA65=-F8MH8N#pWImawfZo93k$|^(&-kyCQjFgidJ4TxO>y*gqW-jp;87e6wT5+H zvM9IC;H>lG$+i%*8R2@Q5Nmp1_&2Zt$@jfx>8HPA{vGydP6hwW{U0&!Ge0u@ z=HI`iu30sHeujQJw-*6Ak>Wz%KBj$pz`O5!K)@xG_{#=Du94 zj0!24NAUCjlAnTzc-HZ{NeUToAgr4B>#U^`UWT4dyi{X!yl9~u4qx)6X7Umo zE9jQyv+6B22p$#i)LYXQT%~5$c;F7!tyna2OQ9fUlwcb%FGwZ}Cd5JBsBNqjuhpx+(wr8j}%tOHM?mf~X+j~rS-`Wf_;nu0Tm z@PVGwg9&t6kG_-kiB&Oi)G(H`D1ig^BT5P^=%{y=z~1;0@+woI9R7)G%LScBcR4p62v-rr&9g98Ney_{H|ny$zmk zo8Gv0XnxU@cHcb*&F7o%GVYKwyT(qRtjA`?So_35!(H9~)YJ}`>Cc&`%wQole`x-p z`HKCq{T_Dvug|CEkLyG5-+F`TdDdlMVU6(vbRX=t%MNZ-hU$O zUKwdi!wc>pu(B08x%7NG;2C%=Y6!DO?eO`o`4u^(>?;E;VA&eaWD0XHuvrH?^-oyA zivQT>D`|;~>Ru2Nx-PhNu=fmD=TD&g38a)Ns8Y%$IJqc8?;CY6?9@2ued>=tr5K9` zV$!FpqCzO%VLwUbEsAN6jBo{_#X-nX$r4~6!IeQb2wo?U_AiVfOkeY@M+untXV47d zDv_G)2}%*%8m{M8tc2@pdi5wa;u87|hk~R|>bd769-+sAi`et!2rFMl%`?dlK`8$H zAn1o)fxu7mCI3SFsgJs-&{R=lw04G6G<^hqu0FjGvd{N31yNem-;sWgcX25-E93>5 zlYiSbI4QsMuhcGb;HaaaoqAf%x7+*8n;5lUWdAEp1ts%daB*-*vnDz3|}EVZtU+@ z?lJFw%-AnCpJ(qM=h0j2|6*ToyDS6TgWA-bfuQyANH2CcCpPQ#18QQNjv*zHf z%>2Jx()@`>H_aEDe`#KLdleVpS5@zNde^RogM)`dg~P>#dkcYZM~HB6?r?B$q@@4F(Wr26rbuvb zK;VBd7bYCs5e6I_C+C0h#@lt2Z-<1$e=+8JIJl>`yuiT!;`2;6I5fkz0^hd(lz%0F z0C#r_2N$KTDv$M!{M}nJmI7Et^DTUn01g)o+am@*76~2G(vt6oOJNj%@zi`Q!Oo#6)wfbBjS7vt= z{jFP{897I0%Wb*4og3XT(7Qubl9%dRPpBFu{?oD?(&b#Fu?Qjk>9oP-c2=WAJ=5r2;F z3ha~bpl#h9nIGuKmzyS9NTOdz+WS>SXsY&oW5n>c*K2TP#r@=-?7}A{QoRZZK55B) zv3m)tVFY{qJkC~kY|97AkUw4@5|J?(-;pY$ZnT>Ou}OC03y0C_^-Yd2Q=-2c`Apq& zVIHoInmeQEh@GL1J+Mfy5}*B>d_sEnk0iB7IE^Rffh%_TB-hUiM^htz?2jAFNL93v zD{7=t|Hh`MwjOcYZu79HxHQ~ssd-|H9M&QN1KgFx(BC!a=2jG^@U7Zc5XcGBXb9`5r#yfnzj7<|_n|$Yeu))<$U^=8gGEgSDgku6Byh z^SJ_dX&MkoJTv{#Wdi@h05Td%3b3YH!p;PKo)UQ-KjiZ_^pm+S{3KX|Q~bDy>y-VB z9bB%M^y_$8r!Dw{q|${sGKKLnS|sSI9!O&!G4bk2ZS}{>I~d&AW96g?v(3}rb)Ok* z^SOqv&08zXT0fP}-%U-DNr)DyUtO&vy1; z?aZD5{)o=IvEa<)rJH@w2h9Au;$ia^?>%|PEh2s1+8}TlG54Lx0q{5F6%mj6?(BPn z*~^=P!YRnA%2Y{x4*vg8^|t{7j`V+2eZxca?hX8(RUH-ZA5{k{seB*S%Jjew=exDw zHioZTLW|`Og)_wk20?ULk+?Hc)TGP^kZNLN7f2BYKAZpQ?&FVHh$0YPV@QhTaY-vL z8}U+A5WHoL(0w3zQdV&O+gy?J0K2_eUWH}r(>*W|8@Ic8p1$mTd4>syXCkb>7>nKr zSy1{B@!y$*!Du;pcX~N`mx4(CZFV~Lgmp~xAg`+RdS$CgmB&~6Pgn;$)RiCI$E;N8 z+$31aZ9PBU=6dS{_!d(6hm1b+;qQSo=i&9FFr#>+WQ1dPHRtg(_dxjn;0_`j(~p!a zPAx4w+T|8+u6?c+5^`lC5CaZ$Uv9gcTa7^uYf`66l2ffQ+6$7WOL0@J5u*(ePlz?X zBi^<@ zMHINk9x`B;Q3>Y_1O$3*LRx?0 z#c8Q=#sRcQJ`}r)Yzh`Qh-?bS-u#WHp62vYuJQ?qnNzWduUwaTc;S%7f236|MAb#` z(Z;gZI>K>Y?221!3Nrm1lK}-5PZ?ztV_Ubrgg*SH{w{5xjcut)fa57h;P%e3ZnoZmnAfDKLyohuVh zbfwRhi+XM&%e%44!-FjvR^&kxY6A=NdPWho&@%{Lc3EymOaF2 zw)YnNRiGw6JbY`Rre5paHbWbO!ryh#MP6i;w-_Vd)Su5Q%_$c)%&y)!n-Ycn3YXHA zJ=K*pGs^#Eo;~ssLFiFsMz&1Tp*L7 zTu|>4H$Cn{>Q_PPi!*H39y8h)ywVxm(-}PLO%mouHZv*hoULTFq{E3L-m~x+NcqUU zXG;REZVTyYCC4u_0EEu4uS?nGFs_Ou6gdS=#}kcocyRf4#&%l9jfTq>v3WoiQwn69 zTTZb5A|6?_eVX)Gm)_Eo*)lFFcEpmMp(*3LvM@LclVMp_{LtW?;yS}hqReBVx65>~ zB01j~xaNauKghlLkO|HphVXL$ty}y1!@X+BcQu4bhTT{-H`?R!AK5eJkQGHRtd>*2 z+~bhdT0;CU0;|}J6eZw_44MX;=-4G|-YSFrr9I{&-Moc5u=fcTyK#CPjeSPpWJBPB zh>9XiJGuE14mln?!S*hU%+)@Ij=Wf%pDkPl|Bu}V1pu%g7uZj_AqArgi`T0^B^z0? zoT?vp>fB`^+hra%>6EK-3)f$_S6p$~UjC}iuae}Lo&VFGx&bCcZkmBVPkGVGl^k~k z(kQlON!I0;(`?DLct%t37WW#PXL2@_r8V41^vjqX;bPZLNHTq=zDh+#D6xt!K>$q=Z)th3oI( zOMD-$z!MLwx=ETR%$wv_sG$vP^}_tvORD&X$t%vhG?NimCmy2DCF6SlCy2$<6{QL5 z?V?M@{8m+;8k%UF=qgrJY?=(CWn%NMJ$j}~y@eK>F^+Lc$iaZtM9*MlX{Mv+QdWP$ zUDH|{6a}^`=+7$<|Fuiwki79sTvNez?Th19%p-WxQ-SFQUuT=Xrasfc2#5I#*Z6nW zq@oj$!n|~NP3r7r4iod2RXST*K91oZYgResF;2xp@?}@Mwi*TFmMTm)PM=Odr<%+1 zo{=1Ow4J5dNMo;2R_L;L9c-UCV!ddy*v`Mno&2j-WZWFl2)!5_gC;Qx=`6fV@E{vy zX$yWxVw4fg7q$Cz$Mi;xRkp>q7f}d2G4DOau#s0*9-U(F%78azw z&s~2yJ!$i(DSUOJBWhUOoE_gQaj6u~9tmX2K5lpOZ9nB?JzTl|WIbo)nUk<*J>;J~Yz_)DR z|1hzOxA*lM_&+l-#=w7=SXbUJb9-Y_oYxmRDnfE;=J6$U+y3gMSjQ>{ZYJJ@j{{riL zGXFZk7%+4g0MomfJc^QMgG-BqQQ$+#re$RI;7A4}p5Q>7ma$u{+|fh&eqV+H=Pa$0m&nb3@A2cr zl5Z>n{+vA07}mZ_b+z&qR!2FCdDBw!g6gtBP3T^nEXT&l*tvJy<=B9co6qbrVZHC8 zG58Q1A1zX}G)EbWBJ0|%j5s*i0~Foo1#52-hWB44*~mWJJ=@AYx+KOimWE2sY1L>r zh+<*m_t}>eaD8k`os9=7Mx^qVsEy8K^}HN261wNV5Qd$|9Dg@Zm7y)e=7@92RsZK5 zv~rQ9y|$Gn(rS=!c7>eFsEdP=OE zr77qo>##1Ek&nSGq&B=SLSTtj+BQCfXCpk(C&;pl*Dt-deSHT$!|lw$NWO`2q_2!I zdE%8)XO$CyV>(vApy%?b3bO?_d!GnMqz_aF8u{isj&=JL<<&Gs zIiugcD9OI4SWV}^&JXXNnDL#$ua{DzaaTH45944fFL3PzY5M*4MB>AN&dWlvbZxf$ zzNngYhF7rrwKn0;+)E8Ucd3it=1v^gZeC>>=h0^NR})rgEk$lG_$Ld@OEu;r^6|`M zLirZwY15|N^$C}FrU5cX*(Fx;<52#Sq=ie|^n(w;va9y%LEhs+cd-KZ=?JfXici~( zJ9{+W3mKEKsiwFek@gNFW>s@$c(0NN4oY|@#NMQ&oC!X66O}yk3LbY0a?tc_z<6j9 z%l98qx4EOa0{E+zO6{_R$UKUT@R;> zRPcxE1|B_P!lYWZ2EVUjyD3G>JzTmM;KvC>dk}GZ4pDOym5$<8!Dg9p{Fn630$J;Y zdGrHyG)jhL4p87U>GJ|;>K9{%dU^svVtLK`0J~@YsBrsBApm6AEpVkdWTjcD|D5Yf zNCMNLu#C7@towFyUkX+7oS$~1wDyg(b|WGeOC{>in9ru){W;gi!h|8G)BFQbi8C?U zzqJwdrZIiR_V^i%QI0F1zYm;1Wmn-wPw`3r?69&X13u0byP`bY)*+F7pSq6VNw>ldl1ry6t(+cai(8ZbdK( zI$j6d^>4Y&4=U3?aS#%x{d2|jn^d#>sjOGYFR+g2`0ODzYX!}>xGMA5{i4FNDk8Wh zwD|{O&NK0mJ+&dzwJ|I8VWZ7qJ@v9j*XVjTY_liJ+rl2Dq#`onFSx7wwAusqW;SP0 zx3mMhQ@|Ip|y!u7OX2^0K5v;+gM$ zLRDu>y?eUnv(e^}4!G1r@^7P@!UT4|5e1=pl?G3{lIbn>1y;q7{=9;ti)cM!+kW_M8QBu3%P*Vqk(_?@wrqcyzSaz0l4qus1X6nP_)w%vrAHK&g1sdCk=x$P0?m)!xQ}AuPJTS z`~^SRn8Ul1I*W!eydQ3$N@7e^sP0j|murZ~6=pgc^)!~lbjAu3#Y$<02ot$T(QIp< zU%ZpPZ_pi!fW{AkP@92auIgvKM0K7kBddQO@MH^Rh!gNMc;#FdNy||L!shf8k9oG! zMYLVV3Twvk_4wtK!(!5+(ThH^YaXtYE`Mcm8r8JR1eJ_Qe~O8~>?JIVb8s^GoWoFf z!2eH{w(p}VuAYcg>DOf6qleqXJC+Fn)3B{j>+nb>avDP(8H)?tsUN*eM@B__t&n+@ zNa^peq!ktlP^)jU!I#25?O3QTkE-VsF4vNVrYphQMZ*pk5axEdUOMJhCo{zebT(4D zf^TSL?xAR7aQVozgbmdJ@1Zt~CK1+h=woM$hBIoqk^s|tztC+MUI`ULjZNtOwB&Y! zIk=%Wl;nosqlkp|a30vE_XGO(UhwGD7%#Ac0LW`Kbk_rQ;+;3z{57t| zf>LO4>QE1`o9ACu=C}M}iO8Nl~oyZjDQ=#o`JBX(df zp0vxuW5?JI<-%yg2SDDzdj@yhjAcpPoU2#H*KEJ4$vwhHY3C($jV2e`w(KLlllD{_ z#)%KNO(8m6F}SZ3D=eoT5xY3w*j7hS$@m>CmYSjTpLdES8nba50z)8_gKAz@@xPbb zUTL-MNqmBNf(<7yFFoGTriWV(eCiN?jUm>Xbo13(9eXVMTJ?jhCC7Br+Z#fWzAK>H zoNoQkyLcx~5TxICwb7w)>|?;O4JgX&^XgJ>yv(VMv+E^%zDiK_XLxa!C35v~_`3M| zAXyw@dqBLV#&@aoG4sR5^K2u~T8g(b%6{{i<74HM)FRDgPQiW2-EB1SnpUGTTW?Qg zfpN6*OhC4waJs+Ft>ybq%M?U<8?IsH_FbJ&(}!KT){8a@GJEk*i*$s18(SdFJay!V z2a?&lWke_X?4Z!;DhV?^51`&M0p#N~%JxS;_>W_sftBue5wQ<7XU>>O>sC}4xyvG` zNoyw0H*;;?uNYUWqvPlcuLy58!2f12yv^;yasH3Npo4H9@&CtQAa(nX!C)mF=cT7! zsOQe0HiMJ1|8oVnNCGcKk-30`hJ=q_fomoCh+sw%6S^Q!bLNv6NXIYv_0vc9Paj)X z;@z(|ZV*y6#a$o&HCeVYnyo!#Hs3N<81fOAzv7u>xlDB2W}OM& zM*0qwmcCA)ZU~D%|9$-w8t`=V`$0b7%0}o?$5DRb_0OI(skJFbZjEPdi{ayus8r|_&3FNtGJBnAS&*HV|SD6?OzQyg~ zE}77D?Ww76-(Pn{FPrT6XPyak=K8*<5zPp^o&*rz`UP8zp?el%Sm13AaE5-;yr!gC zMmAV*SLkl44J!jG9!H-NY+lFiPzDPZoZWctx+rq~Awi&HQU?JFbrIFk7u>% z#T7CEO*~JXDWZx&{W1lf*IrJ}!nB}WFGdc7s2f&l*7(yzX0kUJ+aL52k%~%(oY0}! z^x!tTwmjPhggN0?c6PeGQn*^Rz8bF1boz;RKp6XP+Je!(#NF%}9~qfX2BZj&O4}_a zubs`ear+e8!=u$55B(g`k7Av)Y6D?mljL%ZAtLljhM(zyQfN+dmQe(n+g}#uO^0h~ z>1k-?6_P~xQCoVOLeI!A*>8p6_XxLt3>jBl;Y%F}Qki$2_z}8yJxB@Na`><41ib7- zIz6)`W+p)Y62Coq-@&d2cS#C&Qi{%ce?0L{P-UbU^nBD#xDxN?m=n9vX^VQ5IK4x|d*GX*G0 z`z!2s7lEW%5t+ypnJ0tP6Q&-+W}Ot1vYj-#*U5^l_O-l~R-JHXM8TR)jK=%3*C#iH z^;<}pxGA#kxca_WM9~qY;0@2VkkpV%D0B}Kv`!S>{A^2DAE7>pCzmfgx-^bK=$=D6 zK@_~;2mk$5u#akwmz^RS_`2E=&lx?W=UgHhOC!)N*nnIGj3a868fwguI({d;0PPc*V89vHm}B5Vm^I(Qclwy7G73%fG39CF0zX+8%jwoYhlU`zh%kgM9l^cvUN zZVP5|j<8}ki&>Q^U$2FTLduM2gs}~P)&nd7LL4d*t1#fVh!!0+UTy=)D zP0u%VrO>*rr{Jf>EiyHTy|8r77E?5Nfr?PKy-mHxZ#U9#eP~^S<|o;0#lD zBVp$laz~`-f3~H*c(V_V`PZvbe9jmO6UgN#)#_Uv`9Mo_?M{kP-zIhJ^}Mf42;XnR z3%=f=xOGx6MJ%Q{GX)P!84!9vocvKb4?>;k1O7T^>zK%R#rr?dH?c)xu4*N_=Hz=_ zqOfUkZ0JA3rG%w&j)_OO9r)E(2cRAGV6-+?x8wZT#321jGZ||lE$)Z-e2g`UG4apv z8P49N=@(m9=-FL@h5&gG*SXjV1)$&yH^NMh5-B2wX_k+wOB!Mm=h%AB2Oq@VW41AC z?DjzBbNukdJ*({4Jda1d?Hr7vqxj!EV$v!9Nc9GIES5PsV-Hs!FC1I!ONMNG2Hd;e zhwfe&)GHfG3K9mJaYnX6F@{is)$!LUf}KA^M(3C(x8@eq-eUgE;nDU|)i}bC-Vu!$ zp^#f05?tDKP(Mn@`*J8qq$}%;836>)>`9egX5}rpM3=wtfPHdmydFXzFl3D>K&aW9 zhq}s=lcQbcizBJwGhXw9IZI${`;hy^a_M+BfSc^Wa)T@$V(SxLaHGYWu%733`R+1^ zhb53M#Yc5Y#63P7%DJ6GF!Z3Rz8Vmn(G3)pMq>__(zco*C9A+lL&TfCr&U*5lMwYs z@8<;hDMtN4RRtZ1ht=0Z&Jvm*8veZvkrai@8Gh9*x#DuiXiZdquta)@Ppq|JxODND!C80~>e0q7?d zNUheF-t$)JkrLtr`CHSx?#M11g3nm>s;hZk$K;1Kw!8@@(mZ&QmA42dwt&wJcg(Ye zrlsMk2N=m7qG3+ELy9x9Wp@h#_ zZN+2C8jc{Pt{CMLc5eM!$YN{6b&6kPwkg9%<27^d)G^4YE-p63zNqOKI9Q95(eQ$HAklbfH{AkMK&>W3=nh&#;OOV^*r8eA*f!}kS30|*bSAe zvTca2hi`ev4&+XPJdR87MgK1JpOrgws#X@ndn$G6g<^e+_b&T!XxhGT(hE&;8M~f< zgy~Eq^ye+JMMp&Gv0$LfJ&J5q$y<|4SgnN&wc&UI8fU~*%SwYuz1mP*z(&4ci~V?h~_Q($chid{j^)e zLjn2gVIvb4O|aUD*!!VcH4rC$Q0N_Y?e+2oMU!b-OX##qsP7T+i16(}4FA3A2AUzL z!HY@(RxxA+YUhWnwZ~(Qp?o-WD-v)7s&oVu+~5-Y$b5k)Sg%Ov&j@`uH9js1I(2JIIQ* zt`pIJng2rupYASu{zWcuxf$Df9^OLqvGi~$!iPCHzTbAAv4^SgjOK?E(ZQJQ&%m!e zF%8x#nM?<0+!~ch08VDCqYd6lP^Br+!69E!g$^`d53woCP&cTr0X4^+N@dNG>6d*$ ztu4u4(KbkH)936ii6B3K;R(u}y}_FdOnPQv1NM=l!nhfYAgkpfryNrP-)EtpE_Nt2e6V`LzK0z z7BCoom=a|T5EV^HzaO$P?&y6tospt(ynv$Cgwk+J`ePhR+s#pWt|9L728*<00^&$3 z{)Ay`AWe#VryFOpXke8-5|{hogE)P|XH(J2Z<;0|nezo>W$q(OAnwj8Iv%;gydLi6@f!KG z!Kb{;53(_@q?b9Oyk0mO0?jyHxBNv_e922XK>KxxbQeUknRgi-@}&oh(giGmvk%DM z$cdr)U9r*QK!P8XA1o7XNuc^95{j!LL~jxzl~}`P70VXQBCA_0!!>=uJNze|ypW=? zYbg6=kbES|mNOPWJ1?{Aj4pD*;@SGq!a6FAPcfy$0Nx~kWWF+ZxmDR^*vDPtXffia z3u^7Sy|%|$f!j9o^@}ukc^*_#o!{4}s9~WO{^b%WD;zHIqf4@Fq76Jzc8Rif9OEe6 zJUg(`pSsNLYJ-dFaBsTK&}S8FtzVH*~Twj3FC63H>cfP4ZpnG_Hi^2_=3q50l%^UQYK= zsVn>uN?WEHc4<3(nV2)Uuw6bn4frdtCbIfpzX6$#w^`g#d@kTmrnLHeT zs$y}3e_8QuzpAhLjmUg#&gDjrCZl6!fR?7o)H=T#F1LtfPx7!G8rv%X@Q8&wx@AOAe$ze;@*TK~i45#ZS#NVEQcmQ}bepLB| z;m>>`AB*904U5BZ0Np>Ho@GP(F>g)g}LhPG-N z=gTdK;QM;xrGb=)x`JcW5Y;Z<g0 z?lcQy4JyegLYT3U?=GWw9Qn!{+s)U2^FugrG~ASsbU<%^zzVy@fs$s7>F!Wt`$%^> zm_gi`*L-MR1z6{h7X8x|2~tie>3xE>$r6EQav*CLhSSgy(G@o`#s1`H7>46S)Eikr zDis_{Nh&9DQPCb*L5a|`mOvOr;yf?n%qOSW%KKDt`iN z!~;LdZiI}Ap?(*J3$rDrA5hqCj0HyQo=X?qNX{P1cRFD9>}q^F^4pm6>2{tX@(o>60&!&F8`$osWYUPkFed)J7gIihkl;5IsjG-Ox7v1Y8hN(`nz( zs)z*=-UBc7pKy6SyB&eZ@<1!{AYB1D`&!=(>=1A{bx}$reyRMv(5Iz{59z3sJ3tu~ zvE=%=!f7F_FmsfTjn>JT4C*#n5>;Q3$VMdJ9!;Y^9TKXDv-90hG;r1i$Ba%ilI=)Z z6Ncv6IWtjkH^x&<5E(da9Q{GFw4Fq4#2b&}MB0wb2h`Y(vuML{$!q+L@ENRwJ;}ww z6%Ue}QwwAG2%{}q3MpbCj`~QA_Se|rFAk`s9H%TAzKBHxT*a{W0A)Io#+UpEz-RG+ zswVdWT3!F0MQ}nBm><0+)eDKTH{YRxg!^`?ZS;Pxsgz>bdfKKjiY)IjotpO9_(mFd;v2h;frl-F8b5zr~NlX*T=ZI z^45GZ%4HNzJ4SD@0)At~jLERjXa_p*@WWBvv0&oaX;o+?39S=tYf(s5Vazg~(c7w| zzQl)w7@_lDkUqUv<0{0RxsN}yU)8DU8z%f1HI{C1xaf^M4fp$!65U0Z4k8-`T1gBPZ>4atHiE_P&i+Ze2?OXj3l^H;&IbO}RKFy|wo66-JageTNw}=^WNQ2;*-4bp&o9FM3)K2M zde9@1xgJ zK^>)_VrHK_(_u&3tcde~P!b^hVtf1^ep{)Mnvg!(Q%Q#Q)&pXx9g-Cg`+ON0NtJ$EI{l#{E?^}}r z>g`&$(lM@$4m-pb(Jmt2k2p(=I00Qg7sZFm?Ohl2AFsC=zI(ig6gN}hTq-v+&TjfQ zV&gcwdaB9%guktW)o=8QAX0DdGeaY^DdD3CxQ}0Y4c%2HG|e8WB{HrccY@ySsg=FY zlvI`S=SGt6Uzn7nO*(o+!t#IAb#;0^7q&ZIJqP$}wml0+eL1aJFdJM?1Q4Y6K6){< zr_O}m*20<@r?*7)wG(b-^j8A*_V%5`Q(aYVVJ}ptQ41(5f95vZk}clHt^S$&mjhOE zNvukO#w9iXt~`*Ba-d{;rsyJH_ZNE!7<=m4p%p)6{nACFw?qwwESU5Y>#q+G8HfdF zTD)*KPCjMcnY~W}*6<8}!DeXa>HlUyrCi*e^pB;LG^jjcxa!Q(`AAf`(;I?U5s_9v z%%SxY#zn6W(E57LGu^0BJk2|xtyki&wUu^XTSa^B<#Ib>Q0RF3Q4L6{i{7E}WZUq_CLJ`{uIv-~1aAZ`l(6ao|R6c^qqr zuT;?ym)Zdjg#Q)P5tRLz5sce`8-|3A4@Ad5?zml3AWT_4Tl3Lr)35wgu_@zjNM}&P zx_HDr#YDXvMa!K;))e5+z4zQae<7s0c_DB$=Jn_^ekHQ!yD{1!Dft?_=lJq+Cf#+# z7@+lfE%373d?p;=-TB-ges6IVBK}Z$PttY!c*WuWG&4LX{!n)z-}QI}{R1$@$$1@z zo%iEZKl+I`Q=>hNHyqtP&Uciocby77#o6v%I2wB#zYZS7Kd(18o;@u!cy0O2r<|B{ z%vJi{>UUkfpO0>FG0%^)f6(B&YcSuiwccDs{e0Kze7%*MisgU3M??#FtuH+b zS?9R$y?$;#t@f`Qx{8bOy`5)Jle|2UI)p#R$o0Qz5<2sEIi}!I3plHO z@D&es+G@&6d&Oa*dLsQ10su|iqj*)#4;_03#m1+C9RsixmbEN|j3uUTC>OJr@38pGa(HFEs0ktA|E=v{W*)^*^5Vy+$Mi{SK!{!X8xfIQ*1RyIh^DcJK_(9;Hh?<#iw*SOENrBPxlOdasq+{_%# z_mE;7G*3L6 z#n9Z~-8+ZAVdq?8N=hoXoPSkJKu@jL`ypLYA z_(LS~0GBwHKnhV{OT|4L2XPxp6m?119Qh2LJTq`pojC?@bq3tPpU0>LJaeqO`ULb$ zCZqsB#z*qO<2aoUnCRpjcPs!G{Ze6RO{KsZRXbdXzSc?H&zMPD7y2BDqp5aSC!qKI zQ~GAllr$Z=mHB~ItTj8)=JTG|orkep9O^#MydSCKd)hSWxiz2f6**+QYfBs-i@1Z9 za5|&4J)^c8ahO#)S!!N4NV-VR#J#Bf&L-B*V6X5PDOo=P@m2P~?QZ<(x($7 zDB_x|NJz|^l*6CQj`4@t`dGMJ&}*h}6y6W|mdB;h(i_r5mF)zdDDh4U*571lp`X+k zN!g(R`$zQj)g%(>8=xG0p26dP$~2DT@qZ+r0-oqUPNrXwi`V*yNfvL7p-M{LnGL<3 zi@dJoI(Xzhr|sC=&2WVZiJON6=1E7ES-8N_gro}6OlC=1(7Ao{V&}aBa!-p0$i>s` z`>|4OIzBoQ<=t}aG4X-9?BX?lhOsio5K8(q*F}1Hr#oY6BQo70Zd9o1kwf%#?SXS{ z_3Xdr7_0>8Au2Y{xMWmkC;nUxH@>%ZugnI%SGj`swQ<{@;b=M%e6Yld(w-r@3QJ-G z1?m%AYVZV^eTJGbx#r)wWPhTNX4;9vRDzne`q-JnopTRSGV6?`EUrQQ-rXl4_NVJro`d4 zSNutt{|QTG7$?2`ZiE1>tUwD^j2LT7m%fi5kC*b8q4o8^IZ*^&a)WatHfyHn9Rj1| zprE2;&E^+O;IMBz-HhNoKhy$!a(T&&hNc~pa;Z04%><4Ek;T|&0D-7fZJ`4J#*7#- zM&UPP)h5yM$Xqlok4dK~k+q4&T*(13^LvngEv5E-_IPbuBDmw)tGVZiH&C<;A-W4O>72~HDW}nh=KLr29-Z%=b?vM039HrrDIiO0| zqKEEz06LPI*u%ed&78gpweGf$aPSZtbl|Y(yZoEbnh7Fdj!iyBRw^(&p>FUEQWOIR zVhoo>u?U^~zSiE(th9vwa89k0eyW*hm%WzvB*|W~R?2Cpxn4jt9SYp44@yl`G>A*h zBZvD7nzlSjobkO#}Ks|^_)k@oT9k#6SzrB z@)}ebN4OEzCl{2&4Sq;QF)q?a=dFb&X3{&HxwlASOUBm5*k@-MWjt0!2#x0XfduVg zy|=;ywml<6m+4q#`NkDT=?pcRaKa$^wON3Iyjy9n$(^p(#UfLf4&KzS!As`Gi$G+C z*=(SsNA!NNUwD>;A7)OpKVdeFs@G7on&A~*1*+3ngdLWN8)nch=>>VMcGmcB9RT+Y z(h_ZCnyBd|V~SUXIWZ+NJ%2XH*rR9el20BNzb(Uj7jgB^d{$sdQSL@W?8(B{%YSM2 zjFUMupPb-257BB=A~q_lUeIcy{gPV%(xO)=wJ#-1``c)7T9i^|0dcO6bq9G#YA<)S z*1N)yT9m-3q9QR#7U>((ztU=X*?v)3?tn|7C#HR&i29@81|^?r^?ea}r(61Hqqj+P zpHQ=TK}8>S^*NuY+BJ+h_S52)!O;|$sFXtlj$pjY5K7K(mj`r3?<(MIZl2d6vd@*! z1a$8_fBWVs`bD1UtRwX2S@hz_%ljM6uJYG+JF9z;mTL7)A^DcaclRg8+Y5e>1QEGE zJxWE(?WM;7!Opklk<9(d$^3(F6dx9QW0?@lzxLE!@+Aic@9(ca&e`+6Xf^)`YgF1G zFq482m$2Cs^P)6W5LYhEsxwN|J<_5(fR1f&$OiU?gDKlc$mX=%1v_|i?Qdy&-ACY* zo2Y4#D@x$(>#coU*;T`hvJ{?37%I3f8?@*ei%H=DSakivJY8zP zGf=za3+^yVviKmAu|pX3ARWnzI-0wb|DKLQp$wH(#XR!{L?f%Qeob07$GHAZ-v_pJ zMgr^n8ZunW6X`k#=FgVOTatCpB*Bj%Nw4&Gx6ZgHB;)6p9<_WElqt#S zU&!Of=2tR0aHig(t3H6=HTNi237!3#v9nx6cMP#t6Q+8;QFGsQ_LsbKSC=~n8rnS8 zBh0t>ganMcTkgq?GOMR*##eXN9$BtJcBv@N>R@yIscDyfhfI(;u&v~&b_>2d<E&*%o}bs<@oq1lfqUFOySt{?~Jaes+!#pAII=trDg)dY^F3J#^u& z`sJ7c)z&LQdUn8wHzGtxRee`Ty7eBe@(%~d#e`F{|G~Vk0tZ?u93;^)@qAZn_{3_( zd!8APdXv-UC%!$iFhNf-EuCcZy`+YgarilbAfxQL^cfL7qEnt^o&h!WzZ0t}fkeV;8nbTE({E|5 zs_6hC2k}D`gduxjnbkl5Q4zR_1er?y7n^8=`=ua03>DV~`?urTmz4Qtto&Uh{6GCF zlfMtDjY{h8-lRr`x&vzB3|Ot8Un%BxbV?6ydGtu!pvRG>-Z<(<7X@!^o_<6s8;{r+ zp2hBx&56q5qXs$=k*bMF6O=Z7#6!#*8m=)|Jd3c|#BW{Pql9a7gqW|(Lt{GWBJ3PL z9Z@@mC|sxgKtRPiFULVyg9$@&=a5IW8LHbV{aNr)FyG3;*`7 z!MlFLh>w8Y`2RuzopGc@9jby_hn7I5V zU1gF|((Gm($xF4f+zJ(`-mPW!!QBFzM7%*T*Sd z@2HF*42wo;NuGOBK5FqJE!BB!!@Pn_&3OO)JB`(Vc$OwWt+Duf&zYBm$*xCoKEIOE z6X7q`V7IcoXE;7T%YDOuDAr|oM2WnWAaET{r&$E8o~n&_aqfVC^$l=iD-WU!A7cNp#+T; zS>*G`9X2i^jjm{`dlsZ}`##<(TI0I71%}!;qIRH}`h^ko1t4|8-xqGgPh7nyYd3>( zH^L_KXTDo!I!C3CnLkZP+U64o&>8yW1+TVJc&PCtf7UB>QF z#{Q5>q+-0b1glNxJ`Z%0lA5tH#s*%lD%eMq$tkxqI3J+@>VYetE91CSBcaGQE1M#BOu-4e=o zAQd`7@ZwNnTTVtBZA7egge_M{D>u!l&sQZ24gmbTbxNy_(Kv5B!RLfyR@$0}`DStF3Uprs%IByheJj zaC?2pP!HnLGdfc(w|M&rK(Gej3m`9=OvDE&Kq3=DH!JXiv5#l~=$( zfy*T%1uh+`7w)Pf#c?fCyd_c?@J+oDsM#0gegq@7PM8|Y9AjPmPZO&)exVb@MIimL z5AeaJ%mLZ8O@YZ1ZX^#fK&uU2cmZbr(3-x*1bKs!+fB}^}?vH z);wbSxQ^;>=<{6??%1+F8-enYy}4jJ(j-yrY9@q0bw?=QdTge}QJUwoQU z{#MT6<|y|k73Uts~*npX{9CS zV3!3fNRnDdXzpb~xD*hruoh&;=Z~?4=Pb0|8)Gwp1%I^xGOs|(Yt+|B*IP_$z(p%+ z-MUbr5$un1q*NHPEi8oOf9)KY<*pQGZGbv$b1x_mVUT0DExhuN^{~yBRJtpgV1t8Y zDl7iaCFxW%%uzTt`!#y-3O%WOFGQ|)3aa$^5qm93sa-?>K(7m`*Bfb$9buQ#jx0_& z-}b4(}fKWrE`!L=BEl$~Vg4s4` z)Ct#8<&s^Mgx5uTPH;-sWZ^O^RuvUDsvXd>{#qsa!bW(W-;fMTS=Psx4snQOK5ek$ zBfu{{I zRzsrS0H2#}tSxHug@#6*0@|X_-xN_=8J3IpxU*jQF|`4gHbq+N3$3K~usfjv(CPZi zagUcuqF607+a7q@Nr};XB~+{#`nUeaRXYkU!-dpbO<}taf?3W+{5t0xmpjzKB&A8v zj+j%?%`J}!pK!}RdT7~xMV)ee(Ly_fAGF$C0q#e5O$n|K76zSxw$}uAQxBtT_747S zcBEBim|6@M@!T&;%hFblgDu}snW#+4%@^V2`eM36XzoaK^oF_KN9y2J;g#B8eU=Cz zgy0anLDmUQSx7ycoP$W$wrn3-jBiDp~iq4PcqRWr?6NifnD&$Y$33}rvmT1hb16R$NR zJc?!D(jYFF_ZVFyAz`_|(n7>QH|UK{$2+&5+xfvM{O|3hu0lvmZA!TRKWv;0$EW7- zbc4|Rgm@h>mn{f*?KTp12J$8|gz*6rQxHdDY9Q*d!V$T_8E>yAE(#=yUI4$vq!=)x zuv#WjttF9G$Rmd^MK?wQZy3{Wc*df5y28U;bA`)HQ@UOcb9%)=gDlzNVTraLEmpNC zTHFxJbwxUgMLN_;jbCUCX1jv8r?)=U?GST)K_#og259v4e}>oOgbDQqpPqZDlT3Iq z+66YN)YU@ES%=5Vk=NRRE2**WE-{gm{>JitgK$Se*j<_lSos-Oo~d=X!9l7#Nv_rf zKlDoDG&wt#W}1&R=ai9L}~yqo=VPxK_xD#c80t`oM>ktp>=_Bb{J z^&-JmTO!jA^(yLQl%z$u31#_Tu7QeCem^u)RCq<{ znE2l%Wf}Sgjs^w8zl+liw0Y&aLYcmpp$#U7I%!IVdcljW!Nwo7G8-$ivuy}luek0p z2;uhH-D>?Ti7vYF(w(kY)MNZgT`&n&n9|zss;JZ#Hb`TF1s2ro~`yvj^7tLo9<6RH!PfLE(`i?1~Z6>AIrbpY=)Wo<#k73_Krg&FH=iiaI< zt1Z&%nDCZlrU`;Z@SeGuSehq5Izig)4biZ~3dfWsqRA3vDszLuzHJu)o`X{*SR?3bQa+ zc_<3%%1;F01A@QjW)##|3FVaPpu{;nqX4SPh%>YBWQ0lOSz}C}N;rB5V=Ut(2(c;W zOL`edh_LO^N*Xa$c`|8k*po(L|`Sx{bG4)v13`(|Nq-y*qSF?;xa!sS0O!=d&a22jULR!UD|I`#T z_+dM`7FSw^XP%H+WCv(+$G!f;4Iky060X(`R^*N|ed1F|F86@xI9B_+q##_L4&CRQ zSX0Id>dGk1?ZuB-T;%L`8nMxTnsekV6q&e(>BpokldNEkF09n84E;Yn{iW8p$k}Uu zXAY0oSv{fnXe(TpD_rY{ zwH9h=YDJY$kRhhEL8kh}>#oTb9=}g2mKsM^>;TuWv{3H+VIMf&6Q8+cRaH%g*;5st}r-JBOTLi%nqSwSa7D>xwV_PEF z>4wO!C!Bq&e}Em36ZiuTQ#FJtVfL{jC!pREhMC=D)LP5mdJiXbk5H9cJ)tr~G}s2N zp{02A$L+b)J9>Ck7FeGh+FS~Gczg^=t0!XWohU~7NrHK{aH}1>);i50ZfQa-kz|fD zW@WE!Fa`=qp$!~!qf&4RVxR$M(0>ZM|CN`2-STugp^=J1hSTEwKZmqfaYQ z;qbzTnWxp`0(XRH*pYp|puEWGBn@*`B^xrbbH#G3F+=wl*j(z0R$GH9hM^!6Kf{xe z$V;sdKi8Eow6P4cxP-(v$PzJ&M(5>)3NsB!;uU_lLe3)EfOx*}*+gNGrjt~9!J2r(LUPB%9QwgoKV5?DRo^*SP{vlb%KcI|#2iw)wU6^VRhryoxX=-W}4o{MBGz2lUVahS8jfStOhMRhA&OBOHox z=3-ij_?j%SSUZS_d(y*mDp3D}@>4&FMKmMAAcfXP7Pk)XcAzjJ2!q{@lKRYPD4Ls8kfG!jZF4kZ)JaU^5yFgo5H zlQqkfPPB!SqlG9sV#rFJ0H5#7e^rqKGv(e-#tdSs6 ztnmqB5sqR?R4NgLM3yxY;sC0VosA>%uoP7)*)%MnmLQ}(0FptJJ-YZGY4|xzz6%q% zq#%;;6o5?T166x7<1aEIvkL?`|8)ENdCar_B+$8%Ts@6TTP|-UuFy)q$#XF6`cb zzenj4PJJb+*?`}DZWNr>jthn~EndulLMqB0Og{zJ*g`&ul|`j^q$y(hMp8(}7hY8W zaRDC3%nYVK^)pRE&P4IKc8H}BT;G*AF^lgq+GXh{%M!ViJ&`H6S-C|t1aWA+9oX49 zvuXJV&TGUIBwz)Fq$LAVNcBY6TaK9a%K4YD5#<+P8Hu#J9ip@9D*e6-OQi>ohmaV|>i4en46A)cCVR27L- zk~J8Sl9@eF`2yoS2TDk=koH}xe~tykon18;4ve-PGQ9dU%*YV3wZT>@#sskRLMqN2 z+&_&zCu4X<2r_jM%5AbFO057iF<*d{7c#AF6r~#c z!cGA!3#%m9{ZR0~8ZQ9`XE1e**!%ASx2BAT783cV`a-dP5C`5s^v@M2aXGAlqPZRx zM;)A#JEKTioY)GUPR6iZ0sl~Kk`Hre~EuqVf zNy=$lRlfTipm7yYo{Nt_cNS7!OWe3@$>uUGywub`P0t=jUgQCG771P&{aOhE-q26K zCgUK!;LZtH%Wu*p)HV>^8wFsz#h6dLeu)!{wS2)bol95& zW0U*ER%wj!(%1z^yczt;mJgQEb5Gw1nT4Rz`E@|5j6E2Y9Zqv0Vd{ttrREcVE)h@r zLefz{Y#AwBOb0`%gjnCrz!od2xD__4j9obH1<=0~Q{@gg6*09$A&b-tr@s()S^zVq z^IX-GGNKZJ&w-=46!C7sx0HjVw!{@Jv4y{{3vj)^-w>`iUz7E{f(mrz zMb$qY6m1lj561pOS~xnUh(J{qr3c5byBv(+Fd&x3gQ~I}qgVmCH%w8-D3;PmQhp}t z;=x%cL*syLOuHFQ@5sz9mXb)%E!$7Q?g>znuji?#4m&mxf(WD1=^)HULJ zXCy79zE;}(Mz7QbEI$fqZUw!9sx(#U+A#Ju!h&c!n_P|SVE-q*a5`tQ*2Rcb7Aknx zAb^_df&L%fYqM5Tt~SCOsp@!b&bhWXPaf(DkH!E4{!lM1Tl!I0?khO*W&|Fabq*?9l~Zc-2Za|s7JYHV`<1v+1~rG-%aMO0f zJ--k@Pv7H88w@c{b*PP+Z6Yc~H0203n^_M55!OWN(OeeOG8QWPqhCE3+bK1$4FtKg=XH>LFPM~+L!MA$-r z+rER4YF9@q>v`_YMoyoO$TR_k1B!Kri#Vu>!98A_SrbR-g=G@--@{!M4DOsY&@I#a zzw*4xy%7AxjDf@9gVTbDW6rxd7?4E2vmBYG{&H-~aqjs_ARwe7BaXH1`i4e8`!MA+ zy|7MR&hOH*Zr~@HcvuU%-3tFk5OE&kt_A+lLvG`wNLy}o7?{P=mi2P3v0n*2Okcz6 zOj;v|rG_}r&rGPH+Odd!%ayQ2xGru1-4nWxepy)aK=`BiChoKkrU%*|G`-ZZw00A_ zQT%s&=>yN#6awzRH1wA+S2}IM=pS$@6Oe6bIt^{!@>7;+%8y7)lSm6)#EC{z83$bK z0fU6|Uk&?LkeOGzBj^b%8Nem{Hx)SRy#!v4^m!x+o^H&y|HTii@uHDmm*JzPT8Ek} z#|2RlYXFOO1^tX=vUwj5PUI_zZYZoBC5`*LDm;JRY`2~jx~aHK2JlvB^Nr4edV!3> zg4CW@YyK=;n!t^gZ8_M(1{v5C-JVuD5=2jaT{_qO1BC^#8u&9Rd%@XSpv}_Mk|{^h z9Cwu;imm1BlDC3q**8rKeT6EIf@d?~bdCRzv&TSQnVd@ncB`LAeMbMrhxyv?Q4HJ7 z2cUL2sFBFtPB*v5$QvD4ygT*-5+Oaiz~g*JVP(%~xh6>qhC@Oqo@X@l&_S4g@)!cH zgRsnSO`tUuG7vmb*t)}cO$*nwqpO4Wm;JzhJEPkP09>);)G1V@!;ddE29ZV=i|ehw zhu04%0l*2r%)+p9;a`p`8bQwMcPXX}y%g&EIb!VFa_W0I6qwi2Z0$*fgFUM3+tRB0 z@|7?*|5Z6E6b^5xB3+j_K5t=IT{uvQ2YsArdsAvnfq8L0Eerpc+Nm}Au&Bw@(w04$ z&2hQTQC+X{@q%r+spm#|h`8SMRyv@Q9@jBgdQH>}IQ1rfgxpA9^Sc{R@D22P7KQ~hP$DSaWqV{`?6-4a3oX*a^D@b zwc_5CmfxB+Kp1pf^(7S_5|nb|6?ITR_flAa#Flk8LB`V;@nngV^F*mcegWJFmf!%& ze!?t&Q~L6M=hP=uQ0X6w^q637J$&zMzmfB9>HWWmN>FQ>jb;$jEDwn{=*TASi>$ByVvz&u{t5R&gTS z34_v94&%^5LO&8*zlrr1qlK(>HMV$N-;^DtXr2Ss?B(2m_xH3w4!5V-Cskgj-&N8Q z7Y3HbI%6C?C^vY#O+VBWS1@Lh6-Yuc@v7w>duLv-7TO0lW7`pts=bDnIHB}nf#m`GBYu%yx!z$C|k)mBX%-~CY+eZV_Em9 z5m~ewk8&xt$EBUN&!yV}UJJ7gx7hF}_cNJ#ba}XZS%Mb0n{Uk~=da^E80ne3-jsgN zV=qG>%o2F@X7C37Uyl^UFHl|Y|0fIU4{G-RUlw*qz-R*W18uPRznuIvoZ^`+nU!o&K%S1_!oGKIOiv0ADOLyF9%az#l(r}ov{eDvC6 za}V)*u8*}>ai{aC+)Q`I%jTu_E4N#o&$HHr&d&St`pCg}3NXtT>~q--cqNGI^K1@e z+Hw1S60{=nd3kwy>3wq}KQRDqEx&OBuWfD)`aBz6&J6q-zvk-tcwaB=eOsOe48F$J zqxwFpQrv)_oEJ>r_r_mAechVw7c-2M+|7{_v zLDJ8O`TaJI=^xSe-SFQ7!CoA`kD#dUuDLaU>$sQqDkCis)S zWIx$7-#-bgPs1Tb=TQh>f6K5#5O(xW{|R=@MuQqS9?!&=Ur(?z8)g_2KLp<8jCaEP zQdVE?@=RlW->TB5v3JDXd~c;)M!J~LURYj&P;>Guj6Zts5$t?- zEOu2smr<@>fNp}oM+M;Hh5;}ONb~t+@NKg5W$*j2JaFRoaDsmW90s<(yzLlWEck_$ zVEaX_xqZVd+=ipdk(|o-xMcR+dU3t;YM6FK6VB$_l@dZNd%1hewqPp)?L4C zDCrTuK(qH@qjKIZ?0gsa0R8S^`};mG6}~?f&HLK9x;~b6zPI+$`Ubw!uyOqE(=2%3 zeUj^ZV;W1C;`#5GmEX5TMP4?fPJLq!d)-jiK5>lX;sEQnaC3w+sJbrz@RpZ7183rb zDFwj#BhL1b+n$OmwlDh&VEZ1&H|6BErWYlz@*~{BBR0P??3R`{MBzveYI#di>VW)J zbu-BRiJu#L`xD^1baGqUj&L*X48<-WA#?@lp1KvH@kZlKdrek+_k(Xjeox60`VLer=9rs7&IN5`>_0TJeK9)Plb;I;(tcm-Gcu2mF z>f)dqnL7*u=i9DmBgxA%ncv@Jn} zd|v_Hf9(KoHg0?$Zv2{_&UT7UuIm(kKH!pN5)Cz7BF4T+Ixq;JLh4v?4A;kYNE$;O zb?dF35DeD5suHa)*Tdp(G3vsn6rGBJ=ygX%uHYCu*w%Nw)ibv}Z5J}+Cg#iWmRgY1 z$9J%W9Erj<$umaO+Yq`geKO*#okrJ!^pHochFV?;7(>eHkGn(lR?Ug~dmeME2RO1W z_Hgu_!SMMHT-wA-BCESVC&}y`_=nU+V;I}Ykl!^mzZ|7o|f&qt9H)d zt_5HHLQ%KBwsyq$fm?pBN8bvJvyC4J#ZNsk@tv>^Q-XmW>v)q3D@G-2!Loa#)hwK< zV&*pe%x);HS{t;9O&r6gE)Yel+9Pml0kQ)H(FH@?utj59ngJ)RM%MY@ag0SFFcgpk zgUoUAdmV&Eh~RQq;0-7`TfK@6IYz{P_7$P=(gIDGx#~!zq~;*#`A;ZkV~z5BsDFv( z0}x$GTmBgQo9*}o+iHr*kY|k_%N^!0Du8BwFWQeFd+S!K(M5UDc9d<(eZ_J4_yJNZ z)ZeJjq!V+DX#pm=t;i$UCR`_ZGp(8Zb#Xo&y3yUGkf|j5F^<>xI@%W zwOo=yOBvB-kFTn^LoK(8+2h>Z<2Qp<`vi>8(dXoj@Xk%n1I*b7mdT>8>RU;hQ#&3x zUS|=99w(pV?HG4M)~eI4bo@cGa}gG>H<7GdM=T;Jd+II_ediw#@U>Ad_cc6epLO?d z%$t#MN4W0xjrcQ;L??md(t4((GxsX)$vI;^Irqp=;rf^_hi=nj?DrXC-tuo@#;`B@ z=5sHPtYSw*23I zu|84cI23@YSERoT-mwtbO3|Y#(LD2w5cNjODI8Hrv9W6`3c3m0x63vfsria*spA)PRyC5j0#g`k(YDamKpOP5LkuDp#LoJOB zG(#(b4+x!O4Qtj=KOB3uG2?c%U5Evqh(RJc`{3x1wEvv72c~^`e~bVP-{SP*{hojg$YMjp|HHlF8ffes<9$e5A5RVk8MZ^v*q<>d+M zW0j+h&mIc3jHwV8)yWynO#fHi0tKGoZy8jPaMCKqwQk{Nn9+a~^(e=6ND!e87^qfy zai-zw!$^>HsB?z}N4f#hwjV(@5x?I67iTp5p5w6M{J!s*Gz31~M)BSNxs+u;6?TGE zt{a@_A8?!vw!yQVPz+Nl2&Q5G>(Np{G;^Hm+W*xiLY5m_I9Mif%-6MppV5(_Byz%1 zhERW>K7%O*2POeKvfu~>Qxx{%Nl8Sg<%rRP7W-*4)RT;b?jb`*06hW_K-wZ#qr!c4(Gq-6lzq{JcmY+P_Gen!Rv6SLHnIi-B43vM=X^-Sw1d|9tsA#CuhU6~f4%2WS_mrKaw`7Lb=#%>%nYayy-!f$7 zV-i~9rFP;cX_u~Ag;+HIB{O$w^zXB$9hLq;**<#N)c^{3TW!C)T8tnp5WhbFXJ_hw z;DWyITRXtLdsx4y%`pXl?u!)G-)xDX+v7Sh_#6?^A!jxsl>p~&f$j-40rT1yMqV+Y zsfNe%$4RUw2Z0R6LF;(!8#a^^%4;e(I$2YYt zHM01r^gY-wldScD&;pOl=LY?C*H?m0m7XV{#r_F+kT(MI z9mA@KzhShXxfy8Mzmo*>JzWQWX_+!Zvz%Ussn&$I%l@etC)IS?xbZ3jS?-at9M54h7GcFG-F62?Waf4xz^87_ z9Z3EZxoIs)^KKj|606j|$84F|*VHzkoH{q%f-WVan@c-I;;(3&E}!OIw}n=4nq4L| zcwwPH3BfJ#gaZdRhc#ceii-6cPulb?fu&2 zN9+VNXPT?OQ-M<5Nh*zPW_noV*ixK|h(;<9#|uO?Noip0i0(*%Yg?KFbluXI7;2~7 z;82=EJww~L=#WKTBIzX3sX!(5j;tJAcH{<9Xn7R^s=fI|is$HEsLsU(%~O5`8YM68cyZzyAH(|r4x zK8mO1QfrK5g*7t|3964UR2OKr*Xhlaf>RYY$)H(Wi$GWJg|m7qK+uFTGo9L^K` zDD!*Ae(C$(5X=E3eI_v9=FZX%!&Ka=^%iKSc&m8AV;{GC`X~W^p-(o%vYGy{K8J)_ z%pR<9FhK0jJ~MDeu5;p$MlOabf{FhfefT0;U~2dL(;m%m5qffgVCaS$C51bShYilT z+6r+i$q@>@1-fXy?mbtL>4kXJ<*vdsNwTFZBQkxWhwi4*S+`5K2v7J^kKN;XuqpYV z0)bj{t(-^2vqWesDoeB*B~A~X`n4QujP1L$8O#%C9nd))B|xKCm@+VG9%}(i?~3-r(s{Y= zdoAb#nhVbOecx>S@w+EhOyEsBwsy~ z%At(`U`%@y^A7`zRU>|}ZjD^ocJ$rj0o&vA!@ z-G3(PBmNpd?1kh$iEo0=n}-ZuLXWPdNDmz=twvkrC4sDe>SY?7D>^51Pu{xt1a&_u z&*1Axu-EtTZKvDRUa;{gL-D#QTj5E8w)vMqlC#ZqyM8LgJi=@vN^x0?X%6{^yT#9GA;; z%-1E0^xd#4P96Hv*7y*fwQDtE;6g`k@D@+eeC9Q4@hpk!0rE-C+As($ArL_^@+Bgv z`2$NMvxt1c+B4)7&0C^|loRSL_GEH2SFK?F!nFA2&?64x=1)(%f}Tr!Zw5CQ0$6;wJzU;j^IE(=74#A!JRs-$Y}TdFgAsl+Odw}^I`I6X%)=-0rheL0 z#>7ds+YLjYvaMuR?ZYpuga(5d#w%9l8F)vNLd%#O;=?MCS~et?Vg?(|P!S-15YiM8 zuSCnA=WOo|eW7%v4WongOr~DmZE(7-SnoIPH9s`FfxD#yB9wC;cBmD9H~luMR~+ku z@b_ZY3d-LJP6_1^X2x?3FgwPxX<97BwzaL%OJd%KtYG8V)o+ffe^(J>%Z*rQf*}&+ ze1#gzc}dv30~1yosh`xvL^3Q|L+jHju9Fqw{+(pmx~KJoyeUik_&IxX{{RX%DFF8$ zoBH0{wnqBGW;?xTZxmCkmyOa|C{YgOi;`-o|5A$;bL@nuFhWn{9{zXZbZmra<`Qmx zM@k?@a4iGnkxBq6LUe=(jZn7{COHO9fYc3pvL50#T)`DemgoaM(`e!@^VFZik!zlN z^bdtD9Fhy0sK4wSk%)2;_ZPNlIOMCEN|6I1XU_AUj*rGQ1HQ(aO=k9J*oEm9!&h*o zbG!aC-eNkdyVOqZN&}6n#|_^(8T?;8_Y}gRhz`CqGqQj`)KiRs>6lO|>27Zc>lhPT z0pue;TXgN>*Dkc~uVjeDGsOovbP5|R+|~!HF5wd7PQtAOBy}&i(RhgZe|}n@IG=3zC-b@Uq0H`7RuU-LO03tnIoS*{3d+)r#>>Y0N+&SBMFD(;hO2 zhqG*xx7hI=nzT7zsJ00Lg|LN=Z8PtGeyvenb40rLsxJxJ5%~}FrL{^a$!PPNIt56p zm|J0f!_3Co#ALl!L}5_>npAe5dopfD5PrBmz#2DSW@*TyXlr#O;fw|5qoq*tlF$bml;o1Xe$; zh%yH4m74gE1A1;!=QAyTHzuWg12uMqf|ru179k3ru1Ny>I8?@hH^K((ZZBSrT;DmoJV5Oi{s1- zA=fOde&(1R3f^@pL97*QqMvVSiZ(D#NQE}f3mYn;@(-LRk8FTM&PL}YVf{#*KSNK5 z20zABWhD^~eWvT`silEcltwE#4ldti=JimW4T|*DNg?z;FA-VG3F@P$Lc*dW@fknL zuEBuD!K+9tTEHUoF%+1%@%N9w^IRY-u+bn-)bV$5Fnc;Q zx)U2|vf+AIw>c7ycPmr|eep-f;*U+~B1Xelv!jA>Rteq(0Fty~I~EP0VcCwqXf17) zzMe^55y7>ZysaZOs%V&Vw8k1K!C|_w$`8IqJY0Dk(mYD4i5sKjj8Uy@cZBh0PbpjTeGjj{|lS14Hmer(vE#6 zjw!(deKz;90#LPaxD)UO={m$zT_jUc`Hf!GpIyCy-*Xk4D<$zhvHY)hA!&T;0V}pc zZHeoFe~R=}528g90;nq3@>+S7@MJsV7E!})84nQHHxu~8lt=hY$7I`R&_{W$)0*)_n-^8dXb!)76KPv) z!?3@>X+zlbZwJGH`JNJKbUoS0uY~fIcYxtBcZ$ueLJLv1PR7U-OrS01w_5KB&kw9~ zTmj-4R>M(M4xZeD9#u;5eKPeSiXRmE)6U@|Pz0tQzKBTUE{flcqq|QCV zi>JdzPyM2kYd_#B|4V1wX^U^G%^0t!Xx%daGH%LV_t8zC7+hZZzG4GQziwZ4m6}l= zT;@9pDR`z?asut;h~!<{;E+?&PI2%i{)_s$P*b{Xv|t!n@aPVu9P2!kJ!Yph=Mi=t zPFG3EC&$qT7rOr{X;<+9!^?>QP5md-p!f6o1d)-s4C{G6!(`rL$1*ufq&VgI4>S1D ztw2uB(sXSn3kUIuMSNX+;lC}Tyihi#N0mPC^ZZB(LJkBWIIaVNL8dBr@}C;-#P6=) zU`10BvS8&dgC9S`7g=k6khH^W(8CKwT3n+5DEQQ$DZ-%;Cr>gi91iiEsY5%wMrZH} zvu5HqJy2-)D;-4W?M_g1^je`^)-VkIMWW z1UI#OKH`97ktIwe1kAE}p&sj%Voh?#c#|sX!O)t(rst!7u{Cybsyb zHAY!ii4cOpaJy4K%&=|5QQWBiRc5PUl+aN580Cxq-XW9CF%b;N{aub0N*`0 zT;jUtlBDq)N(sqZ$3sr6NgNN~y{d8TP|r87WY6!OT9BppevY{3apU`Rg*peQYY`Dn z3E+!FE|yOr?7d`Y$Gnyya;94iw*JO~0A*G#yTeCKn!Tzu&efA5V1UhLxDdTSt^Qc7 z9a0|B7)}d$ws1(5TGnzw4k7efsY)|j2o-}E5FXOBQiq}_HovG=TRmO=J3Co(?yg2~ zp!~PZzFlto-bO_kd`7xLN?f5p^B?xlKcEnBv=m;YJ1mV4N=OU!xYWyC&dDw9hQzN8 z=0UtTaqmtn#rQ-_%pxVXpGeXsktC$yVw(*`ZM6Po&FfYgrZrF`IU;52XFoJcRp52u zn=n_c&Nk&5+SnIhaFYfbEQmSiE1&@viGgQfyWCP z?o}V*kxm*ahUUe&SE_6fY&UL<&em3_^ZbJAI|=``5|DLV)Y8+pTp;51oPa!r@WW@7 zVwY^Pq8B2kkzA0w3AY~bF^boXBDaIvC`lyDc?;H2gc8sD3>K24kWbu+^0mv2ID`_< z`3(1l9#=qo_{8Vy-+d=J`d6Dz1j346mn@51i)ym9%dq^`NdoJLUR zy{6+=9Rq7~+8o};Zt{Qc;qpbDHMzE9+mUyFLq%M@>}pAoFfZA_IeTI>!4|B){kqWi zHtT)o2C^|+jDOVuOMUlx`h?&6yF@s#?zK{;31wLekdPh(vT(iXCpAM$eq-vFWR+{W z#|GYojpFfyY0Tk4R3Za3J>YH%<)D&p$m)%;QJ+R`8P+6(-jE?^-B352B5yl=pwur( z%AK$amOjF(1;q^Cutco?psF{8tsbL8sa=v3NABE^mA*mE$x*>oY>R4M2@GB!qpmnb z_B;9Zg#q-3JgiX;@rWcj2uM5MpnQ)uZtGS9?AJH~FBF0YlsgsXS|5vb!@%GoJ0qSjWe`8gGmmD9=uxsC}9j3JcWUpEHqBwVT8er2l)!H#_`imTpgqL7% zY1e}_=0d$8XkYepIw4=W+1;^fhsrD<2S9D31|Pn<4pZRXvTb`>^~iC7NUtfjLv`M; zjB67POsoDn+q4jLFMF9?@M+oXT<2-K`t?8Z66H+ea>*Oah%Nc4ZmV{6R_JK;e%FlW zf(NBsjxA0S1zQi)hRduGOX(#{k-kKlV+6)%T>HMQ6fMm7#S~w+B|osL8zuD8H{1AS z6orEh`NeE9TPLGu!P-;lj9A=u-i*vk;xozVpnv?wCr5Z^#aN2cgh9kKz~?MpKApKv z7PG??sUFWXfn^Q_o}@kxQ|f7AZGnvPC6!^q^FU`pI0ij*nb1_7~B+b6ZW*)Rm(qn_woI zF)dZP(gY9k24W1jzs3w~%Af-e}Y81PA zS;7<*oByTB$lF~x$!1+&Hud0^g7O-g_?s}7(t9q|kK3nL4s4Uq@3Tzm)SEWS#A6`b zq}OfCWF+p*Pu3ztWKzD2Y>3+&x8P~Bx!_eNNM)L56TUUL)TUYYlJ?SdLZsu5maH)e zY^rsL7*A2IPFj`2ltGBb7>5n}gTuJGNw<}9%xeJev+9&D zlI2*i*L_fTgsp{?IBrnxHQCudkdn;$66rO$Aw|Yyf%MXph@>|M2|d-T%VEL*oga10 z9jsrJBJW=BjlX(N^Z1^AEp-u1)eA1Kky~~ySmCU7@#u59%oIO2gckZWu?=IC?c_I_($uCTU>!Jg1@Q`AoT->lYKzq|osGiBHe>jfQ{Y z9d-5M8#!FIWB8C`U;njVmM#E9teWW^Jl&e9f4Xkd^!X@D_xglh-g$#bauXcdj>sopGCAQxA8awa(6w8mlz{y8HlXL6Ozry-kUt{v_CpiD~ zXV`h?r&xXdB@RFQ4ije|W0&*a`w7{|*)(e}$cQzs1&D-(vXS13dfYm#CS0 z3hT^yVP$L0k^qqmNtUt7ToM-M_A}E2%W#Xd1=%8ZF67@@9>0HO_rpK?wEf^;Bc%Qw zOjDL%na)AW(v5R8uy$X9Y3c%!+xPMO=f8rZegS3~%ZP3|#{82n5!#Pdq?;%N|N+A4Ah~h_Z=$@Gn_G?a~wYm#!jj^ez%w zb`jIGi;DS2h-%nD#lmCwmaHPP_ZXV)eZG_>SnVDXTMv-Zz7NlWCFuH2 z;GVaH{PA-HR%}4ieIV-ytz1J!&mnvZ7f?ER56=2|WOg4Qws8mEg{#OOK83w@4lxbe z$Qe9>PvI(x#_z%-ZyE7TThRBP!8v;gh2!_&mb-v}@^yJO+l*Pb<}TpL*T09f&LbEn z&A~>)eu2_Y)H_TeEHMcHr)<6;!qm+^z@nrH=fYFIOZoYg?H7OgUDNh=2&_JZY0?}l zQkP(sya1={4cKQbOHMLPnSp-z3`3_c5L&$jqog?mR_$W%!=J&sXa&9{>(KR|!YzLl z1!E83lCuEAz+Kp8P9v-TTo#_(ag3;jUFZi+;bK@o{^&XEwKHOjnEE|<7A_-aN|!};us3X?jxXV4e32cNNztsT+=@0pM4Fpj2THU<{7itc3i;urRM$cWCB+tV}vjnS*1<@XKx&nj(fTM057O8XM zOJM+tRQ_R0!O_pJ?0)#?ziQq84iQcFL?}@Buv^9slUo5r6q^>Ch;BYY;ml*W<|*+L z-*$@Sr(eRma7iA_{#Yw65V8+q}DwIlq^F(cm|LB6`^SVvJEkILfau+a~4oC z^$?y#D@f})l1T9?SU}6>dkCyphi>2u6?2bZr<+63#C@r$vj=ACcZXtW*K732pQMvFGQT4k> zY~4p<`vD^Bw~@o|ik4A2^Aw(itH|s*fu{Eu4*CV;jo(LD?Jknr4^cRAA5QuO6pY=I zQaP%AU*`2FSV!5+GbyhF%Qn!s{7l#{x%~)P1E;Xgn38mw*>k2MpQU2KKxFi%Qa^a#S{17SF(b#nTPPmTS8LnK4R)Nku`8v(nDs? z5!`Z@Q80QBKKb)VYTiXk+a3Z-mQXSM0M3RPl+N6TXWl$g+V&A$y9tlnIY|MI`Z*-E z9Y`dQZaJS%@d^sY?!wV9kEr@h`JJ>_J^x4|KelljRdbJFmO6#}v2y_x!B#Q%SR#*9 zp4oMR<)>f4Dr*tW1)H$UT9BOGzWEkh^9XEG`Z`iN4kXpYHtis*pMCZnWDT52Um$<< zuAGml-$Z2HI{Zslpc_1aXZ`}RdJlxc`JKN11U8vd&1(DRi`jdnZFbYOHzV3>bVo8 z%0A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%0APCA(fMpM_>}uFN{E@;KDTR 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

    Q@?Ls~26jxMp;THHL$xp}pZ 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 diff --git a/assets/README.md b/assets/README.md index 8a7e3c5f20a8..8c53266bfe7f 100644 --- a/assets/README.md +++ b/assets/README.md @@ -8,7 +8,7 @@ The three Icon Composer projects are the source of truth for full application ic Each project uses `text.svg` for the T3 mark and `background.svg` when the background is a vector layer. Additional layers use semantic names that describe their role and placement. -Run `vp run icons:export` from the repository root to regenerate the tracked iOS, Linux, Windows, and web assets. Run `vp run icons:check` to verify that those generated assets match their sources without changing files. +Run `vp run icons:export` from the repository root to regenerate the tracked iOS, Linux, Windows, and web assets. The development web exports are also copied to `apps/web/public` for the browser favicon and splash screen. Run `vp run icons:check` to verify that the generated assets and public copies match their sources without changing files. Exporting requires Icon Composer 2 or newer on macOS. The script selects the newest compatible exporter from Xcode or a standalone Icon Composer installation and pins design generation 26. Set `ICON_COMPOSER_TOOL` to the full path of `Icon Composer.app/Contents/Executables/ictool` to override automatic discovery. diff --git a/scripts/build-desktop-artifact.test.ts b/scripts/build-desktop-artifact.test.ts index c79fc4797be9..da45376954f2 100644 --- a/scripts/build-desktop-artifact.test.ts +++ b/scripts/build-desktop-artifact.test.ts @@ -30,6 +30,7 @@ import { resolveDesktopBuildIconAssets, resolveDesktopProductName, resolveDesktopUpdateChannel, + resolveDesktopWebAssetBrand, resolveGitHubPublishConfig, resolveMockUpdateServerPort, resolveMockUpdateServerUrl, @@ -102,6 +103,11 @@ it.layer(NodeServices.layer)("build-desktop-artifact", (it) => { }); }); + it("switches the bundled splash and favicon branding for nightly versions", () => { + assert.equal(resolveDesktopWebAssetBrand("0.0.17"), "production"); + assert.equal(resolveDesktopWebAssetBrand("0.0.17-nightly.20260413.42"), "nightly"); + }); + it.effect("resolves GitHub desktop publish config from Effect config", () => Effect.gen(function* () { const latestConfig = yield* resolveGitHubPublishConfig("latest").pipe( diff --git a/scripts/build-desktop-artifact.ts b/scripts/build-desktop-artifact.ts index bac3ef3df857..8a1099a9ed06 100644 --- a/scripts/build-desktop-artifact.ts +++ b/scripts/build-desktop-artifact.ts @@ -10,7 +10,12 @@ import rootPackageJson from "../package.json" with { type: "json" }; import desktopPackageJson from "../apps/desktop/package.json" with { type: "json" }; import serverPackageJson from "../apps/server/package.json" with { type: "json" }; -import { BRAND_ASSET_PATHS } from "./lib/brand-assets.ts"; +import { applyWebBrandAssets } from "./apply-web-brand-assets.ts"; +import { + BRAND_ASSET_PATHS, + resolveWebAssetBrandForChannel, + type WebAssetBrand, +} from "./lib/brand-assets.ts"; import { getDefaultBuildArch } from "./lib/build-target-arch.ts"; import { loadRepoEnv } from "./lib/public-config.ts"; import { resolveCatalogDependencies } from "./lib/resolve-catalog.ts"; @@ -1324,6 +1329,10 @@ export function resolveDesktopUpdateChannel(version: string): "latest" | "nightl return /-nightly\.\d{8}\.\d+$/.test(version) ? "nightly" : "latest"; } +export function resolveDesktopWebAssetBrand(version: string): WebAssetBrand { + return resolveWebAssetBrandForChannel(resolveDesktopUpdateChannel(version)); +} + export function resolveDesktopBuildIconAssets(version: string): DesktopBuildIconAssets { if (resolveDesktopUpdateChannel(version) === "nightly") { return { @@ -1665,6 +1674,9 @@ const buildDesktopArtifact = Effect.fn("buildDesktopArtifact")(function* ( }); } + const webAssetBrand = resolveDesktopWebAssetBrand(appVersion); + yield* applyWebBrandAssets(webAssetBrand, "apps/server/dist/client"); + yield* Effect.log(`[desktop-artifact] Applied ${webAssetBrand} web client branding.`); yield* validateBundledClientAssets(path.dirname(bundledClientEntry)); yield* fs.makeDirectory(path.join(stageAppDir, "apps/desktop"), { recursive: true }); diff --git a/scripts/export-brand-icons.ts b/scripts/export-brand-icons.ts index c24169dc2e13..04b41f278582 100644 --- a/scripts/export-brand-icons.ts +++ b/scripts/export-brand-icons.ts @@ -13,7 +13,7 @@ import * as Stream from "effect/Stream"; import { Command, Flag } from "effect/unstable/cli"; import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"; -import { BRAND_ASSET_PATHS } from "./lib/brand-assets.ts"; +import { BRAND_ASSET_PATHS, DEVELOPMENT_PUBLIC_ICON_OVERRIDES } from "./lib/brand-assets.ts"; import { encodePngIco, readPngDimensions, WINDOWS_ICON_SIZES } from "./lib/icon-export.ts"; const DESIGN_GENERATION = 26; @@ -751,6 +751,16 @@ export const exportBrandIcons = Effect.fn("exportBrandIcons")(function* (checkOn } } + for (const override of DEVELOPMENT_PUBLIC_ICON_OVERRIDES) { + const sourceContents = generated.get(override.sourceRelativePath); + if (sourceContents === undefined) { + return yield* Effect.die( + new Error(`Generated development web icon is missing: ${override.sourceRelativePath}`), + ); + } + generated.set(override.targetRelativePath, sourceContents); + } + if (checkOnly) { const stale = yield* Effect.filter( [...generated.entries()], diff --git a/scripts/lib/brand-assets.test.ts b/scripts/lib/brand-assets.test.ts index 6ab3c6a3a293..c830f3d1c64f 100644 --- a/scripts/lib/brand-assets.test.ts +++ b/scripts/lib/brand-assets.test.ts @@ -3,6 +3,7 @@ import { describe, expect, it } from "vite-plus/test"; import { BRAND_ASSET_PATHS, DEVELOPMENT_ICON_OVERRIDES, + DEVELOPMENT_PUBLIC_ICON_OVERRIDES, PUBLISH_ICON_OVERRIDES, resolveWebAssetBrandForChannel, resolveWebIconOverrides, @@ -37,6 +38,27 @@ describe("brand-assets", () => { }); }); + it("maps development web assets to the public splash and favicon files", () => { + expect(DEVELOPMENT_PUBLIC_ICON_OVERRIDES).toEqual([ + { + sourceRelativePath: BRAND_ASSET_PATHS.developmentWebFaviconIco, + targetRelativePath: "apps/web/public/favicon.ico", + }, + { + sourceRelativePath: BRAND_ASSET_PATHS.developmentWebFavicon16Png, + targetRelativePath: "apps/web/public/favicon-16x16.png", + }, + { + sourceRelativePath: BRAND_ASSET_PATHS.developmentWebFavicon32Png, + targetRelativePath: "apps/web/public/favicon-32x32.png", + }, + { + sourceRelativePath: BRAND_ASSET_PATHS.developmentWebAppleTouchIconPng, + targetRelativePath: "apps/web/public/apple-touch-icon.png", + }, + ]); + }); + it("can target hosted web dist directly", () => { expect(resolveWebIconOverrides("production", "apps/web/dist")).toContainEqual({ sourceRelativePath: BRAND_ASSET_PATHS.productionWebAppleTouchIconPng, diff --git a/scripts/lib/brand-assets.ts b/scripts/lib/brand-assets.ts index fe02c975ea3c..9ab72c2cd752 100644 --- a/scripts/lib/brand-assets.ts +++ b/scripts/lib/brand-assets.ts @@ -101,4 +101,9 @@ export function resolveWebIconOverrides( export const DEVELOPMENT_ICON_OVERRIDES = resolveWebIconOverrides("development", "dist/client"); +export const DEVELOPMENT_PUBLIC_ICON_OVERRIDES = resolveWebIconOverrides( + "development", + "apps/web/public", +); + export const PUBLISH_ICON_OVERRIDES = resolveWebIconOverrides("production", "dist/client"); From 1735e27d9e5106bbb35d5b1dd10363604a54b69e Mon Sep 17 00:00:00 2001 From: Taras Date: Sat, 18 Jul 2026 22:05:09 +0000 Subject: [PATCH 19/31] Add terminal selection copy action (#2904) --- .../src/components/ThreadTerminalDrawer.tsx | 57 ++++++++++++++----- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/apps/web/src/components/ThreadTerminalDrawer.tsx b/apps/web/src/components/ThreadTerminalDrawer.tsx index 1641bb6b109b..8591c24c71ab 100644 --- a/apps/web/src/components/ThreadTerminalDrawer.tsx +++ b/apps/web/src/components/ThreadTerminalDrawer.tsx @@ -31,6 +31,7 @@ import { useState, } from "react"; import { Popover, PopoverPopup, PopoverTrigger } from "~/components/ui/popover"; +import { writeTextToClipboard } from "~/hooks/useCopyToClipboard"; import { cn } from "~/lib/utils"; import { type TerminalContextSelection } from "~/lib/terminalContext"; import { useOpenInPreferredEditor } from "../editorPreferences"; @@ -330,7 +331,7 @@ export function TerminalViewport({ const selectionPointerRef = useRef<{ x: number; y: number } | null>(null); const selectionGestureActiveRef = useRef(false); const selectionActionRequestIdRef = useRef(0); - const selectionActionOpenRef = useRef(false); + const selectionActionMenuOpenRef = useRef(false); const selectionActionTimerRef = useRef(null); const keybindingsRef = useRef(keybindings); const runtimeEnvKey = useMemo(() => runtimeEnvSignature(runtimeEnv), [runtimeEnv]); @@ -417,6 +418,7 @@ export function TerminalViewport({ const readSelectionAction = (): { position: { x: number; y: number }; + clipboardText: string; selection: TerminalContextSelection; } | null => { const activeTerminal = terminalRef.current; @@ -445,6 +447,7 @@ export function TerminalViewport({ }); return { position, + clipboardText: selectionText, selection: { terminalId, terminalLabel: readTerminalLabel(), @@ -460,7 +463,7 @@ export function TerminalViewport({ clearSelectionAction(); return; } - if (selectionActionOpenRef.current) { + if (selectionActionMenuOpenRef.current) { return; } const nextAction = readSelectionAction(); @@ -469,20 +472,46 @@ export function TerminalViewport({ return; } const requestId = ++selectionActionRequestIdRef.current; - selectionActionOpenRef.current = true; - try { - const clicked = await localApi.contextMenu.show( - [{ id: "add-to-chat", label: "Add to chat" }], + selectionActionMenuOpenRef.current = true; + const clicked = await localApi.contextMenu + .show( + [ + { id: "add-to-chat", label: "Add to chat" }, + { id: "copy", label: "Copy" }, + ], nextAction.position, - ); - if (requestId !== selectionActionRequestIdRef.current || clicked !== "add-to-chat") { + ) + .finally(() => { + selectionActionMenuOpenRef.current = false; + }); + if (requestId !== selectionActionRequestIdRef.current || clicked === null) { + return; + } + switch (clicked) { + case "add-to-chat": + handleAddTerminalContext(nextAction.selection); + terminalRef.current?.clearSelection(); + terminalRef.current?.focus(); + return; + case "copy": + try { + await writeTextToClipboard(nextAction.clipboardText, "terminal selection"); + } catch (error) { + if (requestId !== selectionActionRequestIdRef.current) { + return; + } + const activeTerminal = terminalRef.current; + if (activeTerminal) { + writeSystemMessage( + activeTerminal, + error instanceof Error ? error.message : "Unable to copy terminal selection", + ); + } + } + if (requestId === selectionActionRequestIdRef.current) { + terminalRef.current?.focus(); + } return; - } - handleAddTerminalContext(nextAction.selection); - terminalRef.current?.clearSelection(); - terminalRef.current?.focus(); - } finally { - selectionActionOpenRef.current = false; } }; From 4f11740510d9040475936a24b08f60852bf5fdc4 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 19 Jul 2026 11:57:58 +0200 Subject: [PATCH 20/31] Add isolated app testing workflow (#4121) Co-authored-by: codex --- .agents/skills/test-t3-app/SKILL.md | 69 +++++ .agents/skills/test-t3-app/agents/openai.yaml | 4 + .../test-t3-app/references/sqlite-fixtures.md | 58 ++++ AGENTS.md | 33 +- .../src/app/DesktopEnvironment.test.ts | 32 +- apps/desktop/src/app/DesktopEnvironment.ts | 8 +- apps/server/scripts/t3-sqlite-state.test.ts | 119 ++++++++ apps/server/scripts/t3-sqlite-state.ts | 285 ++++++++++++++++++ apps/server/src/cli/config.test.ts | 29 +- apps/server/src/cli/config.ts | 18 +- apps/server/src/config.ts | 10 +- docs/operations/observability.md | 26 +- docs/reference/scripts.md | 8 +- scripts/dev-runner.test.ts | 63 +++- scripts/dev-runner.ts | 36 ++- 15 files changed, 711 insertions(+), 87 deletions(-) create mode 100644 .agents/skills/test-t3-app/SKILL.md create mode 100644 .agents/skills/test-t3-app/agents/openai.yaml create mode 100644 .agents/skills/test-t3-app/references/sqlite-fixtures.md create mode 100644 apps/server/scripts/t3-sqlite-state.test.ts create mode 100644 apps/server/scripts/t3-sqlite-state.ts diff --git a/.agents/skills/test-t3-app/SKILL.md b/.agents/skills/test-t3-app/SKILL.md new file mode 100644 index 000000000000..c573807d615d --- /dev/null +++ b/.agents/skills/test-t3-app/SKILL.md @@ -0,0 +1,69 @@ +--- +name: test-t3-app +description: Launch and test the T3 Code web app in isolated development environments, including first-try browser authentication with one-time pairing URLs, pairing-token recovery, worktree-safe state directories, dev server lifecycle, and direct SQLite inspection or fixture seeding. Use when an agent needs to run T3 locally, test UI behavior in a browser, recover from an expired or consumed pairing token, isolate dev state, or prepare test data in state.sqlite. +--- + +# Test T3 App + +## Start an isolated web environment + +1. Run commands from the repository root. +2. Choose a base directory that belongs only to the current worktree or test: + - Use the repository's ignored `.t3` directory for reusable worktree-local state. + - Use `mktemp -d /tmp/t3code-test.XXXXXX` for disposable state and retain the printed absolute path. +3. Start the full web stack with `vp run dev --home-dir `. +4. Keep the terminal session alive and read the selected server port, web port, base directory, and pairing URL from its output. + +Treat a base directory as disposable only when it was created or deliberately selected for the current test. Never delete or directly seed the shared `~/.t3` directory. Prefer starting with a new temporary base directory over clearing state of uncertain ownership. + +The dev runner disables browser auto-open by default. Do not pass `--browser` during automated testing: an automatically opened page can consume the one-time bootstrap token before the controlled browser uses it. + +## Authenticate the browser on the first navigation + +1. Wait for the server log that says authentication is required and includes a URL ending in `/pair#token=...`. +2. Use the controlled in-app browser or browser-automation surface available to the agent. Do not use a system-browser launch command during automated testing. +3. Open that complete URL exactly once as the controlled browser's first navigation. Preserve the fragment and token verbatim. +4. Wait for the pairing exchange and redirect to finish before navigating elsewhere. +5. Continue in the same browser context so its stored bearer session remains available. + +Treat pairing URLs as secrets. Do not copy them into final responses, screenshots, committed files, or durable logs. A pairing token is short-lived and single-use; opening the URL in another browser or opening it twice can consume it. + +## Recover a consumed or expired pairing token + +Create another token against the same database and web URL as the running dev server: + +```bash +T3CODE_PORT= node apps/server/src/bin.ts auth pairing create \ + --base-dir \ + --dev-url \ + --base-url \ + --ttl 15m \ + --label agent-ui-test +``` + +Use the `Pair URL` from this command once. Derive `` and `` from the current dev-runner output, including any automatically selected port offset. Setting `T3CODE_PORT` keeps the administrative CLI from probing for an unrelated free port. + +Always pass `--dev-url` for a dev-runner environment so the generated pairing URL uses the current web origin. An explicit base directory stores runtime state in `/userdata`; the `/dev` fallback is only used by an implicit dev home. Use `auth pairing list` to inspect active token metadata; it intentionally cannot reveal token secrets. + +## Inspect or seed SQLite state + +Read [references/sqlite-fixtures.md](references/sqlite-fixtures.md) before changing the database. + +- Use `node apps/server/scripts/t3-sqlite-state.ts query` for schema discovery and read-only checks. +- Stop the dev server before using `node apps/server/scripts/t3-sqlite-state.ts exec`, then restart it with the same base directory. +- Seed projection tables only for disposable UI fixtures. Use application commands and APIs when testing business behavior or projection correctness. +- Use the auth CLI, not direct `auth_*` table edits, for pairing and sessions. + +The helper refuses to write to the shared `~/.t3` directory by default and creates a database backup before each mutation. + +## Finish the test + +Stop the dev process with its terminal interrupt. Preserve the isolated base directory when it contains useful reproduction evidence; otherwise remove only a path that was created for this test after resolving and verifying the exact target. A fresh isolated base directory is the safest reset when authentication, migrations, or fixture state becomes ambiguous. + +## Troubleshoot predictably + +- If the browser shows an unauthenticated pairing screen, issue a new token instead of retrying the consumed URL. +- If the pairing URL is no longer visible, create a replacement token with both `--dev-url` and `--base-url`. +- If the replacement token is rejected, verify that the CLI and server use the identical absolute base directory and web URL. +- If the UI shows unexpected data, verify that every command uses the identical explicit base directory before editing anything. +- If ports move because another instance is running, trust the current dev-runner output rather than assuming ports `13773` and `5733`. diff --git a/.agents/skills/test-t3-app/agents/openai.yaml b/.agents/skills/test-t3-app/agents/openai.yaml new file mode 100644 index 000000000000..a3b89c95e608 --- /dev/null +++ b/.agents/skills/test-t3-app/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "T3 App Testing" + short_description: "Launch and seed isolated T3 test environments" + default_prompt: "Use $test-t3-app to launch an isolated T3 development environment and test it in the browser." diff --git a/.agents/skills/test-t3-app/references/sqlite-fixtures.md b/.agents/skills/test-t3-app/references/sqlite-fixtures.md new file mode 100644 index 000000000000..8eca543cf979 --- /dev/null +++ b/.agents/skills/test-t3-app/references/sqlite-fixtures.md @@ -0,0 +1,58 @@ +# SQLite fixtures + +Load this reference only when inspecting or seeding local T3 state directly. + +## Select the correct database + +When `--base-dir` or `--home-dir` is explicit, runtime state lives under `/userdata` and the database path is `/userdata/state.sqlite`. The `/dev` state directory is only the fallback for an implicit development home, preventing an ordinary `vp run dev` from touching production state. + +Start the target runtime once before seeding so all migrations have run. Use an isolated base directory. Stop the server before writes to avoid racing application state or an active projection. + +## Use the helper + +List tables: + +```bash +node apps/server/scripts/t3-sqlite-state.ts query \ + --base-dir \ + --sql "SELECT name FROM sqlite_schema WHERE type = 'table' ORDER BY name" +``` + +Inspect current columns before writing a fixture: + +```bash +node apps/server/scripts/t3-sqlite-state.ts query \ + --base-dir \ + --sql "PRAGMA table_info(projection_threads)" +``` + +Apply a SQL fixture from a file: + +```bash +node apps/server/scripts/t3-sqlite-state.ts exec \ + --base-dir \ + --file /tmp/t3-seed.sql +``` + +Use one statement per invocation for both `query` and `exec`; the helper wraps writes in a transaction and prints the backup path after a successful mutation. Use a single insert with multiple value rows when a fixture needs several records. + +## Seed projection data carefully + +The web UI primarily reads these projection tables: + +- `projection_projects` +- `projection_threads` +- `projection_thread_messages` +- `projection_thread_activities` +- `projection_thread_sessions` +- `projection_turns` +- `projection_pending_approvals` +- `projection_thread_proposed_plans` + +Inspect `PRAGMA table_info()` and the current migrations under `apps/server/src/persistence/Migrations/` before constructing inserts. Keep identifiers unique, timestamps as ISO strings, JSON columns valid, and related project/thread/turn IDs consistent. + +For a substantial current example, inspect `seedDatabase` in `scripts/mobile-showcase-environment.ts`. Adapt its column set to the target database instead of assuming copied SQL remains current. + +Direct projection writes are appropriate for ephemeral visual states, edge-case counts, long titles, activity lists, and similar UI fixtures. They do not create a coherent orchestration event history. Do not modify `orchestration_events` unless the test specifically exercises projector internals, and do not use direct projection writes to claim backend business behavior works. + +Use the app's commands or APIs for behavior tests. Use `node apps/server/src/bin.ts auth ...` for auth state rather than editing `auth_pairing_links` or `auth_sessions`. diff --git a/AGENTS.md b/AGENTS.md index 380a9202683b..0a425cbc1859 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,27 +2,14 @@ ## Task Completion Requirements -- `vp check` and `vp run typecheck` must pass before considering tasks completed. - - If changing native mobile code, `vp run lint:mobile` must also pass. -- Use `vp test` for the built-in Vite+ test command and `vp run test` when you specifically need the `test` package script. - -## Project Snapshot - -T3 Code is a minimal web GUI for using coding agents like Codex and Claude. - -This repository is a VERY EARLY WIP. Proposing sweeping changes that improve long-term maintainability is encouraged. - -## Core Priorities - -1. Performance first. -2. Reliability first. -3. Keep behavior predictable under load and during failures (session restarts, reconnects, partial streams). - -If a tradeoff is required, choose correctness and robustness over short-term convenience. - -## Maintainability - -Long term maintainability is a core priority. If you add new functionality, first check if there is shared logic that can be extracted to a separate module. Duplicate logic across multiple files is a code smell and should be avoided. Don't be afraid to change existing code. Don't take shortcuts by just adding local logic to solve a problem. +- Keep local verification focused on the files and packages changed. Run the smallest relevant test set; do not run the full workspace test suite as a routine completion step. + - Use `vp test run ` for focused built-in Vite+ tests. Use `vp run test` only when the affected package specifically requires its `test` script. + - Backend changes must include and run focused tests for the changed behavior. + - Run targeted formatting, lint, and type checks for the affected scope when available. +- Do not run repo-wide `vp check`, `vp run typecheck`, `vp run test`, or equivalent full-suite commands locally unless the user explicitly requests them. CI is responsible for the full verification suite. +- After frontend feature development or any user-visible frontend behavior change, the primary agent must use the `test-t3-app` skill once after integrating the work. Launch one isolated environment, authenticate through the printed pairing URL, and verify the affected flow in the controlled browser. + - Subagents must not independently launch dev servers or repeat integrated browser verification unless their delegated task explicitly requires it. + - Stop dev servers, watchers, and other long-running verification processes when the focused verification is complete. ## Package Roles @@ -35,7 +22,6 @@ Long term maintainability is a core priority. If you add new functionality, firs ## Reference Repos - Open-source Codex repo: https://github.com/openai/codex -- Codex-Monitor (Tauri, feature-complete, strong reference implementation): https://github.com/Dimillian/CodexMonitor Use these as implementation references when designing protocol handling, UX flows, and operational safeguards. @@ -47,8 +33,7 @@ agents. - Prefer examples and patterns from the vendored source code over generated guesses or web search results. - Do not edit files under `.repos/` unless explicitly asked. - Do not import from `.repos/`; application code must continue importing from normal package dependencies. -- Manage vendored subtrees with `bun run sync:repos`; use `bun run sync:repos --repo ` to sync one - configured repository. +- Manage vendored subtrees with `vpr sync:repos`; use `vpr sync:repos --repo ` to sync one configured repository. - When updating a dependency with a configured vendored subtree, sync that subtree in the same change so `.repos/` matches the installed dependency version. - When writing Effect code, read `.repos/effect-smol/LLMS.md` first and inspect `.repos/effect-smol/` for diff --git a/apps/desktop/src/app/DesktopEnvironment.test.ts b/apps/desktop/src/app/DesktopEnvironment.test.ts index 92da3f887ac3..15d23f8e1522 100644 --- a/apps/desktop/src/app/DesktopEnvironment.test.ts +++ b/apps/desktop/src/app/DesktopEnvironment.test.ts @@ -53,13 +53,16 @@ describe("DesktopEnvironment", () => { assert.equal(environment.isDevelopment, true); assert.equal(environment.appDataDirectory, "/Users/alice/Library/Application Support"); assert.equal(environment.baseDir, "/tmp/t3"); - assert.equal(environment.stateDir, "/tmp/t3/dev"); - assert.equal(environment.desktopSettingsPath, "/tmp/t3/dev/desktop-settings.json"); - assert.equal(environment.clientSettingsPath, "/tmp/t3/dev/client-settings.json"); - assert.equal(environment.savedEnvironmentRegistryPath, "/tmp/t3/dev/saved-environments.json"); - assert.equal(environment.serverSettingsPath, "/tmp/t3/dev/settings.json"); - assert.equal(environment.logDir, "/tmp/t3/dev/logs"); - assert.equal(environment.browserArtifactsDir, "/tmp/t3/dev/browser-artifacts"); + assert.equal(environment.stateDir, "/tmp/t3/userdata"); + assert.equal(environment.desktopSettingsPath, "/tmp/t3/userdata/desktop-settings.json"); + assert.equal(environment.clientSettingsPath, "/tmp/t3/userdata/client-settings.json"); + assert.equal( + environment.savedEnvironmentRegistryPath, + "/tmp/t3/userdata/saved-environments.json", + ); + assert.equal(environment.serverSettingsPath, "/tmp/t3/userdata/settings.json"); + assert.equal(environment.logDir, "/tmp/t3/userdata/logs"); + assert.equal(environment.browserArtifactsDir, "/tmp/t3/userdata/browser-artifacts"); assert.equal(environment.rootDir, "/repo"); assert.equal(environment.appRoot, "/repo"); assert.equal(environment.backendEntryPath, "/repo/apps/server/dist/bin.mjs"); @@ -78,7 +81,7 @@ describe("DesktopEnvironment", () => { }), ); - it.effect("derives production state paths under userdata", () => + it.effect("stores production state under userdata in an explicit home", () => Effect.gen(function* () { const environment = yield* makeEnvironment( {}, @@ -95,6 +98,19 @@ describe("DesktopEnvironment", () => { }), ); + it.effect("keeps implicit development state separate from production state", () => + Effect.gen(function* () { + const development = yield* makeEnvironment( + {}, + { VITE_DEV_SERVER_URL: "http://localhost:5173" }, + ); + const production = yield* makeEnvironment(); + + assert.equal(development.stateDir, "/Users/alice/.t3/dev"); + assert.equal(production.stateDir, "/Users/alice/.t3/userdata"); + }), + ); + it.effect("uses a configured app user model id override", () => Effect.gen(function* () { const environment = yield* makeEnvironment( diff --git a/apps/desktop/src/app/DesktopEnvironment.ts b/apps/desktop/src/app/DesktopEnvironment.ts index 061a9368c536..c991f5b39d6b 100644 --- a/apps/desktop/src/app/DesktopEnvironment.ts +++ b/apps/desktop/src/app/DesktopEnvironment.ts @@ -147,7 +147,8 @@ const make = Effect.fn("desktop.environment.make")(function* ( : input.platform === "darwin" ? path.join(homeDirectory, "Library", "Application Support") : Option.getOrElse(config.xdgConfigHome, () => path.join(homeDirectory, ".config")); - const baseDir = Option.getOrElse(config.t3Home, () => path.join(homeDirectory, ".t3")); + const configuredBaseDir = config.t3Home; + const baseDir = Option.getOrElse(configuredBaseDir, () => path.join(homeDirectory, ".t3")); const rootDir = path.resolve(input.dirname, "../../.."); const appRoot = input.isPackaged ? input.appPath : rootDir; const branding = resolveDesktopAppBranding({ @@ -155,7 +156,10 @@ const make = Effect.fn("desktop.environment.make")(function* ( appVersion: input.appVersion, }); const displayName = branding.displayName; - const stateDir = path.join(baseDir, isDevelopment ? "dev" : "userdata"); + const stateDir = path.join( + baseDir, + isDevelopment && Option.isNone(configuredBaseDir) ? "dev" : "userdata", + ); const userDataDirName = isDevelopment ? "t3code-dev" : "t3code"; const legacyUserDataDirName = isDevelopment ? "T3 Code (Dev)" : "T3 Code (Alpha)"; const resourcesPath = input.resourcesPath; diff --git a/apps/server/scripts/t3-sqlite-state.test.ts b/apps/server/scripts/t3-sqlite-state.test.ts new file mode 100644 index 000000000000..d1ef1368918b --- /dev/null +++ b/apps/server/scripts/t3-sqlite-state.test.ts @@ -0,0 +1,119 @@ +import * as NodeServices from "@effect/platform-node/NodeServices"; +import { assert, it } from "@effect/vitest"; +import * as Effect from "effect/Effect"; +import * as FileSystem from "effect/FileSystem"; +import * as Path from "effect/Path"; +import * as SqlClient from "effect/unstable/sql/SqlClient"; + +import * as NodeSqliteClient from "../src/persistence/NodeSqliteClient.ts"; +import { runSqliteState } from "./t3-sqlite-state.ts"; + +const createFixtureDatabase = Effect.fn("createSqliteStateFixtureDatabase")(function* ( + baseDir: string, +) { + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const stateDir = path.join(baseDir, "userdata"); + const databasePath = path.join(stateDir, "state.sqlite"); + yield* fs.makeDirectory(stateDir, { recursive: true }); + yield* Effect.gen(function* () { + const sql = yield* SqlClient.SqlClient; + yield* sql`CREATE TABLE fixtures (id INTEGER PRIMARY KEY, label TEXT NOT NULL)`; + yield* sql`INSERT INTO fixtures (id, label) VALUES (1, 'existing')`; + }).pipe(Effect.provide(NodeSqliteClient.layer({ filename: databasePath }))); +}); + +it.layer(NodeServices.layer)("t3-sqlite-state", (it) => { + it.effect("reports each invalid SQL source with a specific error", () => + Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + const baseDir = yield* fs.makeTempDirectoryScoped({ prefix: "t3-sqlite-state-input-" }); + + const multipleSources = yield* runSqliteState({ + operation: "query", + baseDir, + sql: "SELECT 1", + file: "fixture.sql", + }).pipe(Effect.flip); + assert.equal(multipleSources._tag, "SqliteStateMultipleSqlSourcesError"); + assert.equal(multipleSources.message, "Provide only one of --sql or --file."); + + const missingSource = yield* runSqliteState({ operation: "query", baseDir }).pipe( + Effect.flip, + ); + assert.equal(missingSource._tag, "SqliteStateMissingSqlSourceError"); + assert.equal(missingSource.message, "Provide one of --sql or --file."); + + const emptySql = yield* runSqliteState({ + operation: "query", + baseDir, + sql: " ", + }).pipe(Effect.flip); + assert.equal(emptySql._tag, "SqliteStateEmptySqlError"); + assert.equal(emptySql.message, "SQL input is empty."); + }), + ); + + it.effect("queries an isolated database through Effect SQL", () => + Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + const baseDir = yield* fs.makeTempDirectoryScoped({ prefix: "t3-sqlite-state-query-" }); + yield* createFixtureDatabase(baseDir); + + const result = yield* runSqliteState({ + operation: "query", + baseDir, + sql: "SELECT id, label FROM fixtures", + }); + + assert.equal(result.operation, "query"); + if (result.operation === "query") { + assert.deepStrictEqual(result.rows, [{ id: 1, label: "existing" }]); + } + }), + ); + + it.effect("backs up isolated state before writes and refuses the shared home", () => + Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const baseDir = yield* fs.makeTempDirectoryScoped({ prefix: "t3-sqlite-state-exec-" }); + yield* createFixtureDatabase(baseDir); + + const mutation = yield* runSqliteState({ + operation: "exec", + baseDir, + sql: "INSERT INTO fixtures (id, label) VALUES (2, 'seeded')", + }); + assert.equal(mutation.operation, "exec"); + if (mutation.operation === "exec") { + assert.equal((yield* fs.stat(mutation.backup)).mode & 0o777, 0o600); + } + + const error = yield* runSqliteState( + { + operation: "exec", + baseDir, + sql: "DELETE FROM fixtures", + }, + { sharedHome: baseDir }, + ).pipe(Effect.flip); + assert.equal(error._tag, "SqliteStateSharedHomeMutationError"); + + const aliasParent = yield* fs.makeTempDirectoryScoped({ + prefix: "t3-sqlite-state-alias-", + }); + const aliasBaseDir = path.join(aliasParent, "shared-home-alias"); + yield* fs.symlink(baseDir, aliasBaseDir); + const aliasError = yield* runSqliteState( + { + operation: "exec", + baseDir: aliasBaseDir, + sql: "DELETE FROM fixtures", + }, + { sharedHome: baseDir }, + ).pipe(Effect.flip); + assert.equal(aliasError._tag, "SqliteStateSharedHomeMutationError"); + }), + ); +}); diff --git a/apps/server/scripts/t3-sqlite-state.ts b/apps/server/scripts/t3-sqlite-state.ts new file mode 100644 index 000000000000..de0402b36472 --- /dev/null +++ b/apps/server/scripts/t3-sqlite-state.ts @@ -0,0 +1,285 @@ +#!/usr/bin/env node + +// @effect-diagnostics nodeBuiltinImport:off - node:os resolves the shared T3 home guard. +import * as NodeRuntime from "@effect/platform-node/NodeRuntime"; +import * as NodeServices from "@effect/platform-node/NodeServices"; +import * as NodeOS from "node:os"; +import { fromJsonStringPretty } from "@t3tools/shared/schemaJson"; +import * as Console from "effect/Console"; +import * as DateTime from "effect/DateTime"; +import * as Effect from "effect/Effect"; +import * as FileSystem from "effect/FileSystem"; +import * as Option from "effect/Option"; +import * as Path from "effect/Path"; +import * as Schema from "effect/Schema"; +import * as SqlClient from "effect/unstable/sql/SqlClient"; +import { Argument, Command, Flag } from "effect/unstable/cli"; + +import * as NodeSqliteClient from "../src/persistence/NodeSqliteClient.ts"; + +export const SqliteStateOperation = Schema.Literals(["query", "exec"]); +export type SqliteStateOperation = typeof SqliteStateOperation.Type; + +export class SqliteStateMultipleSqlSourcesError extends Schema.TaggedErrorClass()( + "SqliteStateMultipleSqlSourcesError", + {}, +) { + override get message(): string { + return "Provide only one of --sql or --file."; + } +} + +export class SqliteStateMissingSqlSourceError extends Schema.TaggedErrorClass()( + "SqliteStateMissingSqlSourceError", + {}, +) { + override get message(): string { + return "Provide one of --sql or --file."; + } +} + +export class SqliteStateEmptySqlError extends Schema.TaggedErrorClass()( + "SqliteStateEmptySqlError", + {}, +) { + override get message(): string { + return "SQL input is empty."; + } +} + +export class SqliteStateDatabaseMissingError extends Schema.TaggedErrorClass()( + "SqliteStateDatabaseMissingError", + { + databasePath: Schema.String, + }, +) { + override get message(): string { + return `Database does not exist at '${this.databasePath}'. Start T3 once to run migrations.`; + } +} + +export class SqliteStateSharedHomeMutationError extends Schema.TaggedErrorClass()( + "SqliteStateSharedHomeMutationError", + {}, +) { + override get message(): string { + return "Refusing to mutate the shared ~/.t3 database. Use an isolated --base-dir."; + } +} + +export class SqliteStateSqlFileError extends Schema.TaggedErrorClass()( + "SqliteStateSqlFileError", + { + filePath: Schema.String, + cause: Schema.Defect(), + }, +) { + override get message(): string { + return `Failed to read SQL from '${this.filePath}'.`; + } +} + +export class SqliteStateDatabaseError extends Schema.TaggedErrorClass()( + "SqliteStateDatabaseError", + { + operation: SqliteStateOperation, + databasePath: Schema.String, + cause: Schema.Defect(), + }, +) { + override get message(): string { + return `Failed to ${this.operation} SQLite database at '${this.databasePath}'.`; + } +} + +const SqliteStateValue = Schema.Union([ + Schema.Null, + Schema.String, + Schema.Number, + Schema.Array(Schema.Number), +]); +const SqliteStateRow = Schema.Record(Schema.String, SqliteStateValue); +const SqliteStateQueryResult = Schema.Struct({ + operation: Schema.Literal("query"), + database: Schema.String, + rows: Schema.Array(SqliteStateRow), +}); +const SqliteStateExecResult = Schema.Struct({ + operation: Schema.Literal("exec"), + database: Schema.String, + backup: Schema.String, +}); +const SqliteStateResult = Schema.Union([SqliteStateQueryResult, SqliteStateExecResult]); +const encodeSqliteStateResult = Schema.encodeEffect(fromJsonStringPretty(SqliteStateResult)); + +export type SqliteStateResult = typeof SqliteStateResult.Type; + +type RawSqliteValue = null | string | number | bigint | Uint8Array; +type RawSqliteRow = Readonly>; + +export interface RunSqliteStateInput { + readonly operation: SqliteStateOperation; + readonly baseDir: string; + readonly sql?: string | undefined; + readonly file?: string | undefined; +} + +export interface RunSqliteStateOptions { + readonly sharedHome?: string | undefined; +} + +const resolveSqlSource = Effect.fn("resolveSqliteStateSqlSource")(function* ( + sql: string | undefined, + file: string | undefined, +) { + if (sql !== undefined && file !== undefined) { + return yield* new SqliteStateMultipleSqlSourcesError(); + } + if (sql === undefined && file === undefined) { + return yield* new SqliteStateMissingSqlSourceError(); + } + + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + let source: string; + if (sql !== undefined) { + source = sql; + } else { + const filePath = path.resolve(file as string); + source = yield* fs + .readFileString(filePath) + .pipe(Effect.mapError((cause) => new SqliteStateSqlFileError({ filePath, cause }))); + } + + const trimmed = source.trim(); + if (trimmed.length === 0) { + return yield* new SqliteStateEmptySqlError(); + } + return trimmed; +}); + +function normalizeSqliteValue(value: RawSqliteValue): typeof SqliteStateValue.Type { + if (typeof value === "bigint") { + const numericValue = Number(value); + return Number.isSafeInteger(numericValue) ? numericValue : value.toString(); + } + if (value instanceof Uint8Array) { + return Array.from(value); + } + return value; +} + +function normalizeSqliteRow(row: RawSqliteRow): typeof SqliteStateRow.Type { + return Object.fromEntries( + Object.entries(row).map(([key, value]) => [key, normalizeSqliteValue(value)]), + ); +} + +export const runSqliteState = Effect.fn("runSqliteState")(function* ( + input: RunSqliteStateInput, + options: RunSqliteStateOptions = {}, +) { + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const baseDir = path.resolve(input.baseDir); + const sharedHome = path.resolve(options.sharedHome ?? path.join(NodeOS.homedir(), ".t3")); + const databasePath = path.join(baseDir, "userdata", "state.sqlite"); + const source = yield* resolveSqlSource(input.sql, input.file); + + if (!(yield* fs.exists(databasePath))) { + return yield* new SqliteStateDatabaseMissingError({ databasePath }); + } + if (input.operation === "exec") { + const [canonicalBaseDir, canonicalSharedHome] = yield* Effect.all([ + fs.realPath(baseDir), + fs.realPath(sharedHome).pipe(Effect.orElseSucceed(() => sharedHome)), + ]); + if (canonicalBaseDir === canonicalSharedHome) { + return yield* new SqliteStateSharedHomeMutationError(); + } + } + + const program = Effect.gen(function* () { + const sql = yield* SqlClient.SqlClient; + yield* sql.unsafe("PRAGMA busy_timeout = 5000").unprepared; + + if (input.operation === "query") { + const rows = yield* sql.unsafe(source).unprepared.pipe( + Effect.provideService(SqlClient.SafeIntegers, true), + Effect.map((rows) => rows.map(normalizeSqliteRow)), + ); + return { + operation: "query", + database: databasePath, + rows, + } as const; + } + + const timestamp = DateTime.formatIso(yield* DateTime.now).replaceAll(":", "-"); + const backupPath = `${databasePath}.backup-${timestamp}`; + yield* sql`VACUUM INTO ${backupPath}`; + yield* fs.chmod(backupPath, 0o600); + yield* sql.withTransaction(sql.unsafe(source).unprepared); + + return { + operation: "exec", + database: databasePath, + backup: backupPath, + } as const; + }); + + return yield* program.pipe( + Effect.provide( + NodeSqliteClient.layer({ + filename: databasePath, + readonly: input.operation === "query", + }), + ), + Effect.mapError( + (cause) => + new SqliteStateDatabaseError({ + operation: input.operation, + databasePath, + cause, + }), + ), + ); +}); + +export const t3SqliteStateCommand = Command.make( + "t3-sqlite-state", + { + operation: Argument.choice("operation", SqliteStateOperation.literals).pipe( + Argument.withDescription("Run a read-only query or a backed-up fixture mutation."), + ), + baseDir: Flag.string("base-dir").pipe( + Flag.withDescription("Explicit T3 base directory containing userdata/state.sqlite."), + ), + sql: Flag.string("sql").pipe( + Flag.optional, + Flag.withDescription("SQL source supplied directly on the command line."), + ), + file: Flag.string("file").pipe( + Flag.optional, + Flag.withDescription("Path to a SQL source file."), + ), + }, + ({ operation, baseDir, sql, file }) => + runSqliteState({ + operation, + baseDir, + sql: Option.getOrUndefined(sql), + file: Option.getOrUndefined(file), + }).pipe(Effect.flatMap(encodeSqliteStateResult), Effect.flatMap(Console.log)), +).pipe( + Command.withDescription( + "Inspect or seed an isolated T3 SQLite database with automatic backups for writes.", + ), +); + +if (import.meta.main) { + Command.run(t3SqliteStateCommand, { version: "0.0.0" }).pipe( + Effect.provide(NodeServices.layer), + NodeRuntime.runMain, + ); +} diff --git a/apps/server/src/cli/config.test.ts b/apps/server/src/cli/config.test.ts index d4d9d3785571..f6c2a63e1923 100644 --- a/apps/server/src/cli/config.test.ts +++ b/apps/server/src/cli/config.test.ts @@ -18,6 +18,9 @@ import * as NodeServices from "@effect/platform-node/NodeServices"; import { deriveServerPaths } from "../config.ts"; import { resolveServerConfig } from "./config.ts"; +const deriveExplicitServerPaths = (baseDir: string, devUrl: URL | undefined) => + deriveServerPaths(baseDir, devUrl, { baseDirIsExplicit: true }); + const encodeDesktopBootstrap = Schema.encodeEffect(Schema.fromJsonString(DesktopBackendBootstrap)); const makeDesktopBootstrap = ( @@ -60,7 +63,10 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { Effect.gen(function* () { const { join } = yield* Path.Path; const baseDir = join(NodeOS.tmpdir(), "t3-cli-config-env-base"); - const derivedPaths = yield* deriveServerPaths(baseDir, new URL("http://127.0.0.1:5173")); + const derivedPaths = yield* deriveExplicitServerPaths( + baseDir, + new URL("http://127.0.0.1:5173"), + ); const resolved = yield* resolveServerConfig( { mode: Option.none(), @@ -119,6 +125,7 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { tailscaleServeEnabled: false, tailscaleServePort: 443, }); + assert.equal(resolved.stateDir, join(baseDir, "userdata")); }), ); @@ -126,7 +133,10 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { Effect.gen(function* () { const { join } = yield* Path.Path; const baseDir = join(NodeOS.tmpdir(), "t3-cli-config-flags-base"); - const derivedPaths = yield* deriveServerPaths(baseDir, new URL("http://127.0.0.1:4173")); + const derivedPaths = yield* deriveExplicitServerPaths( + baseDir, + new URL("http://127.0.0.1:4173"), + ); const resolved = yield* resolveServerConfig( { mode: Option.some("web"), @@ -185,6 +195,7 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { tailscaleServeEnabled: true, tailscaleServePort: 8443, }); + assert.equal(resolved.dbPath, join(baseDir, "userdata", "state.sqlite")); }), ); @@ -199,7 +210,10 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { tailscaleServePort: 443, }), ); - const derivedPaths = yield* deriveServerPaths(baseDir, new URL("http://127.0.0.1:4173")); + const derivedPaths = yield* deriveExplicitServerPaths( + baseDir, + new URL("http://127.0.0.1:4173"), + ); const resolved = yield* resolveServerConfig( { @@ -396,7 +410,10 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { tailscaleServePort: 443, }), ); - const derivedPaths = yield* deriveServerPaths(baseDir, new URL("http://127.0.0.1:4173")); + const derivedPaths = yield* deriveExplicitServerPaths( + baseDir, + new URL("http://127.0.0.1:4173"), + ); const resolved = yield* resolveServerConfig( { @@ -461,7 +478,7 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { const fs = yield* FileSystem.FileSystem; const path = yield* Path.Path; const baseDir = yield* fs.makeTempDirectoryScoped({ prefix: "t3-cli-config-settings-" }); - const derivedPaths = yield* deriveServerPaths(baseDir, undefined); + const derivedPaths = yield* deriveExplicitServerPaths(baseDir, undefined); yield* fs.makeDirectory(path.dirname(derivedPaths.settingsPath), { recursive: true }); yield* fs.writeFileString( derivedPaths.settingsPath, @@ -529,7 +546,7 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { Effect.gen(function* () { const { join } = yield* Path.Path; const baseDir = join(NodeOS.tmpdir(), "t3-cli-config-headless-base"); - const derivedPaths = yield* deriveServerPaths(baseDir, undefined); + const derivedPaths = yield* deriveExplicitServerPaths(baseDir, undefined); const resolved = yield* resolveServerConfig( { diff --git a/apps/server/src/cli/config.ts b/apps/server/src/cli/config.ts index 7a9cd72d526d..5a4cde0a6fd2 100644 --- a/apps/server/src/cli/config.ts +++ b/apps/server/src/cli/config.ts @@ -31,7 +31,9 @@ export const hostFlag = Flag.string("host").pipe( Flag.optional, ); export const baseDirFlag = Flag.string("base-dir").pipe( - Flag.withDescription("Base directory path (equivalent to T3CODE_HOME)."), + Flag.withDescription( + "Explicit T3 Code data directory; runtime state is stored under userdata (equivalent to T3CODE_HOME).", + ), Flag.optional, ); export const devUrlFlag = Flag.string("dev-url").pipe( @@ -259,19 +261,21 @@ export const resolveServerConfig = ( resolveOptionPrecedence(normalizedFlags.devUrl, Option.fromUndefinedOr(env.devUrl)), () => undefined, ); + const explicitBaseDir = resolveOptionPrecedence( + normalizedFlags.baseDir, + Option.fromUndefinedOr(env.t3Home), + ).pipe(Option.filter((value) => value.trim().length > 0)); const baseDir = yield* resolveBaseDir( Option.getOrUndefined( - resolveOptionPrecedence( - normalizedFlags.baseDir, - Option.fromUndefinedOr(env.t3Home), - Option.fromUndefinedOr(bootstrap?.t3Home), - ), + resolveOptionPrecedence(explicitBaseDir, Option.fromUndefinedOr(bootstrap?.t3Home)), ), ); const rawCwd = Option.getOrElse(normalizedFlags.cwd, () => process.cwd()); const cwd = path.resolve(yield* expandHomePath(rawCwd.trim())); yield* fs.makeDirectory(cwd, { recursive: true }); - const derivedPaths = yield* ServerConfig.deriveServerPaths(baseDir, devUrl); + const derivedPaths = yield* ServerConfig.deriveServerPaths(baseDir, devUrl, { + baseDirIsExplicit: Option.isSome(explicitBaseDir), + }); yield* ServerConfig.ensureServerDirectories(derivedPaths); const persistedObservabilitySettings = yield* loadPersistedObservabilitySettings( derivedPaths.settingsPath, diff --git a/apps/server/src/config.ts b/apps/server/src/config.ts index 2608ccc16aee..3b081c95c349 100644 --- a/apps/server/src/config.ts +++ b/apps/server/src/config.ts @@ -45,6 +45,10 @@ export interface ServerDerivedPaths { readonly secretsDir: string; } +export interface DeriveServerPathsOptions { + readonly baseDirIsExplicit?: boolean; +} + /** * ServerConfig - Service tag for server runtime configuration. */ @@ -91,9 +95,13 @@ export const layer = (config: ServerConfig["Service"]) => Layer.succeed(ServerCo export const deriveServerPaths = Effect.fn(function* ( baseDir: ServerConfig["Service"]["baseDir"], devUrl: ServerConfig["Service"]["devUrl"], + options: DeriveServerPathsOptions = {}, ): Effect.fn.Return { const { join } = yield* Path.Path; - const stateDir = join(baseDir, devUrl !== undefined ? "dev" : "userdata"); + const stateDir = join( + baseDir, + devUrl !== undefined && !options.baseDirIsExplicit ? "dev" : "userdata", + ); const dbPath = join(stateDir, "state.sqlite"); const attachmentsDir = join(stateDir, "attachments"); const logsDir = join(stateDir, "logs"); diff --git a/docs/operations/observability.md b/docs/operations/observability.md index 5b98d1163ea4..1d55894b1824 100644 --- a/docs/operations/observability.md +++ b/docs/operations/observability.md @@ -165,16 +165,24 @@ The backend reads observability config at process start. If you change OTLP env The trace file is the fastest way to inspect raw span data. +Resolve the production or explicitly configured trace file once. Runtime state lives under the +base directory's `userdata` folder: + +```bash +TRACE_FILE="${T3CODE_HOME:-$HOME/.t3}/userdata/logs/server.trace.ndjson" +``` + Tail it: ```bash -tail -f "$T3CODE_HOME/userdata/logs/server.trace.ndjson" +tail -f "$TRACE_FILE" ``` -In monorepo dev, use: +For an implicit monorepo dev server, use: ```bash -tail -f ./dev/logs/server.trace.ndjson +TRACE_FILE="$HOME/.t3/dev/logs/server.trace.ndjson" +tail -f "$TRACE_FILE" ``` Show failed spans: @@ -185,7 +193,7 @@ jq -c 'select(.exit._tag != "Success") | { durationMs, exit, attributes -}' "$T3CODE_HOME/userdata/logs/server.trace.ndjson" +}' "$TRACE_FILE" ``` Show slow spans: @@ -196,7 +204,7 @@ jq -c 'select(.durationMs > 1000) | { durationMs, traceId, spanId -}' "$T3CODE_HOME/userdata/logs/server.trace.ndjson" +}' "$TRACE_FILE" ``` Inspect embedded log events: @@ -213,7 +221,7 @@ jq -c 'select(any(.events[]?; .attributes["effect.logLevel"] != null)) | { level: .attributes["effect.logLevel"] } ] -}' "$T3CODE_HOME/userdata/logs/server.trace.ndjson" +}' "$TRACE_FILE" ``` Follow one trace: @@ -224,7 +232,7 @@ jq -r 'select(.traceId == "TRACE_ID_HERE") | [ .spanId, (.parentSpanId // "-"), .durationMs -] | @tsv' "$T3CODE_HOME/userdata/logs/server.trace.ndjson" +] | @tsv' "$TRACE_FILE" ``` Filter orchestration commands: @@ -235,7 +243,7 @@ jq -c 'select(.attributes["orchestration.command_type"] != null) | { durationMs, commandType: .attributes["orchestration.command_type"], aggregateKind: .attributes["orchestration.aggregate_kind"] -}' "$T3CODE_HOME/userdata/logs/server.trace.ndjson" +}' "$TRACE_FILE" ``` Filter git activity: @@ -250,7 +258,7 @@ jq -c 'select(.attributes["git.operation"] != null) | { .events[] | select(.name == "git.hook.started" or .name == "git.hook.finished") ] -}' "$T3CODE_HOME/userdata/logs/server.trace.ndjson" +}' "$TRACE_FILE" ``` ### Use Tempo When You Need A Real Trace Viewer diff --git a/docs/reference/scripts.md b/docs/reference/scripts.md index 6bdea2666652..746aa66d563f 100644 --- a/docs/reference/scripts.md +++ b/docs/reference/scripts.md @@ -3,13 +3,15 @@ - `vp run dev` — Starts contracts, server, and web in watch mode. - `vp run dev:server` — Starts just the WebSocket server. The server process runs on Bun (`@effect/platform-bun` + `BunPtyAdapter`), but task running uses `vp run`. - `vp run dev:web` — Starts just the Vite dev server for the web app. -- Dev commands default `T3CODE_HOME` to `~/.t3` — the same shared home the desktop/production app uses. Override with `--home-dir` (see below) to keep dev state separate. -- Override server CLI-equivalent flags from root dev commands with `--`, for example: - `vp run dev -- --home-dir ~/.t3-2` +- Dev commands implicitly use `~/.t3/dev`, keeping development state separate from `~/.t3/userdata`. An explicit `--home-dir ` stores state under `/userdata`; the base directory remains available for caches, worktrees, and other shared data. +- Web dev commands do not auto-open a browser. Open the one-time pairing URL printed by the server so the first browser navigation is authenticated. Set `T3CODE_NO_BROWSER=0` only when interactive auto-open is intentional. +- Pass dev-runner flags directly after the root task name, for example: + `vp run dev --home-dir /tmp/t3code-dev` - `vp run start` — Runs the production server (serves built web app as static files). - `vp run build` — Builds contracts, web app, and server. - `vp run typecheck` — Strict TypeScript checks for all packages. - `vp run test` — Runs workspace tests. +- `node apps/server/scripts/t3-sqlite-state.ts --base-dir ...` — Inspects or seeds an isolated T3 SQLite database; writes create a private backup first. - `vp run dist:desktop:artifact -- --platform --target --arch ` — Builds a desktop artifact for a specific platform/target/arch. - `vp run dist:desktop:dmg` — Builds a shareable macOS `.dmg` into `./release`. - `vp run dist:desktop:dmg:x64` — Builds an Intel macOS `.dmg`. diff --git a/scripts/dev-runner.test.ts b/scripts/dev-runner.test.ts index 432b50cf7285..3b79db49f5bb 100644 --- a/scripts/dev-runner.test.ts +++ b/scripts/dev-runner.test.ts @@ -1,5 +1,4 @@ import * as NodeServices from "@effect/platform-node/NodeServices"; -import * as NodeOS from "node:os"; import * as NetService from "@t3tools/shared/Net"; import { HostProcessPlatform } from "@t3tools/shared/hostProcess"; import { assert, describe, it } from "@effect/vitest"; @@ -52,7 +51,7 @@ function mockProcess(exit: number | PlatformError.PlatformError) { const devServerInput = { mode: "dev:server", t3Home: "/tmp/t3code-dev-runner", - noBrowser: undefined, + browser: undefined, autoBootstrapProjectFromCwd: undefined, logWebSocketEvents: undefined, host: undefined, @@ -127,16 +126,56 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { }); describe("createDevRunnerEnv", () => { - it.effect("defaults T3CODE_HOME to ~/.t3 when not provided", () => + it.effect("leaves the shared home implicit and disables browser auto-open", () => + Effect.gen(function* () { + const env = yield* createDevRunnerEnv({ + mode: "dev", + baseEnv: {}, + serverOffset: 0, + webOffset: 0, + t3Home: undefined, + browser: undefined, + autoBootstrapProjectFromCwd: undefined, + logWebSocketEvents: undefined, + host: undefined, + port: undefined, + devUrl: undefined, + }); + + assert.equal(env.T3CODE_HOME, undefined); + assert.equal(env.T3CODE_NO_BROWSER, "1"); + }), + ); + + it.effect("allows browser auto-open to be explicitly enabled", () => Effect.gen(function* () { - const path = yield* Path.Path; const env = yield* createDevRunnerEnv({ mode: "dev", baseEnv: {}, serverOffset: 0, webOffset: 0, t3Home: undefined, - noBrowser: undefined, + browser: true, + autoBootstrapProjectFromCwd: undefined, + logWebSocketEvents: undefined, + host: undefined, + port: undefined, + devUrl: undefined, + }); + + assert.equal(env.T3CODE_NO_BROWSER, "0"); + }), + ); + + it.effect("requires the browser flag even when the environment enables auto-open", () => + Effect.gen(function* () { + const env = yield* createDevRunnerEnv({ + mode: "dev", + baseEnv: { T3CODE_NO_BROWSER: "0" }, + serverOffset: 0, + webOffset: 0, + t3Home: undefined, + browser: false, autoBootstrapProjectFromCwd: undefined, logWebSocketEvents: undefined, host: undefined, @@ -144,7 +183,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { devUrl: undefined, }); - assert.equal(env.T3CODE_HOME, path.resolve(NodeOS.homedir(), ".t3")); + assert.equal(env.T3CODE_NO_BROWSER, "1"); }), ); @@ -157,7 +196,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { serverOffset: 0, webOffset: 0, t3Home: "/tmp/custom-t3", - noBrowser: true, + browser: false, autoBootstrapProjectFromCwd: false, logWebSocketEvents: true, host: "0.0.0.0", @@ -187,7 +226,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { serverOffset: 0, webOffset: 0, t3Home: undefined, - noBrowser: undefined, + browser: undefined, autoBootstrapProjectFromCwd: undefined, logWebSocketEvents: undefined, host: undefined, @@ -210,7 +249,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { serverOffset: 0, webOffset: 0, t3Home: undefined, - noBrowser: undefined, + browser: undefined, autoBootstrapProjectFromCwd: undefined, logWebSocketEvents: false, host: undefined, @@ -231,7 +270,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { serverOffset: 0, webOffset: 0, t3Home: "/tmp/my-t3", - noBrowser: undefined, + browser: undefined, autoBootstrapProjectFromCwd: undefined, logWebSocketEvents: undefined, host: undefined, @@ -259,7 +298,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { serverOffset: 0, webOffset: 0, t3Home: "/tmp/my-t3", - noBrowser: true, + browser: true, autoBootstrapProjectFromCwd: undefined, logWebSocketEvents: undefined, host: "127.0.0.1", @@ -288,7 +327,7 @@ it.layer(NodeServices.layer)("dev-runner", (it) => { serverOffset: 0, webOffset: 0, t3Home: undefined, - noBrowser: undefined, + browser: undefined, autoBootstrapProjectFromCwd: undefined, logWebSocketEvents: undefined, host: undefined, diff --git a/scripts/dev-runner.ts b/scripts/dev-runner.ts index 2953a2f4dec9..1938232300fc 100644 --- a/scripts/dev-runner.ts +++ b/scripts/dev-runner.ts @@ -221,7 +221,7 @@ interface CreateDevRunnerEnvInput { readonly serverOffset: number; readonly webOffset: number; readonly t3Home: string | undefined; - readonly noBrowser: boolean | undefined; + readonly browser: boolean | undefined; readonly autoBootstrapProjectFromCwd: boolean | undefined; readonly logWebSocketEvents: boolean | undefined; readonly host: string | undefined; @@ -235,7 +235,7 @@ export function createDevRunnerEnv({ serverOffset, webOffset, t3Home, - noBrowser, + browser, autoBootstrapProjectFromCwd, logWebSocketEvents, host, @@ -245,7 +245,8 @@ export function createDevRunnerEnv({ return Effect.gen(function* () { const serverPort = port ?? BASE_SERVER_PORT + serverOffset; const webPort = BASE_WEB_PORT + webOffset; - const resolvedBaseDir = yield* resolveBaseDir(t3Home); + const configuredBaseDir = t3Home?.trim() || baseEnv.T3CODE_HOME?.trim() || undefined; + const resolvedBaseDir = yield* resolveBaseDir(configuredBaseDir); const isDesktopMode = mode === "dev:desktop"; const output: NodeJS.ProcessEnv = { @@ -254,9 +255,14 @@ export function createDevRunnerEnv({ VITE_DEV_SERVER_URL: devUrl?.toString() ?? `http://${isDesktopMode ? DESKTOP_DEV_LOOPBACK_HOST : "localhost"}:${webPort}`, - T3CODE_HOME: resolvedBaseDir, }; + if (configuredBaseDir !== undefined) { + output.T3CODE_HOME = resolvedBaseDir; + } else { + delete output.T3CODE_HOME; + } + if (!isDesktopMode) { output.T3CODE_PORT = String(serverPort); output.VITE_HTTP_URL = `http://localhost:${serverPort}`; @@ -274,10 +280,8 @@ export function createDevRunnerEnv({ output.T3CODE_HOST = host; } - if (!isDesktopMode && noBrowser !== undefined) { - output.T3CODE_NO_BROWSER = noBrowser ? "1" : "0"; - } else if (!isDesktopMode) { - delete output.T3CODE_NO_BROWSER; + if (!isDesktopMode) { + output.T3CODE_NO_BROWSER = browser === true ? "0" : "1"; } if (autoBootstrapProjectFromCwd !== undefined) { @@ -469,7 +473,7 @@ export function resolveModePortOffsets({ interface DevRunnerCliInput { readonly mode: DevMode; readonly t3Home: string | undefined; - readonly noBrowser: boolean | undefined; + readonly browser: boolean | undefined; readonly autoBootstrapProjectFromCwd: boolean | undefined; readonly logWebSocketEvents: boolean | undefined; readonly host: string | undefined; @@ -507,7 +511,7 @@ export function runDevRunnerWithInput(input: DevRunnerCliInput) { serverOffset, webOffset, t3Home: input.t3Home, - noBrowser: input.noBrowser, + browser: input.browser, autoBootstrapProjectFromCwd: input.autoBootstrapProjectFromCwd, logWebSocketEvents: input.logWebSocketEvents, host: input.host, @@ -519,9 +523,10 @@ export function runDevRunnerWithInput(input: DevRunnerCliInput) { serverOffset !== offset || webOffset !== offset ? ` selectedOffset(server=${serverOffset},web=${webOffset})` : ""; + const baseDir = env.T3CODE_HOME ?? (yield* DEFAULT_T3_HOME); yield* Effect.logInfo( - `[dev-runner] mode=${input.mode} source=${source}${selectionSuffix} serverPort=${String(env.T3CODE_PORT)} webPort=${String(env.PORT)} baseDir=${String(env.T3CODE_HOME)}`, + `[dev-runner] mode=${input.mode} source=${source}${selectionSuffix} serverPort=${String(env.T3CODE_PORT)} webPort=${String(env.PORT)} baseDir=${baseDir}`, ); if (input.dryRun) { @@ -586,12 +591,13 @@ const devRunnerCli = Command.make("dev-runner", { Argument.withDescription("Development mode to run."), ), t3Home: Flag.string("home-dir").pipe( - Flag.withDescription("Base directory for all T3 Code data (equivalent to T3CODE_HOME)."), + Flag.withDescription( + "Explicit T3 Code data directory; runtime state is stored under userdata (equivalent to T3CODE_HOME).", + ), Flag.withFallbackConfig(optionalStringConfig("T3CODE_HOME")), ), - noBrowser: Flag.boolean("no-browser").pipe( - Flag.withDescription("Browser auto-open toggle (equivalent to T3CODE_NO_BROWSER)."), - Flag.withFallbackConfig(optionalBooleanConfig("T3CODE_NO_BROWSER")), + browser: Flag.boolean("browser").pipe( + Flag.withDescription("Open a browser automatically (disabled by default for web dev)."), ), autoBootstrapProjectFromCwd: Flag.boolean("auto-bootstrap-project-from-cwd").pipe( Flag.withDescription( From 53e3c98a55237ab7327dc1fb55f1f7cf500560a1 Mon Sep 17 00:00:00 2001 From: maria Date: Sun, 19 Jul 2026 06:35:58 -0400 Subject: [PATCH 21/31] feat(web): themed sidebar header art for nightly and dev builds (#4130) Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge Co-authored-by: Julius Marminge --- apps/web/src/components/AppSidebarLayout.tsx | 24 +- apps/web/src/components/Sidebar.tsx | 57 +++- .../src/components/SidebarStageBackdrop.tsx | 316 ++++++++++++++++++ apps/web/src/index.css | 36 ++ 4 files changed, 413 insertions(+), 20 deletions(-) create mode 100644 apps/web/src/components/SidebarStageBackdrop.tsx diff --git a/apps/web/src/components/AppSidebarLayout.tsx b/apps/web/src/components/AppSidebarLayout.tsx index 07ec0dc90778..587ec65cbc98 100644 --- a/apps/web/src/components/AppSidebarLayout.tsx +++ b/apps/web/src/components/AppSidebarLayout.tsx @@ -4,10 +4,18 @@ import { useLocation, useNavigate } from "@tanstack/react-router"; import { isElectron } from "../env"; import { resolveShortcutCommand, shortcutLabelForCommand } from "../keybindings"; -import { isMacPlatform } from "../lib/utils"; +import { cn, isMacPlatform } from "../lib/utils"; import { primaryServerKeybindingsAtom } from "../state/server"; import ThreadSidebar from "./Sidebar"; -import { Sidebar, SidebarProvider, SidebarRail, SidebarTrigger, useSidebar } from "./ui/sidebar"; +import { useSidebarStageBackdropVariant } from "./SidebarStageBackdrop"; +import { + Sidebar, + SidebarProvider, + SidebarRail, + SidebarTrigger, + useSidebar, + useSidebarVisibility, +} from "./ui/sidebar"; import { Tooltip, TooltipPopup, TooltipTrigger } from "./ui/tooltip"; const THREAD_SIDEBAR_WIDTH_STORAGE_KEY = "chat_thread_sidebar_width"; @@ -18,6 +26,8 @@ const MACOS_TRAFFIC_LIGHTS_LEFT_INSET = "90px"; function SidebarControl() { const keybindings = useAtomValue(primaryServerKeybindingsAtom); const { toggleSidebar } = useSidebar(); + const isSidebarVisible = useSidebarVisibility(); + const stageBackdropVariant = useSidebarStageBackdropVariant(); const shortcutLabel = shortcutLabelForCommand(keybindings, "sidebar.toggle"); useEffect(() => { @@ -42,7 +52,15 @@ function SidebarControl() { + } /> diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 6a76494daa34..38e9f7a828a7 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -77,7 +77,7 @@ import { isElectron } from "../env"; import { APP_STAGE_LABEL } from "../branding"; import { useOpenPrLink } from "../lib/openPullRequestLink"; import { isTerminalFocused } from "../lib/terminalFocus"; -import { isMacPlatform } from "../lib/utils"; +import { cn, isMacPlatform } from "../lib/utils"; import { readThreadShell, useProject, @@ -126,6 +126,7 @@ import { import { stackedThreadToast, toastManager } from "./ui/toast"; import { formatRelativeTimeLabel } from "../timestampFormat"; import { SettingsSidebarNav } from "./settings/SettingsSidebarNav"; +import { SidebarStageBackdrop, resolveSidebarStageBackdropVariant } from "./SidebarStageBackdrop"; import { Kbd } from "./ui/kbd"; import { getArm64IntelBuildWarningDescription, @@ -2744,33 +2745,55 @@ const SidebarChromeHeader = memo(function SidebarChromeHeader({ }: { isElectron: boolean; }) { - return isElectron ? ( - - - - - ) : ( - - - + const stageLabel = useSidebarStageLabel(); + const backdropVariant = resolveSidebarStageBackdropVariant(stageLabel); + + return ( + + {backdropVariant ? : null} + + ); }); -function SidebarBrand() { - const stageLabel = useSidebarStageLabel(); - +function SidebarBrand({ stageLabel, onBackdrop }: { stageLabel: string; onBackdrop: boolean }) { return ( - + Code - + {stageLabel} @@ -2791,7 +2814,7 @@ function T3Wordmark() { return ( diff --git a/apps/web/src/components/SidebarStageBackdrop.tsx b/apps/web/src/components/SidebarStageBackdrop.tsx new file mode 100644 index 000000000000..963a8c2a951b --- /dev/null +++ b/apps/web/src/components/SidebarStageBackdrop.tsx @@ -0,0 +1,316 @@ +import { useAtomValue } from "@effect/atom-react"; + +import { APP_STAGE_LABEL } from "../branding"; +import { resolveServerBackedAppStageLabel } from "../branding.logic"; +import { primaryServerConfigAtom } from "../state/server"; + +export type SidebarStageBackdropVariant = "nightly" | "dev"; + +// A wide viewBox keeps the 96-unit art height at a fixed scale while sidebar resizing reveals +// more horizontal canvas instead of zooming the scene. +const STAGE_BACKDROP_VIEW_BOX = "0 0 8192 96"; + +export function resolveSidebarStageBackdropVariant( + stageLabel: string, +): SidebarStageBackdropVariant | null { + const normalized = stageLabel.trim().toLowerCase(); + if (normalized === "nightly") return "nightly"; + if (normalized === "dev") return "dev"; + return null; +} + +export function useSidebarStageBackdropVariant(): SidebarStageBackdropVariant | null { + const primaryServerVersion = + useAtomValue(primaryServerConfigAtom)?.environment.serverVersion ?? null; + + return resolveSidebarStageBackdropVariant( + resolveServerBackedAppStageLabel({ + primaryServerVersion, + fallbackStageLabel: APP_STAGE_LABEL, + }), + ); +} + +/** Stage-channel header art; palettes mirror the per-channel app icons in `assets/`. */ +export function SidebarStageBackdrop({ variant }: { variant: SidebarStageBackdropVariant }) { + return ( +
    + {variant === "nightly" ? : } +
    + ); +} + +const NIGHTLY_STARS: ReadonlyArray<{ + cx: number; + cy: number; + r: number; + opacity: number; +}> = [ + { cx: 14, cy: 10, r: 0.6, opacity: 0.85 }, + { cx: 38, cy: 22, r: 0.4, opacity: 0.55 }, + { cx: 58, cy: 8, r: 0.5, opacity: 0.7 }, + { cx: 84, cy: 16, r: 0.4, opacity: 0.5 }, + { cx: 104, cy: 7, r: 0.6, opacity: 0.8 }, + { cx: 126, cy: 20, r: 0.4, opacity: 0.55 }, + { cx: 148, cy: 11, r: 0.5, opacity: 0.7 }, + { cx: 170, cy: 24, r: 0.4, opacity: 0.5 }, + { cx: 192, cy: 9, r: 0.6, opacity: 0.8 }, + { cx: 214, cy: 18, r: 0.4, opacity: 0.55 }, + { cx: 236, cy: 8, r: 0.5, opacity: 0.7 }, + { cx: 258, cy: 20, r: 0.45, opacity: 0.6 }, + { cx: 278, cy: 11, r: 0.55, opacity: 0.75 }, + { cx: 26, cy: 34, r: 0.4, opacity: 0.45 }, + { cx: 118, cy: 34, r: 0.4, opacity: 0.45 }, + { cx: 202, cy: 32, r: 0.4, opacity: 0.5 }, + { cx: 268, cy: 34, r: 0.4, opacity: 0.45 }, +]; + +const NIGHTLY_SPARKLES: ReadonlyArray<{ x: number; y: number }> = [ + { x: 70, y: 28 }, + { x: 160, y: 36 }, + { x: 246, y: 26 }, +]; + +function NightlySkyArt() { + return ( + + + + + + + + + + + + + + + + + + + + + + + {NIGHTLY_STARS.map((star) => ( + + ))} + + + {NIGHTLY_SPARKLES.map((sparkle) => ( + + + + + ))} + + + + + + + + + + + + + + + + + + + ); +} + +function DevBlueprintArt() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/apps/web/src/index.css b/apps/web/src/index.css index c500eb68d7f8..77a5f027c139 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -231,6 +231,42 @@ html[data-mobile-composer-route-transition="true"]::view-transition-old(t3-mobil } } + /* Stage-channel sidebar art; ::after ramps to the sidebar bg color and the + mask lets the surface grain show through at the boundary. */ + .sidebar-stage-backdrop { + mask-image: linear-gradient(to bottom, black 0%, black 55%, transparent 92%); + -webkit-mask-image: linear-gradient(to bottom, black 0%, black 55%, transparent 92%); + } + + .sidebar-stage-backdrop::after { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient( + to bottom, + transparent 0%, + transparent 28%, + color-mix(in srgb, var(--app-chrome-background) 10%, transparent) 40%, + color-mix(in srgb, var(--app-chrome-background) 30%, transparent) 52%, + color-mix(in srgb, var(--app-chrome-background) 58%, transparent) 64%, + color-mix(in srgb, var(--app-chrome-background) 82%, transparent) 75%, + color-mix(in srgb, var(--app-chrome-background) 96%, transparent) 85%, + var(--app-chrome-background) 93% + ); + } + + .stage-blueprint { + --stage-bp-top: #67c2ff; + --stage-bp-mid: #347ff8; + --stage-bp-bottom: #1538d0; + } + + .dark .stage-blueprint { + --stage-bp-top: #3a7ad1; + --stage-bp-mid: #2050ae; + --stage-bp-bottom: #101f6e; + } + .workspace-topbar { display: flex; height: var(--workspace-topbar-height); From 7a820abfddbf77166d16614bb9bcabe8fcd2c829 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Sun, 19 Jul 2026 09:59:23 -0700 Subject: [PATCH 22/31] feat: add headless `t3 connect` setup for SSH hosts (#3749) Co-authored-by: Claude Fable 5 Co-authored-by: Julius Marminge Co-authored-by: codex --- .env.example | 4 + .plans/t3-connect-remote-setup.html | 257 +++++++++ apps/server/src/bin.test.ts | 6 +- apps/server/src/cli/connect.test.ts | 42 ++ apps/server/src/cli/connect.ts | 301 ++++++++-- apps/server/src/cloud/CliTokenManager.test.ts | 264 +++++++++ apps/server/src/cloud/CliTokenManager.ts | 351 +++++++++--- apps/server/src/cloud/bootService.test.ts | 529 ++++++++++++++++++ apps/server/src/cloud/bootService.ts | 452 +++++++++++++++ apps/server/src/cloud/cliAuthHtml.test.ts | 13 + apps/server/src/cloud/cliAuthHtml.ts | 140 +++++ apps/server/src/cloud/http.test.ts | 1 + apps/server/src/cloud/publicConfig.test.ts | 35 ++ apps/server/src/cloud/publicConfig.ts | 41 +- apps/server/src/persistence/Migrations.ts | 12 +- apps/server/src/server.ts | 5 +- apps/web/src/cloud/connectCliAuth.test.ts | 69 +++ apps/web/src/cloud/connectCliAuth.ts | 91 +++ apps/web/src/cloud/publicConfig.ts | 2 +- .../src/components/SidebarStageBackdrop.tsx | 6 +- .../src/components/auth/AuthSurfaceShell.tsx | 44 ++ .../cloud/ConnectCliAuthSurface.tsx | 188 +++++++ apps/web/src/hostedPairing.ts | 4 +- apps/web/src/routeTree.gen.ts | 42 ++ apps/web/src/routes/__root.tsx | 2 +- apps/web/src/routes/connect.tsx | 13 + apps/web/src/routes/connect_.callback.tsx | 13 + apps/web/src/vite-env.d.ts | 1 + apps/web/vite.config.ts | 4 + packages/shared/package.json | 4 + packages/shared/src/connectAuth.test.ts | 78 +++ packages/shared/src/connectAuth.ts | 124 ++++ packages/shared/src/hostProcess.ts | 14 + packages/shared/src/remote.ts | 2 +- scripts/lib/public-config.ts | 7 +- 35 files changed, 3017 insertions(+), 144 deletions(-) create mode 100644 .plans/t3-connect-remote-setup.html create mode 100644 apps/server/src/cloud/CliTokenManager.test.ts create mode 100644 apps/server/src/cloud/bootService.test.ts create mode 100644 apps/server/src/cloud/bootService.ts create mode 100644 apps/server/src/cloud/cliAuthHtml.test.ts create mode 100644 apps/server/src/cloud/cliAuthHtml.ts create mode 100644 apps/web/src/cloud/connectCliAuth.test.ts create mode 100644 apps/web/src/cloud/connectCliAuth.ts create mode 100644 apps/web/src/components/auth/AuthSurfaceShell.tsx create mode 100644 apps/web/src/components/cloud/ConnectCliAuthSurface.tsx create mode 100644 apps/web/src/routes/connect.tsx create mode 100644 apps/web/src/routes/connect_.callback.tsx create mode 100644 packages/shared/src/connectAuth.test.ts create mode 100644 packages/shared/src/connectAuth.ts diff --git a/.env.example b/.env.example index 79b2adaf0c8b..61cdd66d246a 100644 --- a/.env.example +++ b/.env.example @@ -18,6 +18,10 @@ # Get this from your relay deployment. `infra/relay` deploys update it automatically. # T3CODE_RELAY_URL=https://relay.example.com +# Optional: hosted app origin used by the CLI's out-of-band OAuth flow. +# Defaults to https://app.t3.codes; override to test against a staging deployment. +# T3CODE_HOSTED_APP_URL=https://nightly.app.t3.codes + # Public, ingest-only mobile OpenTelemetry configuration. # T3CODE_MOBILE_OTLP_TRACES_URL=https://api.axiom.co/v1/traces # T3CODE_MOBILE_OTLP_TRACES_DATASET=t3-code-mobile-traces-dev diff --git a/.plans/t3-connect-remote-setup.html b/.plans/t3-connect-remote-setup.html new file mode 100644 index 000000000000..101c293bee1f --- /dev/null +++ b/.plans/t3-connect-remote-setup.html @@ -0,0 +1,257 @@ + + + + + +Plan: seamless `npx t3 connect` for remote boxes + + + +
    + +

    Seamless npx t3 connect for remote boxes

    +

    Design principle: the smallest diff that ships the UX. No relay/infra changes, no new backend surface, no new auth primitives — every step reuses code that already exists. One PR, built as four phases with clear commit boundaries — each phase compiles, passes tests, and leaves the product working, so the PR reviews commit-by-commit. (Phase 4, web-triggered update, is an optional follow-up PR.)

    + +
    +$ npx t3 connect

    +To set up T3 Connect, open this URL and sign in:
    +  https://app.t3.codes/connect#B64URL_STATE_AND_CHALLENGE

    +Enter your authentication code: [code]

    +Connected as theo@t3.gg!

    +Run T3 Code in the background whenever this machine boots? (y/n): y

    +T3 Code is set up and ready to go. +
    + +

    Why this is a small change

    +

    The entire t3 connect data plane already works: Clerk PKCE token exchange, encrypted secret store, cloudflared relay-client install, relay environment linking, DPoP tokens. The only broken piece on an SSH box is the redirect: CliTokenManager.login() hardcodes a loopback callback (http://127.0.0.1:34338/callback) that requires a browser on the same machine.

    +

    We swap that one leg for a hosted out-of-band authorization page and keep everything else. Because PKCE's code_verifier never leaves the box, the displayed one-time code is useless to anyone who sees it — no new token-minting or storage is needed anywhere.

    + +
    +

    Reused as-is (zero changes)

    +
      +
    • exchangeToken() PKCE exchange — apps/server/src/cloud/CliTokenManager.ts:147
    • +
    • Token persistence in ServerSecretStore (cloud-cli-oauth-token)
    • +
    • acquireRelayClientForLink() cloudflared install + progress — cli/connect.ts:146
    • +
    • CliState.setCliDesiredCloudLink() + server-side provisioning on start
    • +
    • All relay endpoints (infra/relay) and contracts — untouched
    • +
    • Existing subcommands login/link/status/unlink/logout — semantics unchanged
    • +
    • Web app Clerk session + hosted-page precedent (routes/pair.tsx, hostedPairing.ts)
    • +
    +
    + +

    Auth flow (hosted out-of-band OAuth, Clerk PKCE)

    + +
    + + + + + + Remote box — t3 CLI + Laptop — app.t3.codes + Clerk + + + + + + + 1. gen verifier + challenge + state + + + + + 2. user opens /connect#{state,challenge} + + + + + 3. sign in → /oauth/authorize (PKCE) + + + + + 4. redirect /connect/callback?code&state + + + + 5. shows account + authorization code + + + + + 6. user enters code in terminal + + + + + 7. POST /oauth/token {code + verifier} → access/refresh tokens + + + + 8. store token, set desired link, + install relay client → Connected! + +
    The verifier never leaves the box (steps 1→7), so the authorization code is worthless if observed. state/challenge ride the URL fragment — they are not secrets.
    +
    + +
    +

    Details that keep it simple

    +
      +
    • Stateless URL, no short-link service. The /connect page reads state + code_challenge from the URL fragment and builds the Clerk authorize URL client-side. ~100-char URL — fine to transfer into an SSH session.
    • +
    • State check without a backend: the callback page displays one authorization blob of code.state; the CLI splits it and verifies state matches what it generated. One line on each side, preserves the loopback flow's CSRF check.
    • +
    • Phishing is addressed with copy, not code: the callback page shows which account is being connected ("Connecting as theo@…") and warns: "Only enter this code in a terminal session you started yourself." No mechanism needed.
    • +
    • Code expiry is a non-issue: Clerk auth codes live 10 minutes — the same timeout the existing loopback flow already uses. Wrong/expired code → friendly retry that reprints the URL.
    • +
    • One external config step: register https://app.t3.codes/connect/callback as an allowed redirect URI on the existing Clerk CLI OAuth client. No new client, no new scopes.
    • +
    +
    + +

    The phases (one PR, one commit each)

    +

    Ordering is dependency order: each phase is independently revertable and the tree is green at every boundary. Phases 1–3 are the PR; phase 4 ships separately later.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    PhaseScopeFiles~LOC
    1Hosted code page (web-only, purely additive, zero risk). Two static routes modeled on pair.tsx: /connect (ensure Clerk session, then client-side redirect to authorize — it's a static SPA, no server 302) and /connect/callback (validate params, show account + copyable code + safety warning). Both routes guard against non-hosted deployments — redirect to / unless isHostedStaticApp(), same pattern as pair.tsx, since this bundle also ships in local instances. Plus the Clerk dashboard redirect-URI entry.apps/web/src/routes/connect.tsx
    apps/web/src/routes/connect.callback.tsx
    ~200
    2CLI out-of-band OAuth flow + single command. Add an out-of-band OAuth login path to CliTokenManager (print URL, Prompt.text for the code, reuse exchangeToken). Make bare t3 connect a handler = login + link (subcommands untouched). Auto-pick headless mode inside SSH sessions (SSH_CONNECTION/SSH_TTY — nothing else); --headless flag as manual override. Loopback stays the default on desktop — no regression.cloud/CliTokenManager.ts (+60)
    cloud/publicConfig.ts (+10)
    cli/connect.ts (+60)
    ~150
    3Background on boot — Linux first (the SSH case). One new module: pinned runtime install to ~/.t3/runtime/versions/<v> + current symlink, systemd user unit with absolute node/t3 paths, enable-linger. y/n prompt at the end of connect; teardown in logout. Install and service-start failures must land in a log file (under ~/.t3/userdata/logs/) whose path is printed at connect time — systemd user units fail invisibly otherwise. Unit-file generation is pure string-building → trivially testable. macOS launchd / Windows follow as 3b/3c only if wanted.cloud/bootService.ts (new)
    cli/connect.ts (+prompt/teardown)
    ~250
    4Web-triggered update (optional follow-up PR; not part of this one, not needed for the core UX). Web detects daemon version < latest-on-channel using the existing version-skew surface + hosted manifest; one authenticated "update" command — client says update, daemon resolves/verifies the version itself (never client-specified — that would be RCE). Stage install → verify → atomic symlink swap → systemctl --user restart. Progress streams reuse the RelayClientInstallProgressEvent pattern.web banner + one control command + daemon update routinelater
    + +

    Runtime layout (phase 3)

    +
    ~/.t3/runtime/
    +├── versions/0.0.27/        ← npm install --prefix (gets native deps right: node-pty etc.)
    +└── current -> versions/0.0.27
    +
    +~/.config/systemd/user/t3code.service   ← ExecStart=/abs/path/node .../current/.../t3 serve
    +loginctl enable-linger $USER            ← survives SSH logout / reboot
    +

    Why a real npm install and not "reuse the npx binary": the npx cache is ephemeral and t3 ships native deps (node-pty, @ff-labs/fff-node) that need per-platform prebuilds. Why pinned and not npx t3@latest in the unit: a boot-time registry fetch means the box may simply not come up (network down, PATH-less systemd env, nvm). Deterministic boot; updates happen out-of-band (phase 4 follow-up) or by re-running npx t3 connect.

    + +

    Explicitly not doing

    +
      +
    • Relay / infra / contracts changes — none, in any phase
    • +
    • Short-link service (app.t3.codes/c/AB7K) — only matters for hand-typing; revisit if ever needed
    • +
    • RFC 8628 device grant — wrong UX direction, unverified Clerk support
    • +
    • Auto-update loop in the daemon — web-triggered only (phase 4 follow-up), user stays in control
    • +
    • Project auto-registration — workspace assumed set up; the web UI handles the rest
    • +
    • Changing existing loopback flow, subcommands, or desktop behavior
    • +
    + +

    Risks & checks

    +
      +
    • Clerk redirect URI: confirm the CLI OAuth client accepts the hosted redirect and that the token endpoint honors PKCE exchange for codes issued to it. Verify in staging before the phase 2 commit. (Only external dependency in the plan.)
    • +
    • systemd user env is minimal: always write absolute paths for node + t3 into the unit; never rely on PATH. Service failures are invisible by default — hence the phase 3 requirement to log to a printed file path.
    • +
    • Linger prompt honesty: the y/n prompt should say the machine becomes reachable via T3 Connect whenever powered on — that's the feature, but say it.
    • +
    • Re-running connect when linked → idempotent: refresh token, re-confirm service, done.
    • +
    + +

    Decision log

    +
      +
    • Auth: hosted out-of-band OAuth redirect on Clerk PKCE (not relay-brokered pairing, not device grant) — chosen for minimal new surface.
    • +
    • URL: stateless static page, no backend short-link.
    • +
    • Service: real per-user login service (systemd user + linger first); detect + offer install, never silent.
    • +
    • Binary: pinned managed runtime under ~/.t3; interactive npx usage untouched.
    • +
    • Updates: not always-latest; web UI surfaces available updates with one-click trigger (phase 4 follow-up).
    • +
    • Delivery: one PR with a commit per phase (green tree at every boundary), not separate PRs.
    • +
    • Workspace: assumed already set up; no auto-registration.
    • +
    + + + + diff --git a/apps/server/src/bin.test.ts b/apps/server/src/bin.test.ts index 5c713ff2be78..16b7a7f715a4 100644 --- a/apps/server/src/bin.test.ts +++ b/apps/server/src/bin.test.ts @@ -236,7 +236,7 @@ it.layer(NodeServices.layer)("bin cli parsing", (it) => { }), ); - it.effect("logs in to headless connect without enabling access", () => + it.effect("accepts the --headless login override without enabling access", () => Effect.gen(function* () { const baseDir = NodeFS.mkdtempSync( NodePath.join(NodeOS.tmpdir(), "t3-cli-cloud-login-test-"), @@ -254,7 +254,7 @@ it.layer(NodeServices.layer)("bin cli parsing", (it) => { ); const login = yield* captureStdout( - runConnectCli(["connect", "login", "--base-dir", baseDir]), + runConnectCli(["connect", "login", "--base-dir", baseDir, "--headless"]), ); const status = yield* captureStdout( runConnectCli(["connect", "status", "--base-dir", baseDir, "--json"]), @@ -265,7 +265,7 @@ it.layer(NodeServices.layer)("bin cli parsing", (it) => { readonly authenticated: boolean; }; - assert.equal(login.output, "Signed in to T3 Connect."); + assert.equal(login.output, "✓ Signed in"); assert.isFalse(decoded.desired); assert.isTrue(decoded.authenticated); }), diff --git a/apps/server/src/cli/connect.test.ts b/apps/server/src/cli/connect.test.ts index f01c93f05384..e63cbf331b58 100644 --- a/apps/server/src/cli/connect.test.ts +++ b/apps/server/src/cli/connect.test.ts @@ -1,19 +1,45 @@ import * as RelayClient from "@t3tools/shared/relayClient"; import { assert, it } from "@effect/vitest"; import * as Cause from "effect/Cause"; +import * as ConfigProvider from "effect/ConfigProvider"; import * as Console from "effect/Console"; import * as Effect from "effect/Effect"; import * as Exit from "effect/Exit"; import * as Logger from "effect/Logger"; import * as Option from "effect/Option"; import * as References from "effect/References"; +import * as Terminal from "effect/Terminal"; import { acquireRelayClientForLink, + formatHeadlessAuthorizationPrompt, + formatRelayClientReady, + headlessSessionConfig, isPublishAgentActivityEnabledValue, + recoverBootServiceOffer, reportCloudDisconnectResults, } from "./connect.ts"; +it("explains how to complete headless authorization", () => { + assert.equal( + formatHeadlessAuthorizationPrompt("https://example.test/connect"), + [ + "Headless authorization", + "Open this URL on a device with a browser:", + " https://example.test/connect", + "", + "After signing in, return here and enter the code shown in your browser.", + ].join("\n"), + ); +}); + +it("formats relay readiness without printing its installation path", () => { + assert.equal(formatRelayClientReady("2026.5.2"), "✓ Relay client ready · cloudflared 2026.5.2"); +}); + +const readHeadlessSessionConfig = (env: Record) => + headlessSessionConfig.pipe(Effect.provide(ConfigProvider.layer(ConfigProvider.fromEnv({ env })))); + const managedExecutable = { status: "available", executablePath: "/tmp/cloudflared", @@ -21,6 +47,22 @@ const managedExecutable = { version: RelayClient.CLOUDFLARED_VERSION, } as const; +it.effect("detects headless operation from individual SSH config values", () => + Effect.gen(function* () { + assert.isFalse(yield* readHeadlessSessionConfig({})); + assert.isFalse(yield* readHeadlessSessionConfig({ CI: "true" })); + assert.isTrue(yield* readHeadlessSessionConfig({ SSH_CONNECTION: "client server" })); + assert.isTrue(yield* readHeadlessSessionConfig({ SSH_TTY: "/dev/pts/1" })); + }), +); + +it.effect("treats cancelling optional background setup as a successful skip", () => + Effect.gen(function* () { + const result = yield* recoverBootServiceOffer(Effect.fail(new Terminal.QuitError({}))); + assert.isFalse(result); + }), +); + it.effect("does not install the relay client when the user declines the managed download", () => Effect.gen(function* () { let installCalls = 0; diff --git a/apps/server/src/cli/connect.ts b/apps/server/src/cli/connect.ts index d09d08142227..8b11fc733465 100644 --- a/apps/server/src/cli/connect.ts +++ b/apps/server/src/cli/connect.ts @@ -6,9 +6,12 @@ import { } from "@t3tools/contracts"; import { RelayOkResponse } from "@t3tools/contracts/relay"; import * as RelayClient from "@t3tools/shared/relayClient"; +import * as Terminal from "effect/Terminal"; import { withRelayClientTracing } from "@t3tools/shared/relayTracing"; import * as Cause from "effect/Cause"; +import * as Config from "effect/Config"; import * as Console from "effect/Console"; +import * as Crypto from "effect/Crypto"; import * as Duration from "effect/Duration"; import * as Effect from "effect/Effect"; import * as Exit from "effect/Exit"; @@ -16,6 +19,7 @@ import * as FileSystem from "effect/FileSystem"; import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; import * as References from "effect/References"; +import * as Schema from "effect/Schema"; import { Command, Flag, GlobalFlag, Prompt } from "effect/unstable/cli"; import { FetchHttpClient, @@ -25,8 +29,10 @@ import { } from "effect/unstable/http"; import * as HttpApiClient from "effect/unstable/httpapi/HttpApiClient"; +import packageJson from "../../package.json" with { type: "json" }; import * as EnvironmentAuth from "../auth/EnvironmentAuth.ts"; import * as ServerSecretStore from "../auth/ServerSecretStore.ts"; +import * as BootService from "../cloud/bootService.ts"; import * as CliState from "../cloud/CliState.ts"; import * as CliTokenManager from "../cloud/CliTokenManager.ts"; import { @@ -38,6 +44,8 @@ import { relayUrlConfig } from "../cloud/publicConfig.ts"; import { headlessRelayClientTracingLayer } from "../cloud/relayTracing.ts"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; +import * as ExternalLauncher from "../process/externalLauncher.ts"; +import * as ProcessRunner from "../processRunner.ts"; import { readPersistedServerRuntimeState } from "../serverRuntimeState.ts"; import { projectLocationFlags, resolveCliAuthConfig } from "./config.ts"; @@ -46,6 +54,81 @@ const jsonFlag = Flag.boolean("json").pipe( Flag.withDefault(false), ); +const isCloudCliTokenManagerError = Schema.is(CliTokenManager.CloudCliTokenManagerError); + +const headlessFlag = Flag.boolean("headless").pipe( + Flag.withDescription("Authorize without a local browser using out-of-band OAuth."), + Flag.withDefault(false), +); + +/** + * Inside an SSH session there is no local browser to complete the loopback + * OAuth callback, so out-of-band OAuth is the only flow that can work. + */ +export const headlessSessionConfig = Config.all({ + sshConnection: Config.string("SSH_CONNECTION").pipe(Config.option), + sshTty: Config.string("SSH_TTY").pipe(Config.option), +}).pipe( + Config.map(({ sshConnection, sshTty }) => Option.isSome(sshConnection) || Option.isSome(sshTty)), +); + +const promptForOutOfBandOAuthCode = Effect.fn("cloud.cli.prompt_for_out_of_band_oauth_code")( + function* ({ authorizeUrl, validate }: CliTokenManager.OutOfBandOAuthPromptInput) { + yield* Console.log(formatHeadlessAuthorizationPrompt(authorizeUrl)); + return yield* Prompt.run(Prompt.text({ message: "Authorization code", validate })); + }, +); + +export function formatHeadlessAuthorizationPrompt(authorizeUrl: string): string { + return [ + "Headless authorization", + "Open this URL on a device with a browser:", + ` ${authorizeUrl}`, + "", + "After signing in, return here and enter the code shown in your browser.", + ].join("\n"); +} + +/** Returns the connected account identity, if the flow could determine one. */ +const authorizeCli = Effect.fn("cloud.cli.authorize")(function* (options: { + readonly headless: boolean; +}) { + const tokens = yield* CliTokenManager.CloudCliTokenManager; + const useOutOfBandOAuth = options.headless || (yield* headlessSessionConfig); + if (!useOutOfBandOAuth) { + const authorization = yield* tokens.get; + if (authorization._tag === "Authorized") { + return authorization.token.identity ?? null; + } + yield* Console.log("\nHeadless mode enabled. A new authorization link is ready below."); + } + // A stored credential whose refresh fails (revoked, expired grant) must + // fall through to a fresh out-of-band authorization, not dead-end the command. + const existing = yield* tokens.getExisting.pipe( + Effect.catchTag("CloudCliCredentialRefreshError", () => + Console.log( + "The stored T3 Connect credential could not be refreshed; signing in again.", + ).pipe(Effect.as(Option.none())), + ), + ); + if (Option.isSome(existing)) { + return existing.value.identity ?? null; + } + const { token, identity } = yield* CliTokenManager.outOfBandOAuthLogin( + promptForOutOfBandOAuthCode, + ).pipe( + Effect.mapError((cause) => + // Ctrl-C / EOF at the prompt is a QuitError; let it propagate so the CLI + // cancels quietly instead of dumping an authorization error. + Terminal.isQuitError(cause) || isCloudCliTokenManagerError(cause) + ? cause + : new CliTokenManager.CloudCliAuthorizationError({ cause }), + ), + ); + yield* tokens.store(token); + return identity; +}); + function bytesToString(value: Uint8Array): string { return new TextDecoder().decode(value); } @@ -313,6 +396,21 @@ const disconnectCloud = Effect.fn("cloud.cli.disconnect")(function* (options: { if (options.clearAuthorization) { const tokens = yield* CliTokenManager.CloudCliTokenManager; yield* tokens.clear; + + // uninstall itself no-ops when nothing is installed (and on non-Linux), + // so no status pre-check that could mask a real removal failure. + const bootService = yield* BootService.BootService; + yield* bootService.uninstall.pipe( + Effect.tap((removed) => + removed ? Console.log("Removed the T3 Code background service.") : Effect.void, + ), + Effect.catchTag("BootServiceUnsupportedError", () => Effect.succeed(false)), + Effect.catch((error) => + Console.warn(`Could not remove the background service: ${error.message}`).pipe( + Effect.as(false), + ), + ), + ); } yield* reportCloudDisconnectResults({ @@ -326,7 +424,7 @@ const disconnectCloud = Effect.fn("cloud.cli.disconnect")(function* (options: { } }); -const runCloudCommand = ( +const runCloudCommand = Effect.fn("cloud.cli.run_cloud_command")(function* ( flags: { readonly baseDir: Option.Option }, run: Effect.Effect< A, @@ -335,6 +433,8 @@ const runCloudCommand = ( | CliTokenManager.CloudCliTokenManager | RelayClient.RelayClient | EnvironmentAuth.EnvironmentAuth + | BootService.BootService + | Crypto.Crypto | FileSystem.FileSystem | HttpClient.HttpClient | Prompt.Environment @@ -344,37 +444,79 @@ const runCloudCommand = ( options?: { readonly quietLogs?: boolean; }, -) => - Effect.gen(function* () { - const logLevel = yield* GlobalFlag.LogLevel; - const config = yield* resolveCliAuthConfig(flags, logLevel); - const minimumLogLevel = options?.quietLogs ? "Error" : config.logLevel; - const runtimeLayer = Layer.mergeAll( - ServerSecretStore.layer, - CliTokenManager.layer.pipe(Layer.provide(ServerSecretStore.layer)), - RelayClient.layerCloudflared({ baseDir: config.baseDir }), - EnvironmentAuth.runtimeLayer, - ServerEnvironment.layer, - headlessRelayClientTracingLayer, - ).pipe( - Layer.provideMerge(FetchHttpClient.layer), - Layer.provideMerge(ServerConfig.layer(config)), - Layer.provide(Layer.succeed(References.MinimumLogLevel, minimumLogLevel)), +) { + const logLevel = yield* GlobalFlag.LogLevel; + const config = yield* resolveCliAuthConfig(flags, logLevel); + const minimumLogLevel = options?.quietLogs ? "Error" : config.logLevel; + const runtimeLayer = Layer.mergeAll( + ServerSecretStore.layer, + CliTokenManager.layer.pipe( + Layer.provide(ServerSecretStore.layer), + Layer.provide(ExternalLauncher.layer), + ), + RelayClient.layerCloudflared({ baseDir: config.baseDir }), + EnvironmentAuth.runtimeLayer, + ServerEnvironment.layer, + BootService.layer({ + baseDir: config.baseDir, + logsDir: config.logsDir, + cliVersion: packageJson.version, + }).pipe(Layer.provide(ProcessRunner.layer)), + headlessRelayClientTracingLayer, + ).pipe( + Layer.provideMerge(FetchHttpClient.layer), + Layer.provideMerge(ServerConfig.layer(config)), + Layer.provide(Layer.succeed(References.MinimumLogLevel, minimumLogLevel)), + ); + return yield* run.pipe(Effect.provide(runtimeLayer)); +}); + +const connectedAs = (identity: string | null): string => (identity ? ` as ${identity}` : ""); + +export function formatRelayClientReady(version: string): string { + return `✓ Relay client ready · cloudflared ${version}`; +} + +const linkEnvironmentForConnect = Effect.fn("cloud.cli.link_environment")(function* (options: { + readonly headless: boolean; + readonly publishOnly?: boolean; +}) { + const publishOnly = options.publishOnly ?? false; + if (!publishOnly) { + const relayClient = yield* RelayClient.RelayClient; + const installed = yield* acquireRelayClientForLink( + relayClient, + confirmRelayClientInstall, + reportRelayClientInstallProgress, ); - return yield* run.pipe(Effect.provide(runtimeLayer)); - }); + if (Option.isNone(installed)) { + yield* Console.log("T3 Connect setup cancelled. The relay client was not installed."); + return null; + } + yield* Console.log(formatRelayClientReady(installed.value.version)); + } + + const identity = yield* authorizeCli(options); + yield* CliState.setCliDesiredCloudLink(true, publishOnly ? "publish_only" : "managed"); + if (publishOnly) { + const secrets = yield* ServerSecretStore.ServerSecretStore; + yield* secrets.set(PUBLISH_AGENT_ACTIVITY_SECRET, stringToBytes("true")); + } + return { identity } as const; +}); const connectLoginCommand = Command.make("login", { ...projectLocationFlags, + headless: headlessFlag, }).pipe( Command.withDescription("Authorize the T3 Connect CLI without enabling remote access."), Command.withHandler((flags) => runCloudCommand( flags, Effect.gen(function* () { - const tokens = yield* CliTokenManager.CloudCliTokenManager; - yield* tokens.get; - yield* Console.log("Signed in to T3 Connect."); + yield* Console.log("T3 Connect\n"); + const identity = yield* authorizeCli(flags); + yield* Console.log(`✓ Signed in${connectedAs(identity)}`); }), ), ), @@ -382,6 +524,7 @@ const connectLoginCommand = Command.make("login", { const connectLinkCommand = Command.make("link", { ...projectLocationFlags, + headless: headlessFlag, publishOnly: Flag.boolean("publish-only").pipe( Flag.withDescription( "Link to publish agent activity only — no managed tunnel. Reach this environment out of band (e.g. Tailscale).", @@ -394,41 +537,15 @@ const connectLinkCommand = Command.make("link", { runCloudCommand( flags, Effect.gen(function* () { - // A publish-only link needs no Cloudflare tunnel, so skip installing the - // relay client entirely. - if (!flags.publishOnly) { - const relayClient = yield* RelayClient.RelayClient; - const installed = yield* acquireRelayClientForLink( - relayClient, - confirmRelayClientInstall, - reportRelayClientInstallProgress, - ); - if (Option.isNone(installed)) { - yield* Console.log("T3 Connect setup cancelled. The relay client was not installed."); - return; - } + yield* Console.log("T3 Connect\n"); + const linked = yield* linkEnvironmentForConnect(flags); + if (linked) { yield* Console.log( - `Using relay client ${installed.value.version} from ${installed.value.executablePath}.`, + flags.publishOnly + ? `✓ Authorized${connectedAs(linked.identity)}\n\nNext\n Start T3 to publish agent activity (no managed tunnel).` + : `✓ Authorized${connectedAs(linked.identity)}\n\nNext\n Start the server with \`t3 serve\` to make this machine reachable.`, ); } - - const tokens = yield* CliTokenManager.CloudCliTokenManager; - yield* tokens.get; - yield* CliState.setCliDesiredCloudLink( - true, - flags.publishOnly ? "publish_only" : "managed", - ); - if (flags.publishOnly) { - // A publish-only link exists solely to publish; without the publish - // flag the link would be inert and the success message a lie. - const secrets = yield* ServerSecretStore.ServerSecretStore; - yield* secrets.set(PUBLISH_AGENT_ACTIVITY_SECRET, stringToBytes("true")); - } - yield* Console.log( - flags.publishOnly - ? "This environment will publish agent activity to your mobile clients the next time T3 starts (no managed tunnel)." - : "This T3 environment will be available through T3 Connect the next time T3 starts.", - ); }), ), ), @@ -566,8 +683,80 @@ const connectLogoutCommand = Command.make("logout", { ), ); -export const connectCommand = Command.make("connect").pipe( - Command.withDescription("Manage headless T3 Connect access."), +const offerBootService = Effect.gen(function* () { + const bootService = yield* BootService.BootService; + const { supported, installed, current } = yield* bootService.status; + if (!supported) { + // Don't prompt for something that can only fail; background setup is + // Linux/systemd-only for now. + return false; + } + if (installed && current) { + yield* Console.log("T3 Code is already set up to run in the background on this machine."); + return true; + } + const wanted = yield* Prompt.run( + Prompt.confirm({ + message: installed + ? "The installed T3 Code background service is from an older setup. Update it now?" + : "Run T3 Code in the background whenever this machine boots? " + + "It stays reachable through T3 Connect even after you log out.", + initial: true, + }), + ); + if (!wanted) { + return false; + } + const plan = yield* bootService.install; + yield* Console.log(`Background service installed. Logs: ${plan.logPath}`); + return true; +}); + +export const recoverBootServiceOffer = ( + offer: Effect.Effect, +) => + offer.pipe( + Effect.catchTags({ + QuitError: () => Effect.succeed(false), + BootServiceUnsupportedError: (error) => + Console.log(`Skipping background setup: ${error.message}`).pipe(Effect.as(false)), + BootServiceCommandError: (error) => + Console.warn(`Background setup did not finish: ${error.message}`).pipe(Effect.as(false)), + BootServiceInstallError: (error) => + Console.warn(`Background setup did not finish: ${error.message}`).pipe(Effect.as(false)), + }), + ); + +export const connectCommand = Command.make("connect", { + ...projectLocationFlags, + headless: headlessFlag, +}).pipe( + Command.withDescription("Set up T3 Connect for this machine."), + Command.withHandler((flags) => + runCloudCommand( + flags, + Effect.gen(function* () { + yield* Console.log("T3 Connect\n"); + const linked = yield* linkEnvironmentForConnect(flags); + if (!linked) { + return; + } + // Show which account was linked so an unexpected identity (an + // authorization code for a different account) is visible before the + // machine is brought online. + yield* Console.log(`✓ Connected${connectedAs(linked.identity)}`); + + // Connect itself already succeeded; a boot-service failure must not + // fail the command, just tell the user what happened and move on. + const background = yield* recoverBootServiceOffer(offerBootService); + yield* Console.log( + background + ? "\n✓ Background service ready\n\nT3 Code will stay reachable after you log out." + : "\nNext\n Start the server with `t3 serve` to make this machine reachable.", + ); + }), + ), + ), Command.withSubcommands([ connectLoginCommand, connectLinkCommand, diff --git a/apps/server/src/cloud/CliTokenManager.test.ts b/apps/server/src/cloud/CliTokenManager.test.ts new file mode 100644 index 000000000000..e6eb6b7cd6fd --- /dev/null +++ b/apps/server/src/cloud/CliTokenManager.test.ts @@ -0,0 +1,264 @@ +import { readConnectAuthorizeRequest } from "@t3tools/shared/connectAuth"; +import * as NodeServices from "@effect/platform-node/NodeServices"; +import { assert, it } from "@effect/vitest"; +import * as ConfigProvider from "effect/ConfigProvider"; +import * as Crypto from "effect/Crypto"; +import * as Deferred from "effect/Deferred"; +import * as Effect from "effect/Effect"; +import * as Encoding from "effect/Encoding"; +import * as Layer from "effect/Layer"; +import * as Option from "effect/Option"; +import * as Queue from "effect/Queue"; +import * as Schema from "effect/Schema"; +import * as Terminal from "effect/Terminal"; +import * as HttpClient from "effect/unstable/http/HttpClient"; +import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse"; + +import * as CliTokenManager from "./CliTokenManager.ts"; +import type { OutOfBandOAuthPromptInput } from "./CliTokenManager.ts"; + +// pk_test_ +const TEST_ENV = { + T3CODE_CLERK_PUBLISHABLE_KEY: "pk_test_Y2xlcmsuZXhhbXBsZS50ZXN0JA==", + T3CODE_CLERK_CLI_OAUTH_CLIENT_ID: "oauth_client_test", + T3CODE_HOSTED_APP_URL: "https://hosted.example.test", +}; + +interface RecordedTokenRequest { + readonly url: string; + readonly params: URLSearchParams; +} + +// A JWT whose payload claims { email: "theo@example.test" } (signature is not +// verified — the CLI only reads the claim to display the connected account). +const TestIdTokenHeaderJson = Schema.fromJsonString(Schema.Struct({ alg: Schema.Literal("none") })); +const TestIdTokenPayloadJson = Schema.fromJsonString(Schema.Struct({ email: Schema.String })); +const encodeTestIdTokenHeader = Schema.encodeSync(TestIdTokenHeaderJson); +const encodeTestIdTokenPayload = Schema.encodeSync(TestIdTokenPayloadJson); +const idTokenWithEmail = (() => { + const header = Encoding.encodeBase64Url(encodeTestIdTokenHeader({ alg: "none" })); + const payload = Encoding.encodeBase64Url( + encodeTestIdTokenPayload({ email: "theo@example.test" }), + ); + return `${header}.${payload}.`; +})(); + +const TestTokenResponseJson = Schema.fromJsonString( + Schema.Struct({ + access_token: Schema.String, + refresh_token: Schema.String, + id_token: Schema.String, + expires_in: Schema.Number, + token_type: Schema.String, + }), +); +const encodeTestTokenResponse = Schema.encodeSync(TestTokenResponseJson); + +const makeTokenEndpointLayer = ( + requests: Array, + options?: { readonly idToken?: string }, +) => + Layer.succeed( + HttpClient.HttpClient, + HttpClient.make((request) => + Effect.sync(() => { + const body = + request.body._tag === "Uint8Array" ? new TextDecoder().decode(request.body.body) : ""; + requests.push({ url: request.url, params: new URLSearchParams(body) }); + return HttpClientResponse.fromWeb( + request, + new Response( + encodeTestTokenResponse({ + access_token: "access-token-1", + refresh_token: "refresh-token-1", + id_token: options?.idToken ?? idTokenWithEmail, + expires_in: 3600, + token_type: "bearer", + }), + { status: 200, headers: { "content-type": "application/json" } }, + ), + ); + }), + ), + ); + +const provideTestEnv = Effect.provide( + ConfigProvider.layer(ConfigProvider.fromEnv({ env: TEST_ENV })), +); + +const isAuthorizationError = Schema.is(CliTokenManager.CloudCliAuthorizationError); + +class PromptRejectedError extends Schema.TaggedErrorClass()( + "PromptRejectedError", + { message: Schema.String }, +) {} + +it("formats loopback authorization with a headless-host fallback", () => { + assert.equal( + CliTokenManager.formatLoopbackAuthorizationPrompt("https://clerk.example.test/authorize"), + [ + "Open this URL to authorize T3 Connect:", + " https://clerk.example.test/authorize", + "", + "Press \u001b[1mEnter\u001b[22m to open it in your browser.", + "No browser on this device? Press \u001b[1mH\u001b[22m to switch to headless mode.", + ].join("\n"), + ); +}); + +const makeTestTerminal = (queue: Queue.Queue) => + Terminal.make({ + columns: Effect.succeed(80), + rows: Effect.succeed(24), + readInput: Effect.succeed(Queue.asDequeue(queue)), + readLine: Effect.never, + display: () => Effect.void, + }); + +const userInput = (name: string): Terminal.UserInput => ({ + input: Option.some(name), + key: { name, ctrl: false, meta: false, shift: name !== name.toLowerCase() }, +}); + +it.effect("opens the browser on Enter and switches the active flow on H", () => + Effect.gen(function* () { + const queue = yield* Queue.make(); + yield* Queue.offerAll(queue, [userInput("enter"), userInput("H")]); + const opened: Array = []; + + const result = yield* CliTokenManager.waitForLoopbackAuthorization({ + authorizationUrl: "https://clerk.example.test/authorize", + callback: Effect.never, + terminal: makeTestTerminal(queue), + launchBrowser: (url) => + Effect.sync(() => { + opened.push(url); + }), + }); + + assert.deepEqual(opened, ["https://clerk.example.test/authorize"]); + assert.deepEqual(result, { _tag: "HeadlessRequested" }); + }), +); + +it.effect("finishes normally when the browser callback wins", () => + Effect.gen(function* () { + const queue = yield* Queue.make(); + const callback = yield* Deferred.make(); + yield* Deferred.succeed(callback, "clerk-code-123"); + + const result = yield* CliTokenManager.waitForLoopbackAuthorization({ + authorizationUrl: "https://clerk.example.test/authorize", + callback: Deferred.await(callback), + terminal: makeTestTerminal(queue), + launchBrowser: () => Effect.die("browser launch should not run"), + }); + + assert.deepEqual(result, { _tag: "AuthorizationCode", code: "clerk-code-123" }); + }), +); + +it.layer(NodeServices.layer)("CliTokenManager.outOfBandOAuthLogin", (it) => { + it.effect("prints a hosted authorize URL and exchanges the out-of-band code with PKCE", () => + Effect.gen(function* () { + const requests: Array = []; + let seenAuthorizeUrl = ""; + + const { token, identity } = yield* CliTokenManager.outOfBandOAuthLogin( + ({ authorizeUrl, validate }: OutOfBandOAuthPromptInput) => + Effect.gen(function* () { + seenAuthorizeUrl = authorizeUrl; + const request = readConnectAuthorizeRequest(new URL(authorizeUrl)); + assert.isNotNull(request); + return yield* validate(`clerk-code-123.${request!.state}`).pipe( + Effect.mapError((message) => new PromptRejectedError({ message })), + ); + }), + ).pipe(Effect.provide(makeTokenEndpointLayer(requests)), provideTestEnv); + + const authorizeUrl = new URL(seenAuthorizeUrl); + assert.equal(authorizeUrl.origin, "https://hosted.example.test"); + assert.equal(authorizeUrl.pathname, "/connect"); + const request = readConnectAuthorizeRequest(authorizeUrl); + assert.isNotNull(request); + assert.match(request!.state, /^[A-Za-z0-9_-]{22}$/); + + assert.equal(token.accessToken, "access-token-1"); + assert.equal(token.refreshToken, "refresh-token-1"); + assert.equal(token.identity, "theo@example.test"); + // The id_token's email claim is surfaced so connect can show the account. + assert.equal(identity, "theo@example.test"); + + assert.lengthOf(requests, 1); + const exchange = requests[0]!; + assert.equal(exchange.url, "https://clerk.example.test/oauth/token"); + assert.equal(exchange.params.get("grant_type"), "authorization_code"); + assert.equal(exchange.params.get("code"), "clerk-code-123"); + assert.equal( + exchange.params.get("redirect_uri"), + "https://hosted.example.test/connect/callback", + ); + assert.equal(exchange.params.get("client_id"), "oauth_client_test"); + // The verifier must hash to the challenge advertised in the authorize URL. + const verifier = exchange.params.get("code_verifier"); + assert.isNotNull(verifier); + const crypto = yield* Crypto.Crypto; + const digest = yield* crypto.digest("SHA-256", new TextEncoder().encode(verifier!)); + assert.equal(Encoding.encodeBase64Url(digest), request!.challenge); + }), + ); + + it.effect("rejects out-of-band codes whose state does not match the request", () => + Effect.gen(function* () { + const requests: Array = []; + + const validationErrors: Array = []; + const result = yield* CliTokenManager.outOfBandOAuthLogin( + ({ validate }: OutOfBandOAuthPromptInput) => + validate("clerk-code-123.wrong-state").pipe( + Effect.tapError((message) => Effect.sync(() => validationErrors.push(message))), + Effect.mapError((message) => new PromptRejectedError({ message })), + ), + ).pipe(Effect.provide(makeTokenEndpointLayer(requests)), provideTestEnv, Effect.flip); + + assert.lengthOf(requests, 0); + assert.lengthOf(validationErrors, 1); + assert.include(validationErrors[0], "different connect request"); + assert.instanceOf(result, PromptRejectedError); + }), + ); + + it.effect("ignores an id_token whose claims are not valid JSON", () => + Effect.gen(function* () { + const requests: Array = []; + const malformedIdToken = `header.${Encoding.encodeBase64Url("not-json")}.signature`; + + const { identity } = yield* CliTokenManager.outOfBandOAuthLogin( + ({ authorizeUrl }: OutOfBandOAuthPromptInput) => { + const request = readConnectAuthorizeRequest(new URL(authorizeUrl)); + assert.isNotNull(request); + return Effect.succeed(`clerk-code-123.${request!.state}`); + }, + ).pipe( + Effect.provide(makeTokenEndpointLayer(requests, { idToken: malformedIdToken })), + provideTestEnv, + ); + + assert.isNull(identity); + assert.lengthOf(requests, 1); + }), + ); + + it.effect("fails without touching the token endpoint when the prompt returns garbage", () => + Effect.gen(function* () { + const requests: Array = []; + + const result = yield* CliTokenManager.outOfBandOAuthLogin(() => + Effect.succeed("not-a-connect-code"), + ).pipe(Effect.provide(makeTokenEndpointLayer(requests)), provideTestEnv, Effect.flip); + + assert.lengthOf(requests, 0); + assert.isTrue(isAuthorizationError(result)); + }), + ); +}); diff --git a/apps/server/src/cloud/CliTokenManager.ts b/apps/server/src/cloud/CliTokenManager.ts index 00709370b269..f01599bb96fa 100644 --- a/apps/server/src/cloud/CliTokenManager.ts +++ b/apps/server/src/cloud/CliTokenManager.ts @@ -3,6 +3,7 @@ import * as NodeHttp from "node:http"; import * as NodeHttpServer from "@effect/platform-node/NodeHttpServer"; import * as Clock from "effect/Clock"; +import * as Cause from "effect/Cause"; import * as Console from "effect/Console"; import * as Context from "effect/Context"; import * as Crypto from "effect/Crypto"; @@ -12,8 +13,10 @@ import * as Effect from "effect/Effect"; import * as Encoding from "effect/Encoding"; import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; +import * as Queue from "effect/Queue"; import * as Schema from "effect/Schema"; import * as Semaphore from "effect/Semaphore"; +import * as Terminal from "effect/Terminal"; import * as HttpClient from "effect/unstable/http/HttpClient"; import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest"; import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse"; @@ -21,19 +24,105 @@ import * as HttpRouter from "effect/unstable/http/HttpRouter"; import * as HttpServerRequest from "effect/unstable/http/HttpServerRequest"; import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse"; +import { + buildConnectAuthorizeRequestUrl, + buildConnectClerkAuthorizeUrl, + checkConnectAuthCode, + connectCallbackUrl, +} from "@t3tools/shared/connectAuth"; + import * as ServerSecretStore from "../auth/ServerSecretStore.ts"; -import { cloudCliOAuthConfig, type CloudCliOAuthConfig } from "./publicConfig.ts"; +import * as ExternalLauncher from "../process/externalLauncher.ts"; +import { + cloudCliOAuthConfig, + hostedAppUrlConfig, + type CloudCliOAuthConfig, +} from "./publicConfig.ts"; +import { renderLoopbackAuthorizationCompleteHtml } from "./cliAuthHtml.ts"; const CLOUD_CLI_OAUTH_TOKEN_SECRET = "cloud-cli-oauth-token"; const CLOUD_CLI_OAUTH_CALLBACK_TIMEOUT = Duration.minutes(10); const CLOUD_CLI_OAUTH_REFRESH_EARLY_MS = Duration.toMillis(Duration.minutes(5)); +const boldTerminalText = (value: string): string => `\u001b[1m${value}\u001b[22m`; + +export function formatLoopbackAuthorizationPrompt(authorizationUrl: string): string { + return [ + "Open this URL to authorize T3 Connect:", + ` ${authorizationUrl}`, + "", + `Press ${boldTerminalText("Enter")} to open it in your browser.`, + `No browser on this device? Press ${boldTerminalText("H")} to switch to headless mode.`, + ].join("\n"); +} + +export type LoopbackAuthorizationResult = + | { readonly _tag: "AuthorizationCode"; readonly code: string } + | { readonly _tag: "HeadlessRequested" }; + +const readLoopbackAuthorizationAction = Effect.fn( + "cloud.cli_token.read_loopback_authorization_action", +)(function* (input: Queue.Dequeue) { + while (true) { + const event = yield* Queue.take(input).pipe(Effect.mapError(() => new Terminal.QuitError({}))); + const keyName = event.key.name.toLowerCase(); + if (!event.key.ctrl && !event.key.meta && keyName === "h") { + return "headless" as const; + } + if (keyName === "enter" || keyName === "return") { + return "open-browser" as const; + } + } +}); + +export const waitForLoopbackAuthorization = Effect.fn( + "cloud.cli_token.wait_for_loopback_authorization", +)(function* (input: { + readonly authorizationUrl: string; + readonly callback: Effect.Effect; + readonly terminal: Terminal.Terminal; + readonly launchBrowser: ( + url: string, + ) => Effect.Effect; +}) { + return yield* Effect.scoped( + Effect.gen(function* () { + const terminalInput = yield* input.terminal.readInput; + while (true) { + const result = yield* Effect.raceFirst( + input.callback.pipe( + Effect.map( + (code): LoopbackAuthorizationResult => ({ _tag: "AuthorizationCode", code }), + ), + ), + readLoopbackAuthorizationAction(terminalInput), + ); + if (typeof result !== "string") { + return result; + } + if (result === "headless") { + return { _tag: "HeadlessRequested" } as const; + } + yield* input + .launchBrowser(input.authorizationUrl) + .pipe( + Effect.catch(() => + Console.warn( + `Could not open a browser on this device. Open the URL above manually, or press ${boldTerminalText("H")} to switch to headless mode.`, + ), + ), + ); + } + }), + ); +}); const PersistedToken = Schema.Struct({ accessToken: Schema.String, refreshToken: Schema.String, expiresAtEpochMs: Schema.Number, + identity: Schema.optional(Schema.String), }); -type PersistedToken = typeof PersistedToken.Type; +export type PersistedToken = typeof PersistedToken.Type; const PersistedTokenJson = Schema.fromJsonString(PersistedToken); const decodePersistedToken = Schema.decodeUnknownEffect(PersistedTokenJson); @@ -42,10 +131,39 @@ const encodePersistedToken = Schema.encodeEffect(PersistedTokenJson); const OAuthTokenResponse = Schema.Struct({ access_token: Schema.String, refresh_token: Schema.optional(Schema.String), + id_token: Schema.optional(Schema.String), expires_in: Schema.Number, token_type: Schema.String, }); +const OidcIdentityClaimsJson = Schema.fromJsonString( + Schema.Struct({ + email: Schema.optional(Schema.String), + preferred_username: Schema.optional(Schema.String), + sub: Schema.optional(Schema.String), + }), +); +const decodeOidcIdentityClaimsJson = Schema.decodeUnknownOption(OidcIdentityClaimsJson); + +/** + * Best-effort read of the `email` (or fallback) claim from an OIDC id_token. + * Only used to show the operator which account they linked, so a malformed + * token degrades to "no identity" rather than an error. + */ +function idTokenIdentity(idToken: string | undefined): string | null { + if (!idToken) return null; + const payload = idToken.split(".")[1]; + if (!payload) return null; + const decoded = Encoding.decodeBase64UrlString(payload); + if (decoded._tag !== "Success") return null; + const claims = decodeOidcIdentityClaimsJson(decoded.success); + if (Option.isNone(claims)) return null; + for (const value of [claims.value.email, claims.value.preferred_username, claims.value.sub]) { + if (typeof value === "string" && value.length > 0) return value; + } + return null; +} + export class CloudCliCredentialRemovalError extends Schema.TaggedErrorClass()( "CloudCliCredentialRemovalError", { cause: Schema.Defect() }, @@ -103,18 +221,18 @@ export type CloudCliTokenManagerError = typeof CloudCliTokenManagerError.Type; export class CloudCliTokenManager extends Context.Service< CloudCliTokenManager, { - readonly get: Effect.Effect; + readonly get: Effect.Effect< + | { readonly _tag: "Authorized"; readonly token: PersistedToken } + | { readonly _tag: "HeadlessRequested" }, + CloudCliTokenManagerError | Terminal.QuitError + >; readonly getExisting: Effect.Effect, CloudCliTokenManagerError>; readonly hasCredential: Effect.Effect; + readonly store: (token: PersistedToken) => Effect.Effect; readonly clear: Effect.Effect; } >()("t3/cloud/CliTokenManager/CloudCliTokenManager") {} -const wrapError = - (makeError: (cause: unknown) => WrappedError) => - (effect: Effect.Effect): Effect.Effect => - effect.pipe(Effect.mapError(makeError)); - function stringToBytes(value: string): Uint8Array { return new TextEncoder().encode(value); } @@ -123,10 +241,101 @@ function bytesToString(value: Uint8Array): string { return new TextDecoder().decode(value); } +const exchangeToken = Effect.fn("cloud.cli_token.exchange")(function* ( + metadata: Pick, + params: Record, +) { + const httpClient = (yield* HttpClient.HttpClient).pipe(HttpClient.filterStatusOk); + const response = yield* HttpClientRequest.post(metadata.tokenEndpoint).pipe( + HttpClientRequest.bodyUrlParams(params), + httpClient.execute, + Effect.flatMap(HttpClientResponse.schemaBodyJson(OAuthTokenResponse)), + ); + const now = yield* Clock.currentTimeMillis; + const identity = idTokenIdentity(response.id_token); + return { + token: { + accessToken: response.access_token, + refreshToken: response.refresh_token ?? params.refresh_token ?? "", + expiresAtEpochMs: now + response.expires_in * 1_000, + ...(identity === null ? {} : { identity }), + } satisfies PersistedToken, + identity, + }; +}); + +const makePkceRequest = Effect.gen(function* () { + const crypto = yield* Crypto.Crypto; + const verifier = Encoding.encodeBase64Url(yield* crypto.randomBytes(32)); + const challenge = Encoding.encodeBase64Url( + yield* crypto.digest("SHA-256", new TextEncoder().encode(verifier)), + ); + const state = Encoding.encodeBase64Url(yield* crypto.randomBytes(16)); + return { verifier, challenge, state }; +}); + +export interface OutOfBandOAuthPromptInput { + readonly authorizeUrl: string; + readonly validate: (value: string) => Effect.Effect; +} + +/** + * Out-of-band OAuth for machines without a local browser (SSH). The user + * opens the hosted /connect URL elsewhere, signs in, and enters the displayed + * code in this terminal. The PKCE verifier never leaves this process, so the + * authorization code is useless to an observer, and the state bundled into + * the blob preserves the loopback flow's CSRF check. + */ +export const outOfBandOAuthLogin = Effect.fn("cloud.cli_token.out_of_band_oauth_login")(function* < + E, + R, +>(promptForCode: (input: OutOfBandOAuthPromptInput) => Effect.Effect) { + const metadata = yield* cloudCliOAuthConfig; + const hostedAppUrl = yield* hostedAppUrlConfig; + const { verifier, challenge, state } = yield* makePkceRequest; + + const authorizationCode = yield* promptForCode({ + authorizeUrl: buildConnectAuthorizeRequestUrl({ hostedAppUrl, state, challenge }), + validate: (value) => { + const checked = checkConnectAuthCode(value, state); + return typeof checked === "string" ? Effect.fail(checked) : Effect.succeed(value); + }, + }).pipe( + // Clerk authorization codes expire on this horizon anyway; matching the + // loopback flow's timeout turns an abandoned prompt into a clear error. + Effect.timeout(CLOUD_CLI_OAUTH_CALLBACK_TIMEOUT), + Effect.catchTag("TimeoutError", (cause) => + Effect.fail(new CloudCliAuthorizationTimeoutError({ cause })), + ), + ); + // promptForCode is caller-supplied, so re-check the returned value rather + // than trusting that the prompt ran validate. + const authCode = checkConnectAuthCode(authorizationCode, state); + if (typeof authCode === "string") { + return yield* new CloudCliAuthorizationError({ cause: authCode }); + } + + return yield* exchangeToken(metadata, { + grant_type: "authorization_code", + code: authCode.code, + redirect_uri: connectCallbackUrl(hostedAppUrl), + client_id: metadata.clientId, + code_verifier: verifier, + }); +}); + export const make = Effect.gen(function* () { + // Capture exactly the services the login/refresh flows need at build time + // (matching the behavior before the out-of-band flow captured the instances), not + // the whole ambient context. const crypto = yield* Crypto.Crypto; - const httpClient = (yield* HttpClient.HttpClient).pipe(HttpClient.filterStatusOk); + const httpClient = yield* HttpClient.HttpClient; + const services = Context.make(Crypto.Crypto, crypto).pipe( + Context.add(HttpClient.HttpClient, httpClient), + ); const secrets = yield* ServerSecretStore.ServerSecretStore; + const terminal = yield* Terminal.Terminal; + const externalLauncher = yield* ExternalLauncher.ExternalLauncher; const semaphore = yield* Semaphore.make(1); const persist = Effect.fn("cloud.cli_token.persist")(function* (token: PersistedToken) { const encoded = yield* encodePersistedToken(token); @@ -136,7 +345,7 @@ export const make = Effect.gen(function* () { const clear = secrets .remove(CLOUD_CLI_OAUTH_TOKEN_SECRET) - .pipe(wrapError((cause) => new CloudCliCredentialRemovalError({ cause }))); + .pipe(Effect.mapError((cause) => new CloudCliCredentialRemovalError({ cause }))); const read = Effect.fn("cloud.cli_token.read")(function* () { const encoded = yield* secrets.get(CLOUD_CLI_OAUTH_TOKEN_SECRET); @@ -144,39 +353,21 @@ export const make = Effect.gen(function* () { return Option.some(yield* decodePersistedToken(bytesToString(encoded.value))); }); - const exchangeToken = Effect.fn("cloud.cli_token.exchange")(function* ( - metadata: CloudCliOAuthConfig, - params: Record, - ) { - const response = yield* HttpClientRequest.post(metadata.tokenEndpoint).pipe( - HttpClientRequest.bodyUrlParams(params), - httpClient.execute, - Effect.flatMap(HttpClientResponse.schemaBodyJson(OAuthTokenResponse)), - ); - const now = yield* Clock.currentTimeMillis; - return { - accessToken: response.access_token, - refreshToken: response.refresh_token ?? params.refresh_token ?? "", - expiresAtEpochMs: now + response.expires_in * 1_000, - } satisfies PersistedToken; - }); - const refresh = Effect.fn("cloud.cli_token.refresh")(function* (token: PersistedToken) { const metadata = yield* cloudCliOAuthConfig; - return yield* exchangeToken(metadata, { + const { token: refreshed } = yield* exchangeToken(metadata, { grant_type: "refresh_token", refresh_token: token.refreshToken, client_id: metadata.clientId, }); + return refreshed.identity === undefined && token.identity !== undefined + ? { ...refreshed, identity: token.identity } + : refreshed; }); const login = Effect.fn("cloud.cli_token.login")(function* () { const metadata = yield* cloudCliOAuthConfig; - const verifier = Encoding.encodeBase64Url(yield* crypto.randomBytes(32)); - const challenge = Encoding.encodeBase64Url( - yield* crypto.digest("SHA-256", new TextEncoder().encode(verifier)), - ); - const state = yield* crypto.randomUUIDv4; + const { verifier, challenge, state } = yield* makePkceRequest; const callback = yield* Deferred.make(); const callbackRoute = HttpRouter.add( "GET", @@ -191,14 +382,7 @@ export const make = Effect.gen(function* () { }); } yield* Deferred.succeed(callback, code); - return yield* HttpServerResponse.html` - - -

    T3 Connect authorization complete

    -

    You can close this window and return to your terminal.

    - - -`; + return HttpServerResponse.html(renderLoopbackAuthorizationCompleteHtml()); }), ); yield* HttpRouter.serve(callbackRoute, { @@ -214,32 +398,37 @@ export const make = Effect.gen(function* () { ), Layer.build, ); - const authorizationUrl = new URL(metadata.authorizationEndpoint); - authorizationUrl.searchParams.set("client_id", metadata.clientId); - authorizationUrl.searchParams.set("redirect_uri", metadata.redirectUri); - authorizationUrl.searchParams.set("response_type", "code"); - authorizationUrl.searchParams.set("scope", metadata.scopes.join(" ")); - authorizationUrl.searchParams.set("state", state); - authorizationUrl.searchParams.set("code_challenge", challenge); - authorizationUrl.searchParams.set("code_challenge_method", "S256"); - yield* Console.log(`Open this URL to authorize T3 Connect:\n${authorizationUrl.toString()}\n`); - const code = yield* Deferred.await(callback).pipe( - Effect.timeout(CLOUD_CLI_OAUTH_CALLBACK_TIMEOUT), - Effect.catchTag("TimeoutError", (cause) => - Effect.fail( - new CloudCliAuthorizationTimeoutError({ - cause, - }), + const authorizationUrl = buildConnectClerkAuthorizeUrl({ + authorizationEndpoint: metadata.authorizationEndpoint, + clientId: metadata.clientId, + redirectUri: metadata.redirectUri, + scopes: metadata.scopes, + state, + challenge, + }); + yield* Console.log(formatLoopbackAuthorizationPrompt(authorizationUrl)); + const authorization = yield* waitForLoopbackAuthorization({ + authorizationUrl, + callback: Deferred.await(callback).pipe( + Effect.timeout(CLOUD_CLI_OAUTH_CALLBACK_TIMEOUT), + Effect.catchTag("TimeoutError", (cause) => + Effect.fail(new CloudCliAuthorizationTimeoutError({ cause })), ), ), - ); - return yield* exchangeToken(metadata, { + terminal, + launchBrowser: externalLauncher.launchBrowser, + }); + if (authorization._tag === "HeadlessRequested") { + return authorization; + } + const { token } = yield* exchangeToken(metadata, { grant_type: "authorization_code", - code, + code: authorization.code, redirect_uri: metadata.redirectUri, client_id: metadata.clientId, code_verifier: verifier, }); + return { _tag: "Authorized", token } as const; }); const getExistingNoLock = Effect.fn("cloud.cli_token.get_existing_no_lock")(function* () { @@ -253,24 +442,50 @@ export const make = Effect.gen(function* () { }); const getExisting = semaphore.withPermits(1)( - getExistingNoLock().pipe(wrapError((cause) => new CloudCliCredentialRefreshError({ cause }))), + getExistingNoLock().pipe( + Effect.mapError((cause) => new CloudCliCredentialRefreshError({ cause })), + Effect.provide(services), + ), ); const hasCredential = semaphore.withPermits(1)( read().pipe( Effect.map(Option.isSome), - wrapError((cause) => new CloudCliCredentialReadError({ cause })), + Effect.mapError((cause) => new CloudCliCredentialReadError({ cause })), ), ); const get = semaphore.withPermits(1)( Effect.gen(function* () { - const token = yield* getExistingNoLock(); - return Option.isSome(token) - ? token.value - : yield* Effect.scoped(login()).pipe(Effect.flatMap(persist)); - }).pipe(wrapError((cause) => new CloudCliAuthorizationError({ cause }))), + // A stored credential that can't be read or refreshed (corrupt, revoked, + // expired grant) must fall through to a fresh login rather than dead-end + // the command — authorizeCli applies the same fallback to out-of-band + // authorization. + const token = yield* getExistingNoLock().pipe( + Effect.orElseSucceed(() => Option.none()), + ); + if (Option.isSome(token)) { + return { _tag: "Authorized", token: token.value } as const; + } + const authorization = yield* Effect.scoped(login()); + return authorization._tag === "Authorized" + ? ({ _tag: "Authorized", token: yield* persist(authorization.token) } as const) + : authorization; + }).pipe( + Effect.mapError((cause) => + Terminal.isQuitError(cause) ? cause : new CloudCliAuthorizationError({ cause }), + ), + Effect.provide(services), + ), ); + const store = Effect.fn("cloud.cli_token.store")(function* (token: PersistedToken) { + yield* semaphore.withPermits(1)( + persist(token).pipe( + Effect.asVoid, + Effect.mapError((cause) => new CloudCliAuthorizationError({ cause })), + ), + ); + }); - return CloudCliTokenManager.of({ get, getExisting, hasCredential, clear }); + return CloudCliTokenManager.of({ get, getExisting, hasCredential, store, clear }); }); export const layer = Layer.effect(CloudCliTokenManager, make); diff --git a/apps/server/src/cloud/bootService.test.ts b/apps/server/src/cloud/bootService.test.ts new file mode 100644 index 000000000000..a24d54697d92 --- /dev/null +++ b/apps/server/src/cloud/bootService.test.ts @@ -0,0 +1,529 @@ +import * as NodeServices from "@effect/platform-node/NodeServices"; +import { assert, it } from "@effect/vitest"; +import * as ConfigProvider from "effect/ConfigProvider"; +import * as Effect from "effect/Effect"; +import * as FileSystem from "effect/FileSystem"; +import * as Layer from "effect/Layer"; +import * as Path from "effect/Path"; +import * as Schema from "effect/Schema"; +import * as ChildProcessSpawner from "effect/unstable/process/ChildProcessSpawner"; + +import { + HostProcessArguments, + HostProcessExecutablePath, + HostProcessPlatform, +} from "@t3tools/shared/hostProcess"; + +import * as ProcessRunner from "../processRunner.ts"; +import * as BootService from "./bootService.ts"; + +const isUnsupportedError = Schema.is(BootService.BootServiceUnsupportedError); +const isCommandError = Schema.is(BootService.BootServiceCommandError); + +interface RecordedCommand { + readonly command: string; + readonly args: ReadonlyArray; +} + +const makeRecordingRunnerLayer = ( + commands: Array, + options?: { + readonly failCommand?: string; + readonly failWhen?: (command: string, args: ReadonlyArray) => boolean; + }, +) => + Layer.succeed( + ProcessRunner.ProcessRunner, + ProcessRunner.ProcessRunner.of({ + run: (input) => + Effect.sync(() => { + assert.isUndefined(input.env); + commands.push({ command: input.command, args: input.args }); + const failed = + input.command === options?.failCommand || + options?.failWhen?.(input.command, input.args) === true; + return { + stdout: "", + stderr: failed ? `${input.command} exploded` : "", + code: ChildProcessSpawner.ExitCode(failed ? 1 : 0), + timedOut: false, + stdoutTruncated: false, + stderrTruncated: false, + }; + }), + }), + ); + +const makeHost = (entry: string): BootService.BootServiceHost => ({ + execPath: "/usr/local/bin/node", + cliEntryPath: entry, +}); + +const provideHostRefs = (home: string, platform: NodeJS.Platform = "linux") => + Effect.provide( + Layer.mergeAll( + Layer.succeed(HostProcessPlatform, platform), + ConfigProvider.layer(ConfigProvider.fromEnv({ env: { HOME: home } })), + ), + ); + +const makeTestContext = Effect.fn("test.makeTestContext")(function* () { + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const root = yield* fs.makeTempDirectoryScoped({ prefix: "t3-boot-service-test-" }); + // A real file for the stable-entry cases so status can confirm the entry + // point exists. + const stableEntry = path.join(root, "bin.mjs"); + yield* fs.writeFileString(stableEntry, "#!/usr/bin/env node\n"); + return { + fs, + path, + dirs: { + home: root, + baseDir: path.join(root, ".t3"), + logsDir: path.join(root, ".t3", "userdata", "logs"), + stableEntry, + }, + }; +}); + +it("renders a systemd unit with absolute paths and append-mode logging", () => { + const unit = BootService.renderBootServiceUnit({ + nodePath: "/usr/local/bin/node", + t3EntryPath: "/home/theo/.t3/runtime/versions/0.0.27/node_modules/t3/dist/bin.mjs", + baseDir: "/home/theo/.t3", + logPath: "/home/theo/.t3/userdata/logs/boot-service.log", + unitPath: "/home/theo/.config/systemd/user/t3code.service", + }); + + assert.equal( + unit, + [ + "[Unit]", + "Description=T3 Code server (T3 Connect)", + "StartLimitIntervalSec=300", + "StartLimitBurst=5", + "", + "[Service]", + "Type=simple", + "WorkingDirectory=%h", + "Environment=T3CODE_HOME=/home/theo/.t3", + "ExecStart=/usr/local/bin/node /home/theo/.t3/runtime/versions/0.0.27/node_modules/t3/dist/bin.mjs serve", + "Restart=always", + "RestartSec=5", + "StandardOutput=append:/home/theo/.t3/userdata/logs/boot-service.log", + "StandardError=append:/home/theo/.t3/userdata/logs/boot-service.log", + "", + "[Install]", + "WantedBy=default.target", + "", + ].join("\n"), + ); +}); + +it("quotes systemd values containing spaces and escapes percent specifiers", () => { + assert.equal(BootService.quoteSystemdValue("/plain/path"), "/plain/path"); + assert.equal(BootService.quoteSystemdValue("/home/me/T3 Data"), '"/home/me/T3 Data"'); + assert.equal(BootService.quoteSystemdValue("/opt/100%cpu"), "/opt/100%%cpu"); + + const unit = BootService.renderBootServiceUnit({ + nodePath: "/home/me/my tools/node", + t3EntryPath: "/home/me/T3 Data/bin.mjs", + baseDir: "/home/me/T3 Data", + logPath: "/home/me/100%logs/boot.log", + unitPath: "/home/me/.config/systemd/user/t3code.service", + }); + assert.include(unit, 'ExecStart="/home/me/my tools/node" "/home/me/T3 Data/bin.mjs" serve'); + assert.include(unit, 'Environment=T3CODE_HOME="/home/me/T3 Data"'); + // append: paths take the rest of the line literally (spaces are fine, + // quoting is not), but % still goes through specifier expansion. + assert.include(unit, "StandardOutput=append:/home/me/100%%logs/boot.log"); + assert.include(unit, "StandardError=append:/home/me/100%%logs/boot.log"); +}); + +it("flags package-manager cache entry points as ephemeral", () => { + assert.isTrue( + BootService.isEphemeralCacheEntry("/home/theo/.npm/_npx/abc123/node_modules/t3/dist/bin.mjs"), + ); + assert.isTrue( + BootService.isEphemeralCacheEntry("C:\\Users\\theo\\AppData\\npm-cache\\_npx\\abc\\bin.mjs"), + ); + assert.isTrue( + BootService.isEphemeralCacheEntry( + "/home/theo/.cache/pnpm/dlx/abc/node_modules/t3/dist/bin.mjs", + ), + ); + assert.isTrue( + BootService.isEphemeralCacheEntry("/home/theo/.bun/install/cache/t3@0.0.27/dist/bin.mjs"), + ); + assert.isFalse(BootService.isEphemeralCacheEntry("/usr/local/lib/node_modules/t3/dist/bin.mjs")); + assert.isFalse( + BootService.isEphemeralCacheEntry( + "/home/theo/dev/pnpm/dlx-tools/t3/node_modules/t3/dist/bin.mjs", + ), + ); + assert.isFalse( + BootService.isEphemeralCacheEntry( + "/home/theo/.t3/runtime/versions/0.0.27/node_modules/t3/dist/bin.mjs", + ), + ); +}); + +it.layer(NodeServices.layer)("BootService", (it) => { + it.effect("installs the unit, enables the service, and enables linger", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost(dirs.stableEntry), + }).pipe(Effect.provide(makeRecordingRunnerLayer(commands)), provideHostRefs(dirs.home)); + + const plan = yield* service.install; + + // A stable entry point is reused directly — no npm install. + assert.equal(plan.t3EntryPath, dirs.stableEntry); + assert.deepEqual( + commands.map((entry) => [entry.command, ...entry.args].join(" ")), + [ + "systemctl --user daemon-reload", + "systemctl --user enable t3code.service", + // restart (not enable --now) so repairing a stale unit replaces a + // running process instead of leaving the old one until reboot. + "systemctl --user restart t3code.service", + "loginctl enable-linger", + ], + ); + + const unitPath = path.join(dirs.home, ".config", "systemd", "user", "t3code.service"); + const unit = yield* fs.readFileString(unitPath); + assert.include(unit, `ExecStart=/usr/local/bin/node ${dirs.stableEntry} serve`); + assert.include(unit, `Environment=T3CODE_HOME=${dirs.baseDir}`); + + const status = yield* service.status; + assert.isTrue(status.supported); + assert.isTrue(status.installed); + assert.isTrue(status.current); + + const removed = yield* service.uninstall; + assert.isTrue(removed); + assert.isFalse(yield* fs.exists(unitPath)); + const statusAfter = yield* service.status; + assert.isFalse(statusAfter.installed); + const removedAgain = yield* service.uninstall; + assert.isFalse(removedAgain); + }), + ); + + it.effect("pins a runtime via npm install when running from the npx cache", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost("/home/theo/.npm/_npx/abc/node_modules/t3/dist/bin.mjs"), + }).pipe(Effect.provide(makeRecordingRunnerLayer(commands)), provideHostRefs(dirs.home)); + + const plan = yield* service.install; + + const runtimeDir = path.join(dirs.baseDir, "runtime", "versions", "0.0.27"); + assert.equal( + plan.t3EntryPath, + path.join(runtimeDir, "node_modules", "t3", "dist", "bin.mjs"), + ); + assert.deepEqual(commands[0], { + command: "npm", + args: ["install", "--prefix", runtimeDir, "--no-fund", "--no-audit", "t3@0.0.27"], + }); + // Success is recorded via a sentinel so interrupted installs re-run. + assert.isTrue(yield* fs.exists(path.join(runtimeDir, ".install-complete"))); + }), + ); + + it.effect("reinstalls a pinned runtime when its entry point is missing", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost("/home/theo/.npm/_npx/abc/node_modules/t3/dist/bin.mjs"), + }).pipe(Effect.provide(makeRecordingRunnerLayer(commands)), provideHostRefs(dirs.home)); + + const plan = yield* service.install; + yield* fs.makeDirectory(path.dirname(plan.t3EntryPath), { recursive: true }); + yield* fs.writeFileString(plan.t3EntryPath, "#!/usr/bin/env node\n"); + yield* fs.remove(plan.t3EntryPath); + commands.length = 0; + + yield* service.install; + + assert.isTrue(commands.some(({ command }) => command === "npm")); + }), + ); + + it.effect("reads executable metadata from host process references", () => + Effect.gen(function* () { + const { dirs } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + }).pipe( + Effect.provide(makeRecordingRunnerLayer(commands)), + provideHostRefs(dirs.home), + Effect.provideService(HostProcessExecutablePath, "/opt/node/bin/node"), + Effect.provideService(HostProcessArguments, ["/opt/node/bin/node", dirs.stableEntry]), + ); + + const plan = yield* service.install; + assert.equal(plan.nodePath, "/opt/node/bin/node"); + assert.equal(plan.t3EntryPath, dirs.stableEntry); + }), + ); + + it.effect("cleans up and fails when the pinned runtime install fails", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost("/home/theo/.npm/_npx/abc/node_modules/t3/dist/bin.mjs"), + }).pipe( + Effect.provide(makeRecordingRunnerLayer(commands, { failCommand: "npm" })), + provideHostRefs(dirs.home), + ); + + const error = yield* service.install.pipe(Effect.flip); + assert.isTrue(isCommandError(error)); + const runtimeDir = path.join(dirs.baseDir, "runtime", "versions", "0.0.27"); + // The half-installed tree must not be reused by the next attempt. + assert.isFalse(yield* fs.exists(runtimeDir)); + assert.isFalse(yield* fs.exists(path.join(runtimeDir, ".install-complete"))); + }), + ); + + it.effect("reports an installed-but-stale unit so connect can offer a repair", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost(dirs.stableEntry), + }).pipe(Effect.provide(makeRecordingRunnerLayer(commands)), provideHostRefs(dirs.home)); + + const unitDir = path.join(dirs.home, ".config", "systemd", "user"); + yield* fs.makeDirectory(unitDir, { recursive: true }); + yield* fs.writeFileString( + path.join(unitDir, "t3code.service"), + "[Service]\nExecStart=/old/node /old/t3 serve\n", + ); + + const status = yield* service.status; + assert.isTrue(status.supported); + assert.isTrue(status.installed); + assert.isFalse(status.current); + }), + ); + + it.effect("reports a current unit as stale when its entry point is gone", () => + Effect.gen(function* () { + const { dirs, fs } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost(dirs.stableEntry), + }).pipe(Effect.provide(makeRecordingRunnerLayer(commands)), provideHostRefs(dirs.home)); + + yield* service.install; + assert.isTrue((yield* service.status).current); + + // The pinned runtime (or global bin) was deleted to reclaim space; the + // unit still matches byte-for-byte but would crashloop at boot. + yield* fs.remove(dirs.stableEntry); + const status = yield* service.status; + assert.isTrue(status.installed); + assert.isFalse(status.current); + }), + ); + + it.effect("fails on non-Linux platforms without touching the filesystem", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost("/usr/local/lib/node_modules/t3/dist/bin.mjs"), + }).pipe( + Effect.provide(makeRecordingRunnerLayer(commands)), + provideHostRefs(dirs.home, "darwin"), + ); + + const error = yield* service.install.pipe(Effect.flip); + assert.isTrue(isUnsupportedError(error)); + assert.lengthOf(commands, 0); + assert.isFalse( + yield* fs.exists(path.join(dirs.home, ".config", "systemd", "user", "t3code.service")), + ); + + const status = yield* service.status; + assert.isFalse(status.supported); + assert.isFalse(status.installed); + }), + ); + + it.effect("removes the unit file when an activation step fails", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost("/usr/local/lib/node_modules/t3/dist/bin.mjs"), + }).pipe( + Effect.provide(makeRecordingRunnerLayer(commands, { failCommand: "loginctl" })), + provideHostRefs(dirs.home), + ); + + const error = yield* service.install.pipe(Effect.flip); + assert.isTrue(isCommandError(error)); + // A leftover unit would make the next connect report "already set up" + // even though linger never happened. + assert.isFalse( + yield* fs.exists(path.join(dirs.home, ".config", "systemd", "user", "t3code.service")), + ); + const status = yield* service.status; + assert.isFalse(status.installed); + assert.isTrue( + commands.some( + ({ command, args }) => + command === "systemctl" && args.join(" ") === "--user disable --now t3code.service", + ), + ); + }), + ); + + it.effect("restores the previous unit when a repair cannot activate", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const initialCommands: Array = []; + const initialService = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost(dirs.stableEntry), + }).pipe( + Effect.provide(makeRecordingRunnerLayer(initialCommands)), + provideHostRefs(dirs.home), + ); + yield* initialService.install; + + const unitPath = path.join(dirs.home, ".config", "systemd", "user", "t3code.service"); + const previousUnit = yield* fs.readFileString(unitPath); + const replacementEntry = path.join(dirs.home, "replacement-bin.mjs"); + yield* fs.writeFileString(replacementEntry, "#!/usr/bin/env node\n"); + const repairCommands: Array = []; + const repairService = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.28", + host: makeHost(replacementEntry), + }).pipe( + Effect.provide(makeRecordingRunnerLayer(repairCommands, { failCommand: "loginctl" })), + provideHostRefs(dirs.home), + ); + + const error = yield* repairService.install.pipe(Effect.flip); + + assert.isTrue(isCommandError(error)); + assert.equal(yield* fs.readFileString(unitPath), previousUnit); + assert.isTrue( + repairCommands.some( + ({ command, args }) => + command === "systemctl" && args.join(" ") === "--user restart t3code.service", + ), + ); + }), + ); + + it.effect("keeps the unit when stopping it during uninstall fails", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const installCommands: Array = []; + const installedService = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost(dirs.stableEntry), + }).pipe( + Effect.provide(makeRecordingRunnerLayer(installCommands)), + provideHostRefs(dirs.home), + ); + yield* installedService.install; + + const uninstallCommands: Array = []; + const failingService = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost(dirs.stableEntry), + }).pipe( + Effect.provide( + makeRecordingRunnerLayer(uninstallCommands, { + failWhen: (command, args) => + command === "systemctl" && args.includes("disable") && args.includes("--now"), + }), + ), + provideHostRefs(dirs.home), + ); + + const error = yield* failingService.uninstall.pipe(Effect.flip); + + assert.isTrue(isCommandError(error)); + assert.isTrue( + yield* fs.exists(path.join(dirs.home, ".config", "systemd", "user", "t3code.service")), + ); + }), + ); + + it.effect("appends failed steps to the boot-service log", () => + Effect.gen(function* () { + const { dirs, fs, path } = yield* makeTestContext(); + const commands: Array = []; + const service = yield* BootService.make({ + baseDir: dirs.baseDir, + logsDir: dirs.logsDir, + cliVersion: "0.0.27", + host: makeHost("/usr/local/lib/node_modules/t3/dist/bin.mjs"), + }).pipe( + Effect.provide(makeRecordingRunnerLayer(commands, { failCommand: "systemctl" })), + provideHostRefs(dirs.home), + ); + + const error = yield* service.install.pipe(Effect.flip); + assert.isTrue(isCommandError(error)); + if (!isCommandError(error)) return; + assert.equal(error.exitCode, 1); + assert.equal(error.stderrLength, "systemctl exploded".length); + + const logPath = path.join(dirs.logsDir, "boot-service.log"); + assert.isTrue(yield* fs.exists(logPath)); + assert.include(yield* fs.readFileString(logPath), "exit code 1"); + }), + ); +}); diff --git a/apps/server/src/cloud/bootService.ts b/apps/server/src/cloud/bootService.ts new file mode 100644 index 000000000000..0662b3670494 --- /dev/null +++ b/apps/server/src/cloud/bootService.ts @@ -0,0 +1,452 @@ +import * as Context from "effect/Context"; +import * as Config from "effect/Config"; +import * as DateTime from "effect/DateTime"; +import * as Duration from "effect/Duration"; +import * as Effect from "effect/Effect"; +import * as FileSystem from "effect/FileSystem"; +import * as Layer from "effect/Layer"; +import * as Option from "effect/Option"; +import * as Path from "effect/Path"; +import * as Schema from "effect/Schema"; + +import { + HostProcessArguments, + HostProcessExecutablePath, + HostProcessPlatform, +} from "@t3tools/shared/hostProcess"; + +import * as ProcessRunner from "../processRunner.ts"; + +/** + * Installs T3 Code as a per-user boot service so a connected machine stays + * reachable through T3 Connect after the SSH session ends. Linux-only for + * now: systemd user unit + loginctl enable-linger. The service runs a pinned + * runtime installed under /runtime — never `npx t3`, whose cache is + * ephemeral and whose registry fetch at boot would make startup depend on + * the network. + */ + +const BOOT_SERVICE_NAME = "t3code"; +const BOOT_RUNTIME_DIR = "runtime"; + +const BOOT_SERVICE_UNIT_FILE = `${BOOT_SERVICE_NAME}.service`; +const PINNED_RUNTIME_INSTALL_TIMEOUT = Duration.minutes(10); + +const EPHEMERAL_CACHE_SEGMENTS = [ + "/_npx/", // npx + "\\_npx\\", + "/pnpm/dlx/", // pnpm dlx (~/.cache/pnpm/dlx and $PNPM_HOME/.pnpm/dlx) + "/.pnpm/dlx/", + "/.bun/install/cache/", // bunx +]; + +/** + * `npx t3` (and pnpm dlx / bunx) run out of ephemeral package-manager + * caches that can be evicted at any time — a boot service must never point + * there. Global installs, repo checkouts, and the pinned runtime below are + * all stable. + */ +export function isEphemeralCacheEntry(entryPath: string): boolean { + return EPHEMERAL_CACHE_SEGMENTS.some((segment) => entryPath.includes(segment)); +} + +/** + * systemd expands `%` specifiers in most directive values, including the + * `append:` file paths, which take the rest of the line literally and must + * NOT be quoted. + */ +export function escapeSystemdSpecifiers(value: string): string { + return value.replaceAll("%", "%%"); +} + +/** + * systemd word-splits ExecStart and Environment values and expands `%` + * specifiers, so paths with spaces or percents must be quoted and escaped. + */ +export function quoteSystemdValue(value: string): string { + const escaped = escapeSystemdSpecifiers(value); + return /[\s"'\\]/.test(escaped) + ? `"${escaped.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"` + : escaped; +} + +export interface BootServicePlan { + /** Absolute path of the node binary running this CLI. */ + readonly nodePath: string; + /** Absolute path of the pinned t3 entry point the unit will run. */ + readonly t3EntryPath: string; + readonly baseDir: string; + readonly logPath: string; + readonly unitPath: string; +} + +/** + * Pure so it is testable byte-for-byte. systemd user units run with a + * minimal environment: every path must be absolute, and the service must + * not rely on PATH, nvm shims, or shell profiles. Failures land in + * `logPath` because `systemctl --user` failures are otherwise invisible. + */ +export function renderBootServiceUnit(plan: BootServicePlan): string { + // No After=network-online.target: it does not exist in the systemd *user* + // manager, so ordering on it is silently ignored. The server retries its + // relay connection, and Restart=always covers early-boot failures. + return [ + "[Unit]", + "Description=T3 Code server (T3 Connect)", + // Give up after 5 crashes in 5 minutes so a persistently broken install + // (deleted runtime, broken workspace) stops instead of restarting every + // 5s forever and growing the unrotated append log without bound. + "StartLimitIntervalSec=300", + "StartLimitBurst=5", + "", + "[Service]", + "Type=simple", + "WorkingDirectory=%h", + `Environment=T3CODE_HOME=${quoteSystemdValue(plan.baseDir)}`, + `ExecStart=${quoteSystemdValue(plan.nodePath)} ${quoteSystemdValue(plan.t3EntryPath)} serve`, + "Restart=always", + "RestartSec=5", + `StandardOutput=append:${escapeSystemdSpecifiers(plan.logPath)}`, + `StandardError=append:${escapeSystemdSpecifiers(plan.logPath)}`, + "", + "[Install]", + "WantedBy=default.target", + "", + ].join("\n"); +} + +export class BootServiceUnsupportedError extends Schema.TaggedErrorClass()( + "BootServiceUnsupportedError", + { platform: Schema.String }, +) { + override get message(): string { + return `Background setup currently supports Linux with systemd; this machine reports '${this.platform}'.`; + } +} + +export class BootServiceCommandError extends Schema.TaggedErrorClass()( + "BootServiceCommandError", + { + step: Schema.String, + exitCode: Schema.optional(Schema.Number), + stdoutLength: Schema.optional(Schema.Number), + stderrLength: Schema.optional(Schema.Number), + cause: Schema.optional(Schema.Defect()), + }, +) { + override get message(): string { + return this.exitCode === undefined + ? `Background setup failed while ${this.step}.` + : `Background setup failed while ${this.step} (exit code ${this.exitCode}).`; + } +} + +export class BootServiceInstallError extends Schema.TaggedErrorClass()( + "BootServiceInstallError", + { cause: Schema.Defect() }, +) { + override get message(): string { + return "Could not set up the T3 Code background service."; + } +} + +export type BootServiceError = + | BootServiceUnsupportedError + | BootServiceCommandError + | BootServiceInstallError; + +export interface BootServiceStatus { + readonly supported: boolean; + readonly installed: boolean; + /** False when the installed unit no longer matches what install would write. */ + readonly current: boolean; + readonly unitPath: string; + readonly logPath: string; +} + +export class BootService extends Context.Service< + BootService, + { + /** Installs the pinned runtime + unit, enables linger, starts the service. */ + readonly install: Effect.Effect; + /** + * Stops and removes the unit; leaves the pinned runtime for reuse. + * Returns whether a unit was actually removed. + */ + readonly uninstall: Effect.Effect; + readonly status: Effect.Effect; + } +>()("t3/cloud/bootService") {} + +export interface BootServiceHost { + readonly execPath: string; + readonly cliEntryPath: string; +} + +export const make = Effect.fn("cloud.boot_service.make")(function* (input: { + readonly baseDir: string; + readonly logsDir: string; + readonly cliVersion: string; + readonly host?: BootServiceHost; +}) { + const hostExecPath = yield* HostProcessExecutablePath; + const hostArguments = yield* HostProcessArguments; + const host = input.host ?? { + execPath: hostExecPath, + // When running the packed CLI this is dist/bin.mjs; when stable (global + // install, repo checkout) the boot service runs this same artifact. + cliEntryPath: hostArguments[1] ?? "", + }; + const platform = yield* HostProcessPlatform; + const homeDir = yield* Config.string("HOME").pipe(Config.withDefault("")); + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const runner = yield* ProcessRunner.ProcessRunner; + + const unitDir = path.join(homeDir, ".config", "systemd", "user"); + const unitPath = path.join(unitDir, BOOT_SERVICE_UNIT_FILE); + const logPath = path.join(input.logsDir, "boot-service.log"); + const runtimeVersionDir = path.join( + input.baseDir, + BOOT_RUNTIME_DIR, + "versions", + input.cliVersion, + ); + const runtimeEntryPath = path.join(runtimeVersionDir, "node_modules", "t3", "dist", "bin.mjs"); + const runtimeSentinelPath = path.join(runtimeVersionDir, ".install-complete"); + + const requireSystemdLinux = Effect.gen(function* () { + if (platform !== "linux" || homeDir === "") { + return yield* new BootServiceUnsupportedError({ platform }); + } + }); + + const runStep = Effect.fn("cloud.boot_service.run_step")(function* ( + step: string, + command: string, + args: ReadonlyArray, + options?: { readonly timeout?: Duration.Input }, + ) { + return yield* runner.run({ command, args, timeout: options?.timeout }).pipe( + Effect.mapError((cause) => new BootServiceCommandError({ step, cause })), + Effect.filterOrFail( + (result) => result.code === 0, + (result) => + new BootServiceCommandError({ + step, + exitCode: Number(result.code), + stdoutLength: result.stdout.length, + stderrLength: result.stderr.length, + }), + ), + Effect.tapError((error) => + DateTime.now.pipe( + Effect.flatMap((now) => + fs.writeFileString(logPath, `${DateTime.formatIso(now)} ${error.message}\n`, { + flag: "a", + }), + ), + Effect.ignore, + ), + ), + ); + }); + + /** + * Ensures plannedEntryPath exists before the unit points at it. A stable + * install (global bin, repo checkout) is used as-is; an ephemeral cache + * entry is replaced by `npm install --prefix`-ing the exact running + * version into /runtime/versions/. A real install (not a copy + * of bin.mjs) because t3 ships native deps like node-pty. + */ + const ensurePinnedRuntime = Effect.gen(function* () { + if (!isEphemeralCacheEntry(host.cliEntryPath)) { + return; + } + // The sentinel is written only after npm exits 0. Checking the entry + // file alone is not enough: npm extracts files before running native + // builds (node-pty), so a killed install leaves a plausible-looking but + // broken tree behind. + const alreadyPinned = yield* Effect.all([ + fs.exists(runtimeSentinelPath), + fs.exists(runtimeEntryPath), + ]).pipe( + Effect.map(([sentinelExists, entryExists]) => sentinelExists && entryExists), + Effect.mapError((cause) => new BootServiceInstallError({ cause })), + ); + if (alreadyPinned) { + return; + } + yield* fs.remove(runtimeVersionDir, { recursive: true, force: true }).pipe( + Effect.andThen(fs.makeDirectory(runtimeVersionDir, { recursive: true })), + Effect.mapError((cause) => new BootServiceInstallError({ cause })), + ); + yield* runStep( + "installing the pinned t3 runtime (this can take a few minutes)", + "npm", + [ + "install", + "--prefix", + runtimeVersionDir, + "--no-fund", + "--no-audit", + `t3@${input.cliVersion}`, + ], + // Native deps (node-pty) can compile from source on slow boxes; the + // ProcessRunner default of 60s would kill a healthy install. + { timeout: PINNED_RUNTIME_INSTALL_TIMEOUT }, + ).pipe( + Effect.tapError(() => + fs.remove(runtimeVersionDir, { recursive: true, force: true }).pipe(Effect.ignore), + ), + ); + yield* fs + .writeFileString(runtimeSentinelPath, `${input.cliVersion}\n`) + .pipe(Effect.mapError((cause) => new BootServiceInstallError({ cause }))); + }); + + // Where the unit will point: derivable without touching the network, so + // status can compare units purely; install materializes it first. + const plannedEntryPath = isEphemeralCacheEntry(host.cliEntryPath) + ? runtimeEntryPath + : host.cliEntryPath; + const plan: BootServicePlan = { + nodePath: host.execPath, + t3EntryPath: plannedEntryPath, + baseDir: input.baseDir, + logPath, + unitPath, + }; + + const install: BootService["Service"]["install"] = Effect.gen(function* () { + yield* requireSystemdLinux; + yield* fs + .makeDirectory(input.logsDir, { recursive: true }) + .pipe(Effect.mapError((cause) => new BootServiceInstallError({ cause }))); + + yield* ensurePinnedRuntime; + + const previousUnit = yield* fs.exists(unitPath).pipe( + Effect.flatMap((exists) => + exists + ? fs.readFileString(unitPath).pipe(Effect.map(Option.some)) + : Effect.succeed(Option.none()), + ), + Effect.mapError((cause) => new BootServiceInstallError({ cause })), + ); + + yield* fs.makeDirectory(unitDir, { recursive: true }).pipe( + Effect.andThen(fs.writeFileString(unitPath, renderBootServiceUnit(plan))), + Effect.mapError((cause) => new BootServiceInstallError({ cause })), + ); + + // If any activation step fails, remove the unit again: a leftover file + // would make the next `t3 connect` report the service as already set up + // even though it was never enabled or lingered. + yield* Effect.gen(function* () { + yield* runStep("reloading systemd user units", "systemctl", ["--user", "daemon-reload"]); + yield* runStep("enabling the service", "systemctl", [ + "--user", + "enable", + BOOT_SERVICE_UNIT_FILE, + ]); + // restart rather than enable --now: --now does not replace an already + // running process, so repairing a stale unit would leave the old + // server running until reboot. restart also starts a stopped service. + yield* runStep("starting the service", "systemctl", [ + "--user", + "restart", + BOOT_SERVICE_UNIT_FILE, + ]); + // Linger keeps the user manager (and this service) running without an + // open session — the whole point on a box reached over SSH. No + // username argument: loginctl defaults to the calling user, which is + // always right, while $USER can be stale (su without -l) or unset. + yield* runStep("enabling lingering for this user", "loginctl", ["enable-linger"]); + }).pipe(Effect.tapError(() => rollbackFailedInstall(previousUnit))); + + return plan; + }).pipe(Effect.withSpan("cloud.boot_service.install")); + + // If activation fails partway (e.g. enable succeeds but restart/linger + // fails), leave nothing behind: disable removes the enable symlink, remove + // deletes the file, daemon-reload clears the stale definition — otherwise a + // dangling wants/ symlink logs "Failed to load unit" at every boot and the + // next connect misreports the state. + const rollbackFailedInstall = Effect.fn("cloud.boot_service.rollback_failed_install")(function* ( + previousUnit: Option.Option, + ) { + if (Option.isSome(previousUnit)) { + yield* fs.writeFileString(unitPath, previousUnit.value).pipe(Effect.ignore); + } else { + yield* runStep("cleaning up the service", "systemctl", [ + "--user", + "disable", + "--now", + BOOT_SERVICE_UNIT_FILE, + ]).pipe(Effect.ignore); + yield* fs.remove(unitPath).pipe(Effect.ignore); + } + yield* runStep("reloading systemd user units", "systemctl", ["--user", "daemon-reload"]).pipe( + Effect.ignore, + ); + if (Option.isSome(previousUnit)) { + yield* runStep("restoring the previous service", "systemctl", [ + "--user", + "restart", + BOOT_SERVICE_UNIT_FILE, + ]).pipe(Effect.ignore); + } + }); + + const uninstall: BootService["Service"]["uninstall"] = Effect.gen(function* () { + yield* requireSystemdLinux; + const exists = yield* fs + .exists(unitPath) + .pipe(Effect.mapError((cause) => new BootServiceInstallError({ cause }))); + if (!exists) { + return false; + } + yield* runStep("stopping the service", "systemctl", [ + "--user", + "disable", + "--now", + BOOT_SERVICE_UNIT_FILE, + ]); + yield* fs + .remove(unitPath) + .pipe(Effect.mapError((cause) => new BootServiceInstallError({ cause }))); + yield* runStep("reloading systemd user units", "systemctl", ["--user", "daemon-reload"]); + return true; + }).pipe(Effect.withSpan("cloud.boot_service.uninstall")); + + const status: BootService["Service"]["status"] = Effect.gen(function* () { + if (platform !== "linux" || homeDir === "") { + return { supported: false, installed: false, current: false, unitPath, logPath }; + } + const unitExists = yield* fs.exists(unitPath); + if (!unitExists) { + return { supported: true, installed: false, current: false, unitPath, logPath }; + } + const unit = yield* fs.readFileString(unitPath); + // A unit is current only if it matches what install would write now (an + // older CLI wrote a different runtime/node path) AND the entry point it + // references still exists (a pinned runtime under ~/.t3 can be deleted to + // reclaim space). Either mismatch makes connect offer a repair. + const entryExists = yield* fs.exists(plannedEntryPath); + const current = unit === renderBootServiceUnit(plan) && entryExists; + return { supported: true, installed: true, current, unitPath, logPath }; + }).pipe( + Effect.mapError((cause) => new BootServiceInstallError({ cause })), + Effect.withSpan("cloud.boot_service.status"), + ); + + return BootService.of({ install, uninstall, status }); +}); + +export const layer = (input: { + readonly baseDir: string; + readonly logsDir: string; + readonly cliVersion: string; + readonly host?: BootServiceHost; +}) => Layer.effect(BootService, make(input)); diff --git a/apps/server/src/cloud/cliAuthHtml.test.ts b/apps/server/src/cloud/cliAuthHtml.test.ts new file mode 100644 index 000000000000..a49eaffeda75 --- /dev/null +++ b/apps/server/src/cloud/cliAuthHtml.test.ts @@ -0,0 +1,13 @@ +import { expect, it } from "@effect/vitest"; + +import { renderLoopbackAuthorizationCompleteHtml } from "./cliAuthHtml.ts"; + +it("renders the branded loopback authorization completion page", () => { + const html = renderLoopbackAuthorizationCompleteHtml(); + + expect(html).toContain("T3 Code"); + expect(html).not.toContain("Secure terminal handoff"); + expect(html).toContain("You're connected"); + expect(html).toContain("return to the terminal"); + expect(html).toContain('name="viewport"'); +}); diff --git a/apps/server/src/cloud/cliAuthHtml.ts b/apps/server/src/cloud/cliAuthHtml.ts new file mode 100644 index 000000000000..3c4141fba446 --- /dev/null +++ b/apps/server/src/cloud/cliAuthHtml.ts @@ -0,0 +1,140 @@ +export function renderLoopbackAuthorizationCompleteHtml(): string { + return ` + + + + + + T3 Connect authorization complete + + + +
    +
    +
    +

    T3 Code

    +
    +
    +
    + +

    Browser authorization complete

    +

    You're connected

    +

    The authorization code was delivered securely to your waiting terminal.

    + +
    +
    + +`; +} diff --git a/apps/server/src/cloud/http.test.ts b/apps/server/src/cloud/http.test.ts index bab9cdd27f31..96abf2e4b4ae 100644 --- a/apps/server/src/cloud/http.test.ts +++ b/apps/server/src/cloud/http.test.ts @@ -200,6 +200,7 @@ describe("reconcileDesiredCloudLink", () => { get: unusedSecretStoreOperation(), getExisting: Effect.succeed(Option.none()), hasCredential: unusedSecretStoreOperation(), + store: () => unusedSecretStoreOperation(), clear: unusedSecretStoreOperation(), }), ), diff --git a/apps/server/src/cloud/publicConfig.test.ts b/apps/server/src/cloud/publicConfig.test.ts index c46e2671a46e..96a8a1b8b8a3 100644 --- a/apps/server/src/cloud/publicConfig.test.ts +++ b/apps/server/src/cloud/publicConfig.test.ts @@ -4,6 +4,7 @@ import * as Effect from "effect/Effect"; import * as Result from "effect/Result"; import { + hostedAppUrlConfig, makeCloudCliOAuthConfig, makeRelayUrlConfig, resolveRelayClientTracingConfig, @@ -47,6 +48,40 @@ it.effect("rejects an injected relay URL with a non-origin path", () => makeRelayUrlConfig("https://embedded.example.test/path").pipe(provideEnv({}), Effect.flip), ); +it.effect("normalizes the hosted app URL to an absolute origin", () => + Effect.gen(function* () { + assert.equal( + yield* hostedAppUrlConfig.pipe( + provideEnv({ T3CODE_HOSTED_APP_URL: "https://nightly.app.t3.codes" }), + ), + "https://nightly.app.t3.codes", + ); + assert.equal( + yield* hostedAppUrlConfig.pipe( + provideEnv({ T3CODE_HOSTED_APP_URL: "http://localhost:5733" }), + ), + "http://localhost:5733", + ); + }), +); + +it.effect("rejects malformed or insecure hosted app URLs", () => + Effect.gen(function* () { + for (const value of [ + "app.t3.codes", + "http://app.t3.codes", + "https://app.t3.codes/nested", + "https://app.t3.codes?alias=true", + ]) { + const result = yield* hostedAppUrlConfig.pipe( + provideEnv({ T3CODE_HOSTED_APP_URL: value }), + Effect.result, + ); + assert.isTrue(Result.isFailure(result), value); + } + }), +); + it.effect("derives direct Clerk OAuth endpoints from statically injected public config", () => Effect.gen(function* () { const config = yield* makeCloudCliOAuthConfig({ diff --git a/apps/server/src/cloud/publicConfig.ts b/apps/server/src/cloud/publicConfig.ts index 176b31d7566a..cb07d19721b5 100644 --- a/apps/server/src/cloud/publicConfig.ts +++ b/apps/server/src/cloud/publicConfig.ts @@ -1,3 +1,4 @@ +import { CONNECT_OAUTH_SCOPES, DEFAULT_HOSTED_APP_URL } from "@t3tools/shared/connectAuth"; import { clerkFrontendApiUrlFromPublishableKey } from "@t3tools/shared/relayAuth"; import { normalizeSecureRelayUrl } from "@t3tools/shared/relayUrl"; import * as Config from "effect/Config"; @@ -15,7 +16,7 @@ declare const __T3CODE_BUILD_RELAY_CLIENT_OTLP_TRACES_DATASET__: string | undefi declare const __T3CODE_BUILD_RELAY_CLIENT_OTLP_TRACES_TOKEN__: string | undefined; const CLOUD_CLI_OAUTH_REDIRECT_URI = "http://127.0.0.1:34338/callback"; -const CLOUD_CLI_OAUTH_SCOPES = ["openid", "profile", "email"] as const; +const CLOUD_CLI_OAUTH_SCOPES = CONNECT_OAUTH_SCOPES; function validateRelayUrl(value: string) { const relayUrl = normalizeSecureRelayUrl(value); @@ -100,6 +101,44 @@ export function makeRelayUrlConfig(fallback = buildTimeRelayUrl) { export const relayUrlConfig = makeRelayUrlConfig(); +/** + * Hosted app origin used for out-of-band OAuth on headless + * machines. Overridable so staging/nightly builds can point their CLIs at a + * matching hosted deployment. + */ +export const hostedAppUrlConfig = makePublicValueConfig( + "T3CODE_HOSTED_APP_URL", + DEFAULT_HOSTED_APP_URL, +).pipe(Config.mapOrFail(validateHostedAppUrl)); + +function validateHostedAppUrl(value: string) { + try { + const url = new URL(value); + const isLoopbackHttp = + url.protocol === "http:" && + (url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]"); + if ( + (url.protocol !== "https:" && !isLoopbackHttp) || + url.pathname !== "/" || + url.search !== "" || + url.hash !== "" + ) { + throw new Error("invalid hosted app origin"); + } + return Effect.succeed(url.origin); + } catch { + return Effect.fail( + new Config.ConfigError( + new Schema.SchemaError( + new SchemaIssue.InvalidValue(Option.some(value), { + message: "Hosted app URL must be an absolute HTTPS origin (or HTTP loopback origin).", + }), + ), + ), + ); + } +} + function makePublicValueConfig(name: string, fallback: string) { const runtimeConfig = Config.nonEmptyString(name); return (fallback ? runtimeConfig.pipe(Config.withDefault(fallback)) : runtimeConfig).pipe( diff --git a/apps/server/src/persistence/Migrations.ts b/apps/server/src/persistence/Migrations.ts index ba1131ee2597..d468838d5d44 100644 --- a/apps/server/src/persistence/Migrations.ts +++ b/apps/server/src/persistence/Migrations.ts @@ -123,15 +123,11 @@ export interface RunMigrationsOptions { export const runMigrations = Effect.fn("runMigrations")(function* ({ toMigrationInclusive, }: RunMigrationsOptions = {}) { - yield* Effect.log( - toMigrationInclusive === undefined - ? "Running all migrations..." - : `Running migrations 1 through ${toMigrationInclusive}...`, - ); const executedMigrations = yield* run({ loader: makeMigrationLoader(toMigrationInclusive) }); - yield* Effect.log("Migrations ran successfully").pipe( - Effect.annotateLogs({ migrations: executedMigrations.map(([id, name]) => `${id}_${name}`) }), - ); + const migrations = executedMigrations.map(([id, name]) => `${id}_${name}`); + yield* migrations.length === 0 + ? Effect.logDebug("Database schema is current") + : Effect.log("Migrations ran successfully").pipe(Effect.annotateLogs({ migrations })); return executedMigrations; }); diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index 0c632d8486ca..0e6db87b1091 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -322,7 +322,10 @@ const RuntimeCoreDependenciesLive = ReactorLayerLive.pipe( Layer.provideMerge(ServerSecretStore.layer), Layer.provideMerge( Layer.mergeAll( - CloudCliTokenManager.layer.pipe(Layer.provide(ServerSecretStore.layer)), + CloudCliTokenManager.layer.pipe( + Layer.provide(ServerSecretStore.layer), + Layer.provide(ExternalLauncher.layer), + ), CloudManagedEndpointRuntimeLive, ), ), diff --git a/apps/web/src/cloud/connectCliAuth.test.ts b/apps/web/src/cloud/connectCliAuth.test.ts new file mode 100644 index 000000000000..61d854eb6ab3 --- /dev/null +++ b/apps/web/src/cloud/connectCliAuth.test.ts @@ -0,0 +1,69 @@ +import { afterEach, describe, expect, it, vi } from "vite-plus/test"; + +import { + buildConnectCliClerkAuthorizeUrl, + hasConnectCliAuthConfig, + readConnectCliCallbackResult, +} from "./connectCliAuth"; + +// Any pk_test_* key decodes to .clerk.accounts.dev. +const TEST_PUBLISHABLE_KEY = `pk_test_${btoa("witty-mole-42.clerk.accounts.dev$")}`; + +describe("connectCliAuth", () => { + afterEach(() => { + vi.unstubAllEnvs(); + }); + + it("requires both the publishable key and the CLI OAuth client id", () => { + vi.stubEnv("VITE_CLERK_PUBLISHABLE_KEY", TEST_PUBLISHABLE_KEY); + vi.stubEnv("VITE_CLERK_JWT_TEMPLATE", "t3-relay"); + vi.stubEnv("VITE_T3CODE_RELAY_URL", "https://relay.example.com"); + expect(hasConnectCliAuthConfig()).toBe(false); + + vi.stubEnv("VITE_CLERK_CLI_OAUTH_CLIENT_ID", "oauthapp_123"); + expect(hasConnectCliAuthConfig()).toBe(true); + }); + + it("builds the Clerk authorize URL with the configured hosted origin's callback", () => { + vi.stubEnv("VITE_CLERK_PUBLISHABLE_KEY", TEST_PUBLISHABLE_KEY); + vi.stubEnv("VITE_CLERK_CLI_OAUTH_CLIENT_ID", "oauthapp_123"); + vi.stubEnv("VITE_HOSTED_APP_URL", "https://nightly.app.t3.codes"); + + const authorizeUrl = buildConnectCliClerkAuthorizeUrl({ + state: "state-1", + challenge: "challenge-1", + }); + expect(authorizeUrl).not.toBeNull(); + + const url = new URL(authorizeUrl!); + expect(url.hostname).toBe("witty-mole-42.clerk.accounts.dev"); + expect(url.pathname).toBe("/oauth/authorize"); + expect(url.searchParams.get("redirect_uri")).toBe( + "https://nightly.app.t3.codes/connect/callback", + ); + expect(url.searchParams.get("state")).toBe("state-1"); + expect(url.searchParams.get("code_challenge")).toBe("challenge-1"); + expect(url.searchParams.get("code_challenge_method")).toBe("S256"); + }); + + it("returns null when the CLI OAuth client id is not configured", () => { + vi.stubEnv("VITE_CLERK_PUBLISHABLE_KEY", TEST_PUBLISHABLE_KEY); + expect( + buildConnectCliClerkAuthorizeUrl({ state: "state-1", challenge: "challenge-1" }), + ).toBeNull(); + }); + + it("reads the code and state Clerk echoes back to the callback", () => { + expect( + readConnectCliCallbackResult( + new URL("https://app.t3.codes/connect/callback?code=abc&state=state-1"), + ), + ).toEqual({ code: "abc", state: "state-1" }); + expect( + readConnectCliCallbackResult(new URL("https://app.t3.codes/connect/callback?code=abc")), + ).toBeNull(); + expect( + readConnectCliCallbackResult(new URL("https://app.t3.codes/connect/callback?state=s")), + ).toBeNull(); + }); +}); diff --git a/apps/web/src/cloud/connectCliAuth.ts b/apps/web/src/cloud/connectCliAuth.ts new file mode 100644 index 000000000000..849319dcebef --- /dev/null +++ b/apps/web/src/cloud/connectCliAuth.ts @@ -0,0 +1,91 @@ +import { + buildConnectClerkAuthorizeUrl, + connectCallbackUrl, + CONNECT_OAUTH_SCOPES, + type ConnectAuthorizeRequest, +} from "@t3tools/shared/connectAuth"; +import { clerkFrontendApiUrlFromPublishableKey } from "@t3tools/shared/relayAuth"; + +import { configuredHostedAppUrl, isHostedStaticApp } from "../hostedPairing"; +import { hasCloudPublicConfig, resolveCloudPublicConfig, trimNonEmpty } from "./publicConfig"; + +const CONNECT_CLI_AUTH_STATE_STORAGE_KEY = "t3code-connect-cli-auth-state"; + +export function resolveConnectCliOAuthClientId(): string | null { + return trimNonEmpty(import.meta.env.VITE_CLERK_CLI_OAUTH_CLIENT_ID as string | undefined); +} + +export function hasConnectCliAuthConfig(): boolean { + return Boolean( + resolveCloudPublicConfig().clerkPublishableKey && resolveConnectCliOAuthClientId(), + ); +} + +/** + * Gate for the /connect routes: the CLI handshake only exists on the hosted + * deployment (the same bundle ships inside local instances) and needs the + * Clerk CLI OAuth client configured at build time. + */ +export function connectCliAuthRoutesEnabled(): boolean { + return isHostedStaticApp() && hasCloudPublicConfig() && hasConnectCliAuthConfig(); +} + +/** + * Builds the Clerk authorize URL for a CLI-initiated connect request. The + * state is mirrored into sessionStorage so the callback page can verify the + * response matches a request this browser actually started. + */ +export function buildConnectCliClerkAuthorizeUrl(request: ConnectAuthorizeRequest): string | null { + const { clerkPublishableKey } = resolveCloudPublicConfig(); + const clientId = resolveConnectCliOAuthClientId(); + if (!clerkPublishableKey || !clientId) { + return null; + } + return buildConnectClerkAuthorizeUrl({ + authorizationEndpoint: `${clerkFrontendApiUrlFromPublishableKey(clerkPublishableKey)}/oauth/authorize`, + clientId, + redirectUri: connectCallbackUrl(configuredHostedAppUrl()), + scopes: CONNECT_OAUTH_SCOPES, + state: request.state, + challenge: request.challenge, + }); +} + +export function rememberConnectCliAuthState(state: string): void { + try { + window.sessionStorage.setItem(CONNECT_CLI_AUTH_STATE_STORAGE_KEY, state); + } catch { + // Session storage can be unavailable (e.g. blocked). The callback page + // then falls back to trusting the state Clerk echoed back. + } +} + +/** + * Read-only on purpose: this runs during render, where a removal would be + * consumed by React's double-invoked/discarded renders (StrictMode) and + * silently disable the state check. The value is not a secret and is + * overwritten by the next /connect visit. + */ +export function readConnectCliAuthState(): string | null { + try { + return window.sessionStorage.getItem(CONNECT_CLI_AUTH_STATE_STORAGE_KEY); + } catch { + return null; + } +} + +export interface ConnectCliCallbackResult { + readonly code: string; + readonly state: string; +} + +export function readConnectCliCallbackResult( + url: URL = new URL(window.location.href), +): ConnectCliCallbackResult | null { + const code = url.searchParams.get("code")?.trim() ?? ""; + const state = url.searchParams.get("state")?.trim() ?? ""; + if (!code || !state) { + return null; + } + return { code, state }; +} diff --git a/apps/web/src/cloud/publicConfig.ts b/apps/web/src/cloud/publicConfig.ts index d9d0e5f44cb6..2caf4f52f360 100644 --- a/apps/web/src/cloud/publicConfig.ts +++ b/apps/web/src/cloud/publicConfig.ts @@ -24,7 +24,7 @@ export interface CloudPublicConfig { }; } -function trimNonEmpty(value: string | undefined): string | null { +export function trimNonEmpty(value: string | undefined): string | null { return value?.trim() || null; } diff --git a/apps/web/src/components/SidebarStageBackdrop.tsx b/apps/web/src/components/SidebarStageBackdrop.tsx index 963a8c2a951b..d3d86186c038 100644 --- a/apps/web/src/components/SidebarStageBackdrop.tsx +++ b/apps/web/src/components/SidebarStageBackdrop.tsx @@ -38,11 +38,15 @@ export function SidebarStageBackdrop({ variant }: { variant: SidebarStageBackdro aria-hidden className="sidebar-stage-backdrop pointer-events-none absolute inset-x-0 top-0 z-0 h-20 select-none overflow-hidden" > - {variant === "nightly" ? : } +
); } +export function StageBackdropArt({ variant }: { variant: SidebarStageBackdropVariant }) { + return variant === "nightly" ? : ; +} + const NIGHTLY_STARS: ReadonlyArray<{ cx: number; cy: number; diff --git a/apps/web/src/components/auth/AuthSurfaceShell.tsx b/apps/web/src/components/auth/AuthSurfaceShell.tsx new file mode 100644 index 000000000000..1c45c98a9e49 --- /dev/null +++ b/apps/web/src/components/auth/AuthSurfaceShell.tsx @@ -0,0 +1,44 @@ +import type { ReactNode } from "react"; + +import { APP_DISPLAY_NAME, APP_STAGE_LABEL } from "../../branding"; +import { resolveSidebarStageBackdropVariant, StageBackdropArt } from "../SidebarStageBackdrop"; + +/** + * Full-screen card for standalone auth pages, mirroring the pairing surface's + * treatment. Used by the CLI-connect authorize and callback surfaces. + */ +export function AuthSurfaceShell({ children }: { readonly children: ReactNode }) { + const stageVariant = resolveSidebarStageBackdropVariant(APP_STAGE_LABEL); + + return ( +
+
+
+
+
+ +
+
+ {stageVariant ? ( +
+ +
+ ) : ( +
+ )} +
+
+

+ {APP_DISPLAY_NAME} +

+
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/web/src/components/cloud/ConnectCliAuthSurface.tsx b/apps/web/src/components/cloud/ConnectCliAuthSurface.tsx new file mode 100644 index 000000000000..40ddc4c3dd98 --- /dev/null +++ b/apps/web/src/components/cloud/ConnectCliAuthSurface.tsx @@ -0,0 +1,188 @@ +import { useAuth, useClerk, useUser } from "@clerk/react"; +import { encodeConnectAuthCode, readConnectAuthorizeRequest } from "@t3tools/shared/connectAuth"; +import { useEffect, useRef, useState } from "react"; + +import { + buildConnectCliClerkAuthorizeUrl, + readConnectCliAuthState, + readConnectCliCallbackResult, + rememberConnectCliAuthState, +} from "../../cloud/connectCliAuth"; +import { useCopyToClipboard } from "../../hooks/useCopyToClipboard"; +import { AuthSurfaceShell } from "../auth/AuthSurfaceShell"; +import { Button } from "../ui/button"; + +function ConnectCliAuthMessage({ + eyebrow, + title, + description, +}: { + readonly eyebrow?: string; + readonly title: string; + readonly description: string; +}) { + return ( + <> + {eyebrow ? ( +

+ {eyebrow} +

+ ) : null} +

{title}

+

{description}

+ + ); +} + +const invalidLinkMessage = { + eyebrow: "Authorization request", + title: "This connect link is incomplete", + description: + "The link is missing its authorization request. Re-run `t3 connect` in your terminal and open the freshly printed URL.", +} as const; + +/** + * /connect: the URL a headless CLI prints. Waits for a Clerk session, then + * forwards the CLI's PKCE request to Clerk's authorize endpoint. + */ +export function ConnectCliAuthorizeSurface() { + const [request] = useState(() => readConnectAuthorizeRequest(new URL(window.location.href))); + const clerk = useClerk(); + const { isLoaded, isSignedIn } = useAuth(); + const signInOpened = useRef(false); + const redirecting = useRef(false); + + useEffect(() => { + if (!request || !isLoaded || redirecting.current) { + return; + } + if (!isSignedIn) { + if (!signInOpened.current) { + signInOpened.current = true; + clerk.openSignIn({ forceRedirectUrl: window.location.href }); + } + return; + } + const authorizeUrl = buildConnectCliClerkAuthorizeUrl(request); + if (!authorizeUrl) { + return; + } + redirecting.current = true; + rememberConnectCliAuthState(request.state); + window.location.assign(authorizeUrl); + }, [clerk, isLoaded, isSignedIn, request]); + + if (!request) { + return ( + + + + ); + } + + return ( + + + {isLoaded && !isSignedIn ? ( +
+ +
+ ) : null} +
+ ); +} + +/** + * /connect/callback: Clerk's redirect target. Shows the one-time code the + * user enters in the waiting terminal. + */ +export function ConnectCliCallbackSurface() { + const [result] = useState(readConnectCliCallbackResult); + const [expectedState] = useState(readConnectCliAuthState); + const { user } = useUser(); + const { copyToClipboard, isCopied } = useCopyToClipboard({ target: "authentication code" }); + + if (!result) { + return ( + + + + ); + } + + // Fail closed: the legitimate callback always lands in the same browser + // that visited /connect (which recorded the state), so a missing or + // mismatched state means this page was reached some other way — the CSRF + // shape the state parameter exists to stop. Refuse to display a code. + if (expectedState === null || expectedState !== result.state) { + return ( + + + + ); + } + + const accountLabel = user?.primaryEmailAddress?.emailAddress ?? user?.username ?? null; + const authCode = encodeConnectAuthCode(result); + + return ( + + + +
+
+ + One-time authorization code + + expires shortly +
+ + {authCode} + +
+ +
+ +
+ +

+ Only enter this code in a terminal session you started yourself. Anyone holding it can link + their machine to your T3 Connect account while it is valid. +

+
+ ); +} diff --git a/apps/web/src/hostedPairing.ts b/apps/web/src/hostedPairing.ts index 2caf844af9b8..6a9815b4b336 100644 --- a/apps/web/src/hostedPairing.ts +++ b/apps/web/src/hostedPairing.ts @@ -1,6 +1,6 @@ -import { getPairingTokenFromUrl, setPairingTokenOnUrl } from "./pairingUrl"; +import { DEFAULT_HOSTED_APP_URL } from "@t3tools/shared/connectAuth"; -const DEFAULT_HOSTED_APP_URL = "https://app.t3.codes"; +import { getPairingTokenFromUrl, setPairingTokenOnUrl } from "./pairingUrl"; export interface HostedPairingRequest { readonly host: string; diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts index 3a9140e278c5..b524fe018e95 100644 --- a/apps/web/src/routeTree.gen.ts +++ b/apps/web/src/routeTree.gen.ts @@ -11,6 +11,7 @@ import { Route as rootRouteImport } from './routes/__root' import { Route as SettingsRouteImport } from './routes/settings' import { Route as PairRouteImport } from './routes/pair' +import { Route as ConnectRouteImport } from './routes/connect' import { Route as ChatRouteImport } from './routes/_chat' import { Route as ChatIndexRouteImport } from './routes/_chat.index' import { Route as SettingsSourceControlRouteImport } from './routes/settings.source-control' @@ -20,6 +21,7 @@ import { Route as SettingsGeneralRouteImport } from './routes/settings.general' import { Route as SettingsDiagnosticsRouteImport } from './routes/settings.diagnostics' import { Route as SettingsConnectionsRouteImport } from './routes/settings.connections' import { Route as SettingsArchivedRouteImport } from './routes/settings.archived' +import { Route as ConnectCallbackRouteImport } from './routes/connect_.callback' import { Route as ChatDraftDraftIdRouteImport } from './routes/_chat.draft.$draftId' import { Route as ChatEnvironmentIdThreadIdRouteImport } from './routes/_chat.$environmentId.$threadId' @@ -33,6 +35,11 @@ const PairRoute = PairRouteImport.update({ path: '/pair', getParentRoute: () => rootRouteImport, } as any) +const ConnectRoute = ConnectRouteImport.update({ + id: '/connect', + path: '/connect', + getParentRoute: () => rootRouteImport, +} as any) const ChatRoute = ChatRouteImport.update({ id: '/_chat', getParentRoute: () => rootRouteImport, @@ -77,6 +84,11 @@ const SettingsArchivedRoute = SettingsArchivedRouteImport.update({ path: '/archived', getParentRoute: () => SettingsRoute, } as any) +const ConnectCallbackRoute = ConnectCallbackRouteImport.update({ + id: '/connect_/callback', + path: '/connect/callback', + getParentRoute: () => rootRouteImport, +} as any) const ChatDraftDraftIdRoute = ChatDraftDraftIdRouteImport.update({ id: '/draft/$draftId', path: '/draft/$draftId', @@ -91,8 +103,10 @@ const ChatEnvironmentIdThreadIdRoute = export interface FileRoutesByFullPath { '/': typeof ChatIndexRoute + '/connect': typeof ConnectRoute '/pair': typeof PairRoute '/settings': typeof SettingsRouteWithChildren + '/connect/callback': typeof ConnectCallbackRoute '/settings/archived': typeof SettingsArchivedRoute '/settings/connections': typeof SettingsConnectionsRoute '/settings/diagnostics': typeof SettingsDiagnosticsRoute @@ -104,8 +118,10 @@ export interface FileRoutesByFullPath { '/draft/$draftId': typeof ChatDraftDraftIdRoute } export interface FileRoutesByTo { + '/connect': typeof ConnectRoute '/pair': typeof PairRoute '/settings': typeof SettingsRouteWithChildren + '/connect/callback': typeof ConnectCallbackRoute '/settings/archived': typeof SettingsArchivedRoute '/settings/connections': typeof SettingsConnectionsRoute '/settings/diagnostics': typeof SettingsDiagnosticsRoute @@ -120,8 +136,10 @@ export interface FileRoutesByTo { export interface FileRoutesById { __root__: typeof rootRouteImport '/_chat': typeof ChatRouteWithChildren + '/connect': typeof ConnectRoute '/pair': typeof PairRoute '/settings': typeof SettingsRouteWithChildren + '/connect_/callback': typeof ConnectCallbackRoute '/settings/archived': typeof SettingsArchivedRoute '/settings/connections': typeof SettingsConnectionsRoute '/settings/diagnostics': typeof SettingsDiagnosticsRoute @@ -137,8 +155,10 @@ export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath fullPaths: | '/' + | '/connect' | '/pair' | '/settings' + | '/connect/callback' | '/settings/archived' | '/settings/connections' | '/settings/diagnostics' @@ -150,8 +170,10 @@ export interface FileRouteTypes { | '/draft/$draftId' fileRoutesByTo: FileRoutesByTo to: + | '/connect' | '/pair' | '/settings' + | '/connect/callback' | '/settings/archived' | '/settings/connections' | '/settings/diagnostics' @@ -165,8 +187,10 @@ export interface FileRouteTypes { id: | '__root__' | '/_chat' + | '/connect' | '/pair' | '/settings' + | '/connect_/callback' | '/settings/archived' | '/settings/connections' | '/settings/diagnostics' @@ -181,8 +205,10 @@ export interface FileRouteTypes { } export interface RootRouteChildren { ChatRoute: typeof ChatRouteWithChildren + ConnectRoute: typeof ConnectRoute PairRoute: typeof PairRoute SettingsRoute: typeof SettingsRouteWithChildren + ConnectCallbackRoute: typeof ConnectCallbackRoute } declare module '@tanstack/react-router' { @@ -201,6 +227,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof PairRouteImport parentRoute: typeof rootRouteImport } + '/connect': { + id: '/connect' + path: '/connect' + fullPath: '/connect' + preLoaderRoute: typeof ConnectRouteImport + parentRoute: typeof rootRouteImport + } '/_chat': { id: '/_chat' path: '' @@ -264,6 +297,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof SettingsArchivedRouteImport parentRoute: typeof SettingsRoute } + '/connect_/callback': { + id: '/connect_/callback' + path: '/connect/callback' + fullPath: '/connect/callback' + preLoaderRoute: typeof ConnectCallbackRouteImport + parentRoute: typeof rootRouteImport + } '/_chat/draft/$draftId': { id: '/_chat/draft/$draftId' path: '/draft/$draftId' @@ -321,8 +361,10 @@ const SettingsRouteWithChildren = SettingsRoute._addFileChildren( const rootRouteChildren: RootRouteChildren = { ChatRoute: ChatRouteWithChildren, + ConnectRoute: ConnectRoute, PairRoute: PairRoute, SettingsRoute: SettingsRouteWithChildren, + ConnectCallbackRoute: ConnectCallbackRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) diff --git a/apps/web/src/routes/__root.tsx b/apps/web/src/routes/__root.tsx index 69739ce45703..ff6bc5b39524 100644 --- a/apps/web/src/routes/__root.tsx +++ b/apps/web/src/routes/__root.tsx @@ -97,7 +97,7 @@ function RootRouteView() { }; }, [pathname]); - if (pathname === "/pair") { + if (pathname === "/pair" || pathname === "/connect" || pathname.startsWith("/connect/")) { return ( <> diff --git a/apps/web/src/routes/connect.tsx b/apps/web/src/routes/connect.tsx new file mode 100644 index 000000000000..30750a977ea4 --- /dev/null +++ b/apps/web/src/routes/connect.tsx @@ -0,0 +1,13 @@ +import { createFileRoute, redirect } from "@tanstack/react-router"; + +import { connectCliAuthRoutesEnabled } from "../cloud/connectCliAuth"; +import { ConnectCliAuthorizeSurface } from "../components/cloud/ConnectCliAuthSurface"; + +export const Route = createFileRoute("/connect")({ + beforeLoad: () => { + if (!connectCliAuthRoutesEnabled()) { + throw redirect({ to: "/", replace: true }); + } + }, + component: ConnectCliAuthorizeSurface, +}); diff --git a/apps/web/src/routes/connect_.callback.tsx b/apps/web/src/routes/connect_.callback.tsx new file mode 100644 index 000000000000..a5beee0b9d3b --- /dev/null +++ b/apps/web/src/routes/connect_.callback.tsx @@ -0,0 +1,13 @@ +import { createFileRoute, redirect } from "@tanstack/react-router"; + +import { connectCliAuthRoutesEnabled } from "../cloud/connectCliAuth"; +import { ConnectCliCallbackSurface } from "../components/cloud/ConnectCliAuthSurface"; + +export const Route = createFileRoute("/connect_/callback")({ + beforeLoad: () => { + if (!connectCliAuthRoutesEnabled()) { + throw redirect({ to: "/", replace: true }); + } + }, + component: ConnectCliCallbackSurface, +}); diff --git a/apps/web/src/vite-env.d.ts b/apps/web/src/vite-env.d.ts index d8a6d71b49ad..ac1da93f5c85 100644 --- a/apps/web/src/vite-env.d.ts +++ b/apps/web/src/vite-env.d.ts @@ -9,6 +9,7 @@ interface ImportMetaEnv { readonly VITE_HOSTED_APP_CHANNEL: string; readonly VITE_CLERK_PUBLISHABLE_KEY: string; readonly VITE_CLERK_JWT_TEMPLATE: string; + readonly VITE_CLERK_CLI_OAUTH_CLIENT_ID: string; readonly VITE_RELAY_OTLP_TRACES_URL: string; readonly VITE_RELAY_OTLP_TRACES_DATASET: string; readonly VITE_RELAY_OTLP_TRACES_TOKEN: string; diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index bb6347bf1ac1..6e5b532b58ab 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -18,6 +18,7 @@ const configuredWsUrl = process.env.VITE_WS_URL?.trim(); const configuredRelayUrl = repoEnv.VITE_T3CODE_RELAY_URL?.trim() || ""; const configuredClerkPublishableKey = repoEnv.VITE_CLERK_PUBLISHABLE_KEY?.trim() || ""; const configuredClerkJwtTemplate = repoEnv.VITE_CLERK_JWT_TEMPLATE?.trim() || ""; +const configuredClerkCliOAuthClientId = repoEnv.VITE_CLERK_CLI_OAUTH_CLIENT_ID?.trim() || ""; const configuredRelayTracingUrl = repoEnv.VITE_RELAY_OTLP_TRACES_URL?.trim() || ""; const configuredRelayTracingDataset = repoEnv.VITE_RELAY_OTLP_TRACES_DATASET?.trim() || ""; const configuredRelayTracingToken = repoEnv.VITE_RELAY_OTLP_TRACES_TOKEN?.trim() || ""; @@ -121,6 +122,9 @@ export default defineConfig(() => { "import.meta.env.VITE_T3CODE_RELAY_URL": JSON.stringify(configuredRelayUrl), "import.meta.env.VITE_CLERK_PUBLISHABLE_KEY": JSON.stringify(configuredClerkPublishableKey), "import.meta.env.VITE_CLERK_JWT_TEMPLATE": JSON.stringify(configuredClerkJwtTemplate), + "import.meta.env.VITE_CLERK_CLI_OAUTH_CLIENT_ID": JSON.stringify( + configuredClerkCliOAuthClientId, + ), "import.meta.env.VITE_RELAY_OTLP_TRACES_URL": JSON.stringify(configuredRelayTracingUrl), "import.meta.env.VITE_RELAY_OTLP_TRACES_DATASET": JSON.stringify( configuredRelayTracingDataset, diff --git a/packages/shared/package.json b/packages/shared/package.json index bf68ce766ef1..9c45753cd8ed 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -135,6 +135,10 @@ "types": "./src/cliArgs.ts", "import": "./src/cliArgs.ts" }, + "./connectAuth": { + "types": "./src/connectAuth.ts", + "import": "./src/connectAuth.ts" + }, "./path": { "types": "./src/path.ts", "import": "./src/path.ts" diff --git a/packages/shared/src/connectAuth.test.ts b/packages/shared/src/connectAuth.test.ts new file mode 100644 index 000000000000..9ffef3936bbf --- /dev/null +++ b/packages/shared/src/connectAuth.test.ts @@ -0,0 +1,78 @@ +import { describe, expect, it } from "vite-plus/test"; + +import { + buildConnectAuthorizeRequestUrl, + buildConnectClerkAuthorizeUrl, + connectCallbackUrl, + encodeConnectAuthCode, + parseConnectAuthCode, + readConnectAuthorizeRequest, +} from "./connectAuth.ts"; + +describe("connectAuth", () => { + it("round-trips state and challenge through the authorize URL fragment", () => { + const url = buildConnectAuthorizeRequestUrl({ + hostedAppUrl: "https://app.t3.codes", + state: "q7mK9xV2pL4nR8sT6wYzAQ", + challenge: "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM", + }); + const parsed = new URL(url); + + expect(parsed.origin).toBe("https://app.t3.codes"); + expect(parsed.pathname).toBe("/connect"); + expect(parsed.search).toBe(""); + expect(readConnectAuthorizeRequest(parsed)).toEqual({ + state: "q7mK9xV2pL4nR8sT6wYzAQ", + challenge: "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM", + }); + }); + + it("rejects authorize requests missing state or challenge", () => { + expect(readConnectAuthorizeRequest(new URL("https://app.t3.codes/connect"))).toBeNull(); + expect( + readConnectAuthorizeRequest(new URL("https://app.t3.codes/connect#state=abc")), + ).toBeNull(); + expect( + readConnectAuthorizeRequest(new URL("https://app.t3.codes/connect#challenge=abc")), + ).toBeNull(); + }); + + it("builds a PKCE authorize URL against the Clerk endpoint", () => { + const url = new URL( + buildConnectClerkAuthorizeUrl({ + authorizationEndpoint: "https://clerk.t3.codes/oauth/authorize", + clientId: "oauthapp_123", + redirectUri: connectCallbackUrl("https://app.t3.codes"), + scopes: ["openid", "profile", "email"], + state: "state-1", + challenge: "challenge-1", + }), + ); + + expect(url.origin).toBe("https://clerk.t3.codes"); + expect(url.pathname).toBe("/oauth/authorize"); + expect(url.searchParams.get("client_id")).toBe("oauthapp_123"); + expect(url.searchParams.get("redirect_uri")).toBe("https://app.t3.codes/connect/callback"); + expect(url.searchParams.get("response_type")).toBe("code"); + expect(url.searchParams.get("scope")).toBe("openid profile email"); + expect(url.searchParams.get("state")).toBe("state-1"); + expect(url.searchParams.get("code_challenge")).toBe("challenge-1"); + expect(url.searchParams.get("code_challenge_method")).toBe("S256"); + }); + + it("round-trips the out-of-band authorization code and preserves dots inside it", () => { + const blob = encodeConnectAuthCode({ code: "az9.code.chunk", state: "state-uuid" }); + expect(parseConnectAuthCode(blob)).toEqual({ code: "az9.code.chunk", state: "state-uuid" }); + expect(parseConnectAuthCode(` ${blob}\n`)).toEqual({ + code: "az9.code.chunk", + state: "state-uuid", + }); + }); + + it("rejects malformed out-of-band authorization codes", () => { + expect(parseConnectAuthCode("")).toBeNull(); + expect(parseConnectAuthCode("no-separator")).toBeNull(); + expect(parseConnectAuthCode(".leading")).toBeNull(); + expect(parseConnectAuthCode("trailing.")).toBeNull(); + }); +}); diff --git a/packages/shared/src/connectAuth.ts b/packages/shared/src/connectAuth.ts new file mode 100644 index 000000000000..8d849d77ae6d --- /dev/null +++ b/packages/shared/src/connectAuth.ts @@ -0,0 +1,124 @@ +import { readHashParams } from "./remote.ts"; + +const CONNECT_AUTH_STATE_PARAM = "state"; +const CONNECT_AUTH_CHALLENGE_PARAM = "challenge"; +const CONNECT_AUTH_CODE_SEPARATOR = "."; + +const CONNECT_AUTHORIZE_PATH = "/connect"; +const CONNECT_CALLBACK_PATH = "/connect/callback"; + +/** + * The CLI prints URLs against this origin and the web bundle uses it to + * decide whether it is the hosted deployment — the two must agree, so the + * default lives here. + */ +export const DEFAULT_HOSTED_APP_URL = "https://app.t3.codes"; + +/** + * Requested at authorize time by the hosted page and honored by the CLI's + * token exchange; keep both sides on this single definition. + */ +export const CONNECT_OAUTH_SCOPES = ["openid", "profile", "email"] as const; + +export interface ConnectAuthorizeRequest { + readonly state: string; + readonly challenge: string; +} + +/** + * The URL a headless CLI prints for the user to open on a machine with a + * browser. `state` and `code_challenge` ride the fragment so they never reach + * the hosted app's server or CDN logs; neither is a secret. + */ +export function buildConnectAuthorizeRequestUrl(input: { + readonly hostedAppUrl: string; + readonly state: string; + readonly challenge: string; +}): string { + const url = new URL(CONNECT_AUTHORIZE_PATH, input.hostedAppUrl); + url.hash = new URLSearchParams([ + [CONNECT_AUTH_STATE_PARAM, input.state], + [CONNECT_AUTH_CHALLENGE_PARAM, input.challenge], + ]).toString(); + return url.toString(); +} + +export function readConnectAuthorizeRequest(url: URL): ConnectAuthorizeRequest | null { + const params = readHashParams(url); + const state = params.get(CONNECT_AUTH_STATE_PARAM)?.trim() ?? ""; + const challenge = params.get(CONNECT_AUTH_CHALLENGE_PARAM)?.trim() ?? ""; + if (!state || !challenge) { + return null; + } + return { state, challenge }; +} + +export function connectCallbackUrl(hostedAppUrl: string): string { + return new URL(CONNECT_CALLBACK_PATH, hostedAppUrl).toString(); +} + +export function buildConnectClerkAuthorizeUrl(input: { + readonly authorizationEndpoint: string; + readonly clientId: string; + readonly redirectUri: string; + readonly scopes: ReadonlyArray; + readonly state: string; + readonly challenge: string; +}): string { + const url = new URL(input.authorizationEndpoint); + url.searchParams.set("client_id", input.clientId); + url.searchParams.set("redirect_uri", input.redirectUri); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", input.scopes.join(" ")); + url.searchParams.set("state", input.state); + url.searchParams.set("code_challenge", input.challenge); + url.searchParams.set("code_challenge_method", "S256"); + return url.toString(); +} + +export interface ConnectAuthCode { + readonly code: string; + readonly state: string; +} + +/** + * The single blob the hosted callback page displays and the CLI accepts. + * Bundling `state` with the authorization code lets the CLI keep the loopback + * flow's CSRF check without any backend: it verifies the returned state + * matches the one it generated. Clerk authorization codes and the CLI's + * base64url states never contain ".". + */ +export function encodeConnectAuthCode(input: ConnectAuthCode): string { + return `${input.code}${CONNECT_AUTH_CODE_SEPARATOR}${input.state}`; +} + +/** + * Validates an out-of-band authorization code against the state of the request this process + * generated. Returns the parsed code or a user-facing error message; both + * the prompt's live validation and the authoritative post-prompt check go + * through here so they cannot drift. + */ +export function checkConnectAuthCode( + blob: string, + expectedState: string, +): ConnectAuthCode | string { + const parsed = parseConnectAuthCode(blob); + if (parsed === null) { + return "That does not look like a T3 Connect code. Copy the full code."; + } + if (parsed.state !== expectedState) { + return "That code belongs to a different connect request. Open the URL above and try again."; + } + return parsed; +} + +export function parseConnectAuthCode(blob: string): ConnectAuthCode | null { + const trimmed = blob.trim(); + const separatorIndex = trimmed.lastIndexOf(CONNECT_AUTH_CODE_SEPARATOR); + if (separatorIndex <= 0 || separatorIndex === trimmed.length - 1) { + return null; + } + const code = trimmed.slice(0, separatorIndex); + const state = trimmed.slice(separatorIndex + 1); + return { code, state }; +} diff --git a/packages/shared/src/hostProcess.ts b/packages/shared/src/hostProcess.ts index 1e5b69749cf3..baff2c5ffed7 100644 --- a/packages/shared/src/hostProcess.ts +++ b/packages/shared/src/hostProcess.ts @@ -30,4 +30,18 @@ export const HostProcessEnvironment = Context.Reference( }, ); +export const HostProcessExecutablePath = Context.Reference( + "@t3tools/shared/hostProcess/HostProcessExecutablePath", + { + defaultValue: () => process.execPath, + }, +); + +export const HostProcessArguments = Context.Reference>( + "@t3tools/shared/hostProcess/HostProcessArguments", + { + defaultValue: () => process.argv, + }, +); + export const isHostWindows = Effect.map(HostProcessPlatform, (platform) => platform === "win32"); diff --git a/packages/shared/src/remote.ts b/packages/shared/src/remote.ts index 0adfc6fe90a6..1b5d1c586e22 100644 --- a/packages/shared/src/remote.ts +++ b/packages/shared/src/remote.ts @@ -5,7 +5,7 @@ const HOSTED_PAIRING_HOST_PARAM = "host"; const HOSTED_PAIRING_LABEL_PARAM = "label"; const SUPPORTED_REMOTE_BACKEND_PROTOCOLS = new Set(["http:", "https:", "ws:", "wss:"]); -const readHashParams = (url: URL): URLSearchParams => +export const readHashParams = (url: URL): URLSearchParams => new URLSearchParams(url.hash.startsWith("#") ? url.hash.slice(1) : url.hash); export class RemoteBackendUrlMissingError extends Schema.TaggedErrorClass()( diff --git a/scripts/lib/public-config.ts b/scripts/lib/public-config.ts index 9b988df9c5ba..36ca5497f803 100644 --- a/scripts/lib/public-config.ts +++ b/scripts/lib/public-config.ts @@ -55,6 +55,7 @@ export function loadRepoEnv({ ...(config.clerkCliOAuthClientId ? { T3CODE_CLERK_CLI_OAUTH_CLIENT_ID: config.clerkCliOAuthClientId, + VITE_CLERK_CLI_OAUTH_CLIENT_ID: config.clerkCliOAuthClientId, } : {}), ...(config.relayUrl @@ -116,7 +117,11 @@ export function resolvePublicConfig(...sources: readonly Environment[]): T3CodeP "VITE_CLERK_JWT_TEMPLATE", "EXPO_PUBLIC_CLERK_JWT_TEMPLATE", ), - clerkCliOAuthClientId: firstNonEmpty(sources, "T3CODE_CLERK_CLI_OAUTH_CLIENT_ID"), + clerkCliOAuthClientId: firstNonEmpty( + sources, + "T3CODE_CLERK_CLI_OAUTH_CLIENT_ID", + "VITE_CLERK_CLI_OAUTH_CLIENT_ID", + ), relayUrl: firstNonEmpty(sources, "T3CODE_RELAY_URL", "VITE_T3CODE_RELAY_URL"), mobileOtlpTracesUrl: firstNonEmpty( sources, From 2b180a2b2d307a902fa63c8de3d7a42ea5e1b9c5 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 19 Jul 2026 19:23:53 +0200 Subject: [PATCH 23/31] Refine T3 Connect authorization surfaces (#4159) Co-authored-by: codex --- apps/server/src/cloud/cliAuthHtml.test.ts | 24 ++++++- apps/server/src/cloud/cliAuthHtml.ts | 85 +++++++++++++---------- apps/server/vite.config.ts | 3 + apps/web/src/branding.logic.ts | 4 ++ apps/web/src/branding.test.ts | 11 +++ 5 files changed, 89 insertions(+), 38 deletions(-) diff --git a/apps/server/src/cloud/cliAuthHtml.test.ts b/apps/server/src/cloud/cliAuthHtml.test.ts index a49eaffeda75..1104927b9800 100644 --- a/apps/server/src/cloud/cliAuthHtml.test.ts +++ b/apps/server/src/cloud/cliAuthHtml.test.ts @@ -1,13 +1,31 @@ import { expect, it } from "@effect/vitest"; -import { renderLoopbackAuthorizationCompleteHtml } from "./cliAuthHtml.ts"; +import { + renderLoopbackAuthorizationCompleteHtml, + resolveLoopbackAuthorizationStage, +} from "./cliAuthHtml.ts"; it("renders the branded loopback authorization completion page", () => { const html = renderLoopbackAuthorizationCompleteHtml(); - expect(html).toContain("T3 Code"); + expect(resolveLoopbackAuthorizationStage()).toBe("dev"); + expect(html).toContain("T3 Code (Dev)"); + expect(html).toContain('class="stage stage-dev"'); expect(html).not.toContain("Secure terminal handoff"); expect(html).toContain("You're connected"); - expect(html).toContain("return to the terminal"); + expect(html).toContain("Return to your terminal"); + expect(html).not.toContain('class="next"'); expect(html).toContain('name="viewport"'); + expect(html).not.toContain('class="status"'); +}); + +it("renders the matching header treatment for each release channel", () => { + const nightly = renderLoopbackAuthorizationCompleteHtml("nightly"); + const latest = renderLoopbackAuthorizationCompleteHtml("latest"); + + expect(nightly).toContain("T3 Code (Nightly)"); + expect(nightly).toContain('class="stage stage-nightly"'); + expect(latest).toContain('

T3 Code

'); + expect(latest).not.toContain("(Latest)"); + expect(latest).toContain('class="stage stage-latest"'); }); diff --git a/apps/server/src/cloud/cliAuthHtml.ts b/apps/server/src/cloud/cliAuthHtml.ts index 3c4141fba446..5a22a25993a9 100644 --- a/apps/server/src/cloud/cliAuthHtml.ts +++ b/apps/server/src/cloud/cliAuthHtml.ts @@ -1,4 +1,22 @@ -export function renderLoopbackAuthorizationCompleteHtml(): string { +export type LoopbackAuthorizationStage = "dev" | "nightly" | "latest"; + +declare const __T3CODE_BUILD_CHANNEL__: "nightly" | "latest" | undefined; + +export function resolveLoopbackAuthorizationStage(): LoopbackAuthorizationStage { + return typeof __T3CODE_BUILD_CHANNEL__ === "undefined" ? "dev" : __T3CODE_BUILD_CHANNEL__; +} + +const stageBrands = { + dev: "T3 Code (Dev)", + nightly: "T3 Code (Nightly)", + latest: "T3 Code", +} as const satisfies Record; + +export function renderLoopbackAuthorizationCompleteHtml( + stage: LoopbackAuthorizationStage = resolveLoopbackAuthorizationStage(), +): string { + const stageBrand = stageBrands[stage]; + return ` @@ -38,9 +56,16 @@ export function renderLoopbackAuthorizationCompleteHtml(): string { overflow: hidden; padding: 22px 24px; color: white; + } + .stage-latest { + background: + radial-gradient(circle at 76% 18%, rgba(136, 204, 255, 0.52), transparent 38%), + linear-gradient(135deg, #2468df, #172f82); + } + .stage-dev { background: linear-gradient(145deg, #5ab8fa 0%, #347ff8 46%, #1939bd 100%); } - .stage::before { + .stage-dev::before { content: ""; position: absolute; inset: 0; @@ -52,6 +77,22 @@ export function renderLoopbackAuthorizationCompleteHtml(): string { linear-gradient(90deg, rgba(234, 246, 255, 0.12) 1px, transparent 1px); background-size: 32px 32px, 32px 32px, 8px 8px, 8px 8px; } + .stage-nightly { + background: + radial-gradient(22rem 8rem at 78% 18%, rgba(81, 101, 216, 0.42), transparent 58%), + linear-gradient(145deg, #07152f 0%, #151443 52%, #32155b 100%); + } + .stage-nightly::before { + content: ""; + position: absolute; + inset: 0; + opacity: 0.78; + background-image: + radial-gradient(circle at 12px 12px, rgba(228, 234, 255, 0.9) 0 1px, transparent 1.5px), + radial-gradient(circle at 38px 28px, rgba(228, 234, 255, 0.58) 0 0.8px, transparent 1.3px), + radial-gradient(circle at 58px 9px, rgba(200, 215, 255, 0.72) 0 0.9px, transparent 1.4px); + background-size: 72px 48px, 96px 64px, 128px 56px; + } .stage::after { content: ""; position: absolute; @@ -63,6 +104,10 @@ export function renderLoopbackAuthorizationCompleteHtml(): string { .stage-content { position: relative; z-index: 1; + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; } .brand { margin: 0; @@ -73,21 +118,6 @@ export function renderLoopbackAuthorizationCompleteHtml(): string { } .brand { color: rgba(255, 255, 255, 0.82); } .content { padding: 30px 32px 34px; } - .status { - width: 42px; - height: 42px; - display: grid; - place-items: center; - margin-top: -52px; - margin-bottom: 22px; - border: 4px solid white; - border-radius: 50%; - background: #2065df; - color: white; - font-size: 22px; - font-weight: 700; - box-shadow: 0 8px 22px rgba(25, 72, 177, 0.3); - } .eyebrow { margin: 0 0 8px; color: #2866cc; @@ -98,41 +128,26 @@ export function renderLoopbackAuthorizationCompleteHtml(): string { } h1 { margin: 0; font-size: clamp(26px, 5vw, 34px); line-height: 1.12; letter-spacing: -0.035em; } .description { margin: 12px 0 0; color: #646975; font-size: 15px; line-height: 1.6; } - .next { - margin-top: 24px; - padding: 14px 16px; - border: 1px solid rgba(23, 25, 31, 0.1); - border-radius: 12px; - background: #f7f8fa; - color: #454a55; - font-size: 13px; - } - .next strong { color: #17191f; } @media (prefers-color-scheme: dark) { :root { background: #101115; color: #f1f3f7; } body { background: radial-gradient(48rem 22rem at 50% -8rem, rgba(55, 102, 210, 0.2), transparent), #101115; } main { border-color: rgba(255, 255, 255, 0.1); background: rgba(25, 27, 33, 0.96); } - .status { border-color: #191b21; } .eyebrow { color: #77a8ff; } .description { color: #a8adb8; } - .next { border-color: rgba(255, 255, 255, 0.1); background: #20232a; color: #b9bec8; } - .next strong { color: #f1f3f7; } }
-
+
-

T3 Code

+

${stageBrand}

-

Browser authorization complete

You're connected

-

The authorization code was delivered securely to your waiting terminal.

- +

Return to your terminal to finish setting up T3 Connect. You can close this window.

diff --git a/apps/server/vite.config.ts b/apps/server/vite.config.ts index 473df069ed7d..521654f3279f 100644 --- a/apps/server/vite.config.ts +++ b/apps/server/vite.config.ts @@ -3,6 +3,7 @@ import { defineConfig, mergeConfig } from "vite-plus"; import baseConfig from "../../vite.config.ts"; import { loadRepoEnv } from "../../scripts/lib/public-config.ts"; +import packageJson from "./package.json" with { type: "json" }; const bundledPackagePrefixes = [ "@pierre/diffs", @@ -16,6 +17,7 @@ export function shouldBundleCliDependency(id: string): boolean { } const repoEnv = loadRepoEnv(); +const cliBuildChannel = packageJson.version.includes("-nightly.") ? "nightly" : "latest"; export default mergeConfig( baseConfig, @@ -42,6 +44,7 @@ export default mergeConfig( js: "#!/usr/bin/env node\n", }, define: { + __T3CODE_BUILD_CHANNEL__: JSON.stringify(cliBuildChannel), __T3CODE_BUILD_RELAY_URL__: JSON.stringify(repoEnv.T3CODE_RELAY_URL?.trim() ?? ""), __T3CODE_BUILD_CLERK_PUBLISHABLE_KEY__: JSON.stringify( repoEnv.T3CODE_CLERK_PUBLISHABLE_KEY?.trim() ?? "", diff --git a/apps/web/src/branding.logic.ts b/apps/web/src/branding.logic.ts index b87276f1b9cf..056fbb76e6ab 100644 --- a/apps/web/src/branding.logic.ts +++ b/apps/web/src/branding.logic.ts @@ -4,6 +4,10 @@ export function formatAppDisplayName(input: { readonly baseName: string; readonly stageLabel: string; }): string { + if (input.stageLabel.trim().toLowerCase() === "latest") { + return input.baseName; + } + return `${input.baseName} (${input.stageLabel})`; } diff --git a/apps/web/src/branding.test.ts b/apps/web/src/branding.test.ts index 4aa969c0279d..e1c87bcf0595 100644 --- a/apps/web/src/branding.test.ts +++ b/apps/web/src/branding.test.ts @@ -50,6 +50,17 @@ describe("branding", () => { expect(branding.APP_DISPLAY_NAME).toBe("T3 Code (Nightly)"); }); + it("does not label the latest hosted app channel", async () => { + vi.stubEnv("VITE_HOSTED_APP_CHANNEL", "latest"); + + const branding = await import("./branding"); + + expect(branding.HOSTED_APP_CHANNEL).toBe("latest"); + expect(branding.HOSTED_APP_CHANNEL_LABEL).toBe("Latest"); + expect(branding.APP_STAGE_LABEL).toBe("Latest"); + expect(branding.APP_DISPLAY_NAME).toBe("T3 Code"); + }); + it("ignores unknown hosted app channels", async () => { vi.stubEnv("VITE_HOSTED_APP_CHANNEL", "preview"); From 398140a9bde5596cd6b45dc546150c6f5e3b23b7 Mon Sep 17 00:00:00 2001 From: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Date: Sun, 19 Jul 2026 23:03:10 +0530 Subject: [PATCH 24/31] fix: increase OpenCode server startup timeout from 5s to 30s (#4132) --- apps/server/src/provider/opencodeRuntime.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/provider/opencodeRuntime.ts b/apps/server/src/provider/opencodeRuntime.ts index a83c134d5bd2..46d0b3019bd6 100644 --- a/apps/server/src/provider/opencodeRuntime.ts +++ b/apps/server/src/provider/opencodeRuntime.ts @@ -37,7 +37,7 @@ const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJ const OPENCODE_EMPTY_CONFIG_CONTENT = "{}"; const OPENCODE_SERVER_READY_PREFIX = "opencode server listening"; -const DEFAULT_OPENCODE_SERVER_TIMEOUT_MS = 5_000; +const DEFAULT_OPENCODE_SERVER_TIMEOUT_MS = 30_000; const DEFAULT_HOSTNAME = "127.0.0.1"; export interface OpenCodeServerProcess { readonly url: string; From e8ff6bc7f829911faf23074b147f95d0470d518d Mon Sep 17 00:00:00 2001 From: Kriday Dave Date: Sun, 19 Jul 2026 23:07:22 +0530 Subject: [PATCH 25/31] fix(shared): delete unused agentAwareness phase predicates (#4134) --- packages/shared/src/agentAwareness.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/shared/src/agentAwareness.ts b/packages/shared/src/agentAwareness.ts index 248b983cd4fd..c0f5842eb7c5 100644 --- a/packages/shared/src/agentAwareness.ts +++ b/packages/shared/src/agentAwareness.ts @@ -50,14 +50,6 @@ export function buildAgentAwarenessDeepLink(input: { return `/threads/${encodeURIComponent(input.environmentId)}/${encodeURIComponent(input.threadId)}`; } -export function isTerminalAgentAwarenessPhase(phase: AgentAwarenessPhase): boolean { - return phase === "completed" || phase === "failed"; -} - -export function isInterruptiveAgentAwarenessPhase(phase: AgentAwarenessPhase): boolean { - return phase === "waiting_for_approval" || phase === "waiting_for_input" || phase === "failed"; -} - export function projectThreadAwareness( input: ProjectThreadAwarenessInput, ): AgentAwarenessState | null { From 271454cbd2f93f25c8c158c0bb247164a0041578 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 19 Jul 2026 19:40:22 +0200 Subject: [PATCH 26/31] fix(mobile): Stabilize native stack option updates (#4037) Co-authored-by: codex --- apps/mobile/src/native/StackHeader.tsx | 103 +++++++++++++++++- ...act-navigation%2Fnative-stack@7.17.6.patch | 2 + pnpm-lock.yaml | 6 +- 3 files changed, 105 insertions(+), 6 deletions(-) diff --git a/apps/mobile/src/native/StackHeader.tsx b/apps/mobile/src/native/StackHeader.tsx index bbcbb8e4282b..8a8c355b760c 100644 --- a/apps/mobile/src/native/StackHeader.tsx +++ b/apps/mobile/src/native/StackHeader.tsx @@ -11,6 +11,7 @@ import { useEffect, useLayoutEffect, useMemo, + useRef, type ReactElement, type ReactNode, } from "react"; @@ -61,20 +62,116 @@ function normalizeScreenOptions( return normalized as NativeStackNavigationOptions; } +function optionsSignature(value: unknown, seen = new WeakSet()): string { + if (value === null) return "null"; + switch (typeof value) { + case "boolean": + case "number": + case "string": + return JSON.stringify(value); + case "undefined": + return "undefined"; + case "function": + // Header factories are frequently recreated inline. Their source is + // stable across equivalent renders, while a reference comparison would + // make navigation.setOptions re-enter the navigator indefinitely. + return `function:${Function.prototype.toString.call(value)}`; + case "symbol": + return `symbol:${String(value)}`; + case "bigint": + return `bigint:${String(value)}`; + case "object": { + const object = value as object; + if (seen.has(object)) return "[circular]"; + seen.add(object); + if (Array.isArray(value)) { + return `[${value.map((entry) => optionsSignature(entry, seen)).join(",")}]`; + } + // React refs carry mutable native instances that must not make static + // screen options appear different after every render. + if ("current" in object) return "[ref]"; + return `{${Object.keys(value as Record) + .sort() + .map( + (key) => + `${JSON.stringify(key)}:${optionsSignature((value as Record)[key], seen)}`, + ) + .join(",")}}`; + } + } + return String(value); +} + +function stabilizeOptionFunctions( + value: unknown, + path: string, + latestFunctions: Map unknown>, + wrappers: Map unknown>, + seen = new WeakSet(), +): unknown { + if (typeof value === "function") { + latestFunctions.set(path, value as (...args: unknown[]) => unknown); + let wrapper = wrappers.get(path); + if (!wrapper) { + wrapper = (...args: unknown[]) => { + return latestFunctions.get(path)?.(...args); + }; + wrappers.set(path, wrapper); + } + return wrapper; + } + if (Array.isArray(value)) { + if (seen.has(value)) return value; + seen.add(value); + return value.map((entry, index) => + stabilizeOptionFunctions(entry, `${path}[${index}]`, latestFunctions, wrappers, seen), + ); + } + if (value !== null && typeof value === "object") { + if (seen.has(value) || "current" in value) return value; + seen.add(value); + return Object.fromEntries( + Object.entries(value as Record).map(([key, entry]) => [ + key, + stabilizeOptionFunctions(entry, `${path}.${key}`, latestFunctions, wrappers, seen), + ]), + ); + } + return value; +} + export function NativeStackScreenOptions(props: { readonly options?: AppNativeStackNavigationOptions; readonly listeners?: Record void>; readonly name?: string; }) { const navigation = useNativeStackNavigation(); + const lastAppliedOptionsSignatureRef = useRef(undefined); + const latestOptionFunctionsRef = useRef(new Map unknown>()); + const optionFunctionWrappersRef = useRef(new Map unknown>()); const normalizedOptions = useMemo(() => normalizeScreenOptions(props.options), [props.options]); + const stableOptions = normalizedOptions + ? (stabilizeOptionFunctions( + normalizedOptions, + "options", + latestOptionFunctionsRef.current, + optionFunctionWrappersRef.current, + ) as NativeStackNavigationOptions) + : undefined; useLayoutEffect(() => { - if (!navigation || !normalizedOptions) { + if (!navigation || !stableOptions) { + return; + } + const signature = optionsSignature(stableOptions); + // Avoid re-entering navigation state when semantically equal options are + // reapplied every layout (common when callers pass unstable object literals). + if (lastAppliedOptionsSignatureRef.current === signature) { return; } - navigation.setOptions(normalizedOptions); - }, [navigation, normalizedOptions]); + lastAppliedOptionsSignatureRef.current = signature; + navigation.setOptions(stableOptions); + }, [navigation, stableOptions]); useEffect(() => { if (!navigation || !props.listeners) { diff --git a/patches/@react-navigation%2Fnative-stack@7.17.6.patch b/patches/@react-navigation%2Fnative-stack@7.17.6.patch index cd2b86fb76c8..1ec4d978529f 100644 --- a/patches/@react-navigation%2Fnative-stack@7.17.6.patch +++ b/patches/@react-navigation%2Fnative-stack@7.17.6.patch @@ -1,3 +1,5 @@ +diff --git a/lib/module/views/useHeaderConfigProps.js b/lib/module/views/useHeaderConfigProps.js +index 0b75c70b4e0d233ee3b5faaf9cfbc40d4f8ed494..eb174e3fde91a7783f132b3fb16b01175ec19220 100644 --- a/lib/module/views/useHeaderConfigProps.js +++ b/lib/module/views/useHeaderConfigProps.js @@ -19,6 +19,12 @@ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0271c378aed..c58ccffc4200 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -75,7 +75,7 @@ patchedDependencies: '@legendapp/list@3.2.0': 45e4cbcbeeca1b628b8480869374d7cbc77e3fbfa97ee0107a0d72c3c4a5d7f3 '@pierre/diffs@1.3.0-beta.5': 7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae - '@react-navigation/native-stack@7.17.6': 2d7fec7933e324ccf082b1ae0df3907c35d16d48c117d628e27d9c3921c26bca + '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c717273 effect@4.0.0-beta.78: c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c5 expo-modules-jsi@56.0.10: 9170f8074ae4e35a0a086e756c8f815794fd3abe51eac67ca3ba02804225ec1f react-native-gesture-handler@2.31.2: 808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d3 @@ -229,7 +229,7 @@ importers: version: 7.3.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3) '@react-navigation/native-stack': specifier: 7.17.6 - version: 7.17.6(patch_hash=2d7fec7933e324ccf082b1ae0df3907c35d16d48c117d628e27d9c3921c26bca)(a49e8e72dc3ef754b9d26038db8e6d3f) + version: 7.17.6(patch_hash=c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c717273)(a49e8e72dc3ef754b9d26038db8e6d3f) '@shikijs/core': specifier: 4.2.0 version: 4.2.0 @@ -14148,7 +14148,7 @@ snapshots: optionalDependencies: '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3) - '@react-navigation/native-stack@7.17.6(patch_hash=2d7fec7933e324ccf082b1ae0df3907c35d16d48c117d628e27d9c3921c26bca)(a49e8e72dc3ef754b9d26038db8e6d3f)': + '@react-navigation/native-stack@7.17.6(patch_hash=c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c717273)(a49e8e72dc3ef754b9d26038db8e6d3f)': dependencies: '@react-navigation/elements': 2.9.26(c6a2ad0e2c930f8e3896e77c3ba11bc4) '@react-navigation/native': 7.3.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3) From 69c8be2ee54e3aff9c90b98d8e10aeafd0aaae2e Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 19 Jul 2026 20:32:36 +0200 Subject: [PATCH 27/31] Make test-t3-app skill discoverable by Claude Code (#4162) Co-authored-by: Claude Sonnet 5 --- .claude/skills | 1 + 1 file changed, 1 insertion(+) create mode 120000 .claude/skills diff --git a/.claude/skills b/.claude/skills new file mode 120000 index 000000000000..2b7a412b8fa0 --- /dev/null +++ b/.claude/skills @@ -0,0 +1 @@ +../.agents/skills \ No newline at end of file From b511227b7ad421c422f1ebca65116776020e4799 Mon Sep 17 00:00:00 2001 From: maria Date: Sun, 19 Jul 2026 17:02:23 -0400 Subject: [PATCH 28/31] fix(web): improve dev sidebar backdrop contrast & remove version pills (#4166) --- apps/web/src/components/Sidebar.tsx | 14 ++------------ apps/web/src/components/SidebarStageBackdrop.tsx | 4 ++-- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 38e9f7a828a7..715a94e96724 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -2762,12 +2762,12 @@ const SidebarChromeHeader = memo(function SidebarChromeHeader({ backdropVariant && "hover:bg-white/15 [&_svg]:text-white/85! [&_svg]:hover:text-white!", )} /> - + ); }); -function SidebarBrand({ stageLabel, onBackdrop }: { stageLabel: string; onBackdrop: boolean }) { +function SidebarBrand({ onBackdrop }: { onBackdrop: boolean }) { return ( Code - - {stageLabel} - ); } diff --git a/apps/web/src/components/SidebarStageBackdrop.tsx b/apps/web/src/components/SidebarStageBackdrop.tsx index d3d86186c038..6f0953a9773d 100644 --- a/apps/web/src/components/SidebarStageBackdrop.tsx +++ b/apps/web/src/components/SidebarStageBackdrop.tsx @@ -201,9 +201,9 @@ function DevBlueprintArt() { gradientUnits="userSpaceOnUse" spreadMethod="reflect" > - + - + Date: Mon, 20 Jul 2026 01:24:57 +0200 Subject: [PATCH 29/31] Fix draft banner stack overlap (#4164) Co-authored-by: codex --- .../chat/ComposerBannerStack.test.tsx | 37 +++++++++++++++ .../components/chat/ComposerBannerStack.tsx | 47 +++++++++++-------- .../src/components/chat/DraftHeroHeadline.tsx | 2 +- 3 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 apps/web/src/components/chat/ComposerBannerStack.test.tsx diff --git a/apps/web/src/components/chat/ComposerBannerStack.test.tsx b/apps/web/src/components/chat/ComposerBannerStack.test.tsx new file mode 100644 index 000000000000..16fdff644255 --- /dev/null +++ b/apps/web/src/components/chat/ComposerBannerStack.test.tsx @@ -0,0 +1,37 @@ +import { renderToStaticMarkup } from "react-dom/server"; +import { describe, expect, it } from "vite-plus/test"; + +import { ComposerBannerStack, type ComposerBannerStackItem } from "./ComposerBannerStack"; + +const banner = (id: string): ComposerBannerStackItem => ({ + id, + variant: "warning", + icon: , + title: `${id} warning`, +}); + +describe("ComposerBannerStack", () => { + it("keeps expanded banners in layout flow so surrounding content moves out of their way", () => { + const markup = renderToStaticMarkup( + , + ); + + const expandedItems = markup.match( + /
/, + ); + + expect(expandedItems?.[1]).toContain("grid-rows-[0fr]"); + expect(expandedItems?.[1]).toContain("group-hover/banner-stack:grid-rows-[1fr]"); + expect(expandedItems?.[1]).toContain("z-20"); + expect(expandedItems?.[1]).not.toContain("absolute"); + expect(markup.indexOf("front warning")).toBeLessThan(markup.indexOf("stacked warning")); + expect(markup).toContain("invisible pointer-events-none"); + expect(markup).toContain("group-focus-within/banner-stack:visible"); + }); + + it("does not render an expandable region for a single banner", () => { + const markup = renderToStaticMarkup(); + + expect(markup).not.toContain("data-composer-banner-stack-expanded-items"); + }); +}); diff --git a/apps/web/src/components/chat/ComposerBannerStack.tsx b/apps/web/src/components/chat/ComposerBannerStack.tsx index 1f82c452b058..d51c23a2f276 100644 --- a/apps/web/src/components/chat/ComposerBannerStack.tsx +++ b/apps/web/src/components/chat/ComposerBannerStack.tsx @@ -85,7 +85,7 @@ export function ComposerBannerStack({ className, items }: ComposerBannerStackPro
@@ -119,30 +119,39 @@ export function ComposerBannerStack({ className, items }: ComposerBannerStackPro
{hasStack ? (
- {stackedItems.map((item) => ( +
- requestDismiss(item)} - /> + {stackedItems.map((item) => ( +
+ requestDismiss(item)} + /> +
+ ))}
- ))} +
) : null}
diff --git a/apps/web/src/components/chat/DraftHeroHeadline.tsx b/apps/web/src/components/chat/DraftHeroHeadline.tsx index 32d195d7b2ea..6a88fb8da19b 100644 --- a/apps/web/src/components/chat/DraftHeroHeadline.tsx +++ b/apps/web/src/components/chat/DraftHeroHeadline.tsx @@ -101,7 +101,7 @@ export function DraftHeroHeadline({ ); return ( -

+

{hasResolvedProject ? ( <>What should we build in {projectSelector}? ) : canChooseProject ? ( From e34250df469dcf50b444777f903b5f3482b4ce3c Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Mon, 20 Jul 2026 01:32:19 +0200 Subject: [PATCH 30/31] Add portable mobile app testing guidance (#4165) Co-authored-by: codex --- .agents/skills/ios-debugger-agent/LICENSE | 21 ++ .agents/skills/ios-debugger-agent/SKILL.md | 64 ++++++ .../ios-debugger-agent/agents/openai.yaml | 9 + .agents/skills/ios-simulator-browser/LICENSE | 21 ++ .agents/skills/ios-simulator-browser/SKILL.md | 51 +++++ .../ios-simulator-browser/agents/openai.yaml | 4 + .agents/skills/test-t3-app/SKILL.md | 2 + .agents/skills/test-t3-mobile/SKILL.md | 188 ++++++++++++++++++ .../skills/test-t3-mobile/agents/openai.yaml | 4 + .codex/config.toml | 9 + .mcp.json | 11 + AGENTS.md | 6 +- .../connection/ConnectionSheetButton.tsx | 3 + 13 files changed, 391 insertions(+), 2 deletions(-) create mode 100644 .agents/skills/ios-debugger-agent/LICENSE create mode 100644 .agents/skills/ios-debugger-agent/SKILL.md create mode 100644 .agents/skills/ios-debugger-agent/agents/openai.yaml create mode 100644 .agents/skills/ios-simulator-browser/LICENSE create mode 100644 .agents/skills/ios-simulator-browser/SKILL.md create mode 100644 .agents/skills/ios-simulator-browser/agents/openai.yaml create mode 100644 .agents/skills/test-t3-mobile/SKILL.md create mode 100644 .agents/skills/test-t3-mobile/agents/openai.yaml create mode 100644 .codex/config.toml create mode 100644 .mcp.json diff --git a/.agents/skills/ios-debugger-agent/LICENSE b/.agents/skills/ios-debugger-agent/LICENSE new file mode 100644 index 000000000000..0d193abe04f2 --- /dev/null +++ b/.agents/skills/ios-debugger-agent/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) OpenAI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/.agents/skills/ios-debugger-agent/SKILL.md b/.agents/skills/ios-debugger-agent/SKILL.md new file mode 100644 index 000000000000..7afa579383d9 --- /dev/null +++ b/.agents/skills/ios-debugger-agent/SKILL.md @@ -0,0 +1,64 @@ +--- +name: ios-debugger-agent +description: Build, launch, inspect, and drive iOS apps with the repository-configured XcodeBuildMCP server. Use on macOS for iOS Simulator builds, focused native test runs, semantic UI automation, screenshots, logs, or debugging, including T3 Code Mobile verification. +--- + +# iOS Debugger Agent + +Use the repository-configured `xcodebuildmcp` tools instead of requiring a globally installed Codex plugin. Prefer MCP tools over raw `xcodebuild`, `xcrun`, or `simctl` when the client exposes them. + +## Confirm availability + +This workflow requires macOS 14.5 or newer, Xcode 16 or newer, and Node.js 18 or newer. The repository pins XcodeBuildMCP in both `.mcp.json` for Claude Code and `.codex/config.toml` for Codex. Project MCP servers may require one-time trust or approval followed by a new session. + +If the tools are missing: + +1. Confirm the repository is trusted and its project MCP server was approved. +2. Restart or recreate the agent session after approving configuration. +3. Run `npx --yes xcodebuildmcp@2.6.2 doctor` when the server starts but simulator or UI-automation tools are unavailable. Follow its actionable Xcode or AXe setup guidance. +4. Fall back to the pinned XcodeBuildMCP CLI or native Apple CLIs only when the current agent client cannot expose project MCP tools. + +Do not ask contributors to install the OpenAI `build-ios-apps` plugin globally. + +## Establish one simulator context + +1. Call `session_show_defaults` before discovery, build, launch, or UI work. +2. Call `list_sims` and select one explicit simulator UDID. Prefer a simulator that is already booted; boot an installed simulator when verification requires it, but do not create or download runtimes without user authorization. +3. Call `session_set_defaults` with the project or workspace, scheme, Debug configuration, simulator ID, and bundle identifier when known. +4. Keep every subsequent build, launch, screenshot, log capture, and UI action pinned to that same UDID. + +Avoid generic Mac window automation for switching among Simulator windows. Explicit device identity is more reliable. + +## Choose build or launch + +- Use `build_run_sim` when native source, native dependencies, entitlements, or project configuration changed. +- Use `test_sim` for the smallest relevant native test target or test cases; do not run an entire workspace test matrix routinely. +- Use `launch_app_sim` when a compatible app is already installed and no native rebuild is needed. +- To reuse an existing build artifact, use `get_sim_app_path` or `get_app_bundle_id`, install it with `install_app_sim` when necessary, and then launch it. +- Do not run a build-only action immediately before `build_run_sim` unless the task requires both artifacts. + +After launch, call `snapshot_ui` or `screenshot` before interacting. An open Simulator window alone is not evidence that the intended app launched. + +## Drive the UI semantically + +1. Call `snapshot_ui` to obtain the current accessibility hierarchy and element references. +2. Use only current `elementRef` values whose snapshot entries list the intended action. XcodeBuildMCP `2.6.2` does not accept coordinates for `tap`; when the app exposes no actionable reference, prefer a registered deep link or another app-supported route and otherwise report the accessibility blocker. +3. Refresh with `snapshot_ui` after navigation or layout changes. Element references are snapshot-specific. +4. Use `wait_for_ui` for asynchronous transitions when available rather than fixed sleeps. +5. Capture a final `screenshot` for the state that proves the affected flow. + +Use `gesture` or scoped swipe actions when needed. If a gesture is unreliable, return to a known route or relaunch rather than switching to generic desktop automation. + +## Capture logs and debug + +- Use `start_sim_log_cap` and `stop_sim_log_cap` with the exact bundle identifier for focused runtime logs. +- Use debugger tools only when the task requires runtime diagnosis; attach to the selected simulator and app rather than an ambiguous process. +- Summarize relevant errors instead of returning unbounded logs. + +## Clean up + +Stop only log captures, debugger sessions, apps, or simulators started for the current test. Leave pre-existing simulators and unrelated sessions alone. + +## Upstream + +Adapted from OpenAI's [`build-ios-apps`](https://github.com/openai/plugins/tree/main/plugins/build-ios-apps) plugin version `0.1.2` (`ios-debugger-agent`, MIT) and aligned with XcodeBuildMCP `2.6.2` tool names. diff --git a/.agents/skills/ios-debugger-agent/agents/openai.yaml b/.agents/skills/ios-debugger-agent/agents/openai.yaml new file mode 100644 index 000000000000..094bae6620be --- /dev/null +++ b/.agents/skills/ios-debugger-agent/agents/openai.yaml @@ -0,0 +1,9 @@ +interface: + display_name: "iOS Debugger Agent" + short_description: "Build and drive iOS Simulator apps" + default_prompt: "Use $ios-debugger-agent to build, launch, and inspect the current iOS app on Simulator." +dependencies: + tools: + - type: "mcp" + value: "xcodebuildmcp" + description: "Repository-configured Xcode build, simulator, logging, debugging, and semantic UI tools" diff --git a/.agents/skills/ios-simulator-browser/LICENSE b/.agents/skills/ios-simulator-browser/LICENSE new file mode 100644 index 000000000000..0d193abe04f2 --- /dev/null +++ b/.agents/skills/ios-simulator-browser/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) OpenAI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/.agents/skills/ios-simulator-browser/SKILL.md b/.agents/skills/ios-simulator-browser/SKILL.md new file mode 100644 index 000000000000..74b97530799c --- /dev/null +++ b/.agents/skills/ios-simulator-browser/SKILL.md @@ -0,0 +1,51 @@ +--- +name: ios-simulator-browser +description: Stream an explicit iOS Simulator through pinned serve-sim into the T3 Code in-app browser or another agent browser. Use on Apple Silicon macOS when the user should watch simulator verification live or when browser-visible simulator evidence is needed. +--- + +# iOS Simulator Browser + +Use serve-sim as the shared visual feed for an iOS Simulator. Use `ios-debugger-agent` and XcodeBuildMCP semantic UI tools to drive the app; do not treat browser-canvas coordinates as a substitute for missing app accessibility. + +## Confirm availability + +serve-sim `0.1.45` requires Apple Silicon macOS, Xcode command-line tools, and Node.js 20 or newer. If the host is unsupported, continue with XcodeBuildMCP screenshots and report that live streaming was unavailable. + +When running inside T3 Code, use its product-native browser MCP to open the stream. Other agent hosts may use their own browser or preview surface. + +Keep serve-sim on its default `127.0.0.1` binding. Do not expose its preview to a LAN or tunnel unless the user explicitly requests that access and the network is trusted; the preview includes a token-gated shell-execution route. + +## Start one owned stream + +1. Obtain the exact simulator UDID from the iOS build or launch workflow. +2. Check whether an existing serve-sim stream for that UDID belongs to another task. Reuse it only when explicitly shared; never kill another task's stream. +3. Otherwise, clear only a stale stream for that UDID and start the pinned version with scoped cleanup: + + ```bash + SIMULATOR_ID= + cleanup_serve_sim() { + npx --yes serve-sim@0.1.45 --kill "$SIMULATOR_ID" >/dev/null 2>&1 || true + } + trap cleanup_serve_sim EXIT INT TERM HUP + cleanup_serve_sim + npx --yes serve-sim@0.1.45 "$SIMULATOR_ID" + ``` + +4. Keep the terminal alive and open the exact local URL printed by serve-sim in the agent's browser. +5. Verify that a live simulator frame renders. A loaded wrapper page is not sufficient evidence. + +## Observe while driving semantically + +- Let the user watch the serve-sim stream while XcodeBuildMCP performs `snapshot_ui`, semantic taps, typing, gestures, and screenshots. +- Keep the browser and Xcode tooling pinned to the same simulator UDID. +- Do not switch to generic desktop automation or browser-canvas clicking merely because the stream is visible. + +If the in-app browser explicitly reports that previews are unavailable, do not install unrelated browser automation. Continue through XcodeBuildMCP, capture a simulator screenshot, report the unavailable live stream, and clean up the owned serve-sim process. + +## Finish + +Stop the long-running terminal and wait for its cleanup trap to finish. If it disappeared without cleanup, run `npx --yes serve-sim@0.1.45 --kill ` for that exact simulator. Never run an unscoped `--kill`. + +## Upstream + +Adapted from OpenAI's [`build-ios-apps`](https://github.com/openai/plugins/tree/main/plugins/build-ios-apps) plugin version `0.1.2` (`ios-simulator-browser`, MIT). It invokes serve-sim `0.1.45` under its Apache-2.0 license without vendoring the package. diff --git a/.agents/skills/ios-simulator-browser/agents/openai.yaml b/.agents/skills/ios-simulator-browser/agents/openai.yaml new file mode 100644 index 000000000000..9e8cdf7a16b0 --- /dev/null +++ b/.agents/skills/ios-simulator-browser/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "iOS Simulator Browser" + short_description: "Stream iOS Simulator in the browser" + default_prompt: "Use $ios-simulator-browser to stream the selected iOS Simulator into the T3 Code in-app browser." diff --git a/.agents/skills/test-t3-app/SKILL.md b/.agents/skills/test-t3-app/SKILL.md index c573807d615d..c3dc1c103d4d 100644 --- a/.agents/skills/test-t3-app/SKILL.md +++ b/.agents/skills/test-t3-app/SKILL.md @@ -5,6 +5,8 @@ description: Launch and test the T3 Code web app in isolated development environ # Test T3 App +Use this skill for the web client. For iOS Simulator, Android Emulator, or physical-device testing against an isolated T3 backend, use the sibling [`test-t3-mobile`](../test-t3-mobile/SKILL.md) skill. + ## Start an isolated web environment 1. Run commands from the repository root. diff --git a/.agents/skills/test-t3-mobile/SKILL.md b/.agents/skills/test-t3-mobile/SKILL.md new file mode 100644 index 000000000000..f3e3dcfd8ce5 --- /dev/null +++ b/.agents/skills/test-t3-mobile/SKILL.md @@ -0,0 +1,188 @@ +--- +name: test-t3-mobile +description: Launch and test T3 Code Mobile on an iOS Simulator or Android Emulator against disposable local T3 environments, including Metro and dev-client reuse, native rebuild decisions, per-client pairing, seeded projects, semantic UI control, screenshots, and iOS serve-sim streaming. Use after mobile UI or native changes, when reproducing phone or tablet behavior, pairing an emulator to isolated state, or verifying mobile behavior on macOS, Linux, or Windows. +--- + +# Test T3 Mobile + +Run one focused, end-to-end mobile verification pass against disposable T3 state. Use the sibling [`test-t3-app`](../test-t3-app/SKILL.md) skill as the detailed reference for pairing-token semantics and SQLite fixtures. + +Command examples use POSIX shell syntax. On Windows, use PowerShell equivalents: set variables with `$env:NAME = "value"`, use an explicit temporary directory from `[System.IO.Path]::GetTempPath()`, and run multiline examples on one line or with PowerShell backticks. Use `$env:ANDROID_HOME\platform-tools\adb.exe` when `adb` is not already on `PATH`. + +## Select a viable platform + +Inspect the host and the affected code before launching processes: + +- On macOS with Xcode, prefer one representative iOS Simulator when the change is cross-platform so the user can watch through serve-sim. Load and follow [`ios-debugger-agent`](../ios-debugger-agent/SKILL.md), and load [`ios-simulator-browser`](../ios-simulator-browser/SKILL.md) when live streaming is available. +- On macOS, Linux, or Windows with the Android SDK, use one Android Emulator when Android is the affected surface or iOS tooling is unavailable. +- When the change is platform-specific, test that platform. When neither platform is viable, report the missing SDK, emulator, or dev-client prerequisite rather than claiming verification. + +Do not treat unavailable iOS tooling as a blocker when Android is a valid representative target. + +## Choose the lightest valid launch path + +- For JavaScript, TypeScript, or asset-only changes, reuse a compatible installed development client and start Metro. Do not rebuild native code merely to load a new bundle. +- For native source, native dependencies, entitlements, config plugins, or generated project changes, rebuild the affected platform. +- Use `vp run ios:dev` or `vp run android:dev` only when an Expo clean prebuild is actually required; both commands regenerate the native project. +- If the user requested no native rebuild and no compatible app is installed, reuse an existing compatible `.app` or `.apk` artifact when available. Otherwise report the missing dev client instead of silently rebuilding. + +The development identity on both platforms is: + +- App: `T3 Code Dev` +- Bundle/package identifier: `com.t3tools.t3code.dev` +- URL scheme: `t3code-dev` + +Bundle or package presence proves the correct variant, not native compatibility. Reuse it only when the current changes did not alter its Expo SDK, native dependencies, config plugins, entitlements, generated project, or native source. + +## Start one disposable T3 environment + +Run backend commands from the repository root. Use the ignored, worktree-local `.t3` directory or create a fresh directory with the host OS's temporary-directory mechanism. An explicit base directory stores state in `/userdata`; never point testing at shared `~/.t3` state. + +Seed a small number of meaningful Git projects before starting the backend: + +```bash +node apps/server/src/bin.ts project add \ + --base-dir \ + --title +``` + +Running `project add` before the backend starts gives it exclusive offline database access. If a backend is already running, wait until it is ready so the CLI dispatches through the live server; never run offline mutations concurrently with the server. + +Use direct SQLite mutation only for disposable projection fixtures. Follow `test-t3-app` and stop the backend before writing. + +Start a headless backend after seeding: + +```bash +node apps/server/src/bin.ts serve \ + --host 127.0.0.1 \ + --port \ + --base-dir \ + --no-browser +``` + +Use these client origins: + +- iOS Simulator: `http://127.0.0.1:` +- Android Emulator: `http://10.0.2.2:` +- Physical device: bind the backend to `0.0.0.0` and use the host's reachable LAN origin + +Always enter the complete `http://` origin; the mobile host field otherwise assumes HTTPS. When testing web and mobile together, run `vp run dev --home-dir --host 127.0.0.1` instead and do not launch a second backend over the same base directory. + +## Start or reuse Metro safely + +Run Metro from `apps/mobile`. + +1. Inspect any process on the intended Metro port and its `/status` response. Reuse it only when it is healthy, belongs to this worktree, and matches `APP_VARIANT=development`, `--dev-client`, and scheme `t3code-dev`. +2. Never kill another worktree's Metro. Use a free explicit port when necessary. +3. Run `vp run dev:client` on the standard port. For another port, retain the complete development identity: + + ```bash + APP_VARIANT=development vp exec expo start \ + --dev-client \ + --scheme t3code-dev \ + --clear \ + --lan \ + --port + ``` + + In PowerShell, set `$env:APP_VARIANT = "development"` first and then run the `vp exec expo start ...` command without the leading assignment. + +4. Open the exact development-client URL for the selected device and confirm the loaded bundle belongs to this worktree and Metro port. + +### iOS launch + +Use `ios-debugger-agent` to select one UDID and set these XcodeBuildMCP session defaults: + +- Workspace: `/apps/mobile/ios/T3CodeDev.xcworkspace` +- Scheme: `T3CodeDev` +- Configuration: `Debug` +- Simulator ID: the selected UDID +- Bundle ID: `com.t3tools.t3code.dev` + +Check the installed client with: + +```bash +xcrun simctl get_app_container com.t3tools.t3code.dev app +xcrun simctl openurl +``` + +Accept the iOS confirmation prompt and dismiss the developer menu when it obscures the app. + +### Android launch + +Select one running emulator serial from `adb devices` and check the installed client: + +```bash +adb -s shell pm path com.t3tools.t3code.dev +adb -s reverse tcp: tcp: +adb -s shell am start -W \ + -a android.intent.action.VIEW \ + -d '' \ + com.t3tools.t3code.dev +``` + +Do not start, stop, erase, or reconfigure an emulator owned by another task. Track and later stop only processes owned by this test. + +## Pair each client once + +Issue a fresh credential against the running backend's exact base directory: + +```bash +T3CODE_PORT= node apps/server/src/bin.ts auth pairing create \ + --base-dir \ + --base-url \ + --ttl 15m \ + --label agent-mobile- +``` + +In PowerShell, set `$env:T3CODE_PORT = ""` first and run the `node ... auth pairing create` command without the leading assignment. + +If the visible Add Environment action is not exposed as a semantic target, open the app's registered route instead of guessing coordinates: + +```bash +xcrun simctl openurl 't3code-dev://connections/new' +adb -s shell am start -W \ + -a android.intent.action.VIEW \ + -d 't3code-dev://connections/new' \ + com.t3tools.t3code.dev +``` + +Run only the command for the selected platform. + +In T3 Code Dev, open Add Environment and enter the complete `` and newly printed `Token`. Verify the expected seeded projects appear before exercising the affected flow. + +Pairing credentials are secret, short-lived, and single-use. Create a different credential for every simulator, emulator, physical device, or browser. If an attempt fails, issue a new credential rather than retrying the old one. Do not expose tokens in screenshots, commits, or final responses. + +## Drive and observe the affected flow + +### iOS + +Use `snapshot_ui` and current element references from XcodeBuildMCP for taps and typing. Stream the same UDID through `ios-simulator-browser` so the user can watch in T3 Code when the host supports it. Use the stream as a visual feed rather than a reason to switch to fragile browser coordinates. + +### Android + +Prefer semantic Android automation exposed by the current agent host. Otherwise inspect the current hierarchy with `adb shell uiautomator dump`, target stable resource IDs, content descriptions, text, or bounds, and use scoped `adb shell input` actions. Refresh the hierarchy after navigation. Capture the final state with `adb exec-out screencap -p`. + +Android does not use serve-sim. Use a browser-compatible Android mirror when the host already provides one; otherwise return focused emulator screenshots as evidence rather than installing unrelated streaming infrastructure during verification. + +## Verify and clean up + +Exercise only the affected flow on one representative device unless the change specifically concerns platform, OS version, or screen size. Before finishing: + +1. Confirm the app connected to the intended disposable environment instead of merely rendering an empty disconnected state. +2. Capture the relevant final state. +3. Remove the disposable environment from T3 Code Dev. +4. Remove any `adb reverse` rule created for this test with `adb -s reverse --remove tcp:`. +5. Stop only the serve-sim, Metro, backend, emulator, and log processes started by this test. +6. Remove only base directories and temporary Git repositories deliberately created for this test. Preserve them when they contain useful reproduction evidence. + +Keep local verification focused. Do not turn this workflow into a full repository test run. + +## Troubleshoot predictable failures + +- **Old UI or an old error appears:** verify Metro's worktree, variant, URL, and port before diagnosing the app. +- **The environment remains empty:** verify the platform-specific HTTP origin, use a fresh token, and confirm project seeding used the identical base directory. +- **A second client cannot pair:** pairing tokens are single-use; issue another token. +- **iOS semantic actions fail:** set explicit XcodeBuildMCP defaults and refresh with `snapshot_ui`. +- **Android cannot reach Metro:** verify `adb reverse` for the exact Metro port and relaunch the development-client URL. +- **Android cannot reach the backend:** use `10.0.2.2`, not `127.0.0.1`, for the Android Emulator. diff --git a/.agents/skills/test-t3-mobile/agents/openai.yaml b/.agents/skills/test-t3-mobile/agents/openai.yaml new file mode 100644 index 000000000000..e9518ce9e04a --- /dev/null +++ b/.agents/skills/test-t3-mobile/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Test T3 Mobile" + short_description: "Test T3 Code on iOS or Android" + default_prompt: "Use $test-t3-mobile to launch T3 Code against an isolated backend and verify the affected flow on an available simulator or emulator." diff --git a/.codex/config.toml b/.codex/config.toml new file mode 100644 index 000000000000..a6369d240fc7 --- /dev/null +++ b/.codex/config.toml @@ -0,0 +1,9 @@ +[mcp_servers.xcodebuildmcp] +enabled = true +required = false +command = "npx" +args = ["--yes", "xcodebuildmcp@2.6.2", "mcp"] +startup_timeout_sec = 20.0 + +[mcp_servers.xcodebuildmcp.env] +XCODEBUILDMCP_ENABLED_WORKFLOWS = "simulator,ui-automation,debugging,logging" diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 000000000000..213a64995fab --- /dev/null +++ b/.mcp.json @@ -0,0 +1,11 @@ +{ + "mcpServers": { + "xcodebuildmcp": { + "command": "npx", + "args": ["--yes", "xcodebuildmcp@2.6.2", "mcp"], + "env": { + "XCODEBUILDMCP_ENABLED_WORKFLOWS": "simulator,ui-automation,debugging,logging" + } + } + } +} diff --git a/AGENTS.md b/AGENTS.md index 0a425cbc1859..ef69591a3404 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,8 +7,10 @@ - Backend changes must include and run focused tests for the changed behavior. - Run targeted formatting, lint, and type checks for the affected scope when available. - Do not run repo-wide `vp check`, `vp run typecheck`, `vp run test`, or equivalent full-suite commands locally unless the user explicitly requests them. CI is responsible for the full verification suite. -- After frontend feature development or any user-visible frontend behavior change, the primary agent must use the `test-t3-app` skill once after integrating the work. Launch one isolated environment, authenticate through the printed pairing URL, and verify the affected flow in the controlled browser. - - Subagents must not independently launch dev servers or repeat integrated browser verification unless their delegated task explicitly requires it. +- After frontend feature development or any user-visible frontend behavior change, the primary agent must run one integrated verification pass for each affected client surface after integrating the work: + - Web: use the `test-t3-app` skill. Launch one isolated environment, authenticate through the printed pairing URL, and verify the affected flow in the controlled browser. + - Mobile: use the `test-t3-mobile` skill. Connect one representative iOS Simulator or Android Emulator available on the host to one isolated environment and verify the affected flow. On compatible macOS hosts, prefer iOS for cross-platform changes and stream it through serve-sim in the T3 Code in-app browser or another available agent browser; use Android when it is the affected or viable platform. + - Subagents must not independently launch dev servers or repeat integrated client verification unless their delegated task explicitly requires it. - Stop dev servers, watchers, and other long-running verification processes when the focused verification is complete. ## Package Roles diff --git a/apps/mobile/src/features/connection/ConnectionSheetButton.tsx b/apps/mobile/src/features/connection/ConnectionSheetButton.tsx index d58ee338973c..f88e32874451 100644 --- a/apps/mobile/src/features/connection/ConnectionSheetButton.tsx +++ b/apps/mobile/src/features/connection/ConnectionSheetButton.tsx @@ -58,6 +58,9 @@ export function ConnectionSheetButton(props: { return ( Date: Mon, 20 Jul 2026 01:33:01 +0200 Subject: [PATCH 31/31] fix(client): use lightweight connection probe (#4137) --- .../src/environment/ServerEnvironment.test.ts | 1 + .../src/environment/ServerEnvironment.ts | 1 + apps/server/src/ws.ts | 5 ++ .../src/connection/supervisor.test.ts | 2 +- .../client-runtime/src/rpc/session.test.ts | 80 ++++++++++++++++++- packages/client-runtime/src/rpc/session.ts | 14 +++- packages/contracts/src/environment.ts | 1 + packages/contracts/src/rpc.ts | 8 ++ 8 files changed, 105 insertions(+), 7 deletions(-) diff --git a/apps/server/src/environment/ServerEnvironment.test.ts b/apps/server/src/environment/ServerEnvironment.test.ts index 6b3290246fea..61892d53d63c 100644 --- a/apps/server/src/environment/ServerEnvironment.test.ts +++ b/apps/server/src/environment/ServerEnvironment.test.ts @@ -67,6 +67,7 @@ it.layer(NodeServices.layer)("ServerEnvironmentLive", (it) => { expect(first.environmentId).toBe(second.environmentId); expect(second.capabilities.repositoryIdentity).toBe(true); + expect(second.capabilities.connectionProbe).toBe(true); }), ); diff --git a/apps/server/src/environment/ServerEnvironment.ts b/apps/server/src/environment/ServerEnvironment.ts index b5fbd8e1088c..1c0d34ea5bcd 100644 --- a/apps/server/src/environment/ServerEnvironment.ts +++ b/apps/server/src/environment/ServerEnvironment.ts @@ -135,6 +135,7 @@ export const make = Effect.gen(function* () { serverVersion: packageJson.version, capabilities: { repositoryIdentity: true, + connectionProbe: true, }, }; diff --git a/apps/server/src/ws.ts b/apps/server/src/ws.ts index 32dcb8a13d60..c7223d09dc58 100644 --- a/apps/server/src/ws.ts +++ b/apps/server/src/ws.ts @@ -284,6 +284,7 @@ const RPC_REQUIRED_SCOPE = new Map([ [ORCHESTRATION_WS_METHODS.subscribeShell, AuthOrchestrationReadScope], [ORCHESTRATION_WS_METHODS.getArchivedShellSnapshot, AuthOrchestrationReadScope], [ORCHESTRATION_WS_METHODS.subscribeThread, AuthOrchestrationReadScope], + [WS_METHODS.serverProbe, AuthOrchestrationReadScope], [WS_METHODS.serverGetConfig, AuthOrchestrationReadScope], [WS_METHODS.serverRefreshProviders, AuthOrchestrationOperateScope], [WS_METHODS.serverUpdateProvider, AuthOrchestrationOperateScope], @@ -1238,6 +1239,10 @@ const makeWsRpcLayer = ( }), { "rpc.aggregate": "orchestration" }, ), + [WS_METHODS.serverProbe]: (_input) => + observeRpcEffect(WS_METHODS.serverProbe, Effect.succeed({}), { + "rpc.aggregate": "server", + }), [WS_METHODS.serverGetConfig]: (_input) => observeRpcEffect(WS_METHODS.serverGetConfig, loadServerConfig, { "rpc.aggregate": "server", diff --git a/packages/client-runtime/src/connection/supervisor.test.ts b/packages/client-runtime/src/connection/supervisor.test.ts index eadeceacc2c1..f3901e422511 100644 --- a/packages/client-runtime/src/connection/supervisor.test.ts +++ b/packages/client-runtime/src/connection/supervisor.test.ts @@ -652,7 +652,7 @@ describe("EnvironmentSupervisor", () => { }).pipe(Effect.provide(TestClock.layer())), ); - it.effect("keeps a healthy session when the application becomes active", () => + it.effect("probes the active session without reconnecting on application activation", () => Effect.gen(function* () { const probeCount = yield* Ref.make(0); const probeCalled = yield* Deferred.make(); diff --git a/packages/client-runtime/src/rpc/session.test.ts b/packages/client-runtime/src/rpc/session.test.ts index 7820c93a935b..402faf4f0e29 100644 --- a/packages/client-runtime/src/rpc/session.test.ts +++ b/packages/client-runtime/src/rpc/session.test.ts @@ -109,6 +109,7 @@ const SERVER_CONFIG: ServerConfigType = { serverVersion: "0.0.0-test", capabilities: { repositoryIdentity: true, + connectionProbe: true, }, }, auth: { @@ -141,6 +142,16 @@ const decodeJson = Schema.decodeUnknownSync(Schema.UnknownFromJsonString); const decodeRpcRequest = Schema.decodeUnknownSync(RpcRequest); const encodeJson = Schema.encodeUnknownSync(Schema.UnknownFromJsonString); const encodeServerConfig = Schema.encodeSync(ServerConfig); +const ENCODED_SERVER_CONFIG = encodeServerConfig(SERVER_CONFIG); +const LEGACY_SERVER_CONFIG = { + ...ENCODED_SERVER_CONFIG, + environment: { + ...ENCODED_SERVER_CONFIG.environment, + capabilities: { + repositoryIdentity: true, + }, + }, +}; const makeFactory = Effect.fn("TestRpcSessionFactory.make")(function* () { const sockets: TestWebSocket[] = []; @@ -169,9 +180,10 @@ const awaitSocket = Effect.fn("TestRpcSessionFactory.awaitSocket")(function* ( const awaitRequest = Effect.fn("TestRpcSessionFactory.awaitRequest")(function* ( socket: TestWebSocket, + index = 0, ) { for (let attempt = 0; attempt < 100; attempt += 1) { - const request = socket.sent[0]; + const request = socket.sent[index]; if (request) { return decodeRpcRequest(decodeJson(request)); } @@ -182,6 +194,7 @@ const awaitRequest = Effect.fn("TestRpcSessionFactory.awaitRequest")(function* ( const completeInitialConfig = Effect.fn("TestRpcSessionFactory.completeInitialConfig")(function* ( socket: TestWebSocket, + config: unknown = ENCODED_SERVER_CONFIG, ) { const request = yield* awaitRequest(socket); expect(request).toMatchObject({ @@ -195,7 +208,7 @@ const completeInitialConfig = Effect.fn("TestRpcSessionFactory.completeInitialCo requestId: request.id, exit: { _tag: "Success", - value: encodeServerConfig(SERVER_CONFIG), + value: config, }, }), ); @@ -218,6 +231,30 @@ describe("RpcSessionFactory", () => { expect(config).toEqual(SERVER_CONFIG); expect(socket.sent).toHaveLength(1); + const probeFiber = yield* Effect.forkChild(session.probe); + const probeRequest = yield* awaitRequest(socket, 1); + expect(probeRequest).toMatchObject({ + _tag: "Request", + tag: WS_METHODS.serverProbe, + payload: {}, + }); + socket.serverMessage( + encodeJson({ + _tag: "Exit", + requestId: probeRequest.id, + exit: { + _tag: "Success", + value: {}, + }, + }), + ); + yield* Fiber.join(probeFiber); + + expect(socket.sent.map((request) => decodeRpcRequest(decodeJson(request)).tag)).toEqual([ + WS_METHODS.serverGetConfig, + WS_METHODS.serverProbe, + ]); + socket.close(1012, "service restart"); const error = yield* Effect.flip(session.closed); @@ -250,6 +287,45 @@ describe("RpcSessionFactory", () => { }), ); + it.effect("uses the legacy config RPC for probes when the server lacks the capability", () => + Effect.scoped( + Effect.gen(function* () { + const { factory, sockets } = yield* makeFactory(); + const session = yield* factory.connect(PREPARED); + const readyFiber = yield* Effect.forkChild(session.ready); + const socket = yield* awaitSocket(sockets); + + socket.open(); + yield* completeInitialConfig(socket, LEGACY_SERVER_CONFIG); + yield* Fiber.join(readyFiber); + + const probeFiber = yield* Effect.forkChild(session.probe); + const probeRequest = yield* awaitRequest(socket, 1); + expect(probeRequest).toMatchObject({ + _tag: "Request", + tag: WS_METHODS.serverGetConfig, + payload: {}, + }); + socket.serverMessage( + encodeJson({ + _tag: "Exit", + requestId: probeRequest.id, + exit: { + _tag: "Success", + value: LEGACY_SERVER_CONFIG, + }, + }), + ); + yield* Fiber.join(probeFiber); + + expect(socket.sent.map((request) => decodeRpcRequest(decodeJson(request)).tag)).toEqual([ + WS_METHODS.serverGetConfig, + WS_METHODS.serverGetConfig, + ]); + }), + ), + ); + it.effect("fails readiness when the websocket never opens", () => Effect.gen(function* () { const { factory, sockets } = yield* makeFactory(); diff --git a/packages/client-runtime/src/rpc/session.ts b/packages/client-runtime/src/rpc/session.ts index f9594c1b7ca7..9625effa406f 100644 --- a/packages/client-runtime/src/rpc/session.ts +++ b/packages/client-runtime/src/rpc/session.ts @@ -42,8 +42,9 @@ export class RpcSessionFactory extends Context.Service< type InitialConfigError = Effect.Error< ReturnType >; +type ProbeError = Effect.Error>; -function mapInitialConfigError(error: InitialConfigError): ConnectionAttemptError { +function mapSessionRpcError(error: InitialConfigError | ProbeError): ConnectionAttemptError { switch (error._tag) { case "EnvironmentAuthorizationError": return new ConnectionBlockedError({ @@ -115,12 +116,17 @@ export const make = Effect.gen(function* () { const client = yield* makeWsRpcProtocolClient.pipe(Effect.provide(protocolContext)); const initialConfig = yield* Effect.cached( client[WS_METHODS.serverGetConfig]({}).pipe( - Effect.mapError(mapInitialConfigError), + Effect.mapError(mapSessionRpcError), Effect.withSpan("environment.initialSync"), ), ); - const probe = client[WS_METHODS.serverGetConfig]({}).pipe( - Effect.mapError(mapInitialConfigError), + const probe = initialConfig.pipe( + Effect.flatMap((config) => + (config.environment.capabilities.connectionProbe === true + ? client[WS_METHODS.serverProbe]({}) + : client[WS_METHODS.serverGetConfig]({}) + ).pipe(Effect.mapError(mapSessionRpcError)), + ), Effect.asVoid, Effect.withSpan("clientRuntime.connection.rpcSession.probe"), ); diff --git a/packages/contracts/src/environment.ts b/packages/contracts/src/environment.ts index fb52972d5aa0..bc8db25a95a4 100644 --- a/packages/contracts/src/environment.ts +++ b/packages/contracts/src/environment.ts @@ -22,6 +22,7 @@ export type ExecutionEnvironmentPlatform = typeof ExecutionEnvironmentPlatform.T export const ExecutionEnvironmentCapabilities = Schema.Struct({ repositoryIdentity: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(false))), + connectionProbe: Schema.optionalKey(Schema.Boolean), }); export type ExecutionEnvironmentCapabilities = typeof ExecutionEnvironmentCapabilities.Type; diff --git a/packages/contracts/src/rpc.ts b/packages/contracts/src/rpc.ts index 48c5d9a774d9..0356aa1807b6 100644 --- a/packages/contracts/src/rpc.ts +++ b/packages/contracts/src/rpc.ts @@ -201,6 +201,7 @@ export const WS_METHODS = { previewAutomationFocusHost: "previewAutomation.focusHost", // Server meta + serverProbe: "server.probe", serverGetConfig: "server.getConfig", serverRefreshProviders: "server.refreshProviders", serverUpdateProvider: "server.updateProvider", @@ -246,6 +247,12 @@ export const WsServerRemoveKeybindingRpc = Rpc.make(WS_METHODS.serverRemoveKeybi error: Schema.Union([KeybindingsConfigError, EnvironmentAuthorizationError]), }); +export const WsServerProbeRpc = Rpc.make(WS_METHODS.serverProbe, { + payload: Schema.Struct({}), + success: Schema.Struct({}), + error: EnvironmentAuthorizationError, +}); + export const WsServerGetConfigRpc = Rpc.make(WS_METHODS.serverGetConfig, { payload: Schema.Struct({}), success: ServerConfig, @@ -682,6 +689,7 @@ export const WsSubscribeAuthAccessRpc = Rpc.make(WS_METHODS.subscribeAuthAccess, }); export const WsRpcGroup = RpcGroup.make( + WsServerProbeRpc, WsServerGetConfigRpc, WsServerRefreshProvidersRpc, WsServerUpdateProviderRpc,