From 9ee499e9f723d79b19f84b191181a0aa061d7cc3 Mon Sep 17 00:00:00 2001 From: Waleed Date: Fri, 10 Jul 2026 21:58:08 -0700 Subject: [PATCH 01/23] fix(canvas): raw tooltip shows up when hovering block params (#5589) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(canvas): replace native title tooltip with styled overflow tooltip on block params Hovering a truncated subblock value or block name on the canvas popped the browser's raw native tooltip with the full untruncated content (including raw code). Replace the `title` attribute with the cursor-following styled Tooltip, shown only when the text is actually clipped. * fix(canvas): drop unused ResizeObserver in OverflowSpan useFloatingTooltip's canShow already receives the hovered element, so measuring overflow via useIsOverflowing was redundant — every canvas row was paying for a ResizeObserver and resize listener it never used. --- .../src/lib/overflow-span.tsx | 25 +++++++++++++++++++ .../src/workflow-block/sub-block-row-view.tsx | 17 ++++++------- .../workflow-block/workflow-block-view.tsx | 9 +++---- 3 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 packages/workflow-renderer/src/lib/overflow-span.tsx diff --git a/packages/workflow-renderer/src/lib/overflow-span.tsx b/packages/workflow-renderer/src/lib/overflow-span.tsx new file mode 100644 index 00000000000..65437f0d8a5 --- /dev/null +++ b/packages/workflow-renderer/src/lib/overflow-span.tsx @@ -0,0 +1,25 @@ +import { FloatingTooltip, isTextClipped, useFloatingTooltip } from '@sim/emcn' + +interface OverflowSpanProps { + value: string + className: string +} + +/** + * Truncated span that reveals its full value in a floating tooltip when — and + * only when — the text is actually clipped. Never use a native `title` + * attribute here: on the canvas it pops the browser's raw, unstyled tooltip + * with the full untruncated value (including raw code/JSON) over the graph. + */ +export function OverflowSpan({ value, className }: OverflowSpanProps) { + const { state, handlers } = useFloatingTooltip(isTextClipped) + + return ( + <> + + {value} + + + + ) +} diff --git a/packages/workflow-renderer/src/workflow-block/sub-block-row-view.tsx b/packages/workflow-renderer/src/workflow-block/sub-block-row-view.tsx index 01930cdcac1..7be0b0bb7b6 100644 --- a/packages/workflow-renderer/src/workflow-block/sub-block-row-view.tsx +++ b/packages/workflow-renderer/src/workflow-block/sub-block-row-view.tsx @@ -1,4 +1,5 @@ import { cn } from '@sim/emcn' +import { OverflowSpan } from '../lib/overflow-span' /** * Props for the pure subblock summary row. The container resolves the value — @@ -22,22 +23,18 @@ export interface SubBlockRowViewProps { export function SubBlockRowView({ title, displayValue, isMonospace }: SubBlockRowViewProps) { return (
- - {title} - + /> {displayValue !== undefined && ( - - {displayValue} - + /> )}
) diff --git a/packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx b/packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx index 3b7dbb36cec..cf43c63796d 100644 --- a/packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx +++ b/packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx @@ -2,6 +2,7 @@ import type { ComponentType, ReactNode, Ref } from 'react' import { Badge, cn, handleKeyboardActivation, Tooltip } from '@sim/emcn' import { Handle, Position } from 'reactflow' import { HANDLE_POSITIONS } from '../dimensions' +import { OverflowSpan } from '../lib/overflow-span' import { tileIconColorClass } from '../lib/tile-icon-color' import type { BlockRunStatus } from '../types' import { SubBlockRowView } from './sub-block-row-view' @@ -212,15 +213,13 @@ export function WorkflowBlockView({ )} /> - - {name} - + />
{isWorkflowSelector && From 2ba0b5837d4d1cffd7c0e92a9b06efbbb04a2f8d Mon Sep 17 00:00:00 2001 From: Waleed Date: Fri, 10 Jul 2026 23:23:42 -0700 Subject: [PATCH 02/23] fix(rich-markdown-editor): reliable image selection + serialization/paste polish (#5590) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(rich-markdown-editor): reliable image selection + resize and broken-image polish - Reactive editability. The editor runs with shouldRerenderOnTransaction:false, so a node view that read editor.isEditable once at render kept a stale value after setEditable() toggled (e.g. an agent stream settling into the doc), leaving a pasted image showing read-only affordances and code blocks stuck on their read-only label until a full refresh. A shared useEditorEditable hook subscribes to the editor's update/transaction events so both node views track editability reactively. - Deterministic click-to-select. A handleClickOn plugin sets the image's NodeSelection on a plain click so selecting never depends on ProseMirror's click-vs-drag arbitration; grab-anywhere drag-reorder is kept, and modified clicks (Cmd/Ctrl to follow a linked badge) fall through. - Resize commits once. The width previews in local state during the drag and commits to the node once on pointer-up (or pointer-cancel), so a resize is a single undo step and an interrupted drag isn't lost. - Broken-image placeholder. A src that fails to load renders as a visible box with its alt text and stays selectable, instead of collapsing to a bare broken-icon. * fix(rich-markdown-editor): keep bare URLs and autolinks bare on serialize The normalizing serializer rewrote a bare URL or / autolink to [url](url) / [a@b.com](mailto:a@b.com) on every save, churning every README's links. postProcessSerializedMarkdown now collapses a link back to its bare form when the visible text already equals the destination (a plain http(s) URL, or an email behind mailto:) — GFM re-autolinks it, so the round-trip is identical with a far quieter diff. Titled links, explicit links, and any link inside a fenced/inline code region are left untouched. Idempotent. * feat(rich-markdown-editor): linkify a selection when a URL is pasted over it Pasting a single URL (or a bare www. host / email) over a non-empty text selection within one block now wraps the selection in a link, keeping the visible text. www. gets https://, an email gets mailto:, and the href is scheme-sanitized (javascript:/data: rejected; mailto: requires a real user@host address). Collapsed carets, cross-block selections, multi-word pastes, node selections, and code contexts fall through to normal paste. * chore(rich-markdown-editor): drop useless String.raw in highlight.ts biome 2.0's noUselessStringRaw flags HIGHLIGHT_BODY — its pattern has no escape sequences, so String.raw is equivalent to a plain template literal (byte-identical value; interpolated into the other String.raw regexes unchanged). Pre-existing on staging; the repo-wide lint gate blocks CI on it. --- .../rich-markdown-editor/code-block.tsx | 14 ++-- .../rich-markdown-editor/highlight.ts | 2 +- .../rich-markdown-editor/image.tsx | 73 +++++++++++++++---- .../rich-markdown-editor/markdown-fidelity.ts | 32 +++++++- .../markdown-paste.test.ts | 60 +++++++++++++++ .../rich-markdown-editor/markdown-paste.ts | 35 ++++++++- .../rich-markdown-editor/round-trip.test.ts | 34 +++++++++ .../use-editor-editable.ts | 27 +++++++ 8 files changed, 255 insertions(+), 22 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/use-editor-editable.ts diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/code-block.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/code-block.tsx index c17577c917b..7db9b1481b9 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/code-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/code-block.tsx @@ -15,6 +15,7 @@ import { NodeViewContent, NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap import { Check, ChevronDown, Code, Copy, Eye, WrapText } from 'lucide-react' import { looksLikeMermaid, MermaidDiagram } from '../mermaid-diagram' import { detectLanguage } from './detect-language' +import { useEditorEditable } from './use-editor-editable' const PLAIN = 'plain' const MERMAID = 'mermaid' @@ -59,6 +60,7 @@ function CodeBlockView({ node, updateAttributes, editor, getPos }: ReactNodeView const [editingInline, setEditingInline] = useState(false) const [peekSource, setPeekSource] = useState(false) const { copied, copy } = useCopyToClipboard({ resetMs: 1500 }) + const editable = useEditorEditable(editor) const explicitLanguage = node.attrs.language as string | null const text = node.textContent @@ -68,7 +70,7 @@ function CodeBlockView({ node, updateAttributes, editor, getPos }: ReactNodeView // diagram on blur (the Linear/GitHub model). The Show source / Show diagram control drives this by // focusing into / blurring the block; read-only uses {@link peekSource} since there is no caret. useEffect(() => { - if (!isMermaid || !editor.isEditable) { + if (!isMermaid || !editable) { setEditingInline(false) return } @@ -91,9 +93,9 @@ function CodeBlockView({ node, updateAttributes, editor, getPos }: ReactNodeView editor.off('focus', sync) editor.off('blur', sync) } - }, [editor, getPos, isMermaid]) + }, [editor, getPos, isMermaid, editable]) - const showSource = editor.isEditable ? editingInline : peekSource + const showSource = editable ? editingInline : peekSource const showDiagram = isMermaid && text.trim().length > 0 && !showSource // Skip language detection on the mermaid path — the picker/label never render there. @@ -104,7 +106,7 @@ function CodeBlockView({ node, updateAttributes, editor, getPos }: ReactNodeView 'Plain text' const toggleSource = () => { - if (!editor.isEditable) { + if (!editable) { setPeekSource((value) => !value) return } @@ -144,7 +146,7 @@ function CodeBlockView({ node, updateAttributes, editor, getPos }: ReactNodeView )} {!isMermaid && - (editor.isEditable ? ( + (editable ? ( // Editable: a language picker. Read-only: a static label — selecting a language calls // updateAttributes, which would mutate a doc that must not change. @@ -179,7 +181,7 @@ function CodeBlockView({ node, updateAttributes, editor, getPos }: ReactNodeView {label} ))} - {!isMermaid && editor.isEditable && ( + {!isMermaid && editable && (
diff --git a/apps/sim/stores/modals/search/store.ts b/apps/sim/stores/modals/search/store.ts index 10808b860b0..65a84b2d627 100644 --- a/apps/sim/stores/modals/search/store.ts +++ b/apps/sim/stores/modals/search/store.ts @@ -67,18 +67,24 @@ export const useSearchModalStore = create()( devtools( (set, _) => ({ isOpen: false, + sections: null, + pendingConnect: null, data: initialData, setOpen: (open: boolean) => { - set({ isOpen: open }) + set({ isOpen: open, sections: null, pendingConnect: null }) }, - open: () => { - set({ isOpen: true }) + open: (options) => { + set({ + isOpen: true, + sections: options?.sections ?? null, + pendingConnect: options?.pendingConnect ?? null, + }) }, close: () => { - set({ isOpen: false }) + set({ isOpen: false, sections: null, pendingConnect: null }) }, initializeData: (filterBlocks) => { diff --git a/apps/sim/stores/modals/search/types.ts b/apps/sim/stores/modals/search/types.ts index b276f23627a..b8315e8156e 100644 --- a/apps/sim/stores/modals/search/types.ts +++ b/apps/sim/stores/modals/search/types.ts @@ -49,6 +49,44 @@ export interface SearchData { isInitialized: boolean } +/** + * Every result group the search modal can render, in render order. Used to + * restrict the palette to a subset of sections when opened for a specific + * intent (e.g. a drag-release that should only offer canvas-insertable items). + */ +export const SEARCH_SECTIONS = [ + 'actions', + 'connectedAccounts', + 'integrations', + 'blocks', + 'tools', + 'triggers', + 'chats', + 'workflows', + 'tables', + 'files', + 'knowledgeBases', + 'toolOperations', + 'workspaces', + 'docs', + 'pages', +] as const + +/** A single search-modal result group. */ +export type SearchSection = (typeof SEARCH_SECTIONS)[number] + +/** + * Context handed to the palette when it is opened to complete an edge + * drag-release: the dragged source handle and the release point. A selection + * stamps it onto its event so the canvas places the block at the drop point and + * wires it from that handle. + */ +export interface PendingConnect { + source: { nodeId: string; handleId: string } + screenX: number + screenY: number +} + /** * Global state for the universal search modal. * @@ -60,18 +98,33 @@ export interface SearchModalState { /** Whether the search modal is currently open. */ isOpen: boolean + /** + * When set, the palette renders only these sections; `null` shows all of them. + */ + sections: SearchSection[] | null + + /** + * Pending edge drag-release the palette was opened to complete. A selection + * stamps it onto its event; other add-block dispatchers carry none, so only a + * genuine palette pick completes the connection. `null` for ordinary opens. + */ + pendingConnect: PendingConnect | null + /** Pre-computed search data. */ data: SearchData /** - * Explicitly set the open state of the modal. + * Explicitly set the open state of the modal. Always resets to the full + * palette (no section restriction, no pending connect). */ setOpen: (open: boolean) => void /** - * Convenience method to open the modal. + * Convenience method to open the modal. Pass `sections` to restrict the + * palette to a subset of result groups, and `pendingConnect` to complete an + * edge drag-release with the selection. */ - open: () => void + open: (options?: { sections?: SearchSection[]; pendingConnect?: PendingConnect }) => void /** * Convenience method to close the modal. From 3a2f4e5c8fc3a0dde2adfafca037bc5a15d698e8 Mon Sep 17 00:00:00 2001 From: Theodore Li Date: Sat, 11 Jul 2026 10:47:20 -0700 Subject: [PATCH 05/23] feat(custom-blocks): add deploy_custom_block copilot tool (#5532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(custom-blocks): add deploy_custom_block copilot tool * feat(copilot): send workspace entitlements to the mothership * chore(copilot): sync tool catalog — plan-neutral deploy trigger text * refactor(copilot): extract entitlements registry with add-an-entitlement recipe * fix(custom-blocks): review fixes — undeploy without enterprise, array bounds, whitespace name * fix(custom-blocks): enforce per-item field limits from the REST contract * fix(custom-blocks): enterprise gate applies to first publish only, matching REST * chore(copilot): sync tool catalog — deploy_custom_block requires name --- apps/sim/app/api/mothership/execute/route.ts | 47 +- apps/sim/lib/copilot/chat/payload.test.ts | 30 ++ apps/sim/lib/copilot/chat/payload.ts | 3 + apps/sim/lib/copilot/chat/post.ts | 13 +- apps/sim/lib/copilot/entitlements.ts | 72 +++ .../lib/copilot/generated/tool-catalog-v1.ts | 118 ++++- .../lib/copilot/generated/tool-schemas-v1.ts | 320 ++++++++++---- .../tool-executor/register-handlers.ts | 3 + .../handlers/deployment/custom-block.test.ts | 414 ++++++++++++++++++ .../tools/handlers/deployment/custom-block.ts | 281 ++++++++++++ .../lib/copilot/tools/handlers/param-types.ts | 18 + apps/sim/lib/mothership/inbox/executor.ts | 25 +- .../lib/workflows/custom-blocks/operations.ts | 101 ++++- 13 files changed, 1297 insertions(+), 148 deletions(-) create mode 100644 apps/sim/lib/copilot/entitlements.ts create mode 100644 apps/sim/lib/copilot/tools/handlers/deployment/custom-block.test.ts create mode 100644 apps/sim/lib/copilot/tools/handlers/deployment/custom-block.ts diff --git a/apps/sim/app/api/mothership/execute/route.ts b/apps/sim/app/api/mothership/execute/route.ts index 37236aa160f..fa227d69351 100644 --- a/apps/sim/app/api/mothership/execute/route.ts +++ b/apps/sim/app/api/mothership/execute/route.ts @@ -8,6 +8,7 @@ import { checkInternalAuth } from '@/lib/auth/hybrid' import { buildIntegrationToolSchemas } from '@/lib/copilot/chat/payload' import { processContextsServer } from '@/lib/copilot/chat/process-contents' import { generateWorkspaceContext } from '@/lib/copilot/chat/workspace-context' +import { computeWorkspaceEntitlements } from '@/lib/copilot/entitlements' import { MothershipStreamV1EventType, MothershipStreamV1TextChannel, @@ -141,25 +142,32 @@ export const POST = withRouteHandler(async (req: NextRequest) => { const lastUserMessage = messages.filter((m) => m.role === 'user').at(-1)?.content // double-cast-allowed: the contract validates contexts as open kind/label objects; processContextsServer narrows on `kind` at runtime const agentMentions = contexts as unknown as ChatContext[] | undefined - const [workspaceContext, integrationTools, userSkillTool, userPermission, agentContexts] = - await Promise.all([ - generateWorkspaceContext(workspaceId, userId), - buildIntegrationToolSchemas(userId, messageId, undefined, workspaceId), - buildUserSkillTool(workspaceId), - getUserEntityPermissions(userId, 'workspace', workspaceId).catch(() => null), - processContextsServer( - agentMentions, - userId, - lastUserMessage, - workspaceId, - effectiveChatId - ).catch((error) => { - reqLogger.warn('Failed to resolve agent contexts for execution', { - error: toError(error).message, - }) - return [] - }), - ]) + const [ + workspaceContext, + integrationTools, + userSkillTool, + userPermission, + entitlements, + agentContexts, + ] = await Promise.all([ + generateWorkspaceContext(workspaceId, userId), + buildIntegrationToolSchemas(userId, messageId, undefined, workspaceId), + buildUserSkillTool(workspaceId), + getUserEntityPermissions(userId, 'workspace', workspaceId).catch(() => null), + computeWorkspaceEntitlements(workspaceId, userId), + processContextsServer( + agentMentions, + userId, + lastUserMessage, + workspaceId, + effectiveChatId + ).catch((error) => { + reqLogger.warn('Failed to resolve agent contexts for execution', { + error: toError(error).message, + }) + return [] + }), + ]) const requestPayload: Record = { messages, responseFormat, @@ -182,6 +190,7 @@ export const POST = withRouteHandler(async (req: NextRequest) => { ...(integrationTools.length > 0 ? { integrationTools } : {}), ...(userSkillTool ? { mothershipTools: [userSkillTool] } : {}), ...(userPermission ? { userPermission } : {}), + ...(entitlements.length > 0 ? { entitlements } : {}), } let allowExplicitAbort = true diff --git a/apps/sim/lib/copilot/chat/payload.test.ts b/apps/sim/lib/copilot/chat/payload.test.ts index 88d6abbf689..06e3a288e0a 100644 --- a/apps/sim/lib/copilot/chat/payload.test.ts +++ b/apps/sim/lib/copilot/chat/payload.test.ts @@ -237,4 +237,34 @@ describe('buildCopilotRequestPayload', () => { }) ) }) + + it('passes entitlements through and omits the field when empty', async () => { + const withEntitlements = await buildCopilotRequestPayload( + { + message: 'publish as a block', + userId: 'user-1', + userMessageId: 'msg-1', + mode: 'agent', + model: 'claude-opus-4-8', + workspaceId: 'ws-1', + entitlements: ['custom-blocks'], + }, + { selectedModel: 'claude-opus-4-8' } + ) + expect(withEntitlements).toEqual(expect.objectContaining({ entitlements: ['custom-blocks'] })) + + const withoutEntitlements = await buildCopilotRequestPayload( + { + message: 'publish as a block', + userId: 'user-1', + userMessageId: 'msg-1', + mode: 'agent', + model: 'claude-opus-4-8', + workspaceId: 'ws-1', + entitlements: [], + }, + { selectedModel: 'claude-opus-4-8' } + ) + expect(withoutEntitlements).not.toHaveProperty('entitlements') + }) }) diff --git a/apps/sim/lib/copilot/chat/payload.ts b/apps/sim/lib/copilot/chat/payload.ts index 97943990f09..9bea8cddc10 100644 --- a/apps/sim/lib/copilot/chat/payload.ts +++ b/apps/sim/lib/copilot/chat/payload.ts @@ -41,6 +41,8 @@ interface BuildPayloadParams { workspaceContext?: string vfs?: VfsSnapshotV1 userPermission?: string + /** Plan/flag-gated org capabilities (e.g. "custom-blocks") the mothership gates tools/prompts on. */ + entitlements?: string[] userTimezone?: string userMetadata?: { name?: string @@ -387,6 +389,7 @@ export async function buildCopilotRequestPayload( ...(params.workspaceContext ? { workspaceContext: params.workspaceContext } : {}), ...(params.vfs ? { vfs: params.vfs } : {}), ...(params.userPermission ? { userPermission: params.userPermission } : {}), + ...(params.entitlements?.length ? { entitlements: params.entitlements } : {}), ...(params.userTimezone ? { userTimezone: params.userTimezone } : {}), ...(params.userMetadata && (params.userMetadata.name || params.userMetadata.email || params.userMetadata.timezone) diff --git a/apps/sim/lib/copilot/chat/post.ts b/apps/sim/lib/copilot/chat/post.ts index ca5943ae3b7..99345d240e6 100644 --- a/apps/sim/lib/copilot/chat/post.ts +++ b/apps/sim/lib/copilot/chat/post.ts @@ -25,6 +25,7 @@ import { finalizeAssistantTurn } from '@/lib/copilot/chat/terminal-state' import { generateWorkspaceSnapshot } from '@/lib/copilot/chat/workspace-context' import { chatPubSub } from '@/lib/copilot/chat-status' import { COPILOT_REQUEST_MODES } from '@/lib/copilot/constants' +import { computeWorkspaceEntitlements } from '@/lib/copilot/entitlements' import { CopilotChatFinalizeOutcome, CopilotChatPersistOutcome, @@ -175,6 +176,7 @@ type UnifiedChatBranch = contexts: Array<{ type: string; content: string; tag?: string; path?: string }> fileAttachments?: UnifiedChatRequest['fileAttachments'] userPermission?: string + entitlements?: string[] userTimezone?: string userMetadata?: { name?: string; email?: string; timezone?: string } workflowId: string @@ -212,6 +214,7 @@ type UnifiedChatBranch = contexts: Array<{ type: string; content: string; tag?: string; path?: string }> fileAttachments?: UnifiedChatRequest['fileAttachments'] userPermission?: string + entitlements?: string[] userTimezone?: string userMetadata?: { name?: string; email?: string; timezone?: string } workspaceContext?: string @@ -624,6 +627,7 @@ async function resolveBranch(params: { workspaceContext: payloadParams.workspaceContext, vfs: payloadParams.vfs, userPermission: payloadParams.userPermission, + entitlements: payloadParams.entitlements, userTimezone: payloadParams.userTimezone, userMetadata: payloadParams.userMetadata, }, @@ -679,6 +683,7 @@ async function resolveBranch(params: { workspaceContext: payloadParams.workspaceContext, vfs: payloadParams.vfs, userPermission: payloadParams.userPermission, + entitlements: payloadParams.entitlements, userTimezone: payloadParams.userTimezone, userMetadata: payloadParams.userMetadata, includeMothershipTools: true, @@ -899,6 +904,9 @@ export async function handleUnifiedChatPost(req: NextRequest) { } ) : Promise.resolve(null) + const entitlementsPromise = workspaceId + ? computeWorkspaceEntitlements(workspaceId, authenticatedUserId) + : Promise.resolve([]) // Wrap the pre-LLM prep work in spans so the trace waterfall shows // where time is going between "request received" and "llm.stream // opens". Previously these ran bare under the root and inflated the @@ -953,10 +961,11 @@ export async function handleUnifiedChatPost(req: NextRequest) { activeOtelRoot.context ) - const [agentContexts, userPermission, workspaceSnapshot, , executionContext] = + const [agentContexts, userPermission, entitlements, workspaceSnapshot, , executionContext] = await Promise.all([ agentContextsPromise, userPermissionPromise, + entitlementsPromise, workspaceContextPromise, persistUserMessagePromise, executionContextPromise, @@ -991,6 +1000,7 @@ export async function handleUnifiedChatPost(req: NextRequest) { contexts: agentContexts, fileAttachments: body.fileAttachments, userPermission: userPermission ?? undefined, + entitlements, userTimezone: body.userTimezone, userMetadata, workflowId: branch.workflowId, @@ -1012,6 +1022,7 @@ export async function handleUnifiedChatPost(req: NextRequest) { contexts: agentContexts, fileAttachments: body.fileAttachments, userPermission: userPermission ?? undefined, + entitlements, userTimezone: body.userTimezone, userMetadata, workspaceContext, diff --git a/apps/sim/lib/copilot/entitlements.ts b/apps/sim/lib/copilot/entitlements.ts new file mode 100644 index 00000000000..8ef560cacea --- /dev/null +++ b/apps/sim/lib/copilot/entitlements.ts @@ -0,0 +1,72 @@ +import { createLogger } from '@sim/logger' +import { getErrorMessage } from '@sim/utils/errors' +import { LRUCache } from 'lru-cache' +import { isCustomBlocksEligible } from '@/lib/workflows/custom-blocks/operations' + +const logger = createLogger('CopilotEntitlements') + +/** + * Cross-repo contract: the mothership (Go) matches these exact strings against + * its `core.Entitlement*` constants to gate agent surfaces. + */ +export const CUSTOM_BLOCKS_ENTITLEMENT = 'custom-blocks' + +/** + * Workspace entitlements — plan/flag-gated org capabilities sent to the + * mothership as the chat payload's `entitlements` array. The Go side hides the + * matching tools, skills, and prompt sections when an entitlement is absent, so + * a non-entitled org's agents never hear of the feature. + * + * Adding an entitlement: + * 1. Add the kebab-case name and a fail-closed evaluator here. Every payload + * site (interactive chat, headless execute, inbox) picks it up automatically. + * 2. Go repo: add the matching `Entitlement*` constant in `internal/core` and + * gate surfaces declaratively — `RequiredEntitlement` on tool definitions, + * `entitlement:` frontmatter on skills, a conditional section in + * `BuildAgentEnvelope`, or a variant swap in `Capabilities`. + * 3. Keep enforcement in sim: the Go gating is advertisement-only (the payload + * is forgeable), so the sim-side tool handler must re-check the same + * predicate at execution time. + */ +const ENTITLEMENT_EVALUATORS: Record< + string, + (workspaceId: string, userId?: string) => Promise +> = { + [CUSTOM_BLOCKS_ENTITLEMENT]: isCustomBlocksEligible, +} + +const entitlementsCache = new LRUCache>({ + max: 500, + ttl: 5_000, +}) + +/** + * The entitlements to send to the mothership for a request in this workspace. + * Each evaluator fails closed (an error means the entitlement is absent). + * Cached briefly so the several per-message callers collapse to one evaluation. + */ +export function computeWorkspaceEntitlements( + workspaceId: string, + userId?: string +): Promise { + const cacheKey = `${workspaceId}:${userId ?? ''}` + const cached = entitlementsCache.get(cacheKey) + if (cached) return cached + + const promise = Promise.all( + Object.entries(ENTITLEMENT_EVALUATORS).map(async ([name, evaluate]) => { + try { + return (await evaluate(workspaceId, userId)) ? name : null + } catch (error) { + logger.warn('Entitlement evaluation failed; treating as absent', { + entitlement: name, + workspaceId, + error: getErrorMessage(error), + }) + return null + } + }) + ).then((names) => names.filter((name): name is string => name !== null)) + entitlementsCache.set(cacheKey, promise) + return promise +} diff --git a/apps/sim/lib/copilot/generated/tool-catalog-v1.ts b/apps/sim/lib/copilot/generated/tool-catalog-v1.ts index 4a4c24a1594..cce8011cd3e 100644 --- a/apps/sim/lib/copilot/generated/tool-catalog-v1.ts +++ b/apps/sim/lib/copilot/generated/tool-catalog-v1.ts @@ -23,6 +23,7 @@ export interface ToolCatalogEntry { | 'deploy' | 'deploy_api' | 'deploy_chat' + | 'deploy_custom_block' | 'deploy_mcp' | 'diff_workflows' | 'download_to_workspace_file' @@ -121,6 +122,7 @@ export interface ToolCatalogEntry { | 'deploy' | 'deploy_api' | 'deploy_chat' + | 'deploy_custom_block' | 'deploy_mcp' | 'diff_workflows' | 'download_to_workspace_file' @@ -536,7 +538,7 @@ export const Deploy: ToolCatalogEntry = { properties: { request: { description: - 'Detailed deployment instructions. Include deployment type (api/chat/mcp) and ALL user-specified options: identifier, title, description, authType, password, allowedEmails, welcomeMessage, outputConfigs (block outputs to display).', + 'Detailed deployment instructions. Include the deployment type and ALL user-specified options: identifier, title, description, authType, password, allowedEmails, welcomeMessage, outputConfigs (block outputs to display).', type: 'string', }, }, @@ -772,6 +774,119 @@ export const DeployChat: ToolCatalogEntry = { requiredPermission: 'admin', } +export const DeployCustomBlock: ToolCatalogEntry = { + id: 'deploy_custom_block', + name: 'deploy_custom_block', + route: 'sim', + mode: 'async', + parameters: { + type: 'object', + properties: { + action: { + type: 'string', + description: 'Whether to publish (deploy) or unpublish (undeploy) the custom block', + enum: ['deploy', 'undeploy'], + default: 'deploy', + }, + description: { + type: 'string', + description: 'Short description shown in the block picker, max 280 characters', + }, + exposedOutputs: { + type: 'array', + description: + "Outputs the block exposes, each mapping a child block output path to a friendly name (use get_block_outputs for valid paths). Omit to expose the terminal block's whole result", + items: { + type: 'object', + properties: { + blockId: { type: 'string', description: 'Block UUID inside the workflow' }, + name: { type: 'string', description: 'Friendly output name shown on the block' }, + path: { + type: 'string', + description: + "Dot-path into that block's output (from get_block_outputs relativeOutputs)", + }, + }, + required: ['blockId', 'path', 'name'], + }, + }, + iconUrl: { + type: 'string', + description: + 'Optional icon image for the block: a workspace file VFS path (e.g. "files/icon.png", copied into public icon storage at publish) or an external image URL. Omit to use the organization\'s default icon', + }, + inputs: { + type: 'array', + description: + "Optional per-input placeholder overrides. Input names and types are derived from the workflow's input trigger and cannot be changed here", + items: { + type: 'object', + properties: { + id: { type: 'string', description: 'Stable id of the input trigger field' }, + placeholder: { + type: 'string', + description: "Placeholder text shown in the block's input field", + }, + }, + required: ['id'], + }, + }, + name: { + type: 'string', + description: + 'Display name for the block, max 60 characters. When republishing an existing block, pass the current name to keep it or a new name to rename.', + }, + workflowId: { type: 'string', description: 'Workflow ID (defaults to active workflow)' }, + }, + required: ['name'], + }, + resultSchema: { + type: 'object', + properties: { + action: { + type: 'string', + description: 'Action performed by the tool, such as "deploy" or "undeploy".', + }, + blockId: { type: 'string', description: 'Custom block record ID.' }, + blockType: { + type: 'string', + description: 'Stable block type slug (custom_block_*) used in workflow state.', + }, + deploymentConfig: { + type: 'object', + description: + "Structured deployment configuration keyed by surface name. Includes the block's type, name, description, icon, derived input fields, and exposed outputs.", + }, + deploymentStatus: { + type: 'object', + description: + 'Structured per-surface deployment status keyed by surface name, including customBlock and the underlying api surface when applicable.', + }, + deploymentType: { + type: 'string', + description: + 'Deployment surface this result describes. For deploy_custom_block this is always "custom_block".', + }, + isDeployed: { + type: 'boolean', + description: 'Whether the custom block is published after this tool call.', + }, + name: { type: 'string', description: 'Display name of the custom block.' }, + removed: { + type: 'boolean', + description: 'Whether the custom block was unpublished during an undeploy action.', + }, + updated: { + type: 'boolean', + description: 'Whether an existing custom block was updated instead of created.', + }, + workflowId: { type: 'string', description: 'Workflow ID the custom block is bound to.' }, + }, + required: ['deploymentType', 'deploymentStatus'], + }, + requiredPermission: 'admin', +} + export const DeployMcp: ToolCatalogEntry = { id: 'deploy_mcp', name: 'deploy_mcp', @@ -4581,6 +4696,7 @@ export const TOOL_CATALOG: Record = { [Deploy.id]: Deploy, [DeployApi.id]: DeployApi, [DeployChat.id]: DeployChat, + [DeployCustomBlock.id]: DeployCustomBlock, [DeployMcp.id]: DeployMcp, [DiffWorkflows.id]: DiffWorkflows, [DownloadToWorkspaceFile.id]: DownloadToWorkspaceFile, diff --git a/apps/sim/lib/copilot/generated/tool-schemas-v1.ts b/apps/sim/lib/copilot/generated/tool-schemas-v1.ts index dcaea0db6ea..bdb97241d30 100644 --- a/apps/sim/lib/copilot/generated/tool-schemas-v1.ts +++ b/apps/sim/lib/copilot/generated/tool-schemas-v1.ts @@ -10,7 +10,7 @@ export interface ToolRuntimeSchemaEntry { } export const TOOL_RUNTIME_SCHEMAS: Record = { - agent: { + ['agent']: { parameters: { properties: { request: { @@ -23,7 +23,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - auth: { + ['auth']: { parameters: { properties: { request: { @@ -36,7 +36,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - check_deployment_status: { + ['check_deployment_status']: { parameters: { type: 'object', properties: { @@ -48,7 +48,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - complete_scheduled_task: { + ['complete_scheduled_task']: { parameters: { type: 'object', properties: { @@ -61,7 +61,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - crawl_website: { + ['crawl_website']: { parameters: { type: 'object', properties: { @@ -96,7 +96,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - create_file: { + ['create_file']: { parameters: { type: 'object', properties: { @@ -162,7 +162,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { required: ['success', 'message'], }, }, - create_file_folder: { + ['create_file_folder']: { parameters: { type: 'object', properties: { @@ -180,7 +180,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - create_workflow: { + ['create_workflow']: { parameters: { type: 'object', properties: { @@ -205,7 +205,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - create_workspace_mcp_server: { + ['create_workspace_mcp_server']: { parameters: { type: 'object', properties: { @@ -238,7 +238,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - delete_file: { + ['delete_file']: { parameters: { type: 'object', properties: { @@ -268,7 +268,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { required: ['success', 'message'], }, }, - delete_file_folder: { + ['delete_file_folder']: { parameters: { type: 'object', properties: { @@ -284,7 +284,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - delete_workflow: { + ['delete_workflow']: { parameters: { type: 'object', properties: { @@ -300,7 +300,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - delete_workspace_mcp_server: { + ['delete_workspace_mcp_server']: { parameters: { type: 'object', properties: { @@ -313,12 +313,12 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - deploy: { + ['deploy']: { parameters: { properties: { request: { description: - 'Detailed deployment instructions. Include deployment type (api/chat/mcp) and ALL user-specified options: identifier, title, description, authType, password, allowedEmails, welcomeMessage, outputConfigs (block outputs to display).', + 'Detailed deployment instructions. Include the deployment type and ALL user-specified options: identifier, title, description, authType, password, allowedEmails, welcomeMessage, outputConfigs (block outputs to display).', type: 'string', }, }, @@ -327,7 +327,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - deploy_api: { + ['deploy_api']: { parameters: { type: 'object', properties: { @@ -411,7 +411,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { ], }, }, - deploy_chat: { + ['deploy_chat']: { parameters: { type: 'object', properties: { @@ -570,7 +570,135 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { ], }, }, - deploy_mcp: { + ['deploy_custom_block']: { + parameters: { + type: 'object', + properties: { + action: { + type: 'string', + description: 'Whether to publish (deploy) or unpublish (undeploy) the custom block', + enum: ['deploy', 'undeploy'], + default: 'deploy', + }, + description: { + type: 'string', + description: 'Short description shown in the block picker, max 280 characters', + }, + exposedOutputs: { + type: 'array', + description: + "Outputs the block exposes, each mapping a child block output path to a friendly name (use get_block_outputs for valid paths). Omit to expose the terminal block's whole result", + items: { + type: 'object', + properties: { + blockId: { + type: 'string', + description: 'Block UUID inside the workflow', + }, + name: { + type: 'string', + description: 'Friendly output name shown on the block', + }, + path: { + type: 'string', + description: + "Dot-path into that block's output (from get_block_outputs relativeOutputs)", + }, + }, + required: ['blockId', 'path', 'name'], + }, + }, + iconUrl: { + type: 'string', + description: + 'Optional icon image for the block: a workspace file VFS path (e.g. "files/icon.png", copied into public icon storage at publish) or an external image URL. Omit to use the organization\'s default icon', + }, + inputs: { + type: 'array', + description: + "Optional per-input placeholder overrides. Input names and types are derived from the workflow's input trigger and cannot be changed here", + items: { + type: 'object', + properties: { + id: { + type: 'string', + description: 'Stable id of the input trigger field', + }, + placeholder: { + type: 'string', + description: "Placeholder text shown in the block's input field", + }, + }, + required: ['id'], + }, + }, + name: { + type: 'string', + description: + 'Display name for the block, max 60 characters. When republishing an existing block, pass the current name to keep it or a new name to rename.', + }, + workflowId: { + type: 'string', + description: 'Workflow ID (defaults to active workflow)', + }, + }, + required: ['name'], + }, + resultSchema: { + type: 'object', + properties: { + action: { + type: 'string', + description: 'Action performed by the tool, such as "deploy" or "undeploy".', + }, + blockId: { + type: 'string', + description: 'Custom block record ID.', + }, + blockType: { + type: 'string', + description: 'Stable block type slug (custom_block_*) used in workflow state.', + }, + deploymentConfig: { + type: 'object', + description: + "Structured deployment configuration keyed by surface name. Includes the block's type, name, description, icon, derived input fields, and exposed outputs.", + }, + deploymentStatus: { + type: 'object', + description: + 'Structured per-surface deployment status keyed by surface name, including customBlock and the underlying api surface when applicable.', + }, + deploymentType: { + type: 'string', + description: + 'Deployment surface this result describes. For deploy_custom_block this is always "custom_block".', + }, + isDeployed: { + type: 'boolean', + description: 'Whether the custom block is published after this tool call.', + }, + name: { + type: 'string', + description: 'Display name of the custom block.', + }, + removed: { + type: 'boolean', + description: 'Whether the custom block was unpublished during an undeploy action.', + }, + updated: { + type: 'boolean', + description: 'Whether an existing custom block was updated instead of created.', + }, + workflowId: { + type: 'string', + description: 'Workflow ID the custom block is bound to.', + }, + }, + required: ['deploymentType', 'deploymentStatus'], + }, + }, + ['deploy_mcp']: { parameters: { type: 'object', properties: { @@ -686,7 +814,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { required: ['deploymentType', 'deploymentStatus'], }, }, - diff_workflows: { + ['diff_workflows']: { parameters: { type: 'object', properties: { @@ -710,7 +838,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - download_to_workspace_file: { + ['download_to_workspace_file']: { parameters: { type: 'object', properties: { @@ -759,7 +887,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - edit_content: { + ['edit_content']: { parameters: { type: 'object', properties: { @@ -791,7 +919,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { required: ['success', 'message'], }, }, - edit_workflow: { + ['edit_workflow']: { parameters: { type: 'object', properties: { @@ -830,7 +958,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - enrichment_run: { + ['enrichment_run']: { parameters: { type: 'object', properties: { @@ -874,7 +1002,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { required: ['matched', 'result'], }, }, - ffmpeg: { + ['ffmpeg']: { parameters: { type: 'object', properties: { @@ -1055,7 +1183,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - file: { + ['file']: { parameters: { properties: { prompt: { @@ -1068,7 +1196,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - function_execute: { + ['function_execute']: { parameters: { type: 'object', properties: { @@ -1206,7 +1334,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - generate_api_key: { + ['generate_api_key']: { parameters: { type: 'object', properties: { @@ -1224,7 +1352,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - generate_audio: { + ['generate_audio']: { parameters: { type: 'object', properties: { @@ -1376,7 +1504,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - generate_image: { + ['generate_image']: { parameters: { type: 'object', properties: { @@ -1504,7 +1632,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - generate_video: { + ['generate_video']: { parameters: { type: 'object', properties: { @@ -1671,7 +1799,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - get_block_outputs: { + ['get_block_outputs']: { parameters: { type: 'object', properties: { @@ -1692,7 +1820,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - get_block_upstream_references: { + ['get_block_upstream_references']: { parameters: { type: 'object', properties: { @@ -1714,7 +1842,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - get_deployed_workflow_state: { + ['get_deployed_workflow_state']: { parameters: { type: 'object', properties: { @@ -1727,7 +1855,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - get_deployment_log: { + ['get_deployment_log']: { parameters: { type: 'object', properties: { @@ -1740,7 +1868,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - get_page_contents: { + ['get_page_contents']: { parameters: { type: 'object', properties: { @@ -1768,14 +1896,14 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - get_platform_actions: { + ['get_platform_actions']: { parameters: { type: 'object', properties: {}, }, resultSchema: undefined, }, - get_scheduled_task_logs: { + ['get_scheduled_task_logs']: { parameters: { type: 'object', properties: { @@ -1800,7 +1928,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - get_workflow_data: { + ['get_workflow_data']: { parameters: { type: 'object', properties: { @@ -1819,7 +1947,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - get_workflow_run_options: { + ['get_workflow_run_options']: { parameters: { type: 'object', properties: { @@ -1832,7 +1960,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - glob: { + ['glob']: { parameters: { type: 'object', properties: { @@ -1851,7 +1979,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - grep: { + ['grep']: { parameters: { type: 'object', properties: { @@ -1899,7 +2027,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - knowledge: { + ['knowledge']: { parameters: { properties: { request: { @@ -1912,7 +2040,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - knowledge_base: { + ['knowledge_base']: { parameters: { type: 'object', properties: { @@ -2105,7 +2233,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { required: ['success', 'message'], }, }, - list_file_folders: { + ['list_file_folders']: { parameters: { type: 'object', properties: { @@ -2117,7 +2245,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - list_integration_tools: { + ['list_integration_tools']: { parameters: { properties: { integration: { @@ -2131,14 +2259,14 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - list_user_workspaces: { + ['list_user_workspaces']: { parameters: { type: 'object', properties: {}, }, resultSchema: undefined, }, - list_workspace_mcp_servers: { + ['list_workspace_mcp_servers']: { parameters: { type: 'object', properties: { @@ -2151,7 +2279,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - load_deployment: { + ['load_deployment']: { parameters: { type: 'object', properties: { @@ -2170,7 +2298,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - load_integration_tool: { + ['load_integration_tool']: { parameters: { properties: { tool_ids: { @@ -2187,7 +2315,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - manage_credential: { + ['manage_credential']: { parameters: { type: 'object', properties: { @@ -2216,7 +2344,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - manage_custom_tool: { + ['manage_custom_tool']: { parameters: { type: 'object', properties: { @@ -2296,7 +2424,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - manage_folder: { + ['manage_folder']: { parameters: { type: 'object', properties: { @@ -2335,7 +2463,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - manage_mcp_tool: { + ['manage_mcp_tool']: { parameters: { type: 'object', properties: { @@ -2387,7 +2515,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - manage_scheduled_task: { + ['manage_scheduled_task']: { parameters: { type: 'object', properties: { @@ -2462,7 +2590,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - manage_skill: { + ['manage_skill']: { parameters: { type: 'object', properties: { @@ -2495,7 +2623,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - materialize_file: { + ['materialize_file']: { parameters: { type: 'object', properties: { @@ -2519,7 +2647,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - media: { + ['media']: { parameters: { properties: { prompt: { @@ -2532,7 +2660,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - move_file: { + ['move_file']: { parameters: { type: 'object', properties: { @@ -2553,7 +2681,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - move_file_folder: { + ['move_file_folder']: { parameters: { type: 'object', properties: { @@ -2571,7 +2699,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - move_workflow: { + ['move_workflow']: { parameters: { type: 'object', properties: { @@ -2591,7 +2719,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - oauth_get_auth_link: { + ['oauth_get_auth_link']: { parameters: { type: 'object', properties: { @@ -2605,7 +2733,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - oauth_request_access: { + ['oauth_request_access']: { parameters: { type: 'object', properties: { @@ -2619,7 +2747,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - open_resource: { + ['open_resource']: { parameters: { type: 'object', properties: { @@ -2653,7 +2781,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - promote_to_live: { + ['promote_to_live']: { parameters: { type: 'object', properties: { @@ -2672,7 +2800,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - query_logs: { + ['query_logs']: { parameters: { type: 'object', properties: { @@ -2783,7 +2911,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - read: { + ['read']: { parameters: { type: 'object', properties: { @@ -2810,7 +2938,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - redeploy: { + ['redeploy']: { parameters: { type: 'object', properties: { @@ -2889,7 +3017,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { ], }, }, - rename_file: { + ['rename_file']: { parameters: { type: 'object', properties: { @@ -2925,7 +3053,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { required: ['success', 'message'], }, }, - rename_file_folder: { + ['rename_file_folder']: { parameters: { type: 'object', properties: { @@ -2942,7 +3070,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - rename_workflow: { + ['rename_workflow']: { parameters: { type: 'object', properties: { @@ -2959,7 +3087,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - research: { + ['research']: { parameters: { properties: { topic: { @@ -2972,7 +3100,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - respond: { + ['respond']: { parameters: { additionalProperties: true, properties: { @@ -2995,7 +3123,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - restore_resource: { + ['restore_resource']: { parameters: { type: 'object', properties: { @@ -3013,7 +3141,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - run: { + ['run']: { parameters: { properties: { context: { @@ -3030,7 +3158,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - run_block: { + ['run_block']: { parameters: { type: 'object', properties: { @@ -3062,7 +3190,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - run_from_block: { + ['run_from_block']: { parameters: { type: 'object', properties: { @@ -3094,7 +3222,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - run_workflow: { + ['run_workflow']: { parameters: { type: 'object', properties: { @@ -3132,7 +3260,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - run_workflow_until_block: { + ['run_workflow_until_block']: { parameters: { type: 'object', properties: { @@ -3175,7 +3303,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - scheduled_task: { + ['scheduled_task']: { parameters: { properties: { request: { @@ -3188,7 +3316,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - scrape_page: { + ['scrape_page']: { parameters: { type: 'object', properties: { @@ -3209,7 +3337,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - search_documentation: { + ['search_documentation']: { parameters: { type: 'object', properties: { @@ -3226,7 +3354,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - search_library_docs: { + ['search_library_docs']: { parameters: { type: 'object', properties: { @@ -3247,7 +3375,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - search_online: { + ['search_online']: { parameters: { type: 'object', properties: { @@ -3287,7 +3415,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - search_patterns: { + ['search_patterns']: { parameters: { type: 'object', properties: { @@ -3309,7 +3437,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - set_block_enabled: { + ['set_block_enabled']: { parameters: { type: 'object', properties: { @@ -3331,7 +3459,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - set_environment_variables: { + ['set_environment_variables']: { parameters: { type: 'object', properties: { @@ -3365,7 +3493,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - set_global_workflow_variables: { + ['set_global_workflow_variables']: { parameters: { type: 'object', properties: { @@ -3406,7 +3534,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - superagent: { + ['superagent']: { parameters: { properties: { task: { @@ -3420,7 +3548,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - table: { + ['table']: { parameters: { properties: { request: { @@ -3433,7 +3561,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - update_deployment_version: { + ['update_deployment_version']: { parameters: { type: 'object', properties: { @@ -3462,7 +3590,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - update_scheduled_task_history: { + ['update_scheduled_task_history']: { parameters: { type: 'object', properties: { @@ -3480,7 +3608,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - update_workspace_mcp_server: { + ['update_workspace_mcp_server']: { parameters: { type: 'object', properties: { @@ -3505,7 +3633,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - user_memory: { + ['user_memory']: { parameters: { type: 'object', properties: { @@ -3554,7 +3682,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - user_table: { + ['user_table']: { parameters: { type: 'object', properties: { @@ -3917,7 +4045,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { required: ['success', 'message'], }, }, - workflow: { + ['workflow']: { parameters: { properties: { prompt: { @@ -3930,7 +4058,7 @@ export const TOOL_RUNTIME_SCHEMAS: Record = { }, resultSchema: undefined, }, - workspace_file: { + ['workspace_file']: { parameters: { type: 'object', properties: { diff --git a/apps/sim/lib/copilot/tool-executor/register-handlers.ts b/apps/sim/lib/copilot/tool-executor/register-handlers.ts index b39027e3526..999dea91b28 100644 --- a/apps/sim/lib/copilot/tool-executor/register-handlers.ts +++ b/apps/sim/lib/copilot/tool-executor/register-handlers.ts @@ -8,6 +8,7 @@ import { DeleteWorkspaceMcpServer, DeployApi, DeployChat, + DeployCustomBlock, DeployMcp, DiffWorkflows, FunctionExecute, @@ -53,6 +54,7 @@ import { } from '@/lib/copilot/generated/tool-catalog-v1' import { createServerToolHandler } from '@/lib/copilot/tools/registry/server-tool-adapter' import { getRegisteredServerToolNames } from '@/lib/copilot/tools/server/router' +import { executeDeployCustomBlock } from '../tools/handlers/deployment/custom-block' import { executeDeployApi, executeDeployChat, @@ -156,6 +158,7 @@ function buildHandlerMap(): Record { [DeployApi.id]: h(executeDeployApi), [DeployChat.id]: h(executeDeployChat), [DeployMcp.id]: h(executeDeployMcp), + [DeployCustomBlock.id]: h(executeDeployCustomBlock), [Redeploy.id]: h(executeRedeploy), [CheckDeploymentStatus.id]: h(executeCheckDeploymentStatus), [ListWorkspaceMcpServers.id]: h(executeListWorkspaceMcpServers), diff --git a/apps/sim/lib/copilot/tools/handlers/deployment/custom-block.test.ts b/apps/sim/lib/copilot/tools/handlers/deployment/custom-block.test.ts new file mode 100644 index 00000000000..b5e8850c279 --- /dev/null +++ b/apps/sim/lib/copilot/tools/handlers/deployment/custom-block.test.ts @@ -0,0 +1,414 @@ +/** + * @vitest-environment node + */ + +import { auditMock } from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { ExecutionContext } from '@/lib/copilot/request/types' + +const { + ensureWorkflowAccessMock, + getWorkspaceWithOwnerMock, + isFeatureEnabledMock, + isOrganizationOnEnterprisePlanMock, + publishCustomBlockMock, + updateCustomBlockMock, + deleteCustomBlockMock, + getCustomBlockWithInputsByWorkflowIdMock, + listWorkspaceFilesMock, + fetchWorkspaceFileBufferMock, + uploadFileMock, +} = vi.hoisted(() => ({ + ensureWorkflowAccessMock: vi.fn(), + getWorkspaceWithOwnerMock: vi.fn(), + isFeatureEnabledMock: vi.fn(), + isOrganizationOnEnterprisePlanMock: vi.fn(), + publishCustomBlockMock: vi.fn(), + updateCustomBlockMock: vi.fn(), + deleteCustomBlockMock: vi.fn(), + getCustomBlockWithInputsByWorkflowIdMock: vi.fn(), + listWorkspaceFilesMock: vi.fn(), + fetchWorkspaceFileBufferMock: vi.fn(), + uploadFileMock: vi.fn(), +})) + +vi.mock('@sim/audit', () => auditMock) + +vi.mock('../access', () => ({ + ensureWorkflowAccess: ensureWorkflowAccessMock, + ensureWorkspaceAccess: vi.fn(), +})) + +vi.mock('@/lib/workspaces/permissions/utils', () => ({ + getWorkspaceWithOwner: getWorkspaceWithOwnerMock, +})) + +vi.mock('@/lib/core/config/feature-flags', () => ({ + isFeatureEnabled: isFeatureEnabledMock, +})) + +vi.mock('@/lib/billing', () => ({ + isOrganizationOnEnterprisePlan: isOrganizationOnEnterprisePlanMock, +})) + +vi.mock('@/lib/uploads/contexts/workspace/workspace-file-manager', () => ({ + listWorkspaceFiles: listWorkspaceFilesMock, + fetchWorkspaceFileBuffer: fetchWorkspaceFileBufferMock, +})) + +vi.mock('@/lib/uploads/core/storage-service', () => ({ + uploadFile: uploadFileMock, +})) + +vi.mock('@/lib/uploads/utils/file-utils', () => ({ + isImageFileType: (type: string) => type.startsWith('image/'), +})) + +vi.mock('@/lib/workflows/custom-blocks/operations', () => { + class CustomBlockValidationError extends Error {} + return { + CustomBlockValidationError, + publishCustomBlock: publishCustomBlockMock, + updateCustomBlock: updateCustomBlockMock, + deleteCustomBlock: deleteCustomBlockMock, + getCustomBlockWithInputsByWorkflowId: getCustomBlockWithInputsByWorkflowIdMock, + } +}) + +import { executeDeployCustomBlock } from './custom-block' + +const context = { userId: 'user-1', workflowId: 'wf-1' } as ExecutionContext + +const publishedBlock = { + id: 'cb-1', + organizationId: 'org-1', + workflowId: 'wf-1', + workflowName: 'Test Workflow', + workspaceId: 'ws-1', + workspaceName: 'Workspace', + type: 'custom_block_abc123', + name: 'Enrich Lead', + description: 'Enrich a lead by email', + iconUrl: null, + enabled: true, + inputFields: [{ id: 'f1', name: 'email', type: 'string' }], + exposedOutputs: [{ blockId: 'b1', path: 'content', name: 'summary' }], +} + +describe('executeDeployCustomBlock', () => { + beforeEach(() => { + vi.clearAllMocks() + ensureWorkflowAccessMock.mockResolvedValue({ + workflow: { id: 'wf-1', workspaceId: 'ws-1', name: 'Test Workflow', isDeployed: true }, + }) + getWorkspaceWithOwnerMock.mockResolvedValue({ id: 'ws-1', organizationId: 'org-1' }) + isFeatureEnabledMock.mockResolvedValue(true) + isOrganizationOnEnterprisePlanMock.mockResolvedValue(true) + getCustomBlockWithInputsByWorkflowIdMock.mockResolvedValue(null) + }) + + it('publishes a new custom block', async () => { + publishCustomBlockMock.mockResolvedValue(publishedBlock) + + const result = await executeDeployCustomBlock( + { + name: 'Enrich Lead', + description: 'Enrich a lead by email', + exposedOutputs: [{ blockId: 'b1', path: 'content', name: 'summary' }], + }, + context + ) + + expect(ensureWorkflowAccessMock).toHaveBeenCalledWith('wf-1', 'user-1', 'admin') + expect(publishCustomBlockMock).toHaveBeenCalledWith({ + organizationId: 'org-1', + workspaceId: 'ws-1', + workflowId: 'wf-1', + userId: 'user-1', + name: 'Enrich Lead', + description: 'Enrich a lead by email', + iconUrl: undefined, + inputs: undefined, + exposedOutputs: [{ blockId: 'b1', path: 'content', name: 'summary' }], + }) + expect(result.success).toBe(true) + expect(result.output).toMatchObject({ + workflowId: 'wf-1', + blockType: 'custom_block_abc123', + isDeployed: true, + updated: false, + deploymentType: 'custom_block', + deploymentStatus: { customBlock: { isDeployed: true, name: 'Enrich Lead' } }, + }) + }) + + it('returns a clean admin-permission error when workflow access is denied', async () => { + ensureWorkflowAccessMock.mockRejectedValue(new Error('Unauthorized workflow access')) + + const result = await executeDeployCustomBlock({ name: 'Enrich Lead' }, context) + + expect(result.success).toBe(false) + expect(result.error).toContain('admin permission') + expect(publishCustomBlockMock).not.toHaveBeenCalled() + }) + + it('surfaces workflow-not-found from access resolution', async () => { + ensureWorkflowAccessMock.mockRejectedValue(new Error('Workflow wf-1 not found')) + + const result = await executeDeployCustomBlock({ name: 'Enrich Lead' }, context) + + expect(result.success).toBe(false) + expect(result.error).toContain('not found') + }) + + it('requires a name on first publish', async () => { + const result = await executeDeployCustomBlock({}, context) + + expect(result.success).toBe(false) + expect(result.error).toContain('name is required') + expect(publishCustomBlockMock).not.toHaveBeenCalled() + }) + + it('requires the workflow to be deployed on first publish', async () => { + ensureWorkflowAccessMock.mockResolvedValue({ + workflow: { id: 'wf-1', workspaceId: 'ws-1', name: 'Test Workflow', isDeployed: false }, + }) + + const result = await executeDeployCustomBlock({ name: 'Enrich Lead' }, context) + + expect(result.success).toBe(false) + expect(result.error).toContain('deploy_api') + expect(publishCustomBlockMock).not.toHaveBeenCalled() + }) + + it('updates an existing block in place', async () => { + getCustomBlockWithInputsByWorkflowIdMock + .mockResolvedValueOnce(publishedBlock) + .mockResolvedValueOnce({ ...publishedBlock, name: 'Enrich Lead v2' }) + + const result = await executeDeployCustomBlock({ name: 'Enrich Lead v2' }, context) + + expect(updateCustomBlockMock).toHaveBeenCalledWith('cb-1', { + name: 'Enrich Lead v2', + description: undefined, + iconUrl: undefined, + inputs: undefined, + exposedOutputs: undefined, + }) + expect(publishCustomBlockMock).not.toHaveBeenCalled() + expect(result.success).toBe(true) + expect(result.output).toMatchObject({ updated: true, name: 'Enrich Lead v2' }) + }) + + it('unpublishes the block on undeploy', async () => { + getCustomBlockWithInputsByWorkflowIdMock.mockResolvedValue(publishedBlock) + + const result = await executeDeployCustomBlock({ action: 'undeploy' }, context) + + expect(deleteCustomBlockMock).toHaveBeenCalledWith('cb-1') + expect(result.success).toBe(true) + expect(result.output).toMatchObject({ + isDeployed: false, + removed: true, + action: 'undeploy', + blockType: 'custom_block_abc123', + }) + }) + + it('updates an existing block without requiring the enterprise plan', async () => { + isOrganizationOnEnterprisePlanMock.mockResolvedValue(false) + getCustomBlockWithInputsByWorkflowIdMock + .mockResolvedValueOnce(publishedBlock) + .mockResolvedValueOnce(publishedBlock) + + const result = await executeDeployCustomBlock({ description: 'refreshed copy' }, context) + + expect(result.success).toBe(true) + expect(updateCustomBlockMock).toHaveBeenCalled() + expect(publishCustomBlockMock).not.toHaveBeenCalled() + }) + + it('undeploys without requiring the enterprise plan', async () => { + isOrganizationOnEnterprisePlanMock.mockResolvedValue(false) + getCustomBlockWithInputsByWorkflowIdMock.mockResolvedValue(publishedBlock) + + const result = await executeDeployCustomBlock({ action: 'undeploy' }, context) + + expect(result.success).toBe(true) + expect(deleteCustomBlockMock).toHaveBeenCalledWith('cb-1') + }) + + it('does not clear the stored name when a republish sends whitespace', async () => { + getCustomBlockWithInputsByWorkflowIdMock + .mockResolvedValueOnce(publishedBlock) + .mockResolvedValueOnce(publishedBlock) + + const result = await executeDeployCustomBlock({ name: ' ' }, context) + + expect(updateCustomBlockMock).toHaveBeenCalledWith( + 'cb-1', + expect.objectContaining({ name: undefined }) + ) + expect(result.success).toBe(true) + }) + + it('rejects oversized exposedOutputs and inputs arrays', async () => { + const outputs = Array.from({ length: 51 }, (_, i) => ({ + blockId: `b${i}`, + path: 'content', + name: `out${i}`, + })) + const tooManyOutputs = await executeDeployCustomBlock( + { name: 'Enrich Lead', exposedOutputs: outputs }, + context + ) + expect(tooManyOutputs.success).toBe(false) + expect(tooManyOutputs.error).toContain('50') + + const inputs = Array.from({ length: 51 }, (_, i) => ({ id: `f${i}` })) + const tooManyInputs = await executeDeployCustomBlock({ name: 'Enrich Lead', inputs }, context) + expect(tooManyInputs.success).toBe(false) + expect(tooManyInputs.error).toContain('50') + expect(publishCustomBlockMock).not.toHaveBeenCalled() + }) + + it('rejects oversized per-item fields', async () => { + const longPlaceholder = await executeDeployCustomBlock( + { name: 'Enrich Lead', inputs: [{ id: 'f1', placeholder: 'x'.repeat(201) }] }, + context + ) + expect(longPlaceholder.success).toBe(false) + expect(longPlaceholder.error).toContain('200') + + const longOutputName = await executeDeployCustomBlock( + { + name: 'Enrich Lead', + exposedOutputs: [{ blockId: 'b1', path: 'content', name: 'x'.repeat(61) }], + }, + context + ) + expect(longOutputName.success).toBe(false) + expect(longOutputName.error).toContain('60') + expect(publishCustomBlockMock).not.toHaveBeenCalled() + }) + + it('rejects exposedOutputs entries missing required fields', async () => { + const result = await executeDeployCustomBlock( + { name: 'Enrich Lead', exposedOutputs: [{ blockId: 'b1', path: '', name: 'out' }] }, + context + ) + expect(result.success).toBe(false) + expect(result.error).toContain('blockId, path, and name') + }) + + it('fails undeploy when the workflow is not published as a block', async () => { + const result = await executeDeployCustomBlock({ action: 'undeploy' }, context) + + expect(result.success).toBe(false) + expect(deleteCustomBlockMock).not.toHaveBeenCalled() + }) + + it('fails when the feature flag is off', async () => { + isFeatureEnabledMock.mockResolvedValue(false) + + const result = await executeDeployCustomBlock({ name: 'Enrich Lead' }, context) + + expect(result.success).toBe(false) + expect(result.error).toContain('not enabled') + }) + + it('fails when the org is not on the enterprise plan', async () => { + isOrganizationOnEnterprisePlanMock.mockResolvedValue(false) + + const result = await executeDeployCustomBlock({ name: 'Enrich Lead' }, context) + + expect(result.success).toBe(false) + expect(result.error).toContain('enterprise') + }) + + it('ingests a workspace-file icon into public icon storage', async () => { + listWorkspaceFilesMock.mockResolvedValue([ + { + name: 'icon.png', + folderPath: null, + type: 'image/png', + size: 1024, + key: 'workspace/ws-1/123-abc-icon.png', + }, + ]) + fetchWorkspaceFileBufferMock.mockResolvedValue(Buffer.from('png-bytes')) + uploadFileMock.mockResolvedValue({ path: '/api/files/serve/s3/workspace-logos%2Ficon.png' }) + publishCustomBlockMock.mockResolvedValue(publishedBlock) + + const result = await executeDeployCustomBlock( + { name: 'Enrich Lead', iconUrl: 'files/icon.png' }, + context + ) + + expect(uploadFileMock).toHaveBeenCalledWith( + expect.objectContaining({ + context: 'workspace-logos', + contentType: 'image/png', + customKey: expect.stringMatching(/^workspace-logos\/\d+-[A-Za-z0-9_-]+-icon\.png$/), + preserveKey: true, + metadata: { workspaceId: 'ws-1', userId: 'user-1', originalName: 'icon.png' }, + }) + ) + expect(publishCustomBlockMock).toHaveBeenCalledWith( + expect.objectContaining({ iconUrl: '/api/files/serve/s3/workspace-logos%2Ficon.png' }) + ) + expect(result.success).toBe(true) + }) + + it('passes an external icon URL through without ingestion', async () => { + publishCustomBlockMock.mockResolvedValue(publishedBlock) + + const result = await executeDeployCustomBlock( + { name: 'Enrich Lead', iconUrl: 'https://example.com/icon.png' }, + context + ) + + expect(uploadFileMock).not.toHaveBeenCalled() + expect(publishCustomBlockMock).toHaveBeenCalledWith( + expect.objectContaining({ iconUrl: 'https://example.com/icon.png' }) + ) + expect(result.success).toBe(true) + }) + + it('fails when the icon workspace file does not exist', async () => { + listWorkspaceFilesMock.mockResolvedValue([]) + + const result = await executeDeployCustomBlock( + { name: 'Enrich Lead', iconUrl: 'files/missing.png' }, + context + ) + + expect(result.success).toBe(false) + expect(result.error).toContain('not found') + expect(publishCustomBlockMock).not.toHaveBeenCalled() + }) + + it('fails when the icon workspace file is not an image', async () => { + listWorkspaceFilesMock.mockResolvedValue([ + { name: 'notes.pdf', folderPath: null, type: 'application/pdf', size: 1024, key: 'k' }, + ]) + + const result = await executeDeployCustomBlock( + { name: 'Enrich Lead', iconUrl: 'files/notes.pdf' }, + context + ) + + expect(result.success).toBe(false) + expect(result.error).toContain('image') + expect(uploadFileMock).not.toHaveBeenCalled() + }) + + it('fails when the workspace has no organization', async () => { + getWorkspaceWithOwnerMock.mockResolvedValue({ id: 'ws-1', organizationId: null }) + + const result = await executeDeployCustomBlock({ name: 'Enrich Lead' }, context) + + expect(result.success).toBe(false) + expect(result.error).toContain('organization') + }) +}) diff --git a/apps/sim/lib/copilot/tools/handlers/deployment/custom-block.ts b/apps/sim/lib/copilot/tools/handlers/deployment/custom-block.ts new file mode 100644 index 00000000000..65d2bed86d6 --- /dev/null +++ b/apps/sim/lib/copilot/tools/handlers/deployment/custom-block.ts @@ -0,0 +1,281 @@ +import { AuditAction, AuditResourceType, recordAudit } from '@sim/audit' +import { toError } from '@sim/utils/errors' +import { generateShortId } from '@sim/utils/id' +import { isOrganizationOnEnterprisePlan } from '@/lib/billing' +import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' +import { canonicalizeVfsPath, canonicalWorkspaceFilePath } from '@/lib/copilot/vfs/path-utils' +import { isFeatureEnabled } from '@/lib/core/config/feature-flags' +import { + fetchWorkspaceFileBuffer, + listWorkspaceFiles, +} from '@/lib/uploads/contexts/workspace/workspace-file-manager' +import { uploadFile } from '@/lib/uploads/core/storage-service' +import { isImageFileType } from '@/lib/uploads/utils/file-utils' +import { + CustomBlockValidationError, + type CustomBlockWithInputs, + deleteCustomBlock, + getCustomBlockWithInputsByWorkflowId, + publishCustomBlock, + updateCustomBlock, +} from '@/lib/workflows/custom-blocks/operations' +import { getWorkspaceWithOwner } from '@/lib/workspaces/permissions/utils' +import { ensureWorkflowAccess } from '../access' +import type { DeployCustomBlockParams } from '../param-types' + +const MAX_ICON_BYTES = 5 * 1024 * 1024 +const MAX_INPUT_ENTRIES = 50 +const MAX_OUTPUT_ENTRIES = 50 + +/** + * Resolve the agent-supplied icon reference to a publicly servable URL. A VFS + * workspace-file path (`files/...`) is ingested: the file is copied into the + * world-readable `workspace-logos` storage context (the same context the icon + * upload UI writes to), because a raw workspace-file URL is membership-gated + * and the block's icon must render for org members in other workspaces. Any + * other non-empty value (an external or already-public URL) passes through. + */ +async function resolveIconUrl( + raw: string | undefined, + userId: string, + workspaceId: string +): Promise { + const value = raw?.trim() + if (!value) return undefined + if (!value.startsWith('files/')) return value + + const canonical = canonicalizeVfsPath(value) + const files = await listWorkspaceFiles(workspaceId, { hydrateFolderPaths: true }) + const record = files.find( + (f) => canonicalWorkspaceFilePath({ folderPath: f.folderPath, name: f.name }) === canonical + ) + if (!record) { + throw new CustomBlockValidationError(`Icon file not found in this workspace: ${value}`) + } + if (!isImageFileType(record.type)) { + throw new CustomBlockValidationError( + 'Icon file must be an image (PNG, JPEG, GIF, WebP, or SVG)' + ) + } + if (record.size > MAX_ICON_BYTES) { + throw new CustomBlockValidationError('Icon file must be 5MB or smaller') + } + + const buffer = await fetchWorkspaceFileBuffer(record) + const safeFileName = record.name.replace(/[^a-zA-Z0-9.-]/g, '_') + const uploaded = await uploadFile({ + file: buffer, + fileName: record.name, + contentType: record.type, + context: 'workspace-logos', + customKey: `workspace-logos/${Date.now()}-${generateShortId()}-${safeFileName}`, + preserveKey: true, + metadata: { workspaceId, userId, originalName: record.name }, + }) + return uploaded.path +} + +function customBlockOutput(block: CustomBlockWithInputs, action: 'deploy' | 'undeploy') { + const isDeployed = action === 'deploy' + return { + workflowId: block.workflowId, + blockId: block.id, + blockType: block.type, + name: block.name, + action, + isDeployed, + removed: !isDeployed, + deploymentType: 'custom_block', + deploymentStatus: { + customBlock: { + isDeployed, + blockType: block.type, + name: block.name, + enabled: block.enabled, + }, + }, + deploymentConfig: { + customBlock: { + blockType: block.type, + name: block.name, + description: block.description, + iconUrl: block.iconUrl, + inputFields: block.inputFields, + exposedOutputs: block.exposedOutputs, + organizationId: block.organizationId, + }, + }, + } +} + +export async function executeDeployCustomBlock( + params: DeployCustomBlockParams, + context: ExecutionContext +): Promise { + try { + const workflowId = params.workflowId || context.workflowId + if (!workflowId) { + return { success: false, error: 'workflowId is required' } + } + const action = params.action === 'undeploy' ? 'undeploy' : 'deploy' + + let workflowRecord: Awaited>['workflow'] + try { + workflowRecord = (await ensureWorkflowAccess(workflowId, context.userId, 'admin')).workflow + } catch (error) { + const message = toError(error).message + if (message.includes('not found')) { + return { success: false, error: message } + } + return { + success: false, + error: "Managing a custom block requires admin permission on the workflow's workspace", + } + } + const workspaceId = workflowRecord.workspaceId + if (!workspaceId) { + return { success: false, error: 'Workflow must belong to a workspace' } + } + + const ws = await getWorkspaceWithOwner(workspaceId) + const organizationId = ws?.organizationId + if (!organizationId) { + return { + success: false, + error: 'Publishing a block requires the workspace to belong to an organization', + } + } + if ( + !(await isFeatureEnabled('deploy-as-block', { + userId: context.userId, + orgId: organizationId, + })) + ) { + return { success: false, error: 'Custom blocks are not enabled for this organization' } + } + + const existing = await getCustomBlockWithInputsByWorkflowId(workflowId) + + if (action === 'undeploy') { + if (!existing) { + return { success: false, error: 'This workflow is not published as a custom block' } + } + await deleteCustomBlock(existing.id) + recordAudit({ + workspaceId, + actorId: context.userId, + action: AuditAction.CUSTOM_BLOCK_DELETED, + resourceType: AuditResourceType.CUSTOM_BLOCK, + resourceId: existing.id, + resourceName: existing.name, + description: `Unpublished custom block "${existing.name}"`, + metadata: { organizationId, type: existing.type, workflowId, source: 'copilot' }, + }) + return { success: true, output: customBlockOutput(existing, 'undeploy') } + } + + const name = params.name?.trim() + const description = params.description?.trim() + if (name && name.length > 60) { + return { success: false, error: 'name must be 60 characters or fewer' } + } + if (description && description.length > 280) { + return { success: false, error: 'description must be 280 characters or fewer' } + } + if (params.inputs && params.inputs.length > MAX_INPUT_ENTRIES) { + return { success: false, error: `inputs must be ${MAX_INPUT_ENTRIES} entries or fewer` } + } + if (params.inputs?.some((entry) => !entry?.id?.trim())) { + return { success: false, error: 'each inputs entry requires the trigger field id' } + } + if (params.inputs?.some((entry) => (entry.placeholder?.length ?? 0) > 200)) { + return { success: false, error: 'input placeholders must be 200 characters or fewer' } + } + if (params.exposedOutputs && params.exposedOutputs.length > MAX_OUTPUT_ENTRIES) { + return { + success: false, + error: `exposedOutputs must be ${MAX_OUTPUT_ENTRIES} entries or fewer`, + } + } + if ( + params.exposedOutputs?.some( + (entry) => !entry?.blockId?.trim() || !entry?.path?.trim() || !entry?.name?.trim() + ) + ) { + return { + success: false, + error: 'each exposedOutputs entry requires blockId, path, and name', + } + } + if (params.exposedOutputs?.some((entry) => entry.name.length > 60)) { + return { success: false, error: 'exposed output names must be 60 characters or fewer' } + } + const iconUrl = await resolveIconUrl(params.iconUrl, context.userId, workspaceId) + + if (existing) { + await updateCustomBlock(existing.id, { + name: name || undefined, + description, + iconUrl, + inputs: params.inputs, + exposedOutputs: params.exposedOutputs, + }) + const updated = await getCustomBlockWithInputsByWorkflowId(workflowId) + if (!updated) { + return { success: false, error: 'Custom block not found after update' } + } + recordAudit({ + workspaceId, + actorId: context.userId, + action: AuditAction.CUSTOM_BLOCK_UPDATED, + resourceType: AuditResourceType.CUSTOM_BLOCK, + resourceId: updated.id, + resourceName: updated.name, + description: `Updated custom block "${updated.name}"`, + metadata: { organizationId, type: updated.type, workflowId, source: 'copilot' }, + }) + return { success: true, output: { ...customBlockOutput(updated, 'deploy'), updated: true } } + } + + if (!(await isOrganizationOnEnterprisePlan(organizationId))) { + return { success: false, error: 'Custom blocks require an enterprise plan' } + } + if (!name) { + return { success: false, error: 'name is required when publishing a new custom block' } + } + if (!workflowRecord.isDeployed) { + return { + success: false, + error: + 'Workflow must be deployed before publishing as a custom block. Use deploy_api first.', + } + } + const block = await publishCustomBlock({ + organizationId, + workspaceId, + workflowId, + userId: context.userId, + name, + description: description ?? '', + iconUrl, + inputs: params.inputs, + exposedOutputs: params.exposedOutputs, + }) + recordAudit({ + workspaceId, + actorId: context.userId, + action: AuditAction.CUSTOM_BLOCK_PUBLISHED, + resourceType: AuditResourceType.CUSTOM_BLOCK, + resourceId: block.id, + resourceName: block.name, + description: `Published custom block "${block.name}"`, + metadata: { organizationId, type: block.type, workflowId, source: 'copilot' }, + }) + return { success: true, output: { ...customBlockOutput(block, 'deploy'), updated: false } } + } catch (error) { + if (error instanceof CustomBlockValidationError) { + return { success: false, error: error.message } + } + return { success: false, error: toError(error).message } + } +} diff --git a/apps/sim/lib/copilot/tools/handlers/param-types.ts b/apps/sim/lib/copilot/tools/handlers/param-types.ts index da437b4993a..19eae663ba8 100644 --- a/apps/sim/lib/copilot/tools/handlers/param-types.ts +++ b/apps/sim/lib/copilot/tools/handlers/param-types.ts @@ -173,6 +173,24 @@ export interface DeployMcpParams { parameterDescriptions?: Array<{ name: string; description: string }> } +export interface DeployCustomBlockParams { + workflowId?: string + action?: 'deploy' | 'undeploy' + /** Block display name (max 60 chars). Required on first publish. */ + name?: string + /** Block-picker description (max 280 chars). */ + description?: string + /** Icon image URL; omit for the organization's default icon. */ + iconUrl?: string + /** + * Per-input placeholder overrides keyed by the input trigger field's stable id. + * The field set itself is always derived from the workflow's deployment. + */ + inputs?: Array<{ id: string; placeholder?: string }> + /** Curated outputs; omit to expose the terminal block's whole result. */ + exposedOutputs?: Array<{ blockId: string; path: string; name: string }> +} + export interface CheckDeploymentStatusParams { workflowId?: string } diff --git a/apps/sim/lib/mothership/inbox/executor.ts b/apps/sim/lib/mothership/inbox/executor.ts index 86ac2312b2d..903018024d6 100644 --- a/apps/sim/lib/mothership/inbox/executor.ts +++ b/apps/sim/lib/mothership/inbox/executor.ts @@ -13,6 +13,7 @@ import { } from '@/lib/copilot/chat/persisted-message' import { generateWorkspaceContext } from '@/lib/copilot/chat/workspace-context' import { chatPubSub } from '@/lib/copilot/chat-status' +import { computeWorkspaceEntitlements } from '@/lib/copilot/entitlements' import { runHeadlessCopilotLifecycle } from '@/lib/copilot/request/lifecycle/headless' import { requestChatTitle } from '@/lib/copilot/request/lifecycle/start' import type { OrchestratorResult } from '@/lib/copilot/request/types' @@ -208,14 +209,21 @@ export async function executeInboxTask(taskId: string): Promise { return { attachments, ...downloaded } } - const [attachmentResult, workspaceContext, integrationTools, userSkillTool, userPermission] = - await Promise.all([ - fetchAttachments(), - generateWorkspaceContext(ws.id, userId), - buildIntegrationToolSchemas(userId, undefined, undefined, ws.id), - buildUserSkillTool(ws.id), - getUserEntityPermissions(userId, 'workspace', ws.id).catch(() => null), - ]) + const [ + attachmentResult, + workspaceContext, + integrationTools, + userSkillTool, + userPermission, + entitlements, + ] = await Promise.all([ + fetchAttachments(), + generateWorkspaceContext(ws.id, userId), + buildIntegrationToolSchemas(userId, undefined, undefined, ws.id), + buildUserSkillTool(ws.id), + getUserEntityPermissions(userId, 'workspace', ws.id).catch(() => null), + computeWorkspaceEntitlements(ws.id, userId), + ]) const { attachments, fileAttachments, storedAttachments } = attachmentResult const truncatedTask = { @@ -237,6 +245,7 @@ export async function executeInboxTask(taskId: string): Promise { ...(integrationTools.length > 0 ? { integrationTools } : {}), ...(userSkillTool ? { mothershipTools: [userSkillTool] } : {}), ...(userPermission ? { userPermission } : {}), + ...(entitlements.length > 0 ? { entitlements } : {}), ...(fileAttachments.length > 0 ? { fileAttachments } : {}), } diff --git a/apps/sim/lib/workflows/custom-blocks/operations.ts b/apps/sim/lib/workflows/custom-blocks/operations.ts index 23e602b83d1..643867dd611 100644 --- a/apps/sim/lib/workflows/custom-blocks/operations.ts +++ b/apps/sim/lib/workflows/custom-blocks/operations.ts @@ -25,15 +25,36 @@ const logger = createLogger('CustomBlocksOperations') * enterprise plan). Applying it in every org-scoped resolver keeps execution, the * copilot VFS, and workspace context from surfacing blocks the API withholds (e.g. * after an org drops off the enterprise plan). Returns `null` when ineligible. + * + * Pass `userId` when the caller acts for a specific user so per-user flag + * targeting matches the REST routes; workspace-scoped resolvers (VFS, context, + * executor overlay) omit it and evaluate at org level. */ -async function eligibleOrgForWorkspace(workspaceId: string): Promise { +async function eligibleOrgForWorkspace( + workspaceId: string, + userId?: string +): Promise { const ws = await getWorkspaceWithOwner(workspaceId, { includeArchived: true }) if (!ws?.organizationId) return null - if (!(await isFeatureEnabled('deploy-as-block', { orgId: ws.organizationId }))) return null + if (!(await isFeatureEnabled('deploy-as-block', { userId, orgId: ws.organizationId }))) { + return null + } if (!(await isOrganizationOnEnterprisePlan(ws.organizationId))) return null return ws.organizationId } +/** + * Whether the workspace's org may use custom blocks (`deploy-as-block` flag + + * enterprise plan). Feeds the 'custom-blocks' entitlement in + * `@/lib/copilot/entitlements` and matches the REST route gates. + */ +export async function isCustomBlocksEligible( + workspaceId: string, + userId?: string +): Promise { + return (await eligibleOrgForWorkspace(workspaceId, userId)) !== null +} + /** A persisted custom block plus its live-derived Start input fields. */ export interface CustomBlockWithInputs { id: string @@ -170,6 +191,37 @@ export async function listCustomBlockSummariesForWorkspace( .where(and(eq(customBlock.organizationId, organizationId), eq(customBlock.enabled, true))) } +/** + * Hydrate a joined custom-block row into the wire shape. Field set derived live + * from the deployed Start; stored placeholders merged in. Derive even for a + * disabled block — the source workflow's deployment is independent of the block's + * enabled flag, and the edit form needs the real fields so a save doesn't + * overwrite the block's stored placeholders. + */ +async function hydrateCustomBlockRow(joined: { + block: typeof customBlock.$inferSelect + workflowName: string + workspaceId: string | null + workspaceName: string | null +}): Promise { + const { block: row, workflowName, workspaceId, workspaceName } = joined + return { + id: row.id, + organizationId: row.organizationId, + workflowId: row.workflowId, + workflowName, + workspaceId, + workspaceName, + type: row.type, + name: row.name, + description: row.description, + iconUrl: row.iconUrl, + enabled: row.enabled, + inputFields: applyInputPlaceholders(row.inputs, await deriveInputFields(row.workflowId)), + exposedOutputs: row.outputs ?? [], + } +} + /** The org's custom blocks with live-derived input fields (client overlay + list API). */ export async function listCustomBlocksWithInputs( organizationId: string @@ -186,27 +238,30 @@ export async function listCustomBlocksWithInputs( .leftJoin(workspace, eq(workspace.id, workflow.workspaceId)) .where(eq(customBlock.organizationId, organizationId)) - return Promise.all( - rows.map(async ({ block: row, workflowName, workspaceId, workspaceName }) => ({ - id: row.id, - organizationId: row.organizationId, - workflowId: row.workflowId, - workflowName, - workspaceId, - workspaceName, - type: row.type, - name: row.name, - description: row.description, - iconUrl: row.iconUrl, - enabled: row.enabled, - // Field set derived live from the deployed Start; stored placeholders merged - // in. Derive even for a disabled block — the source workflow's deployment is - // independent of the block's enabled flag, and the edit form needs the real - // fields so a save doesn't overwrite the block's stored placeholders. - inputFields: applyInputPlaceholders(row.inputs, await deriveInputFields(row.workflowId)), - exposedOutputs: row.outputs ?? [], - })) - ) + return Promise.all(rows.map(hydrateCustomBlockRow)) +} + +/** + * The custom block bound to a workflow (with live-derived input fields), or `null` + * when the workflow isn't published as a block. One block per workflow is enforced + * at publish time. Used by the copilot deploy_custom_block tool. + */ +export async function getCustomBlockWithInputsByWorkflowId( + workflowId: string +): Promise { + const [row] = await db + .select({ + block: customBlock, + workflowName: workflow.name, + workspaceId: workflow.workspaceId, + workspaceName: workspace.name, + }) + .from(customBlock) + .innerJoin(workflow, eq(workflow.id, customBlock.workflowId)) + .leftJoin(workspace, eq(workspace.id, workflow.workspaceId)) + .where(eq(customBlock.workflowId, workflowId)) + .limit(1) + return row ? hydrateCustomBlockRow(row) : null } /** Fetch a single custom block row by id. */ From d14c30478709ccbe10f0843ecb8b9da2852be137 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 11:04:18 -0700 Subject: [PATCH 06/23] fix(og-image): match sim.ai OG image colors to live landing tokens (#5592) The wordmark ink and background were slightly off from the actual site: #1a1a1a on #f8f8f8 in the static OG asset vs var(--text-body) (#3b3b3b) on var(--bg) (#fefefe) as rendered on the live landing page. Recolored the same wordmark artwork in place to match exactly - alpha reconstructed from the existing two-color image and recomposited onto the new colors, so the glyph geometry/anti-aliasing is unchanged. --- .../sim/public/logo/426-240/reverse/small.png | Bin 19956 -> 20419 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/sim/public/logo/426-240/reverse/small.png b/apps/sim/public/logo/426-240/reverse/small.png index 196dd6389e92f2564253673a54da28c281378935..3e0f96d5b91274722937e55d257b24bd7d202b7c 100644 GIT binary patch literal 20419 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 CC3IN; literal 19956 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 oB!i!_z_6cs@xS$syu2~*X82c?3EM3wp@ Date: Sat, 11 Jul 2026 11:04:47 -0700 Subject: [PATCH 07/23] fix(rich-markdown-editor): fix mention chip losing ambient color inside links/h6 (#5594) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(rich-markdown-editor): fix mention chip losing ambient color (same class as #5573) Auditing the whole "an element's own explicit color always wins over an inherited one" bug class (previously fixed for strong/em/code/del/s vs. links and h6 in #5573) turned up one more instance: the @-mention chip's label hardcoded text-[var(--text-primary)], which is redundant with the prose default anyway (matching the strong/em/code precedent) and silently overrides any ambient color a mention's container legitimately sets — a link's blue, or h6's dimmer --text-secondary — since a mention is inline content that can appear inside either (e.g. "###### see @some-file"). Removed the hardcoded color entirely so the label inherits correctly in every context, same fix as strong/em/code. The icon's own monochrome --text-icon fallback is untouched (icons intentionally don't follow ambient text color). New test renders MentionChipView directly and asserts the wrapper carries no explicit text-color utility class; verified it fails against the pre-fix className. * fix(rich-markdown-editor): broaden mention-chip color-regression guard beyond the exact old class Greptile: the test only matched the literal old text-[var(--text-primary)] string — a future edit swapping it for e.g. text-[var(--text-secondary)] or text-blue-500 would still silently reintroduce the ambient-color bug and pass this test. Now checks every non-descendant-scoped (excludes the [&>svg]: icon rule) text-* utility on the wrapper against a color-shaped pattern (arbitrary value, color-shade pairs, or a named color keyword), so any bare text color slipping back in fails. Verified against a text-blue-500 regression. * fix(rich-markdown-editor): close the semantic-Tailwind-color gap in the mention-chip test Greptile: the color-shaped regex still missed semantic theme tokens (text-primary, text-muted-foreground, text-chart-1, etc.) since they don't match a shade-suffix or bracket pattern. Rather than keep enumerating Tailwind's color-naming schemes, flag ANY unscoped text-* utility on the wrapper — none is legitimate on this chip today, so this can only be a color slipping back in. Verified against text-primary/text-muted-foreground/text-chart-1 regressions. * fix(rich-markdown-editor): catch Tailwind's self-targeting [&]:text-* variant too Greptile: the previous filter excluded ANY class starting with `[&`, which also dropped Tailwind's self-targeting arbitrary variant (`[&]:text-primary` applies to the element itself, same as a bare `text-primary`) — only descendant variants like `[&>svg]:text-*` should be excluded. Now explicitly catches both the bare and `[&]:` forms. Verified against a `[&]:text-primary` regression. --- .../mention/mention-chip.test.tsx | 81 +++++++++++++++++++ .../mention/mention-chip.tsx | 11 ++- 2 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/mention/mention-chip.test.tsx diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/mention/mention-chip.test.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/mention/mention-chip.test.tsx new file mode 100644 index 00000000000..e91226d8757 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/mention/mention-chip.test.tsx @@ -0,0 +1,81 @@ +/** + * @vitest-environment jsdom + * + * The chip label must never carry its own explicit text color — see the comment on `CHIP_CLASS` in + * `mention-chip.tsx`. An element's own explicit `color` always wins over an inherited one regardless + * of ancestor specificity, so hardcoding a color here would silently override any ambient color a + * mention's container legitimately sets (a link's blue, an `h6` heading's dimmer `--text-secondary`) — + * the same bug class already fixed for `strong`/`em`/`code` in `rich-markdown-editor.css`. + */ +import { act } from 'react' +import type { Editor } from '@tiptap/react' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, describe, expect, it, vi } from 'vitest' + +vi.mock('next/navigation', () => ({ + useRouter: () => ({ push: vi.fn() }), + useParams: () => ({}), +})) + +// Override the global `getAllBlocks: () => ({})` stub — `getIconColorMap` iterates it as an array. +vi.mock('@/blocks/registry', () => ({ + getAllBlocks: () => [], +})) + +const { MentionChipView } = await import('./mention-chip') + +function fakeNode(attrs: Record) { + return { attrs } as unknown as Parameters[0]['node'] +} + +function fakeEditor(): Editor { + return { storage: { mention: { navigable: false } } } as unknown as Editor +} + +let container: HTMLDivElement | null = null +let root: Root | null = null + +afterEach(() => { + if (root) act(() => root?.unmount()) + container?.remove() + container = null + root = null +}) + +describe('MentionChipView', () => { + it('renders its wrapper with no explicit text-color utility class', async () => { + ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + + await act(async () => { + root?.render( + MentionChipView({ + node: fakeNode({ kind: 'file', id: 'f1', label: 'notes.md' }), + editor: fakeEditor(), + } as Parameters[0]) + ) + }) + + const chip = container.querySelector('.mention-chip') as HTMLElement + expect(chip).not.toBeNull() + + // Any `text-*` utility targeting the wrapper itself — bare, or Tailwind's self-targeting + // `[&]:text-*` arbitrary variant (as opposed to a descendant variant like `[&>svg]:text-*`, + // which the icon rule below legitimately uses) — would regress this fix, not just the specific + // old `text-[var(--text-primary)]` class. Rather than enumerate every Tailwind color-naming + // scheme (arbitrary value, shade-suffixed, semantic theme tokens like `text-primary`/ + // `text-muted-foreground`, keywords), flag ANY such token: none is legitimate on this wrapper + // today, so this can only ever be a color utility slipping back in. A genuinely new, non-color + // `text-*` need (e.g. a font-size utility) should fail this test and force an explicit update, + // not be silently allowed through. + const ownTextUtilities = chip.className + .split(/\s+/) + .filter((cls) => cls.startsWith('text-') || cls.startsWith('[&]:text-')) + expect(ownTextUtilities).toEqual([]) + + // The icon's own monochrome fallback is unrelated and must be untouched by this fix. + expect(chip.className).toContain('[&>svg]:text-[var(--text-icon)]') + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/mention/mention-chip.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/mention/mention-chip.tsx index d64d5e4958e..b851c2a86fa 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/mention/mention-chip.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/mention/mention-chip.tsx @@ -15,9 +15,16 @@ import { simLinkPath } from './sim-link' * color, and a 12px icon. Integration icons keep their brand color via * {@link getBareIconStyle} (see {@link MentionChipView}); other kinds stay * monochrome through the `--text-icon` fallback below. + * + * No explicit label color — an element's own explicit `color` always wins over an inherited one + * regardless of ancestor specificity, so hardcoding `--text-primary` here (redundant with the prose + * default anyway) would silently override any ambient color a ancestor legitimately sets — a link's + * blue, or `h6`'s dimmer `--text-secondary` — since a mention is inline content and can appear inside + * either. Omitting it lets the label inherit correctly in both cases, same fix as `strong`/`em`/`code` + * in rich-markdown-editor.css. */ const CHIP_CLASS = - 'mention-chip mx-px inline-flex items-center gap-1 align-middle text-[var(--text-primary)] leading-[1.5] [&>svg]:size-[12px] [&>svg]:shrink-0 [&>svg]:text-[var(--text-icon)]' + 'mention-chip mx-px inline-flex items-center gap-1 align-middle leading-[1.5] [&>svg]:size-[12px] [&>svg]:shrink-0 [&>svg]:text-[var(--text-icon)]' /** * Live chip: an entity icon + label matching the chat input's mention rendering. Where the host opted @@ -25,7 +32,7 @@ const CHIP_CLASS = * inert so a click can't navigate away from an unsaved edit. This view pulls the block registry (for * integration brand icons), so it's kept out of the headless {@link MarkdownMention} module. */ -function MentionChipView({ node, editor }: ReactNodeViewProps) { +export function MentionChipView({ node, editor }: ReactNodeViewProps) { const router = useRouter() const params = useParams() const { kind, id, label } = node.attrs as MentionAttrs From def2d5299a982da90d8d74a1e34a2a9cf7cc07ca Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 11:17:54 -0700 Subject: [PATCH 08/23] fix(docs-og-image): match reference cover template typography exactly (#5598) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(docs-og-image): match reference cover template typography exactly - swap Season Sans for Söhne Kräftig (500) — the reference cover's actual brand font, confirmed by letterform comparison; recovered from git history since it was removed as an unused static asset - fix ink/background colors to exact reference hex values - square caps + miter join on the corner arrow to match the reference's sharp corners instead of rounded ones - recalibrate title font size, line height, and wrap width for the new font's metrics * fix(docs-og-image): estimate CJK glyph width separately to avoid under-wrap wrapTitleLines budgeted a flat 0.42em/char, tuned for Latin text. Docs ships ja/zh locales — CJK glyphs render near-square (~1em), so a CJK title could overflow the fixed-width title box uncaught. Sum per-char em-width with a CJK-range check instead of counting characters. * fix(docs-og-image): fall back to character-level wrap for oversized CJK words wrapTitleLines only splits at spaces, so a space-free CJK run (common for Chinese titles) still arrived as a single word wider than the title box and rendered as one overflowing line. Falls back to character-level chunking for any word that alone exceeds maxWidthEm. --- apps/docs/app/api/og/route.tsx | 110 +++++++++++++----- .../static/fonts/SeasonSans-600-static.ttf | Bin 158484 -> 0 bytes .../public/static/fonts/Soehne-Kraftig.ttf | Bin 0 -> 96964 bytes 3 files changed, 78 insertions(+), 32 deletions(-) delete mode 100644 apps/docs/public/static/fonts/SeasonSans-600-static.ttf create mode 100644 apps/docs/public/static/fonts/Soehne-Kraftig.ttf diff --git a/apps/docs/app/api/og/route.tsx b/apps/docs/app/api/og/route.tsx index ec58754d9b3..ee99eec89e9 100644 --- a/apps/docs/app/api/og/route.tsx +++ b/apps/docs/app/api/og/route.tsx @@ -5,16 +5,19 @@ import type { NextRequest } from 'next/server' export const runtime = 'edge' const TITLE_FONT_SIZE = { - large: 105, - medium: 91, - small: 81, + large: 110, + medium: 96, + small: 85, } as const /** Average glyph width as a fraction of font size, for this weight/family — used to pack words into lines. */ -const AVG_CHAR_WIDTH_EM = 0.46 +const LATIN_CHAR_WIDTH_EM = 0.42 +/** CJK glyphs (docs ships `ja`/`zh` locales) render near-square, roughly 2.4x a Latin glyph at this weight. */ +const CJK_CHAR_WIDTH_EM = 1 +const CJK_RANGE = /[\u3000-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uffef]/ const TITLE_BOX_WIDTH = 1020 const FONT_CACHE_REVALIDATE_SECONDS = 60 * 60 * 24 * 30 -/** Measured off the reference cover template (`apps/sim/public/library/best-zapier-alternatives/cover.jpg`). */ -const INK_COLOR = '#525252' +/** Exact hex from a vector trace of the reference cover template, not an estimate off compressed JPEG pixels. */ +const INK_COLOR = '#515151' const OG_CONTAINER_STYLE = { height: '100%', width: '100%', @@ -22,8 +25,8 @@ const OG_CONTAINER_STYLE = { flexDirection: 'column', justifyContent: 'space-between', padding: '26px', - background: '#c3c3c3', - fontFamily: 'Season', + background: '#c1c1c1', + fontFamily: 'Soehne', } satisfies CSSProperties const OG_HEADER_STYLE = { display: 'flex', @@ -34,10 +37,12 @@ const OG_HEADER_STYLE = { const OG_TITLE_STYLE = { display: 'flex', flexDirection: 'column', - fontWeight: 600, + fontWeight: 500, color: INK_COLOR, - lineHeight: 1.15, + lineHeight: 1.1, width: `${TITLE_BOX_WIDTH}px`, + /** Compensates for Satori adding extra invisible leading below the last line instead of splitting it evenly. */ + transform: 'translateY(14px)', } satisfies CSSProperties function getTitleFontSize(title: string): number { @@ -53,6 +58,41 @@ function getTitleStyle(title: string): CSSProperties { } } +/** Sums per-character em-widths rather than counting characters, so wide CJK glyphs (docs ships `ja`/`zh`) don't under-wrap. */ +function estimateWidthEm(text: string): number { + let width = 0 + for (const char of text) { + width += CJK_RANGE.test(char) ? CJK_CHAR_WIDTH_EM : LATIN_CHAR_WIDTH_EM + } + return width +} + +/** + * Splits a single word wider than `maxWidthEm` into character-level chunks + * that each fit. CJK titles (docs ships `ja`/`zh` locales) are often + * space-free, so a whole run can arrive as one "word" from `wrapTitleLines`' + * space-based split. Breaking mid-word is correct for CJK, where each glyph + * is independently readable; Latin words never reach this path since they + * stay under `maxWidthEm` in practice. + */ +function splitOversizedWord(word: string, maxWidthEm: number): string[] { + const chunks: string[] = [] + let chunk = '' + + for (const char of word) { + const candidate = chunk + char + if (estimateWidthEm(candidate) > maxWidthEm && chunk) { + chunks.push(chunk) + chunk = char + } else { + chunk = candidate + } + } + if (chunk) chunks.push(chunk) + + return chunks +} + /** * Greedily packs words into lines that fit `TITLE_BOX_WIDTH` at `fontSize`, * then joins each line with U+00A0 instead of a plain space. Satori @@ -63,14 +103,25 @@ function getTitleStyle(title: string): CSSProperties { * (which is also disabled here — lines are pre-split, not auto-wrapped). */ function wrapTitleLines(title: string, fontSize: number): string[] { - const maxCharsPerLine = Math.floor(TITLE_BOX_WIDTH / (fontSize * AVG_CHAR_WIDTH_EM)) + const maxWidthEm = TITLE_BOX_WIDTH / fontSize const words = title.split(' ') const lines: string[] = [] let current = '' for (const word of words) { + if (estimateWidthEm(word) > maxWidthEm) { + if (current) { + lines.push(current) + current = '' + } + const chunks = splitOversizedWord(word, maxWidthEm) + lines.push(...chunks.slice(0, -1)) + current = chunks[chunks.length - 1] ?? '' + continue + } + const candidate = current ? `${current} ${word}` : word - if (candidate.length > maxCharsPerLine && current) { + if (estimateWidthEm(candidate) > maxWidthEm && current) { lines.push(current) current = word } else { @@ -83,21 +134,16 @@ function wrapTitleLines(title: string, fontSize: number): string[] { } /** - * Loads a static (600/semibold) TTF instance of the site's own Season Sans - * font — the platform's real brand/body font, also used by the library/blog - * cover template this OG image matches. Instantiated from the variable font - * at `apps/docs/app/fonts/SeasonSansUprightsVF.woff2` (`fonttools - * varLib.instancer wght=600`, then flavor-stripped to plain TTF) rather than - * loading the variable WOFF2 directly: Satori (`next/og`'s renderer) can't - * parse variable fonts without excessive memory use, and can't parse WOFF2 - * at all ("Unsupported OpenType signature wOF2") — it needs an uncompressed - * TTF/OTF. Fetched over HTTP since the edge runtime has no filesystem access - * — served from `/static/fonts/` (not `/fonts/`) so it isn't intercepted by - * the site's i18n proxy (`proxy.ts`), whose matcher excludes `static` but - * not `fonts`. + * Loads Söhne Kräftig (weight 500), the typeface used on the reference cover + * template this OG image matches. Converted to a plain TTF from the + * last-shipped `soehne-kraftig.woff2` since Satori (`next/og`'s renderer) + * can't parse WOFF2 or variable fonts. Fetched over HTTP since the edge + * runtime has no filesystem access — served from `/static/fonts/` (not + * `/fonts/`) so it isn't intercepted by the site's i18n proxy (`proxy.ts`), + * whose matcher excludes `static` but not `fonts`. */ -async function loadSeasonFont(baseUrl: string): Promise { - const response = await fetch(new URL('/static/fonts/SeasonSans-600-static.ttf', baseUrl), { +async function loadTitleFont(baseUrl: string): Promise { + const response = await fetch(new URL('/static/fonts/Soehne-Kraftig.ttf', baseUrl), { next: { revalidate: FONT_CACHE_REVALIDATE_SECONDS }, }) @@ -128,7 +174,7 @@ function SimWordmark() { ) } -/** Diagonal "open" arrow, top-right — matches the library/blog cover template. */ +/** Diagonal "open" arrow, top-right — square caps and a miter join to match the reference's sharp corners. */ function CornerArrow() { return ( @@ -136,8 +182,8 @@ function CornerArrow() { d='M2 22 22 2M22 2H12M22 2V12' stroke={INK_COLOR} strokeWidth={3.6} - strokeLinecap='round' - strokeLinejoin='round' + strokeLinecap='square' + strokeLinejoin='miter' /> ) @@ -153,7 +199,7 @@ export async function GET(request: NextRequest) { const { searchParams } = new URL(request.url) const title = searchParams.get('title') || 'Documentation' - const fontData = await loadSeasonFont(request.url) + const fontData = await loadTitleFont(request.url) const fontSize = getTitleFontSize(title) const titleLines = wrapTitleLines(title, fontSize) @@ -175,10 +221,10 @@ export async function GET(request: NextRequest) { height: 675, fonts: [ { - name: 'Season', + name: 'Soehne', data: fontData, style: 'normal', - weight: 600, + weight: 500, }, ], } diff --git a/apps/docs/public/static/fonts/SeasonSans-600-static.ttf b/apps/docs/public/static/fonts/SeasonSans-600-static.ttf deleted file mode 100644 index 56dcc2b803bc8e30d27d2a83131812ca29ff8ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158484 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 P*IAz5J9fxO3)lZYa0}O+ diff --git a/apps/docs/public/static/fonts/Soehne-Kraftig.ttf b/apps/docs/public/static/fonts/Soehne-Kraftig.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8a92c26f779fc240f6a22184c4efa5a417813616 GIT binary patch literal 96964 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 Date: Sat, 11 Jul 2026 11:23:27 -0700 Subject: [PATCH 09/23] feat(providers): add xAI to hosted key rotation pool (#5574) * feat(providers): add xAI to hosted key rotation pool Wires xai into the same hosted-key mechanism as OpenAI, Anthropic, and Z.ai so Sim can serve Grok models without users bringing their own key. * fix(pi): include xai in Pi cloud-mode workspace BYOK read-back xai was fully wired as a Pi-supported provider but missing from WORKSPACE_BYOK_PROVIDERS, so a stored workspace xAI key was never read back for cloud-mode Pi runs. * fix(byok): add xai settings UI row xai is both hosted (Pi block hides its inline API key field for hosted models) and Pi-supported (cloud mode requires a user key), so without a Settings > BYOK row users had no way to supply an xai key for Pi cloud runs. --- .../settings/components/byok/byok.tsx | 9 +++++++++ apps/sim/executor/handlers/pi/keys.test.ts | 15 +++++++++++++++ apps/sim/executor/handlers/pi/keys.ts | 8 +++++++- apps/sim/lib/api-key/byok.ts | 3 ++- apps/sim/lib/api/contracts/byok-keys.ts | 1 + apps/sim/lib/core/config/api-keys.ts | 7 ++++++- apps/sim/lib/core/config/env.ts | 3 +++ apps/sim/lib/core/utils.test.ts | 8 ++++++++ apps/sim/providers/models.test.ts | 14 ++++++++++++++ apps/sim/providers/models.ts | 1 + apps/sim/providers/utils.test.ts | 8 +++++--- apps/sim/providers/utils.ts | 3 ++- apps/sim/tools/types.ts | 1 + 13 files changed, 74 insertions(+), 7 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx index 41740182975..a2031ab5948 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok.tsx @@ -34,6 +34,7 @@ import { SerperIcon, TogetherIcon, WizaIcon, + xAIIcon, ZeroBounceIcon, } from '@/components/icons' import { MAX_BYOK_KEYS_PER_PROVIDER } from '@/lib/api/contracts/byok-keys' @@ -76,6 +77,13 @@ const PROVIDERS: (BYOKManagerProvider & { id: BYOKProviderId })[] = [ description: 'LLM calls and Knowledge Base OCR', placeholder: 'Enter your API key', }, + { + id: 'xai', + name: 'xAI', + icon: xAIIcon, + description: 'LLM calls', + placeholder: 'xai-...', + }, { id: 'fireworks', name: 'Fireworks', @@ -287,6 +295,7 @@ const PROVIDER_SECTIONS: BYOKProviderSection[] = [ 'anthropic', 'google', 'mistral', + 'xai', 'fireworks', 'together', 'baseten', diff --git a/apps/sim/executor/handlers/pi/keys.test.ts b/apps/sim/executor/handlers/pi/keys.test.ts index 17b407cc0ad..17c45a6d6ef 100644 --- a/apps/sim/executor/handlers/pi/keys.test.ts +++ b/apps/sim/executor/handlers/pi/keys.test.ts @@ -134,6 +134,21 @@ describe('resolvePiModelKey', () => { expect(mockGetApiKeyWithBYOK).not.toHaveBeenCalled() }) + it('cloud mode falls back to a stored workspace key for xAI', async () => { + mockGetProviderFromModel.mockReturnValue('xai') + mockGetBYOKKey.mockResolvedValue({ apiKey: 'xai-workspace-key', isBYOK: true }) + + const result = await resolvePiModelKey({ + model: 'grok-4.5', + mode: 'cloud', + workspaceId: 'ws-1', + }) + + expect(result).toEqual({ providerId: 'xai', apiKey: 'xai-workspace-key', isBYOK: true }) + expect(mockGetBYOKKey).toHaveBeenCalledWith('ws-1', 'xai') + expect(mockGetApiKeyWithBYOK).not.toHaveBeenCalled() + }) + it('cloud mode rejects when no user key is available (never a hosted key)', async () => { mockGetProviderFromModel.mockReturnValue('anthropic') mockGetBYOKKey.mockResolvedValue(null) diff --git a/apps/sim/executor/handlers/pi/keys.ts b/apps/sim/executor/handlers/pi/keys.ts index 9d85eb8a4ee..cc28d6de4b4 100644 --- a/apps/sim/executor/handlers/pi/keys.ts +++ b/apps/sim/executor/handlers/pi/keys.ts @@ -33,7 +33,13 @@ interface ResolvePiModelKeyParams { } /** Providers whose key Sim can store as a workspace BYOK key (read back for cloud). */ -const WORKSPACE_BYOK_PROVIDERS = new Set(['anthropic', 'openai', 'google', 'mistral']) +const WORKSPACE_BYOK_PROVIDERS = new Set([ + 'anthropic', + 'openai', + 'google', + 'mistral', + 'xai', +]) /** Resolves the provider and a usable API key for the selected model. */ export async function resolvePiModelKey(params: ResolvePiModelKeyParams): Promise { diff --git a/apps/sim/lib/api-key/byok.ts b/apps/sim/lib/api-key/byok.ts index 4a4f26b3271..6e45fe2cad8 100644 --- a/apps/sim/lib/api-key/byok.ts +++ b/apps/sim/lib/api-key/byok.ts @@ -205,13 +205,14 @@ export async function getApiKeyWithBYOK( const isGeminiModel = provider === 'google' const isMistralModel = provider === 'mistral' const isZaiModel = provider === 'zai' + const isXaiModel = provider === 'xai' const byokProviderId = isGeminiModel ? 'google' : (provider as BYOKProviderId) if ( isHosted && workspaceId && - (isOpenAIModel || isClaudeModel || isGeminiModel || isMistralModel || isZaiModel) + (isOpenAIModel || isClaudeModel || isGeminiModel || isMistralModel || isZaiModel || isXaiModel) ) { const hostedModels = getHostedModels() const isModelHosted = hostedModels.some((m) => m.toLowerCase() === model.toLowerCase()) diff --git a/apps/sim/lib/api/contracts/byok-keys.ts b/apps/sim/lib/api/contracts/byok-keys.ts index 10a1d589123..0c2be6492bf 100644 --- a/apps/sim/lib/api/contracts/byok-keys.ts +++ b/apps/sim/lib/api/contracts/byok-keys.ts @@ -7,6 +7,7 @@ export const byokProviderIdSchema = z.enum([ 'google', 'mistral', 'zai', + 'xai', 'fireworks', 'together', 'baseten', diff --git a/apps/sim/lib/core/config/api-keys.ts b/apps/sim/lib/core/config/api-keys.ts index 1a1f04218cd..b435da46f22 100644 --- a/apps/sim/lib/core/config/api-keys.ts +++ b/apps/sim/lib/core/config/api-keys.ts @@ -12,7 +12,8 @@ export function getRotatingApiKey(provider: string): string { provider !== 'anthropic' && provider !== 'gemini' && provider !== 'cohere' && - provider !== 'zai' + provider !== 'zai' && + provider !== 'xai' ) { throw new Error(`No rotation implemented for provider: ${provider}`) } @@ -39,6 +40,10 @@ export function getRotatingApiKey(provider: string): string { if (env.ZAI_API_KEY_1) keys.push(env.ZAI_API_KEY_1) if (env.ZAI_API_KEY_2) keys.push(env.ZAI_API_KEY_2) if (env.ZAI_API_KEY_3) keys.push(env.ZAI_API_KEY_3) + } else if (provider === 'xai') { + if (env.XAI_API_KEY_1) keys.push(env.XAI_API_KEY_1) + if (env.XAI_API_KEY_2) keys.push(env.XAI_API_KEY_2) + if (env.XAI_API_KEY_3) keys.push(env.XAI_API_KEY_3) } if (keys.length === 0) { diff --git a/apps/sim/lib/core/config/env.ts b/apps/sim/lib/core/config/env.ts index 717a6f5eb2b..a7e56751caf 100644 --- a/apps/sim/lib/core/config/env.ts +++ b/apps/sim/lib/core/config/env.ts @@ -147,6 +147,9 @@ export const env = createEnv({ ZAI_API_KEY_1: z.string().min(1).optional(), // Primary Z.ai API key for load balancing ZAI_API_KEY_2: z.string().min(1).optional(), // Additional Z.ai API key for load balancing ZAI_API_KEY_3: z.string().min(1).optional(), // Additional Z.ai API key for load balancing + XAI_API_KEY_1: z.string().min(1).optional(), // Primary xAI API key for load balancing + XAI_API_KEY_2: z.string().min(1).optional(), // Additional xAI API key for load balancing + XAI_API_KEY_3: z.string().min(1).optional(), // Additional xAI API key for load balancing OLLAMA_URL: z.string().url().optional(), // Ollama local LLM server URL VLLM_BASE_URL: z.string().url().optional(), // vLLM self-hosted base URL (OpenAI-compatible) VLLM_API_KEY: z.string().optional(), // Optional bearer token for vLLM diff --git a/apps/sim/lib/core/utils.test.ts b/apps/sim/lib/core/utils.test.ts index a9e2b1662f9..7ccb5dc75cf 100644 --- a/apps/sim/lib/core/utils.test.ts +++ b/apps/sim/lib/core/utils.test.ts @@ -43,6 +43,9 @@ vi.mock('@/lib/core/config/env', () => GEMINI_API_KEY_1: 'test-gemini-key-1', GEMINI_API_KEY_2: 'test-gemini-key-2', GEMINI_API_KEY_3: 'test-gemini-key-3', + XAI_API_KEY_1: 'test-xai-key-1', + XAI_API_KEY_2: 'test-xai-key-2', + XAI_API_KEY_3: 'test-xai-key-3', }) ) @@ -327,6 +330,11 @@ describe('getRotatingApiKey', () => { expect(result).toMatch(/^test-gemini-key-[1-3]$/) }) + it.concurrent('should return xAI API key based on current minute', () => { + const result = getRotatingApiKey('xai') + expect(result).toMatch(/^test-xai-key-[1-3]$/) + }) + it.concurrent('should throw error for unsupported provider', () => { expect(() => getRotatingApiKey('unsupported')).toThrow('No rotation implemented for provider') }) diff --git a/apps/sim/providers/models.test.ts b/apps/sim/providers/models.test.ts index 0c01133649c..14dcee48590 100644 --- a/apps/sim/providers/models.test.ts +++ b/apps/sim/providers/models.test.ts @@ -218,3 +218,17 @@ describe('zai provider definition', () => { expect(getHostedModels()).toContain('glm-4.6') }) }) + +describe('xai provider definition', () => { + const xai = PROVIDER_DEFINITIONS.xai + + it('is registered with grok-4.5 as the default model', () => { + expect(xai).toBeDefined() + expect(xai.id).toBe('xai') + expect(xai.defaultModel).toBe('grok-4.5') + }) + + it('is included in getHostedModels since Sim provides the xAI key server-side', () => { + expect(getHostedModels()).toContain('grok-4.5') + }) +}) diff --git a/apps/sim/providers/models.ts b/apps/sim/providers/models.ts index e5021a4c721..bc5aa24cbe7 100644 --- a/apps/sim/providers/models.ts +++ b/apps/sim/providers/models.ts @@ -3921,6 +3921,7 @@ export function getHostedModels(): string[] { ...getProviderModels('anthropic'), ...getProviderModels('google'), ...getProviderModels('zai'), + ...getProviderModels('xai'), ] } diff --git a/apps/sim/providers/utils.test.ts b/apps/sim/providers/utils.test.ts index 1e9c877a976..1697c12f80d 100644 --- a/apps/sim/providers/utils.test.ts +++ b/apps/sim/providers/utils.test.ts @@ -865,7 +865,7 @@ describe('Cost Calculation', () => { }) describe('getHostedModels', () => { - it.concurrent('should return OpenAI, Anthropic, and Google models as hosted', () => { + it.concurrent('should return OpenAI, Anthropic, Google, and xAI models as hosted', () => { const hostedModels = getHostedModels() expect(hostedModels).toContain('gpt-4o') @@ -877,8 +877,9 @@ describe('getHostedModels', () => { expect(hostedModels).toContain('gemini-2.5-pro') expect(hostedModels).toContain('gemini-2.5-flash') + expect(hostedModels).toContain('grok-4.5') + expect(hostedModels).not.toContain('deepseek-v3') - expect(hostedModels).not.toContain('grok-4-latest') }) it.concurrent('should return an array of strings', () => { @@ -902,11 +903,12 @@ describe('shouldBillModelUsage', () => { expect(shouldBillModelUsage('gemini-2.5-pro')).toBe(true) expect(shouldBillModelUsage('gemini-2.5-flash')).toBe(true) + + expect(shouldBillModelUsage('grok-4.5')).toBe(true) }) it.concurrent('should return false for non-hosted models', () => { expect(shouldBillModelUsage('deepseek-v3')).toBe(false) - expect(shouldBillModelUsage('grok-4-latest')).toBe(false) expect(shouldBillModelUsage('unknown-model')).toBe(false) }) diff --git a/apps/sim/providers/utils.ts b/apps/sim/providers/utils.ts index 3b8bdd10c6a..8ca3017354a 100644 --- a/apps/sim/providers/utils.ts +++ b/apps/sim/providers/utils.ts @@ -903,8 +903,9 @@ export function getApiKey(provider: string, model: string, userProvidedKey?: str const isClaudeModel = provider === 'anthropic' const isGeminiModel = provider === 'google' const isZaiModel = provider === 'zai' + const isXaiModel = provider === 'xai' - if (isHosted && (isOpenAIModel || isClaudeModel || isGeminiModel || isZaiModel)) { + if (isHosted && (isOpenAIModel || isClaudeModel || isGeminiModel || isZaiModel || isXaiModel)) { const hostedModels = getHostedModels() const isModelHosted = hostedModels.some((m) => m.toLowerCase() === model.toLowerCase()) diff --git a/apps/sim/tools/types.ts b/apps/sim/tools/types.ts index fca1e60a443..542e5e9a620 100644 --- a/apps/sim/tools/types.ts +++ b/apps/sim/tools/types.ts @@ -8,6 +8,7 @@ export type BYOKProviderId = | 'google' | 'mistral' | 'zai' + | 'xai' | 'fireworks' | 'together' | 'baseten' From b486aba07ef24fe1e3ef5fe075212992a5d9558e Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 12:40:07 -0700 Subject: [PATCH 10/23] fix(pricing): route Talk to sales CTA to demo request form instead of signup (#5602) - pricing page's enterprise card was labeled "Talk to sales" but linked to /signup for every card, sending visitors to self-serve signup instead of the demo-request flow every other "Contact sales" CTA on the site uses - resolveCta now keys off the CTA's sales intent to pick the right href - extracted the /signup and /demo route literals (previously hardcoded independently in 6 files) into a single shared apps/sim/app/(landing)/constants.ts so no CTA can drift to the wrong destination again - hoisted the static per-column comparison sections out of render and deduped the annual-discount price math in pricing-plans.tsx --- apps/sim/app/(landing)/components/cta/cta.tsx | 5 ++- .../components/hero-cta/hero-cta.tsx | 5 ++- .../components/mobile-nav/mobile-nav.tsx | 5 ++- .../(landing)/components/navbar/navbar.tsx | 5 ++- apps/sim/app/(landing)/constants.ts | 8 ++++ .../app/(landing)/enterprise/enterprise.tsx | 9 ++-- .../pricing-plans/pricing-plans.tsx | 45 +++++++++++-------- 7 files changed, 52 insertions(+), 30 deletions(-) create mode 100644 apps/sim/app/(landing)/constants.ts diff --git a/apps/sim/app/(landing)/components/cta/cta.tsx b/apps/sim/app/(landing)/components/cta/cta.tsx index 61fe0cb64e4..b82a6bcf7ef 100644 --- a/apps/sim/app/(landing)/components/cta/cta.tsx +++ b/apps/sim/app/(landing)/components/cta/cta.tsx @@ -1,4 +1,5 @@ import { ChipLink } from '@sim/emcn' +import { DEMO_HREF, SIGNUP_HREF } from '@/app/(landing)/constants' /** * Landing pre-footer CTA - the page's final conversion band. A tall, centered @@ -28,10 +29,10 @@ export function Cta() { Build your first agent today.
- + Get started - + Contact sales
diff --git a/apps/sim/app/(landing)/components/hero-cta/hero-cta.tsx b/apps/sim/app/(landing)/components/hero-cta/hero-cta.tsx index 93a4dee3d6e..ff392fd0b2a 100644 --- a/apps/sim/app/(landing)/components/hero-cta/hero-cta.tsx +++ b/apps/sim/app/(landing)/components/hero-cta/hero-cta.tsx @@ -1,4 +1,5 @@ import { ChipLink, cn } from '@sim/emcn' +import { DEMO_HREF, SIGNUP_HREF } from '@/app/(landing)/constants' /** * Hero-scale sizing shared by both CTAs - one step up from the navbar's 30px @@ -24,11 +25,11 @@ const CTA_SIZE = 'h-[36px] px-[0.571em] text-[15px] [&>span]:[font-size:inherit] export function HeroCta() { return (
- + Request a demo diff --git a/apps/sim/app/(landing)/components/navbar/components/mobile-nav/mobile-nav.tsx b/apps/sim/app/(landing)/components/navbar/components/mobile-nav/mobile-nav.tsx index 59e31ad04a7..7be454b18ae 100644 --- a/apps/sim/app/(landing)/components/navbar/components/mobile-nav/mobile-nav.tsx +++ b/apps/sim/app/(landing)/components/navbar/components/mobile-nav/mobile-nav.tsx @@ -10,6 +10,7 @@ import { NAVBAR_GLASS_SURFACE, useNavbarFrost, } from '@/app/(landing)/components/navbar/components/navbar-shell' +import { DEMO_HREF, SIGNUP_HREF } from '@/app/(landing)/constants' /** * Mobile navigation - the `< lg` counterpart to the desktop nav clusters. @@ -70,7 +71,7 @@ export function MobileNav({ stars }: MobileNavProps) { return (
- + Sign up
diff --git a/apps/sim/app/(landing)/constants.ts b/apps/sim/app/(landing)/constants.ts new file mode 100644 index 00000000000..c16abe98f78 --- /dev/null +++ b/apps/sim/app/(landing)/constants.ts @@ -0,0 +1,8 @@ +/** + * Shared landing-page CTA destinations. Every "Get started"/"Sign up" CTA + * across the marketing site funnels to signup; every "Talk to sales"/ + * "Contact sales" CTA funnels to the demo-request form. Centralized here so + * no CTA can drift to the wrong destination independently. + */ +export const SIGNUP_HREF = '/signup' +export const DEMO_HREF = '/demo' diff --git a/apps/sim/app/(landing)/enterprise/enterprise.tsx b/apps/sim/app/(landing)/enterprise/enterprise.tsx index 100ab549b0d..677a23d1968 100644 --- a/apps/sim/app/(landing)/enterprise/enterprise.tsx +++ b/apps/sim/app/(landing)/enterprise/enterprise.tsx @@ -9,6 +9,7 @@ import { } from '@/app/(landing)/components/solutions-page/components' import { SOLUTIONS_SPACING } from '@/app/(landing)/components/solutions-page/constants' import type { SolutionsPageConfig } from '@/app/(landing)/components/solutions-page/types' +import { DEMO_HREF, SIGNUP_HREF } from '@/app/(landing)/constants' import { EnterpriseFeatureGrid } from '@/app/(landing)/enterprise/components/enterprise-feature-grid' import { EnterprisePlatformLoop } from '@/app/(landing)/enterprise/components/enterprise-platform-loop' import { @@ -84,7 +85,7 @@ const ENTERPRISE_CONFIG: SolutionsPageConfig = { title: 'Build, Deploy, and Manage Enterprise AI Agents in One Workspace', subtitle: 'Build enterprise AI agents, ship to production, and manage every version from one workspace.', - cta: { label: 'Start building', href: '/signup' }, + cta: { label: 'Start building', href: SIGNUP_HREF }, cards: [ { title: 'Build visually or with code', @@ -111,7 +112,7 @@ const ENTERPRISE_CONFIG: SolutionsPageConfig = { title: 'Governance and Security for Enterprise AI Agents', subtitle: 'Security, approvals, and controls keep enterprise AI agents trusted in production.', - cta: { label: 'See security', href: '/demo' }, + cta: { label: 'See security', href: DEMO_HREF }, cards: [ { title: 'Control who can do what', @@ -138,7 +139,7 @@ const ENTERPRISE_CONFIG: SolutionsPageConfig = { id: 'deploy', title: 'Deploy Enterprise Workflow Agents with Confidence', subtitle: 'Stage, observe, and version workflow agents before they reach production.', - cta: { label: 'Explore deployment', href: '/signup' }, + cta: { label: 'Explore deployment', href: SIGNUP_HREF }, cards: [ { title: 'Stage before you ship', @@ -162,7 +163,7 @@ const ENTERPRISE_CONFIG: SolutionsPageConfig = { title: 'Built for Enterprise Teams', subtitle: 'Built for the teams that own enterprise AI agents across IT, operations, and engineering.', - cta: { label: 'Talk to sales', href: '/demo' }, + cta: { label: 'Talk to sales', href: DEMO_HREF }, cards: [ { title: 'IT and platform teams', diff --git a/apps/sim/app/(landing)/pricing/components/pricing-plans/pricing-plans.tsx b/apps/sim/app/(landing)/pricing/components/pricing-plans/pricing-plans.tsx index efaf271b15e..5fc794978ef 100644 --- a/apps/sim/app/(landing)/pricing/components/pricing-plans/pricing-plans.tsx +++ b/apps/sim/app/(landing)/pricing/components/pricing-plans/pricing-plans.tsx @@ -4,6 +4,7 @@ import type { ReactNode } from 'react' import { useQueryStates } from 'nuqs' import { getUpgradeCardCta, type PlanTier, type UpgradeCardId } from '@/lib/billing/client' import { ANNUAL_DISCOUNT_RATE, CREDIT_TIERS } from '@/lib/billing/constants' +import { DEMO_HREF, SIGNUP_HREF } from '@/app/(landing)/constants' import { PricingCard, type PricingCardCta, @@ -18,14 +19,12 @@ import { /** * A public visitor has no subscription, so each card's canonical label and - * variant resolves against the `free` tier. On this page every CTA funnels to - * sign-up regardless of plan. + * variant resolves against the `free` tier. On this page every self-serve CTA + * funnels to sign-up regardless of plan; the enterprise CTA routes to the + * demo-request form instead. */ const VISITOR_TIER: PlanTier = 'free' -/** Every CTA on the public pricing page funnels logged-out visitors to sign-up. */ -const SIGNUP_HREF = '/signup' - /** This section's rows render on the public cards without their group header. */ const HEADERLESS_SECTION_TITLE = 'Credits & pricing' @@ -52,13 +51,27 @@ function sectionsForColumn(col: number): PricingCardSection[] { })) } +/** The four card columns (Free, Pro, Max, Enterprise) transposed once at module load - the source data is static, so this never needs to be redone per render. */ +const SECTIONS_BY_COLUMN = [0, 1, 2, 3].map(sectionsForColumn) + +/** Round a dollar amount down to the annual-billing discounted price. */ +function annualPrice(dollars: number): number { + return Math.round(dollars * (1 - ANNUAL_DISCOUNT_RATE)) +} + /** - * Resolve a card's canonical label and variant from the free-tier matrix; the - * CTA always funnels logged-out visitors to sign-up. + * Resolve a card's canonical label and variant from the free-tier matrix. A + * `sales` intent ("Talk to sales") routes to the demo-request form, matching + * every other "Contact sales" CTA on the landing site; every other intent + * funnels logged-out visitors to sign-up. */ function resolveCta(card: UpgradeCardId): PricingCardCta { const cta = getUpgradeCardCta(VISITOR_TIER, card) - return { label: cta.label, variant: cta.variant, href: SIGNUP_HREF } + return { + label: cta.label, + variant: cta.variant, + href: cta.intent === 'sales' ? DEMO_HREF : SIGNUP_HREF, + } } const FREE_CTA: PricingCardCta = { @@ -86,12 +99,8 @@ export function PricingPlans({ heading }: PricingPlansProps) { const setIsAnnual = (next: boolean) => setParams({ billing: next ? 'annual' : 'monthly' }) const discountPct = Math.round(ANNUAL_DISCOUNT_RATE * 100) - const proPrice = isAnnual - ? Math.round(CREDIT_TIERS[0].dollars * (1 - ANNUAL_DISCOUNT_RATE)) - : CREDIT_TIERS[0].dollars - const maxPrice = isAnnual - ? Math.round(CREDIT_TIERS[1].dollars * (1 - ANNUAL_DISCOUNT_RATE)) - : CREDIT_TIERS[1].dollars + const proPrice = isAnnual ? annualPrice(CREDIT_TIERS[0].dollars) : CREDIT_TIERS[0].dollars + const maxPrice = isAnnual ? annualPrice(CREDIT_TIERS[1].dollars) : CREDIT_TIERS[1].dollars const priceSubtext = isAnnual ? 'per user/month, billed annually' : 'per user/month, billed monthly' @@ -114,7 +123,7 @@ export function PricingPlans({ heading }: PricingPlansProps) { price='$0' priceSubtext='Free forever' cta={FREE_CTA} - sections={sectionsForColumn(0)} + sections={SECTIONS_BY_COLUMN[0]} />
From e2e29eed305f5e53906f09a0901881ddd3d80c20 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 14:14:11 -0700 Subject: [PATCH 11/23] fix(api): bound request-body reads on speech/knowledge-chunks/help routes (#5601) * fix(api): bound request-body reads on speech/knowledge-chunks/help routes Replace unbounded request.json()/formData() reads with the existing size-limited helpers, and move auth ahead of the body read on the knowledge chunks route so unauthenticated callers can't force a large allocation before being rejected. * fix(knowledge): reject non-string workflowId instead of silently skipping authorization A truthy non-string workflowId previously fell through the type guard and skipped the workflow-scoped write authorization entirely. Validate the type explicitly and fail closed with a 400 instead. --- apps/sim/app/api/help/route.ts | 26 ++++++++++++++++++- .../documents/[documentId]/chunks/route.ts | 12 ++++++--- apps/sim/app/api/speech/token/route.test.ts | 9 +++++++ apps/sim/app/api/speech/token/route.ts | 13 ++++++++-- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/apps/sim/app/api/help/route.ts b/apps/sim/app/api/help/route.ts index 6fe478fe4b4..3c10f68f4d4 100644 --- a/apps/sim/app/api/help/route.ts +++ b/apps/sim/app/api/help/route.ts @@ -5,12 +5,26 @@ import { helpFormBodySchema } from '@/lib/api/contracts/common' import { validationErrorResponse } from '@/lib/api/server' import { getSession } from '@/lib/auth' import { generateRequestId } from '@/lib/core/utils/request' +import { + isPayloadSizeLimitError, + MAX_MULTIPART_OVERHEAD_BYTES, + readFormDataWithLimit, +} from '@/lib/core/utils/stream-limits' import { withRouteHandler } from '@/lib/core/utils/with-route-handler' import { sendEmail } from '@/lib/messaging/email/mailer' import { getFromEmailAddress, getHelpEmailAddress } from '@/lib/messaging/email/utils' +import { MAX_WORKSPACE_FORMDATA_FILE_SIZE } from '@/lib/uploads/shared/types' const logger = createLogger('HelpAPI') +/** + * The form can carry several image attachments with no server-side count + * cap, so this reuses the repo's largest existing per-request form-data + * bound (see files/upload route) rather than an arbitrary smaller limit + * that could reject a legitimate multi-image submission. + */ +const MAX_HELP_FORM_BYTES = MAX_WORKSPACE_FORMDATA_FILE_SIZE + MAX_MULTIPART_OVERHEAD_BYTES + export const POST = withRouteHandler(async (req: NextRequest) => { const requestId = generateRequestId() @@ -23,7 +37,10 @@ export const POST = withRouteHandler(async (req: NextRequest) => { const email = session.user.email - const formData = await req.formData() + const formData = await readFormDataWithLimit(req, { + maxBytes: MAX_HELP_FORM_BYTES, + label: 'Help request form data', + }) const subject = formData.get('subject') as string const message = formData.get('message') as string @@ -128,6 +145,13 @@ ${message} { status: 200 } ) } catch (error) { + if (isPayloadSizeLimitError(error)) { + logger.warn(`[${requestId}] Help request form data too large`, { message: error.message }) + return NextResponse.json( + { error: `Request body exceeds the maximum allowed size of ${MAX_HELP_FORM_BYTES} bytes` }, + { status: 413 } + ) + } if (error instanceof Error && error.message.includes('not configured')) { logger.error(`[${requestId}] Email service configuration error`, error) return NextResponse.json( diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts index 059abee2fb6..75d9df48173 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts @@ -7,7 +7,7 @@ import { createChunkBodySchema, listKnowledgeChunksQuerySchema, } from '@/lib/api/contracts/knowledge' -import { isZodError, parseRequest } from '@/lib/api/server' +import { isZodError, parseJsonBody, parseRequest } from '@/lib/api/server' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' import { generateRequestId } from '@/lib/core/utils/request' import { withRouteHandler } from '@/lib/core/utils/with-route-handler' @@ -103,9 +103,6 @@ export const POST = withRouteHandler( const { id: knowledgeBaseId, documentId } = await params try { - const body = await req.json() - const { workflowId, ...searchParams } = body - const auth = await checkSessionOrInternalAuth(req, { requireWorkflowId: false }) if (!auth.success || !auth.userId) { logger.warn(`[${requestId}] Authentication failed: ${auth.error || 'Unauthorized'}`) @@ -113,7 +110,14 @@ export const POST = withRouteHandler( } const userId = auth.userId + const parsedBody = await parseJsonBody(req) + if (!parsedBody.success) return parsedBody.response + const { workflowId, ...searchParams } = parsedBody.data as Record + if (workflowId) { + if (typeof workflowId !== 'string') { + return NextResponse.json({ error: 'workflowId must be a string' }, { status: 400 }) + } const authorization = await authorizeWorkflowByWorkspacePermission({ workflowId, userId, diff --git a/apps/sim/app/api/speech/token/route.test.ts b/apps/sim/app/api/speech/token/route.test.ts index 8c00a1c7787..a555948c9d9 100644 --- a/apps/sim/app/api/speech/token/route.test.ts +++ b/apps/sim/app/api/speech/token/route.test.ts @@ -138,4 +138,13 @@ describe('POST /api/speech/token — usage attribution', () => { workspaceId: 'ws-1', }) }) + + it('rejects an oversized body before any auth/billing work runs', async () => { + const oversizedBody = { chatId: 'x'.repeat(64 * 1024) } + const res = await POST(createMockRequest('POST', oversizedBody)) + + expect(res.status).toBe(413) + expect(mockGetSession).not.toHaveBeenCalled() + expect(mockRecordUsage).not.toHaveBeenCalled() + }) }) diff --git a/apps/sim/app/api/speech/token/route.ts b/apps/sim/app/api/speech/token/route.ts index 3ccb721366f..47a63b741dc 100644 --- a/apps/sim/app/api/speech/token/route.ts +++ b/apps/sim/app/api/speech/token/route.ts @@ -6,6 +6,7 @@ import { getErrorMessage } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { speechTokenBodySchema } from '@/lib/api/contracts/media/speech' +import { parseOptionalJsonBody } from '@/lib/api/server' import { getSession } from '@/lib/auth' import { checkActorUsageLimits } from '@/lib/billing/calculations/usage-monitor' import { recordUsage } from '@/lib/billing/core/usage-log' @@ -34,6 +35,13 @@ const STT_TOKEN_RATE_LIMIT = { refillIntervalMs: 72 * 1000, } as const +/** + * This body only ever carries an optional chatId/workspaceId string, so a + * tight cap keeps an unauthenticated caller from forcing a large in-memory + * allocation before the auth checks below run. + */ +const MAX_SPEECH_TOKEN_BODY_BYTES = 16 * 1024 + function hashVoiceToken(token: string): string { return createHash('sha256').update(token).digest('hex') } @@ -87,8 +95,9 @@ async function validateChatAuth( export const POST = withRouteHandler(async (request: NextRequest) => { try { - const rawBody = await request.json().catch(() => ({})) - const body = speechTokenBodySchema.safeParse(rawBody) + const parsedBody = await parseOptionalJsonBody(request, MAX_SPEECH_TOKEN_BODY_BYTES) + if (!parsedBody.success) return parsedBody.response + const body = speechTokenBodySchema.safeParse(parsedBody.data ?? {}) const chatId = body.success && typeof body.data.chatId === 'string' ? body.data.chatId : undefined From b73116226add3fed8b29a86b70d688398776985b Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 14:14:42 -0700 Subject: [PATCH 12/23] fix(file-viewer): sanitize docx hyperlink hrefs to block javascript: XSS (#5599) Sanitize anchor hrefs rendered by docx-preview after render, stripping any scheme outside http/https/mailto (same allowlist already used by the PPTX renderer). Covers both the workspace file viewer and the unauthenticated public share page, which reuse the same component. --- .../components/file-viewer/docx-preview.tsx | 2 + apps/sim/lib/core/security/url-safety.test.ts | 61 +++++++++++++++++++ apps/sim/lib/core/security/url-safety.ts | 37 +++++++++++ apps/sim/lib/pptx-renderer/core/viewer.ts | 2 +- .../pptx-renderer/renderer/shape-renderer.ts | 2 +- .../pptx-renderer/renderer/text-renderer.ts | 2 +- .../pptx-renderer/utils/url-safety.test.ts | 16 ----- .../sim/lib/pptx-renderer/utils/url-safety.ts | 17 ------ 8 files changed, 103 insertions(+), 36 deletions(-) create mode 100644 apps/sim/lib/core/security/url-safety.test.ts create mode 100644 apps/sim/lib/core/security/url-safety.ts delete mode 100644 apps/sim/lib/pptx-renderer/utils/url-safety.test.ts delete mode 100644 apps/sim/lib/pptx-renderer/utils/url-safety.ts diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/docx-preview.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/docx-preview.tsx index 6f1e8f75df0..3ff4df51c2c 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/docx-preview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/docx-preview.tsx @@ -4,6 +4,7 @@ import { memo, useCallback, useEffect, useRef, useState } from 'react' import { cn } from '@sim/emcn' import { createLogger } from '@sim/logger' import { toError } from '@sim/utils/errors' +import { sanitizeRenderedHyperlinks } from '@/lib/core/security/url-safety' import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace' import { PREVIEW_LOADING_OVERLAY, PreviewError, resolvePreviewError } from './preview-shared' import { PreviewToolbar } from './preview-toolbar' @@ -209,6 +210,7 @@ export const DocxPreview = memo(function DocxPreview({ ignoreHeight: false, }) if (!cancelled && containerRef.current) { + sanitizeRenderedHyperlinks(containerRef.current) applyPostRenderStyling() setHasRenderedPreview(true) setDocumentRenderVersion((version) => version + 1) diff --git a/apps/sim/lib/core/security/url-safety.test.ts b/apps/sim/lib/core/security/url-safety.test.ts new file mode 100644 index 00000000000..122dc22b8ec --- /dev/null +++ b/apps/sim/lib/core/security/url-safety.test.ts @@ -0,0 +1,61 @@ +/** + * @vitest-environment jsdom + */ +import { describe, expect, it } from 'vitest' +import { isAllowedExternalUrl, sanitizeRenderedHyperlinks } from '@/lib/core/security/url-safety' + +describe('isAllowedExternalUrl', () => { + it('allows http, https, and mailto URLs', () => { + expect(isAllowedExternalUrl('https://example.com/deck')).toBe(true) + expect(isAllowedExternalUrl('http://example.com/deck')).toBe(true) + expect(isAllowedExternalUrl('mailto:support@example.com')).toBe(true) + }) + + it('rejects scriptable, data, and relative URLs', () => { + expect(isAllowedExternalUrl('javascript:alert(1)')).toBe(false) + expect(isAllowedExternalUrl('data:text/html,')).toBe(false) + expect(isAllowedExternalUrl('/workspace/files')).toBe(false) + }) +}) + +describe('sanitizeRenderedHyperlinks', () => { + function containerWithAnchor(href: string): HTMLDivElement { + const container = document.createElement('div') + const anchor = document.createElement('a') + anchor.setAttribute('href', href) + anchor.textContent = 'link' + container.appendChild(anchor) + return container + } + + it('strips javascript: hrefs from a docx-preview hyperlink rendering', () => { + const container = containerWithAnchor( + "javascript:document.body.setAttribute('data-xss-fired','1')" + ) + sanitizeRenderedHyperlinks(container) + const anchor = container.querySelector('a') + expect(anchor?.hasAttribute('href')).toBe(false) + }) + + it('strips data: and vbscript: hrefs', () => { + for (const href of ['data:text/html,', 'vbscript:msgbox(1)']) { + const container = containerWithAnchor(href) + sanitizeRenderedHyperlinks(container) + expect(container.querySelector('a')?.hasAttribute('href')).toBe(false) + } + }) + + it('preserves same-document bookmark anchors', () => { + const container = containerWithAnchor('#section-2') + sanitizeRenderedHyperlinks(container) + expect(container.querySelector('a')?.getAttribute('href')).toBe('#section-2') + }) + + it('keeps allowed external links and adds rel=noopener noreferrer', () => { + const container = containerWithAnchor('https://example.com/report') + sanitizeRenderedHyperlinks(container) + const anchor = container.querySelector('a') + expect(anchor?.getAttribute('href')).toBe('https://example.com/report') + expect(anchor?.getAttribute('rel')).toBe('noopener noreferrer') + }) +}) diff --git a/apps/sim/lib/core/security/url-safety.ts b/apps/sim/lib/core/security/url-safety.ts new file mode 100644 index 00000000000..694ad516310 --- /dev/null +++ b/apps/sim/lib/core/security/url-safety.ts @@ -0,0 +1,37 @@ +/** + * URL safety utilities for external hyperlinks/media in untrusted document content + * (PPTX, DOCX, and other previews rendered into the app origin). + */ + +const ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:']) + +/** + * Returns true only for absolute URLs with an allowed protocol. + */ +export function isAllowedExternalUrl(url: string): boolean { + try { + const parsed = new URL(url) + return ALLOWED_PROTOCOLS.has(parsed.protocol.toLowerCase()) + } catch { + return false + } +} + +/** + * Neutralizes anchors rendered from untrusted document content (e.g. docx-preview, + * which copies an external-relationship `Target` straight into `href` with no scheme + * check). Same-document fragment links (`#bookmark`) are left intact; anything else + * that isn't http/https/mailto has its `href` stripped so the anchor can't navigate. + * Surviving external links get `rel="noopener noreferrer"` to block tabnabbing. + */ +export function sanitizeRenderedHyperlinks(root: ParentNode): void { + for (const anchor of root.querySelectorAll('a[href]')) { + const href = anchor.getAttribute('href') ?? '' + if (href.startsWith('#')) continue + if (isAllowedExternalUrl(href)) { + anchor.setAttribute('rel', 'noopener noreferrer') + continue + } + anchor.removeAttribute('href') + } +} diff --git a/apps/sim/lib/pptx-renderer/core/viewer.ts b/apps/sim/lib/pptx-renderer/core/viewer.ts index efdb5ac5e02..3434a8ba225 100644 --- a/apps/sim/lib/pptx-renderer/core/viewer.ts +++ b/apps/sim/lib/pptx-renderer/core/viewer.ts @@ -1,11 +1,11 @@ import { getErrorMessage } from '@sim/utils/errors' import type { ECharts } from 'echarts' +import { isAllowedExternalUrl } from '@/lib/core/security/url-safety' import { buildPresentation, type PresentationData } from '../model/presentation' import type { ZipParseLimits } from '../parser/zip-parser' import { parseZip } from '../parser/zip-parser' import type { SlideHandle } from '../renderer/slide-renderer' import { renderSlide as renderSlideInternal } from '../renderer/slide-renderer' -import { isAllowedExternalUrl } from '../utils/url-safety' export type { SlideHandle } from '../renderer/slide-renderer' diff --git a/apps/sim/lib/pptx-renderer/renderer/shape-renderer.ts b/apps/sim/lib/pptx-renderer/renderer/shape-renderer.ts index 58ed7f9c70d..db73643b419 100644 --- a/apps/sim/lib/pptx-renderer/renderer/shape-renderer.ts +++ b/apps/sim/lib/pptx-renderer/renderer/shape-renderer.ts @@ -15,6 +15,7 @@ function hasVisibleText(textBody: TextBody): boolean { return false } +import { isAllowedExternalUrl } from '@/lib/core/security/url-safety' import { emuToPx } from '../parser/units' import type { SafeXmlNode } from '../parser/xml-parser' import { renderCustomGeometry } from '../shapes/custom-geometry' @@ -26,7 +27,6 @@ import { } from '../shapes/presets' import { applyTint, hexToRgb, rgbToHex } from '../utils/color' import { getOrCreateBlobUrl, resolveMediaPath } from '../utils/media' -import { isAllowedExternalUrl } from '../utils/url-safety' import { resolveColor, resolveColorToCss, diff --git a/apps/sim/lib/pptx-renderer/renderer/text-renderer.ts b/apps/sim/lib/pptx-renderer/renderer/text-renderer.ts index e66a802bfcd..42679dcf9e3 100644 --- a/apps/sim/lib/pptx-renderer/renderer/text-renderer.ts +++ b/apps/sim/lib/pptx-renderer/renderer/text-renderer.ts @@ -4,11 +4,11 @@ */ import { hexToRgb, toCssColor } from '@/lib/colors' +import { isAllowedExternalUrl } from '@/lib/core/security/url-safety' import type { PlaceholderInfo } from '../model/nodes/base-node' import type { TextBody } from '../model/nodes/shape-node' import { angleToDeg, emuToPx, pctToDecimal } from '../parser/units' import { SafeXmlNode } from '../parser/xml-parser' -import { isAllowedExternalUrl } from '../utils/url-safety' import type { RenderContext } from './render-context' import { resolveColor, resolveColorToCss } from './style-resolver' diff --git a/apps/sim/lib/pptx-renderer/utils/url-safety.test.ts b/apps/sim/lib/pptx-renderer/utils/url-safety.test.ts deleted file mode 100644 index 793ae18ea5b..00000000000 --- a/apps/sim/lib/pptx-renderer/utils/url-safety.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { describe, expect, it } from 'vitest' -import { isAllowedExternalUrl } from '@/lib/pptx-renderer/utils/url-safety' - -describe('isAllowedExternalUrl', () => { - it('allows http, https, and mailto URLs', () => { - expect(isAllowedExternalUrl('https://example.com/deck')).toBe(true) - expect(isAllowedExternalUrl('http://example.com/deck')).toBe(true) - expect(isAllowedExternalUrl('mailto:support@example.com')).toBe(true) - }) - - it('rejects scriptable, data, and relative URLs', () => { - expect(isAllowedExternalUrl('javascript:alert(1)')).toBe(false) - expect(isAllowedExternalUrl('data:text/html,')).toBe(false) - expect(isAllowedExternalUrl('/workspace/files')).toBe(false) - }) -}) diff --git a/apps/sim/lib/pptx-renderer/utils/url-safety.ts b/apps/sim/lib/pptx-renderer/utils/url-safety.ts deleted file mode 100644 index c3e8f42b2de..00000000000 --- a/apps/sim/lib/pptx-renderer/utils/url-safety.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * URL safety utilities for external hyperlinks/media in untrusted PPTX content. - */ - -const ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:']) - -/** - * Returns true only for absolute URLs with an allowed protocol. - */ -export function isAllowedExternalUrl(url: string): boolean { - try { - const parsed = new URL(url) - return ALLOWED_PROTOCOLS.has(parsed.protocol.toLowerCase()) - } catch { - return false - } -} From eb123330327d901811023ebe617396839b05ff71 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 14:15:07 -0700 Subject: [PATCH 13/23] fix(chat-otp): re-check authType before minting deployment auth cookie (#5600) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PUT verify no longer trusts a stale authType at cookie-mint time — it now re-checks the chat is still email-auth before issuing the cookie, matching the existing POST guard and the public-file OTP route. --- .../api/chat/[identifier]/otp/route.test.ts | 37 +++++++++++++++++++ .../app/api/chat/[identifier]/otp/route.ts | 4 ++ 2 files changed, 41 insertions(+) diff --git a/apps/sim/app/api/chat/[identifier]/otp/route.test.ts b/apps/sim/app/api/chat/[identifier]/otp/route.test.ts index a860df8eb28..6d32eb61f6b 100644 --- a/apps/sim/app/api/chat/[identifier]/otp/route.test.ts +++ b/apps/sim/app/api/chat/[identifier]/otp/route.test.ts @@ -529,6 +529,43 @@ describe('Chat OTP API Route', () => { }) }) + describe('PUT - Verify OTP (authType re-check)', () => { + beforeEach(() => { + mockGetStorageMethod.mockReturnValue('redis') + mockRedisGet.mockResolvedValue(`${mockOTP}:0`) + }) + + it('rejects verification when the chat has switched away from email auth', async () => { + mockDbSelect.mockImplementationOnce(() => ({ + from: vi.fn().mockReturnValue({ + where: vi.fn().mockReturnValue({ + limit: vi.fn().mockResolvedValue([ + { + id: mockChatId, + authType: 'password', + password: 'encrypted-password', + }, + ]), + }), + }), + })) + + const request = new NextRequest('http://localhost:3000/api/chat/test/otp', { + method: 'PUT', + body: JSON.stringify({ email: mockEmail, otp: mockOTP }), + }) + + await PUT(request, { params: Promise.resolve({ identifier: mockIdentifier }) }) + + expect(mockCreateErrorResponse).toHaveBeenCalledWith( + 'This chat does not use email authentication', + 400 + ) + expect(mockRedisGet).not.toHaveBeenCalled() + expect(mockSetChatAuthCookie).not.toHaveBeenCalled() + }) + }) + describe('PUT - Verify OTP (Database path)', () => { beforeEach(() => { mockGetStorageMethod.mockReturnValue('database') diff --git a/apps/sim/app/api/chat/[identifier]/otp/route.ts b/apps/sim/app/api/chat/[identifier]/otp/route.ts index aeb1b69f450..248fcfa84ab 100644 --- a/apps/sim/app/api/chat/[identifier]/otp/route.ts +++ b/apps/sim/app/api/chat/[identifier]/otp/route.ts @@ -174,6 +174,10 @@ export const PUT = withRouteHandler( const deployment = deploymentResult[0] + if (deployment.authType !== 'email') { + return createErrorResponse('This chat does not use email authentication', 400) + } + const storedValue = await getOTP('chat', deployment.id, email) if (!storedValue) { return createErrorResponse('No verification code found, request a new one', 400) From 67a2f00266461c5ddd4987fbff47ca5b415dc4f5 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 14:15:57 -0700 Subject: [PATCH 14/23] perf(search): cap Cmd-K result groups so typing isn't blocked by reshuffle (#5597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf(search): cap Cmd-K result groups so typing isn't blocked by reshuffle Every result group re-rendered its full match set on each keystroke — the catalog alone is 1,000+ tool operations, plus all workflows/files in large workspaces — so the deferred re-render that reshuffles results stalls the input and drops the next character. Add a per-group cap (filterAndCap, MAX_RESULTS_PER_GROUP=50) applied to every variable-size group. Results are already score-sorted, so the cap only trims the low-relevance tail while keeping the DOM and per-keystroke reconciliation bounded. No UX changes. * perf(search): scope the result cap to active queries, never the browse list Keep the empty state byte-for-byte identical to before — capping applies only to the top-ranked matches of an active query (the reshuffling per-keystroke render that stalls input), never to the full browsable list. No browsable result a user could otherwise see is hidden. * fix(search): rank blocks/tools by name so exact name matches win Blocks and tools were ranked against their full searchValue (name + type + every command-searchable option label), so an exact name match couldn't earn the exact-match bonus and paid a length penalty inflated by option text — e.g. "Agent" lost to "Pi Coding Agent" for the query "agent". Rank by name first via a new optional secondary accessor on filterAndSort/filterAndCap, falling back to searchValue only when the name doesn't match, so an exact name match always wins while a block stays findable by an option label. * fix(search): treat whitespace-only queries as browse A whitespace-only query (e.g. a single space) was truthy, so it both filtered (a space matches the spaces in multi-word labels) and capped large groups to 50 while the palette looked empty. Trim the query at the source in filterAndSort so every caller treats whitespace-only as browse, and decide the cap on the trimmed query — whitespace-only input now returns the full, unfiltered browse state. * fix(search): keep integrations catalog hidden on whitespace-only input The filteredIntegrations guard used the raw deferredSearch, so a whitespace-only value passed it while filterAndCap trimmed the same value to browse and returned the full catalog. Guard on deferredSearch.trim() to match the trimmed-emptiness semantics — the catalog stays hidden until the user types something meaningful. --- .../components/search-modal/search-modal.tsx | 47 +++++++----- .../components/search-modal/utils.test.ts | 76 ++++++++++++++++++- .../sidebar/components/search-modal/utils.ts | 58 ++++++++++++-- 3 files changed, 156 insertions(+), 25 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx index fc60cd431ba..beac3a100cb 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx @@ -70,7 +70,7 @@ import type { WorkflowItem, WorkspaceItem, } from './utils' -import { filterAndSort } from './utils' +import { filterAndCap, filterAndSort } from './utils' const logger = createLogger('SearchModal') @@ -575,60 +575,69 @@ export function SearchModal({ }, [actions, isOnWorkflowPage, isOnIntegrationsPage, deferredSearch]) /** - * Ranking matches against clean, human-meaningful text only (names, types, - * aliases, folder paths) — never the structural `-`/uuid tokens used - * for cmdk row identity. Those tokens carry letters (e.g. "block", "tool") that - * would otherwise let short fuzzy queries scatter-match unrelated items. + * Blocks and tools rank by name first, with `searchValue` (type + option + * labels) as a lower-tier fallback, so an exact name match wins while a block + * stays findable by an option label. */ const filteredBlocks = useMemo(() => { if (!isOnWorkflowPage) return [] - return filterAndSort(blocks, (b) => b.searchValue ?? b.name, deferredSearch) + return filterAndCap( + blocks, + (b) => b.name, + deferredSearch, + (b) => b.searchValue + ) }, [isOnWorkflowPage, blocks, deferredSearch]) const filteredTools = useMemo(() => { if (!isOnWorkflowPage) return [] - return filterAndSort(tools, (t) => t.searchValue ?? t.name, deferredSearch) + return filterAndCap( + tools, + (t) => t.name, + deferredSearch, + (t) => t.searchValue + ) }, [isOnWorkflowPage, tools, deferredSearch]) const filteredTriggers = useMemo(() => { if (!isOnWorkflowPage) return [] - return filterAndSort(triggers, (t) => `${t.name} ${t.id}`, deferredSearch) + return filterAndCap(triggers, (t) => `${t.name} ${t.id}`, deferredSearch) }, [isOnWorkflowPage, triggers, deferredSearch]) const filteredToolOps = useMemo(() => { if (!isOnWorkflowPage) return [] - return filterAndSort(toolOperations, (op) => op.searchValue, deferredSearch) + return filterAndCap(toolOperations, (op) => op.searchValue, deferredSearch) }, [isOnWorkflowPage, toolOperations, deferredSearch]) const filteredDocs = useMemo(() => { if (!isOnWorkflowPage) return [] - return filterAndSort(docs, (d) => `${d.name} docs documentation`, deferredSearch) + return filterAndCap(docs, (d) => `${d.name} docs documentation`, deferredSearch) }, [isOnWorkflowPage, docs, deferredSearch]) const filteredTables = useMemo( - () => filterAndSort(tables, (t) => t.name, deferredSearch), + () => filterAndCap(tables, (t) => t.name, deferredSearch), [tables, deferredSearch] ) const filteredFiles = useMemo( - () => filterAndSort(files, (f) => `${f.name} ${f.folderPath?.join(' ') ?? ''}`, deferredSearch), + () => filterAndCap(files, (f) => `${f.name} ${f.folderPath?.join(' ') ?? ''}`, deferredSearch), [files, deferredSearch] ) const filteredKnowledgeBases = useMemo( - () => filterAndSort(knowledgeBases, (kb) => kb.name, deferredSearch), + () => filterAndCap(knowledgeBases, (kb) => kb.name, deferredSearch), [knowledgeBases, deferredSearch] ) const filteredWorkflows = useMemo( () => - filterAndSort(workflows, (w) => `${w.name} ${w.folderPath?.join(' ') ?? ''}`, deferredSearch), + filterAndCap(workflows, (w) => `${w.name} ${w.folderPath?.join(' ') ?? ''}`, deferredSearch), [workflows, deferredSearch] ) const filteredChats = useMemo( - () => filterAndSort(chats, (t) => t.name, deferredSearch), + () => filterAndCap(chats, (t) => t.name, deferredSearch), [chats, deferredSearch] ) const filteredWorkspaces = useMemo( - () => filterAndSort(workspaces, (w) => w.name, deferredSearch), + () => filterAndCap(workspaces, (w) => w.name, deferredSearch), [workspaces, deferredSearch] ) const filteredPages = useMemo( @@ -639,13 +648,13 @@ export function SearchModal({ /** Connected accounts: visible on the integrations page even with empty input. */ const filteredConnectedAccounts = useMemo(() => { if (!isOnIntegrationsPage) return [] - return filterAndSort(connectedAccounts, (a) => a.name, deferredSearch) + return filterAndCap(connectedAccounts, (a) => a.name, deferredSearch) }, [isOnIntegrationsPage, connectedAccounts, deferredSearch]) /** Catalog integrations: only shown once the user has typed something. */ const filteredIntegrations = useMemo(() => { - if (!isOnIntegrationsPage || !deferredSearch) return [] - return filterAndSort(integrations, (i) => i.name, deferredSearch) + if (!isOnIntegrationsPage || !deferredSearch.trim()) return [] + return filterAndCap(integrations, (i) => i.name, deferredSearch) }, [isOnIntegrationsPage, deferredSearch, integrations]) if (!mounted) return null diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.test.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.test.ts index eb9175abd28..a82b79fd5f9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.test.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.test.ts @@ -2,7 +2,7 @@ * @vitest-environment node */ import { describe, expect, it } from 'vitest' -import { filterAndSort, fuzzyMatch } from './utils' +import { filterAndCap, filterAndSort, fuzzyMatch, MAX_RESULTS_PER_GROUP } from './utils' /** * The matcher that shipped before fuzzy matching was introduced. Re-implemented @@ -241,3 +241,77 @@ describe('fuzzyMatch — positions for highlighting', () => { expect(result.matched).toBe(true) }) }) + +describe('filterAndSort — name ranked above secondary text', () => { + interface Item { + name: string + searchValue: string + } + const toName = (i: Item) => i.name + const toExtra = (i: Item) => i.searchValue + + it('ranks an exact name match above a substring buried in another item’s option text', () => { + const items: Item[] = [ + // Matches "agent" only inside a long secondary string (its model catalog). + { name: 'Pi Coding Agent', searchValue: `Pi Coding Agent pi ${'model-x '.repeat(60)}` }, + // Exact name match, but an even longer secondary string. + { name: 'Agent', searchValue: `Agent agent ${'claude-sonnet gpt-4o '.repeat(60)}` }, + ] + const sorted = filterAndSort(items, toName, 'agent', toExtra) + expect(sorted[0].name).toBe('Agent') + }) + + it('keeps every name match above every secondary-only match', () => { + const items: Item[] = [ + { name: 'Zeta', searchValue: 'Zeta agent agent agent' }, // strong secondary hit, no name hit + { name: 'Agent', searchValue: 'Agent agent' }, // name hit + ] + const sorted = filterAndSort(items, toName, 'agent', toExtra) + expect(sorted[0].name).toBe('Agent') + }) + + it('still surfaces an item matched only by its secondary text', () => { + const items: Item[] = [{ name: 'Agent', searchValue: 'Agent agent claude-sonnet gpt-4o' }] + expect(filterAndSort(items, toName, 'gpt-4o', toExtra)).toHaveLength(1) + }) + + it('is byte-identical to single-field ranking when no secondary accessor is given', () => { + const items = ['Slack message', 'Send message to Slack'] + expect(filterAndSort(items, (s) => s, 'slack')).toEqual( + filterAndSort(items, (s) => s, 'slack', undefined) + ) + }) +}) + +describe('filterAndCap', () => { + const id = (s: string) => s + + it('caps an active search to MAX_RESULTS_PER_GROUP', () => { + const items = Array.from({ length: MAX_RESULTS_PER_GROUP + 25 }, (_, i) => `item ${i}`) + expect(filterAndCap(items, id, 'item')).toHaveLength(MAX_RESULTS_PER_GROUP) + }) + + it('never caps the empty (browse) state, even above the cap', () => { + const items = Array.from({ length: MAX_RESULTS_PER_GROUP + 25 }, (_, i) => `item ${i}`) + const result = filterAndCap(items, id, '') + expect(result).toHaveLength(items.length) + expect(result).toBe(items) + }) + + it('treats whitespace-only input as browse: unfiltered and uncapped', () => { + const items = Array.from({ length: MAX_RESULTS_PER_GROUP + 25 }, (_, i) => `item ${i}`) + const result = filterAndCap(items, id, ' ') + expect(result).toBe(items) + }) + + it('returns every match untrimmed when under the cap', () => { + const items = ['Slack', 'Slate', 'Slalom'] + expect(filterAndCap(items, id, 'sl')).toHaveLength(3) + }) + + it('caps to the top-ranked matches, preserving filterAndSort order', () => { + const items = Array.from({ length: MAX_RESULTS_PER_GROUP + 5 }, (_, i) => `item ${i}`) + const capped = filterAndCap(items, id, 'item') + expect(capped).toEqual(filterAndSort(items, id, 'item').slice(0, MAX_RESULTS_PER_GROUP)) + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts index 7970294e93f..a9f3fe9dbbe 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts @@ -243,17 +243,65 @@ export function fuzzyMatch(text: string, query: string): FuzzyResult { return tokenFallback(lowerText, lowerQuery) } +/** Rank offset that lifts every name match above any secondary-text match. */ +const NAME_MATCH_TIER = 1_000_000 + /** - * Filters items whose value fuzzy-matches the search, ordered by descending - * score. Returns the input untouched when the search is empty. + * Ranks an item by its name first, falling back to secondary text (ids, aliases, + * option labels) only when the name doesn't match — a name match always wins, so + * an exact name hit isn't diluted by a long secondary string ("Agent" beats + * "Pi Coding Agent" for the query "agent"). */ -export function filterAndSort(items: T[], toValue: (item: T) => string, search: string): T[] { - if (!search) return items +function scoreItem(name: string, extra: string | undefined, search: string): FuzzyResult { + const byName = fuzzyMatch(name, search) + if (!extra) return byName + if (byName.matched) { + return { matched: true, score: byName.score + NAME_MATCH_TIER, positions: byName.positions } + } + const byExtra = fuzzyMatch(extra, search) + return byExtra.matched ? byExtra : NO_MATCH +} + +/** + * Filters and ranks items by fuzzy match, highest score first; returns the input + * unchanged when the search is empty or whitespace-only. Pass `toExtra` to rank + * the name first and fall back to secondary text. + */ +export function filterAndSort( + items: T[], + toValue: (item: T) => string, + search: string, + toExtra?: (item: T) => string | undefined +): T[] { + const query = search.trim() + if (!query) return items const scored: Array<{ item: T; score: number }> = [] for (const item of items) { - const { matched, score } = fuzzyMatch(toValue(item), search) + const { matched, score } = scoreItem(toValue(item), toExtra?.(item), query) if (matched) scored.push({ item, score }) } scored.sort((a, b) => b.score - a.score) return scored.map((entry) => entry.item) } + +/** + * Max rows rendered per group while searching. Re-rendering an unbounded, + * reshuffling match set every keystroke is what stalls typing; results are + * score-sorted, so the cap only drops the low-relevance tail. + */ +export const MAX_RESULTS_PER_GROUP = 50 + +/** + * {@link filterAndSort} bounded to {@link MAX_RESULTS_PER_GROUP} while searching, + * so the per-keystroke render can't block typing. The empty browse state is + * returned in full. + */ +export function filterAndCap( + items: T[], + toValue: (item: T) => string, + search: string, + toExtra?: (item: T) => string | undefined +): T[] { + const results = filterAndSort(items, toValue, search, toExtra) + return search.trim() ? results.slice(0, MAX_RESULTS_PER_GROUP) : results +} From d165712d54bdf85593e78bb80d774f3330795a6a Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 14:16:14 -0700 Subject: [PATCH 15/23] fix(files-upload): enforce workspace authorization on mothership uploads (#5604) * fix(files-upload): enforce workspace authorization on mothership uploads The mothership context in POST /api/files/upload skipped the workspace permission and storage quota checks that every sibling context enforces, letting a caller write files into a workspace they have no access to. * fix(files-upload): check mothership quota once against the full batch Resolve the mothership permission and quota check once per request (mirroring the existing execution-context pattern) instead of per file: a per-file quota check let a multi-file batch exceed the caller's quota since each file's own size fit even when the combined total did not. Also corrects the missing-workspaceId error message, which named the chat context instead of mothership. --- apps/sim/app/api/files/upload/route.test.ts | 131 ++++++++++++++++++++ apps/sim/app/api/files/upload/route.ts | 40 ++++-- 2 files changed, 164 insertions(+), 7 deletions(-) diff --git a/apps/sim/app/api/files/upload/route.test.ts b/apps/sim/app/api/files/upload/route.test.ts index f6df57eb59d..aa810049034 100644 --- a/apps/sim/app/api/files/upload/route.test.ts +++ b/apps/sim/app/api/files/upload/route.test.ts @@ -24,6 +24,7 @@ const mocks = vi.hoisted(() => { const mockIsUsingCloudStorage = vi.fn() const mockUploadFile = vi.fn() const mockUploadExecutionFile = vi.fn() + const mockCheckStorageQuota = vi.fn() return { mockVerifyFileAccess, @@ -35,6 +36,7 @@ const mocks = vi.hoisted(() => { mockIsUsingCloudStorage, mockUploadFile, mockUploadExecutionFile, + mockCheckStorageQuota, } }) @@ -108,6 +110,10 @@ vi.mock('@/lib/uploads/setup.server', () => ({ UPLOAD_DIR_SERVER: '/tmp/test-uploads', })) +vi.mock('@/lib/billing/storage', () => ({ + checkStorageQuota: mocks.mockCheckStorageQuota, +})) + import { uploadWorkspaceFile } from '@/lib/uploads/contexts/workspace' import { POST } from '@/app/api/files/upload/route' @@ -183,6 +189,12 @@ function setupFileApiMocks( key: 'test-key', path: '/test/path', }) + + mocks.mockCheckStorageQuota.mockResolvedValue({ + allowed: true, + currentUsage: 0, + limit: Number.MAX_SAFE_INTEGER, + }) } describe('File Upload API Route', () => { @@ -640,6 +652,125 @@ describe('File Upload Security Tests', () => { }) }) + describe('Mothership Context Permission Gate', () => { + const postMothershipUpload = async (workspaceId: string | null = 'test-workspace-id') => { + const formData = new FormData() + const file = new File(['test content'], 'test.pdf', { type: 'application/pdf' }) + formData.append('file', file) + formData.append('context', 'mothership') + if (workspaceId !== null) formData.append('workspaceId', workspaceId) + + const req = new Request('http://localhost/api/files/upload', { + method: 'POST', + headers: { 'content-length': '1024' }, + body: formData, + }) + + return POST(req as unknown as NextRequest) + } + + beforeEach(() => { + setupFileApiMocks({ + cloudEnabled: false, + storageProvider: 'local', + }) + }) + + it('rejects mothership uploads without workspaceId', async () => { + const response = await postMothershipUpload(null) + + expect(response.status).toBe(400) + const data = await response.json() + expect(data.message).toContain('workspaceId') + expect(storageServiceMockFns.mockUploadFile).not.toHaveBeenCalled() + }) + + it('rejects mothership uploads for a workspace the caller does not belong to', async () => { + permissionsMockFns.mockGetUserEntityPermissions.mockResolvedValue(null) + + const response = await postMothershipUpload() + + expect(response.status).toBe(403) + const data = await response.json() + expect(data.error).toBe('Write or Admin access required for mothership uploads') + expect(storageServiceMockFns.mockUploadFile).not.toHaveBeenCalled() + }) + + it('rejects mothership uploads for a read-only workspace member', async () => { + permissionsMockFns.mockGetUserEntityPermissions.mockResolvedValue('read') + + const response = await postMothershipUpload() + + expect(response.status).toBe(403) + expect(storageServiceMockFns.mockUploadFile).not.toHaveBeenCalled() + }) + + it('rejects mothership uploads over the caller storage quota', async () => { + permissionsMockFns.mockGetUserEntityPermissions.mockResolvedValue('write') + mocks.mockCheckStorageQuota.mockResolvedValue({ + allowed: false, + currentUsage: 100, + limit: 100, + error: 'Storage limit exceeded. Used: 0.00GB, Limit: 0GB', + }) + + const response = await postMothershipUpload() + + expect(response.status).toBe(413) + const data = await response.json() + expect(data.error).toContain('Storage limit exceeded') + expect(storageServiceMockFns.mockUploadFile).not.toHaveBeenCalled() + }) + + it('allows mothership uploads for a write-permission workspace member', async () => { + permissionsMockFns.mockGetUserEntityPermissions.mockResolvedValue('write') + + const response = await postMothershipUpload() + + expect(response.status).toBe(200) + expect(permissionsMockFns.mockGetUserEntityPermissions).toHaveBeenCalledWith( + 'test-user-id', + 'workspace', + 'test-workspace-id' + ) + expect(storageServiceMockFns.mockUploadFile).toHaveBeenCalled() + }) + + it('allows mothership uploads for an admin-permission workspace member', async () => { + permissionsMockFns.mockGetUserEntityPermissions.mockResolvedValue('admin') + + const response = await postMothershipUpload() + + expect(response.status).toBe(200) + expect(storageServiceMockFns.mockUploadFile).toHaveBeenCalled() + }) + + it('checks quota once against the combined size of a multi-file batch', async () => { + permissionsMockFns.mockGetUserEntityPermissions.mockResolvedValue('write') + + const formData = new FormData() + const fileA = new File(['a'.repeat(10)], 'a.pdf', { type: 'application/pdf' }) + const fileB = new File(['b'.repeat(20)], 'b.pdf', { type: 'application/pdf' }) + formData.append('file', fileA) + formData.append('file', fileB) + formData.append('context', 'mothership') + formData.append('workspaceId', 'test-workspace-id') + + const req = new Request('http://localhost/api/files/upload', { + method: 'POST', + headers: { 'content-length': '1024' }, + body: formData, + }) + + const response = await POST(req as unknown as NextRequest) + + expect(response.status).toBe(200) + expect(mocks.mockCheckStorageQuota).toHaveBeenCalledTimes(1) + expect(mocks.mockCheckStorageQuota).toHaveBeenCalledWith('test-user-id', 30) + expect(permissionsMockFns.mockGetUserEntityPermissions).toHaveBeenCalledTimes(1) + }) + }) + describe('Authentication Requirements', () => { it('should reject uploads without authentication', async () => { authMockFns.mockGetSession.mockResolvedValue(null) diff --git a/apps/sim/app/api/files/upload/route.ts b/apps/sim/app/api/files/upload/route.ts index 64914af8970..ab934a64960 100644 --- a/apps/sim/app/api/files/upload/route.ts +++ b/apps/sim/app/api/files/upload/route.ts @@ -115,6 +115,36 @@ export const POST = withRouteHandler(async (request: NextRequest) => { executionUploadContext = { workspaceId, workflowId, executionId } } + // Mothership context requires the same workspace write/admin permission check, plus a + // storage quota check. Resolve both once per request (not per file) since workspaceId is + // invariant across all files in the upload and quota must account for the full batch size, + // not just one file. + let mothershipWorkspaceId: string | undefined + if (context === 'mothership') { + if (!workspaceId) { + throw new InvalidRequestError('Mothership context requires workspaceId parameter') + } + + const permission = await getUserEntityPermissions(session.user.id, 'workspace', workspaceId) + if (permission !== 'write' && permission !== 'admin') { + return NextResponse.json( + { error: 'Write or Admin access required for mothership uploads' }, + { status: 403 } + ) + } + + const { checkStorageQuota } = await import('@/lib/billing/storage') + const quotaCheck = await checkStorageQuota(session.user.id, totalFileSize) + if (!quotaCheck.allowed) { + return NextResponse.json( + { error: quotaCheck.error || 'Storage limit exceeded' }, + { status: 413 } + ) + } + + mothershipWorkspaceId = workspaceId + } + const uploadResults = [] for (const file of files) { @@ -261,21 +291,17 @@ export const POST = withRouteHandler(async (request: NextRequest) => { } // Handle mothership context (chat-scoped uploads to workspace S3) - if (context === 'mothership') { - if (!workspaceId) { - throw new InvalidRequestError('Chat context requires workspaceId parameter') - } - + if (context === 'mothership' && mothershipWorkspaceId) { logger.info(`Uploading mothership file: ${originalName}`) - const storageKey = generateWorkspaceFileKey(workspaceId, originalName) + const storageKey = generateWorkspaceFileKey(mothershipWorkspaceId, originalName) const metadata: Record = { originalName: originalName, uploadedAt: new Date().toISOString(), purpose: 'mothership', userId: session.user.id, - workspaceId, + workspaceId: mothershipWorkspaceId, } const fileInfo = await storageService.uploadFile({ From 0aa23090e9f1b1b61ecf88e4db1dd51c8d92be22 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 16:56:18 -0700 Subject: [PATCH 16/23] fix(files): unwedge post-stream read-only editor; stop bullet Backspace from destroying the image below (#5608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(rich-markdown-editor): stop Backspace on an empty bullet from destroying the image below it Reported: clearing an empty bullet with an image after it "nuked the bullet point and the image". Reproduced: when the emptied bullet is the doc's first block, removeEmptyWrappedBlock's Selection.near(resolve(start), -1) finds no text position behind it and silently lands a NodeSelection on the FOLLOWING image — so the user's next keystroke is destructive (a second Backspace while clearing deletes the image; typing replaces it). Only-first-block explains why it wouldn't re-repro. The selection left behind is now always a caret: end of the previous textblock first, else a gap cursor at the deletion point when the neighbour is a leaf (typing there inserts a new block instead of replacing the image), else the next textblock. The regression test surfaced two adjacent gap-cursor crashes on Backspace, both reachable on current staging whenever a gap cursor exists (e.g. between two dividers/images, the data-gap-between-leaves state): - our own handler threw RangeError from $from.before(0) on a depth-0 (doc-start) gap cursor - with that guarded by falling through, TipTap's blockquote Backspace handler crashes on the same resolution ($from.node(-1) is undefined) — so a doc-start gap cursor consumes the key instead (there is nothing before it for Backspace to act on) * fix(files): poll the content query while the post-stream reconcile waits, so the editor can't wedge read-only Reported: images "don't get selected sometimes" (can't grab/drag/resize, doc uneditable) until a full refresh. Reproduced in a real-Chromium harness driving the actual RichMarkdownEditor + engine: after an agent stream settles, the reconcile phase exits only when a fetch shows the server content advanced past the pre-stream baseline — but that exit had no retry. A single refetch racing the agent's write (or the mothership invalidation never reaching this surface — it's the only place that invalidates this query) left the editor locked read-only indefinitely: contenteditable=false, images not grabbable, until refetchOnWindowFocus or a reload happened to run. Fix: while (and only while) the reducer is in `reconciling`, the content query polls via react-query's refetchInterval — the same pattern this module already uses for the generated-doc 409 polling, and like it, bounded (45s window; past that the write has almost certainly failed and refetchOnWindowFocus remains the recovery). The interval is the function form reading the phase through a ref, re-evaluated by react-query after every fetch, so polling stops the moment a fetch advances without needing an extra render. Harness (real Chromium, real editor + engine, in-memory server): pre-fix the editor stays editable=false with fetches frozen at 1 indefinitely while the server holds the new content; post-fix it unlocks within one poll (~1.5s), polling stops immediately after finalize, and the streamed image click-selects. Unit tests drive stream -> settle -> advance through the real engine and assert the interval flips on/off with the phase (2 of 3 fail pre-fix), plus the bounded window and a no-polling guard for plain at-rest editing. * test(files): cover the refetchInterval passthrough against real react-query Both consumers' test setups (the reconcile unit tests and the browser harness) replace @/hooks/queries/workspace-files, so the real hook's two changed lines were exercised by nothing but the type-checker. These render the real useWorkspaceFileContent under a real QueryClientProvider with a stubbed fetch: no polling by default, polling with a numeric interval, and the function form re-evaluated so flipping its condition stops the polling — the exact mechanism the reconcile fix depends on. The two polling tests fail against the pre-fix hook. * fix(files): degrade reconcile polling to a slow cadence instead of stopping; prove findFrom textOnly never leaf-selects Greptile round 1: - Real gap in my bounded window: past 45s the poll stopped outright, leaving the reducer wedged in reconciling with only focus-refetch/reload as recovery — the exact failure shape this PR exists to remove, just later. Polling now degrades to a 15s cadence instead of stopping, so a write landing late (slow job, replica catch-up) is still picked up automatically; react-query pauses interval refetches in background tabs by default, so an abandoned doc doesn't poll unattended. - Refuted with source + an executable test: Selection.findFrom($gap, -1, true) cannot return a NodeSelection — prosemirror-state's findSelectionIn skips atoms entirely under textOnly (`!text && isSelectable`). New regression test pins the exact scenario (image directly BEFORE the emptied bullet): backward search returns null, the gap-cursor/forward-caret branches take over, and the image is never silently selected. --- .../rich-markdown-editor/keymap.test.ts | 98 ++++++++++ .../rich-markdown-editor/keymap.ts | 33 +++- .../use-editable-file-content.test.tsx | 167 ++++++++++++++++++ .../file-viewer/use-editable-file-content.ts | 45 ++++- apps/sim/blocks/blocks/brex.ts | 7 +- .../hooks/queries/workspace-files.test.tsx | 104 +++++++++++ apps/sim/hooks/queries/workspace-files.ts | 11 +- apps/sim/tools/brex/get_company.ts | 2 +- 8 files changed, 461 insertions(+), 6 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/use-editable-file-content.test.tsx create mode 100644 apps/sim/hooks/queries/workspace-files.test.tsx diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/keymap.test.ts b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/keymap.test.ts index 862414f9fd6..b9392de02c8 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/keymap.test.ts +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/keymap.test.ts @@ -7,6 +7,7 @@ * keymap's `isSuggestionMenuOpen` guard reads flips on when a menu opens. */ import { Editor } from '@tiptap/core' +import { GapCursor } from '@tiptap/pm/gapcursor' import { AllSelection, NodeSelection } from '@tiptap/pm/state' import { beforeEach, describe, expect, it, vi } from 'vitest' import { createMarkdownEditorExtensions } from './editor-extensions' @@ -195,6 +196,103 @@ describe('empty wrapped-block Backspace', () => { editor.destroy() } ) + + it('leaves a gap cursor — never a NodeSelection — when the removed bullet was followed by an image at doc start', () => { + // Regression: `Selection.near` after the delete silently NodeSelected the following image, so a + // second Backspace while "clearing the bullet" deleted the image (and typing would have replaced + // it). The selection left behind must never make the next keystroke destructive. + const editor = editorWith({ + type: 'doc', + content: [ + { type: 'bulletList', content: [{ type: 'listItem', content: [{ type: 'paragraph' }] }] }, + { type: 'image', attrs: { src: '/api/files/view/wf_img', alt: 'photo' } }, + ], + }) + editor.commands.setTextSelection(3) + pressBackspace(editor) + + expect(blockShape(editor)).toEqual(['image', 'paragraph']) + expect(editor.state.selection).not.toBeInstanceOf(NodeSelection) + + pressBackspace(editor) + expect(blockShape(editor)).toEqual(['image', 'paragraph']) + editor.destroy() + }) + + it('does not crash on Backspace from a gap cursor (top-level selection, depth 0)', () => { + // Regression: `$from.before($from.depth)` with a gap cursor's depth of 0 threw + // "RangeError: There is no position before the top-level node" — reachable whenever a gap + // cursor sits between two leaves (the `data-gap-between-leaves` state) and Backspace is pressed. + const editor = editorWith('

') + const gapPos = editor.state.doc.firstChild ? editor.state.doc.firstChild.nodeSize : 1 + editor.view.dispatch( + editor.state.tr.setSelection(new GapCursor(editor.state.doc.resolve(gapPos))) + ) + expect(editor.state.selection).toBeInstanceOf(GapCursor) + + expect(() => pressBackspace(editor)).not.toThrow() + // TipTap appends a trailing paragraph after the final leaf; the dividers must both survive. + expect(blockShape(editor)).toEqual(['horizontalRule', 'horizontalRule', 'paragraph']) + editor.destroy() + }) + + it('never NodeSelects a leaf BEFORE the removed bullet either (findFrom textOnly skips atoms)', () => { + // `Selection.findFrom($gap, -1, true)` cannot return a NodeSelection: with textOnly, + // prosemirror-state's findSelectionIn skips atoms entirely (`!text && isSelectable`). With an + // image directly before the emptied bullet and no textblock behind it, the backward search + // returns null and the gap-cursor branch takes over — the image is never silently selected. + const editor = editorWith({ + type: 'doc', + content: [ + { type: 'image', attrs: { src: '/api/files/view/wf_img', alt: 'photo' } }, + { type: 'bulletList', content: [{ type: 'listItem', content: [{ type: 'paragraph' }] }] }, + ], + }) + editor.commands.setTextSelection(4) + expect(editor.state.selection.$from.parent.type.name).toBe('paragraph') + pressBackspace(editor) + + expect(blockShape(editor)).toEqual(['image', 'paragraph']) + expect(editor.state.selection).not.toBeInstanceOf(NodeSelection) + + pressBackspace(editor) + expect(blockShape(editor)).toEqual(['image', 'paragraph']) + editor.destroy() + }) + + it('does not crash on Backspace from a gap cursor at the very start of the doc', () => { + // Depth-0 + offset-0 is the worst case: our old code threw before(0), and TipTap's blockquote + // handler crashes on $from.node(-1) if the key falls through — so it must be consumed. + const editor = editorWith({ + type: 'doc', + content: [{ type: 'image', attrs: { src: '/api/files/view/wf_img', alt: 'photo' } }], + }) + editor.view.dispatch(editor.state.tr.setSelection(new GapCursor(editor.state.doc.resolve(0)))) + expect(editor.state.selection).toBeInstanceOf(GapCursor) + + expect(() => pressBackspace(editor)).not.toThrow() + expect(blockShape(editor)).toEqual(['image', 'paragraph']) + editor.destroy() + }) + + it('still prefers the previous textblock caret when one exists (image after the bullet untouched)', () => { + const editor = editorWith({ + type: 'doc', + content: [ + { type: 'paragraph', content: [{ type: 'text', text: 'hello' }] }, + { type: 'bulletList', content: [{ type: 'listItem', content: [{ type: 'paragraph' }] }] }, + { type: 'image', attrs: { src: '/api/files/view/wf_img', alt: 'photo' } }, + ], + }) + editor.commands.setTextSelection(10) + pressBackspace(editor) + + expect(blockShape(editor)).toEqual(['paragraph', 'image', 'paragraph']) + expect(editor.state.selection.empty).toBe(true) + expect(editor.state.selection).not.toBeInstanceOf(NodeSelection) + expect(editor.state.selection.$from.parent.textContent).toBe('hello') + editor.destroy() + }) }) describe('empty list-item Enter', () => { diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/keymap.ts b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/keymap.ts index 3034fd66fe6..0d5bc22801c 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/keymap.ts +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/keymap.ts @@ -35,6 +35,14 @@ function isInsideWrapper($from: ResolvedPos): boolean { * container and strand an empty paragraph (a visible gap, and markdown that re-parses to a different * document). Walking up while `childCount === 1` deletes the whole now-empty wrapper (the emptied list * item, not just its paragraph) so no orphan `
  • ` or empty continuation line is left behind. + * + * The selection left behind must be a CARET, never a NodeSelection: `Selection.near` can silently + * land a NodeSelection on an adjacent leaf (deleting the sole bullet at the top of a doc whose next + * block is an image selected that image), turning the user's next keystroke destructive — a second + * Backspace while "clearing the bullet" deleted the image, and typing would have replaced it. So: + * end of the previous textblock first; else a gap cursor at the deletion point when the neighbour is + * a leaf (typing there inserts a new block where the emptied one was, instead of replacing the leaf); + * else the next textblock. */ function removeEmptyWrappedBlock(editor: Editor, $from: ResolvedPos): boolean { let depth = $from.depth @@ -44,13 +52,31 @@ function removeEmptyWrappedBlock(editor: Editor, $from: ResolvedPos): boolean { return editor.commands.command(({ tr, dispatch }) => { if (dispatch) { tr.delete(start, end) - tr.setSelection(Selection.near(tr.doc.resolve(start), -1)) + const $gap = tr.doc.resolve(start) + tr.setSelection( + Selection.findFrom($gap, -1, true) ?? + (isLeafGap($gap) ? new GapCursor($gap) : null) ?? + Selection.findFrom($gap, 1, true) ?? + Selection.near($gap, -1) + ) dispatch(tr.scrollIntoView()) } return true }) } +/** + * True when `$pos` is a block boundary a gap cursor is valid at in this schema: the following node is + * a selectable leaf (divider/image) and there is nothing before it, or another leaf — i.e. no textblock + * on either side for a normal caret to land in. + */ +function isLeafGap($pos: ResolvedPos): boolean { + const after = $pos.nodeAfter + if (!after || !SELECTABLE_LEAVES.has(after.type.name)) return false + const before = $pos.nodeBefore + return !before || SELECTABLE_LEAVES.has(before.type.name) +} + /** * True while a `/` or `@` suggestion menu is open. Arrow keys must reach that menu's own handler, so * the leaf-selection shortcuts below yield rather than stealing the key to select an adjacent divider. @@ -146,6 +172,11 @@ export const RichMarkdownKeymap = Extension.create({ const { selection, doc } = editor.state if (!selection.empty || selection.$from.parentOffset !== 0) return false const { $from } = selection + // A gap cursor at the start of the doc resolves at the top level (`depth === 0`, offset 0): + // `$from.before(0)` below throws, and falling through instead is no better — TipTap's + // blockquote Backspace handler crashes on the same resolution (`$from.node(-1)` is + // undefined). There is nothing before the gap for Backspace to act on, so consume the key. + if ($from.depth === 0) return true if ($from.parent.type.name === 'heading') { return editor.commands.setParagraph() } diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/use-editable-file-content.test.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/use-editable-file-content.test.tsx new file mode 100644 index 00000000000..58c5447df66 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/use-editable-file-content.test.tsx @@ -0,0 +1,167 @@ +/** + * @vitest-environment jsdom + * + * The post-stream reconcile must poll the content query until a fetch shows the server content + * advanced past the pre-stream baseline — its exit is data-driven, and without the poll a single + * refetch racing the agent's write (or an invalidation that never reaches this surface) wedged the + * editor read-only until a window refocus or full reload. These drive the real + * `useEditableFileContent` engine through stream → settle → advance and assert the + * `refetchInterval` handed to the content query flips on and off with the `reconciling` phase. + */ +import { act } from 'react' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const { queryState } = vi.hoisted(() => ({ + queryState: { + fetched: undefined as string | undefined, + lastOptions: undefined as + | { refetchInterval?: number | false | (() => number | false) } + | undefined, + }, +})) + +vi.mock('@/hooks/queries/workspace-files', () => ({ + useWorkspaceFileContent: ( + _workspaceId: string, + _fileId: string, + _key: string, + _raw?: boolean, + options?: { refetchInterval?: number | false | (() => number | false) } + ) => { + queryState.lastOptions = options + return { data: queryState.fetched, isLoading: queryState.fetched === undefined, error: null } + }, + useUpdateWorkspaceFileContent: () => ({ mutateAsync: vi.fn(async () => ({ success: true })) }), +})) + +vi.mock('idb-keyval', () => ({ + get: vi.fn(async () => undefined), + set: vi.fn(async () => {}), + del: vi.fn(async () => {}), +})) + +import { + RECONCILING_REFETCH_INTERVAL_MS, + RECONCILING_REFETCH_SLOW_INTERVAL_MS, + RECONCILING_REFETCH_WINDOW_MS, + useEditableFileContent, +} from './use-editable-file-content' + +const FILE = { + id: 'f1', + key: 'workspace/ws-1/123-abc-doc.md', + name: 'doc.md', + type: 'text/markdown', + folderId: null, +} as any + +interface ProbeProps { + streamingContent?: string + isAgentEditing?: boolean +} + +let container: HTMLDivElement | null = null +let root: Root | null = null +let latest: ReturnType | null = null + +function Probe(props: ProbeProps) { + latest = useEditableFileContent({ + file: FILE, + workspaceId: 'ws-1', + canEdit: true, + streamingContent: props.streamingContent, + isAgentEditing: props.isAgentEditing, + }) + return null +} + +function render(props: ProbeProps) { + act(() => { + root?.render() + }) +} + +/** The interval value react-query would currently be using (resolving the function form). */ +function currentInterval(): number | false { + const raw = queryState.lastOptions?.refetchInterval + return typeof raw === 'function' ? raw() : (raw ?? false) +} + +beforeEach(() => { + ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true + queryState.fetched = undefined + queryState.lastOptions = undefined + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) +}) + +afterEach(() => { + if (root) act(() => root?.unmount()) + container?.remove() + container = null + root = null + latest = null + vi.useRealTimers() +}) + +describe('reconcile refetch polling', () => { + it('polls only while reconciling, and stops the moment the fetched content advances', () => { + const BASELINE = '# Doc\n\nstart\n' + const STREAMED = '# Doc\n\nstart\n\n![img](/api/files/view/wf_x)\n' + + // Mount mid-stream (fetch not resolved yet): no polling. + render({ streamingContent: '', isAgentEditing: true }) + expect(currentInterval()).toBe(false) + + // Baseline fetch resolves during the stream; chunks arrive: still no polling. + queryState.fetched = BASELINE + render({ streamingContent: '# Doc\n\nstart\n\n![img](', isAgentEditing: true }) + render({ streamingContent: STREAMED, isAgentEditing: true }) + expect(currentInterval()).toBe(false) + expect(latest?.isStreamInteractionLocked).toBe(true) + + // Stream settles but the cached fetch still shows the pre-stream baseline: reconciling → poll. + render({ streamingContent: undefined, isAgentEditing: false }) + expect(latest?.isStreamInteractionLocked).toBe(true) + expect(currentInterval()).toBe(RECONCILING_REFETCH_INTERVAL_MS) + + // A poll returns the advanced server content: finalize, unlock, polling off. + queryState.fetched = STREAMED + render({ streamingContent: undefined, isAgentEditing: false }) + expect(latest?.isStreamInteractionLocked).toBe(false) + expect(latest?.content).toBe(STREAMED) + expect(currentInterval()).toBe(false) + }) + + it('degrades to the slow cadence after the fast window — never stops outright while reconciling', () => { + vi.useFakeTimers() + vi.setSystemTime(1_000_000) + const BASELINE = '# Doc\n\nstart\n' + + render({ streamingContent: '', isAgentEditing: true }) + queryState.fetched = BASELINE + render({ streamingContent: `${BASELINE}\nmore`, isAgentEditing: true }) + render({ streamingContent: undefined, isAgentEditing: false }) + expect(currentInterval()).toBe(RECONCILING_REFETCH_INTERVAL_MS) + + vi.setSystemTime(1_000_000 + RECONCILING_REFETCH_WINDOW_MS - 1) + expect(currentInterval()).toBe(RECONCILING_REFETCH_INTERVAL_MS) + + // A write landing late (slow job, replica catch-up) must still be picked up automatically — + // the poll degrades in rate but the editor can never end up with no recovery path at all. + vi.setSystemTime(1_000_000 + RECONCILING_REFETCH_WINDOW_MS) + expect(currentInterval()).toBe(RECONCILING_REFETCH_SLOW_INTERVAL_MS) + }) + + it('never polls during plain at-rest editing (no stream involved)', () => { + queryState.fetched = '# Plain\n\ndoc\n' + render({}) + expect(latest?.isStreamInteractionLocked).toBe(false) + expect(currentInterval()).toBe(false) + act(() => latest?.setDraftContent('# Plain\n\ndoc edited\n')) + render({}) + expect(currentInterval()).toBe(false) + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/use-editable-file-content.ts b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/use-editable-file-content.ts index f466249e74f..cb6defd8d95 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/use-editable-file-content.ts +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/use-editable-file-content.ts @@ -28,6 +28,25 @@ const GENERATED_SOURCE_FILE_TYPES = new Set([ 'text/x-python-xlsx', ]) +/** + * Poll cadence for the content query while the post-stream reconcile waits for a fetch showing the + * server content advanced past the pre-stream baseline. Only active during `reconciling` — a short + * window ending the moment a fetch advances — so the cost is a few small GETs after an agent edit. + */ +export const RECONCILING_REFETCH_INTERVAL_MS = 1500 + +/** + * How long the reconcile polls at the fast cadence after a stream settles. A write that hasn't + * landed within this window has almost certainly failed or is badly delayed, so polling degrades + * to {@link RECONCILING_REFETCH_SLOW_INTERVAL_MS} — never stopping outright, so the editor can't + * end up locked read-only with no automatic recovery (react-query pauses interval refetches in + * background tabs by default, so a wedged doc left open does not poll unattended). + */ +export const RECONCILING_REFETCH_WINDOW_MS = 45_000 + +/** Slow-poll cadence once the fast window has elapsed without the server content advancing. */ +export const RECONCILING_REFETCH_SLOW_INTERVAL_MS = 15_000 + interface UseEditableFileContentOptions { file: WorkspaceFileRecord workspaceId: string @@ -99,6 +118,7 @@ function useFileContentState(options: SyncTextEditorContentStateOptions) { savedContent: state.savedContent, isInitialized: state.phase !== 'uninitialized', isStreamInteractionLocked: state.phase === 'streaming' || state.phase === 'reconciling', + isReconciling: state.phase === 'reconciling', setDraftContent, markSavedContent, } @@ -127,6 +147,25 @@ export function useEditableFileContent({ onDirtyChangeRef.current = onDirtyChange onSaveStatusChangeRef.current = onSaveStatusChange + /** + * Mirrors the reducer's `reconciling` phase (assigned below the reducer hook; read here through a + * stable function that react-query re-evaluates after every fetch and options pass, so polling + * starts and stops with the phase, no extra re-render required). While reconciling — the stream + * ended but no fetch has shown the server content advancing past the pre-stream baseline yet — + * the content query polls. The reconcile's exit is data-driven and this is its only retry: a + * single refetch that races the agent's write (or an invalidation that never reaches this + * surface) would otherwise leave the editor read-only until a window refocus or a full reload. + */ + const isReconcilingRef = useRef(false) + const reconcilingSinceRef = useRef(0) + const reconcileRefetchInterval = useCallback(() => { + if (!isReconcilingRef.current) return false + if (Date.now() - reconcilingSinceRef.current >= RECONCILING_REFETCH_WINDOW_MS) { + return RECONCILING_REFETCH_SLOW_INTERVAL_MS + } + return RECONCILING_REFETCH_INTERVAL_MS + }, []) + const { data: fetchedContent, isLoading, @@ -135,7 +174,8 @@ export function useEditableFileContent({ workspaceId, file.id, file.key, - GENERATED_SOURCE_FILE_TYPES.has(file.type) + GENERATED_SOURCE_FILE_TYPES.has(file.type), + { refetchInterval: reconcileRefetchInterval } ) /** @@ -165,6 +205,7 @@ export function useEditableFileContent({ savedContent, isInitialized, isStreamInteractionLocked: isStreamPhaseLocked, + isReconciling, setDraftContent, markSavedContent, } = useFileContentState({ @@ -172,6 +213,8 @@ export function useEditableFileContent({ fetchedContent: baselineContent, streamingContent, }) + if (isReconciling && !isReconcilingRef.current) reconcilingSinceRef.current = Date.now() + isReconcilingRef.current = isReconciling const isStreamInteractionLocked = isStreamPhaseLocked || Boolean(isAgentEditing) diff --git a/apps/sim/blocks/blocks/brex.ts b/apps/sim/blocks/blocks/brex.ts index 086617b2615..b7d8da6fa61 100644 --- a/apps/sim/blocks/blocks/brex.ts +++ b/apps/sim/blocks/blocks/brex.ts @@ -1044,7 +1044,10 @@ export const BrexBlock: BlockConfig = { routingNumber: { type: 'string', description: 'Bank routing number of the cash account' }, primary: { type: 'boolean', description: 'Whether the cash account is primary' }, accountId: { type: 'string', description: 'Account ID of the budget or spend limit' }, - description: { type: 'string', description: 'Description of the budget or spend limit' }, + description: { + type: 'string', + description: 'Description of the budget, spend limit, or transfer', + }, parentBudgetId: { type: 'string', description: 'Parent budget ID' }, ownerUserIds: { type: 'json', description: 'Owner user IDs of the budget or spend limit' }, memberUserIds: { type: 'json', description: 'Member user IDs of the spend limit' }, @@ -1052,7 +1055,7 @@ export const BrexBlock: BlockConfig = { spendType: { type: 'string', description: 'Spend type of the spend limit' }, startDate: { type: 'string', description: 'Start date of the budget or spend limit' }, endDate: { type: 'string', description: 'End date of the budget or spend limit' }, - amount: { type: 'json', description: 'Amount of the budget' }, + amount: { type: 'json', description: 'Amount of the budget or transfer' }, spendBudgetStatus: { type: 'string', description: 'Status of the budget' }, limitType: { type: 'string', description: 'Limit type of the budget' }, currentPeriodBalance: { diff --git a/apps/sim/hooks/queries/workspace-files.test.tsx b/apps/sim/hooks/queries/workspace-files.test.tsx new file mode 100644 index 00000000000..db51e9fc452 --- /dev/null +++ b/apps/sim/hooks/queries/workspace-files.test.tsx @@ -0,0 +1,104 @@ +/** + * @vitest-environment jsdom + * + * `useWorkspaceFileContent` against REAL react-query (no module mocks): the `refetchInterval` + * option must reach the query — the editor's post-stream reconcile depends on it to poll until the + * server content advances (see `use-editable-file-content.ts`), and both its consumers' test + * setups replace this module, so without this file the passthrough itself would be exercised by + * nothing but the type-checker. + */ +import { act, type ReactNode } from 'react' +import { sleep } from '@sim/utils/helpers' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { useWorkspaceFileContent } from '@/hooks/queries/workspace-files' + +let fetchCount = 0 + +beforeEach(() => { + ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true + fetchCount = 0 + vi.stubGlobal( + 'fetch', + vi.fn(async () => { + fetchCount += 1 + return new Response('# content', { status: 200 }) + }) + ) +}) + +afterEach(() => { + vi.unstubAllGlobals() +}) + +function renderContentHook(options?: { + refetchInterval?: number | false | (() => number | false) +}): { unmount: () => void } { + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }) + const container = document.createElement('div') + const root: Root = createRoot(container) + + function Probe() { + useWorkspaceFileContent('ws-1', 'file-1', 'workspace/ws-1/123-abc-doc.md', false, options) + return null + } + + function Wrapper({ children }: { children: ReactNode }) { + return {children} + } + + act(() => { + root.render( + + + + ) + }) + return { + unmount: () => { + act(() => root.unmount()) + queryClient.clear() + }, + } +} + +describe('useWorkspaceFileContent refetchInterval passthrough', () => { + it('fetches once and does not poll by default', async () => { + const { unmount } = renderContentHook() + await act(async () => { + await sleep(150) + }) + expect(fetchCount).toBe(1) + unmount() + }) + + it('polls when a numeric refetchInterval is passed', async () => { + const { unmount } = renderContentHook({ refetchInterval: 30 }) + await act(async () => { + await sleep(200) + }) + expect(fetchCount).toBeGreaterThanOrEqual(3) + unmount() + }) + + it('function form is re-evaluated so flipping its condition stops the polling', async () => { + let polling = true + const { unmount } = renderContentHook({ refetchInterval: () => (polling ? 30 : false) }) + await act(async () => { + await sleep(200) + }) + expect(fetchCount).toBeGreaterThanOrEqual(3) + + polling = false + await act(async () => { + await sleep(100) + }) + const settled = fetchCount + await act(async () => { + await sleep(150) + }) + expect(fetchCount).toBe(settled) + unmount() + }) +}) diff --git a/apps/sim/hooks/queries/workspace-files.ts b/apps/sim/hooks/queries/workspace-files.ts index edd65bb3984..b58da2b15ab 100644 --- a/apps/sim/hooks/queries/workspace-files.ts +++ b/apps/sim/hooks/queries/workspace-files.ts @@ -137,12 +137,20 @@ async function fetchWorkspaceFileContent(url: string, signal?: AbortSignal): Pro * Hook to fetch workspace file content as text. * `key` (the storage object key) is forwarded into the query key factory so that a new * storage key (e.g. after a file is re-uploaded) correctly busts the cache. + * + * `refetchInterval` lets a caller poll while waiting for the server content to advance — the + * editor's post-stream reconcile (see `use-editable-file-content.ts`) exits only when a fetch + * returns content that moved past its baseline, and would otherwise wedge read-only forever if + * its single refetch raced the agent's write. The function form is re-evaluated by react-query + * after every fetch and options pass, so a condition read through a ref stops the polling as soon + * as it flips — no re-render required. */ export function useWorkspaceFileContent( workspaceId: string, fileId: string, key: string, - raw?: boolean + raw?: boolean, + options?: { refetchInterval?: number | false | (() => number | false) } ) { const source = useFileContentSource() return useQuery({ @@ -152,6 +160,7 @@ export function useWorkspaceFileContent( enabled: !!workspaceId && !!fileId && !!key, staleTime: WORKSPACE_FILE_CONTENT_STALE_TIME, refetchOnWindowFocus: 'always', + refetchInterval: options?.refetchInterval ?? false, }) } diff --git a/apps/sim/tools/brex/get_company.ts b/apps/sim/tools/brex/get_company.ts index 700e339a089..5e222e387c1 100644 --- a/apps/sim/tools/brex/get_company.ts +++ b/apps/sim/tools/brex/get_company.ts @@ -31,7 +31,7 @@ export const brexGetCompanyTool: ToolConfig Date: Sat, 11 Jul 2026 17:48:25 -0700 Subject: [PATCH 17/23] improvement(files): show loading spinner in file preview content area (#5610) --- .../components/file-viewer/image-preview.tsx | 27 +++++++++------ .../components/file-viewer/preview-shared.tsx | 33 ++++++++++++++----- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/image-preview.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/image-preview.tsx index e4ba8033261..d65fd1d928b 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/image-preview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/image-preview.tsx @@ -1,12 +1,14 @@ 'use client' -import { memo } from 'react' +import { memo, useState } from 'react' import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace' import { useFileContentSource } from '@/hooks/use-file-content-source' +import { PREVIEW_LOADING_OVERLAY } from './preview-shared' import { ZoomablePreview } from './zoomable-preview' export const ImagePreview = memo(function ImagePreview({ file }: { file: WorkspaceFileRecord }) { const source = useFileContentSource() + const [hasSettled, setHasSettled] = useState(false) // Version the URL on updatedAt: overwrites keep the same storage key, so an unversioned // URL would resolve to a previously cached copy instead of the rewritten bytes. const serveUrl = source.buildUrl(file.key, { @@ -14,14 +16,19 @@ export const ImagePreview = memo(function ImagePreview({ file }: { file: Workspa }) return ( - - {file.name} - +
    + + {file.name} setHasSettled(true)} + onError={() => setHasSettled(true)} + /> + + {!hasSettled && PREVIEW_LOADING_OVERLAY} +
    ) }) diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/preview-shared.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/preview-shared.tsx index 4796ae6bb1e..041a0225074 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/preview-shared.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/preview-shared.tsx @@ -2,6 +2,7 @@ import { Component, type ErrorInfo, type ReactNode } from 'react' import { cn } from '@sim/emcn' +import { Loader } from '@sim/emcn/icons' import { createLogger } from '@sim/logger' const logger = createLogger('FilePreview') @@ -87,13 +88,20 @@ export function resolvePreviewError( return renderError } +/** Canonical content-area loading spinner, matching the rest of the app. */ +const PREVIEW_LOADING_SPINNER = ( + +) + /** - * Canonical blank loading overlay for previews that render into a - * `--surface-1` canvas. Absolutely covers the canvas (with `z-10` so it - * paints above in-flow render targets) until the preview is ready. + * Canonical loading overlay for previews that render into a `--surface-1` + * canvas. Absolutely covers the canvas (with `z-10` so it paints above + * in-flow render targets) with a centered spinner until the preview is ready. */ export const PREVIEW_LOADING_OVERLAY = ( -
    +
    + {PREVIEW_LOADING_SPINNER} +
    ) interface PreviewLoadingFrameProps { @@ -104,14 +112,21 @@ interface PreviewLoadingFrameProps { } /** - * Canonical in-flow blank loading frame shown while a preview is fetching or - * rendering. The `tone` must match the background of the loaded state it is - * standing in for, so mount completion does not flash a different token. + * Canonical in-flow loading frame with a centered spinner, shown while a + * preview is fetching or rendering. The `tone` must match the background of + * the loaded state it is standing in for, so mount completion does not flash + * a different token. */ export function PreviewLoadingFrame({ className, tone = 'bg' }: PreviewLoadingFrameProps) { return (
    + className={cn( + 'flex items-center justify-center', + tone === 'surface' ? 'bg-[var(--surface-1)]' : 'bg-[var(--bg)]', + className + )} + > + {PREVIEW_LOADING_SPINNER} +
    ) } From fcf4e029306cf219b13bbea3c73917bdd7befa51 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 17:50:00 -0700 Subject: [PATCH 18/23] fix(landing): repair Lighthouse-flagged CWV audits on production (#5605) * fix(landing): repair Lighthouse-flagged CWV audits on production Empirically verified against a live full Lighthouse run of www.sim.ai (production, pre-fix) plus a local build of the exact deployed commit with source maps temporarily enabled for root-causing. Distinguished genuinely failing audits from passing ones already misread as broken. - fetchPriority missing on every LCP hero image: `priority` generates a preload but Next does not auto-add fetchpriority=high to it - confirmed via raw deployed HTML diff. Added explicit fetchPriority='high' to all 5 priority Image usages (hero, enterprise, blog/library post + index cards). - valid-source-maps failing: production ships no source maps at all (productionBrowserSourceMaps defaults false). Enabled it - safe here since this repo's frontend is already fully open source, so no incremental exposure versus Next's default. - image-delivery-insight (55.8KB wasted): feature-integrate-ui.png's `sizes` hint was a flat 1050px regardless of viewport, so mobile fetched the 1920w variant for a ~423px real render. Replaced with a responsive sizes expression derived from the sibling backdrop image's own (already correct) hint, scaled by the callout's documented 125% overhang. - cache-insight (best-fixable portion): _next/static/* filenames are content-hashed and immutable per deploy, but shared one cache rule with unhashed /public assets, capping both at 1-day max-age. Split into two rules - hashed assets now get 1-year immutable, unhashed assets keep the shorter revalidating TTL. Verified via a real build + server that both paths now return the correct distinct header. Investigated and NOT changed (documented, not assumed): - legacy-javascript-insight (14KB): traced via sourcemap to next/dist/build/polyfills/polyfill-module.js - Next's own built-in polyfill bundle, not our code or a dependency, and not exposed via any next.config.ts option. No browserslist misconfiguration on our end (none exists; Next already defaults to its modern target). - forced-reflow-insight: even with source maps present locally, the dominant cost (335-417ms) stayed [unattributed] by Chrome's own profiler, and the small attributed slice was non-deterministic between our own chunk and a third-party script (HubSpot analytics) across runs - not a confident single root cause worth a targeted fix. - render-blocking-insight / network-dependency-tree / bf-cache: bf-cache's actual failure reason is Cache-Control: no-store on the main document - the exact root cause already fixed on staging (PR #5522/#5528, the PublicEnvScript/unstable_noStore fix) but not yet promoted to main/prod. Resolves once that ships, not additional work here. * fix(landing): convert mothership cover from PNG to JPEG (/blog LCP 6.6s -> 2.8s) Ran a full Lighthouse sweep across every public page as requested. /blog scored 73 (LCP 6.6s) while every other page scored 95+ - reproduced consistently across 3 runs, not noise. Traced via lcp-breakdown-insight: the LCP image (mothership/cover.png, 241KB even after the earlier palette compression pass) took 6+ seconds to download on simulated mobile throttling, well beyond what its size should cost. PNG is a poor fit for this illustration's subtle gradients versus JPEG's lossy compression. Verified empirically before converting: same 1920x1080 resolution, visually identical (spot-checked), 241KB -> 65KB (73% smaller). No other cover in the content set uses PNG and benefits the same way (checked copilot/cover.png, the only other PNG cover - already optimal at 64KB, converting it yielded no improvement, left unchanged). Verified fix: /blog score 73->93, LCP 6.6s->2.8s, reproduced across 3 runs. * fix(landing): correct mobile sizes tier, drop non-functional cache rule - integrations-callout: account for FeatureCard's max-lg:grid-cols-1 mobile stack in the sizes hint, verified against Lighthouse's measured mobile render width. - next.config: remove a custom _next/static cache-control rule that never actually fired (confirmed via header-marker test) - Next's own built-in default already applies the correct immutable 1yr cache to that path. * fix(landing): correct sizes underestimate + fix dead .map header rule - integrations-callout: derive sizes from the section's actual grid math (fixed 386px copy column, 40px gap, section gutters) instead of an approximated vw fraction. Verified against a static reproduction of the layout rendered at each Tailwind breakpoint - the old 110vw mobile tier underestimated real render width by ~3% right at the 1023px stack boundary, which could cause the browser to pick a too-small srcset candidate and upscale. - next.config: the .map header rule's trailing `$` was read as a literal character by Next's path-to-regexp source matcher, not a regex anchor, so the rule never matched a real .map URL (confirmed via routes-manifest regex + a live header check). Removed the dead anchor and added a bounded Cache-Control so a future decision to stop shipping source maps isn't undermined by a 1yr immutable cache on already-fetched maps. * fix(llms): serve well-formed llms.txt, remove Mothership + dead static files Both the marketing site and docs site's llms.txt validator errors ("does not appear to contain any links") traced to the same root cause: a static public/llms.txt shadowed a better-written, already-existing dynamic app/llms.txt route, and every "link" in the static files (and in the docs app's auto-generated route) was bare `label: url` text, not Markdown link syntax - so a strict Markdown-link parser found zero matches even though URLs were visibly present. - apps/sim: delete public/llms.txt (dead code, shadowing the properly Markdown-linked app/llms.txt route.ts, confirmed via production headers showing the static file was what actually served). Fix llms-full.txt's Links/Support/Legal sections to use [label](url) syntax, correct a stale "Next.js 15" reference, and replace "Mothership" with "Chat" per the constitution's language rules. - apps/docs: same shadowing issue - delete the orphaned public/llms.txt (also still said "Mothership"). Fix the auto-generated per-page link list in app/llms.txt/route.ts to emit [title](url) instead of "title: url" for every documentation page. * fix(llms): actually include the route.ts fixes from the prior commit The prior commit (3b2d35c99) only staged the two deleted public/llms.txt files - these two modified route.ts files (the Mothership/link-format fixes they were meant to accompany) were left unstaged. No new changes, just completing that commit's intent. --- apps/docs/app/llms.txt/route.ts | 10 +-- apps/docs/public/llms.txt | 51 --------------- .../content-index-page/content-index-page.tsx | 1 + .../content-post-page/content-post-page.tsx | 1 + .../integrations-callout.tsx | 14 ++++- .../app/(landing)/components/hero/hero.tsx | 1 + .../app/(landing)/enterprise/enterprise.tsx | 1 + apps/sim/app/llms-full.txt/route.ts | 32 +++++----- apps/sim/content/blog/mothership/index.mdx | 2 +- apps/sim/next.config.ts | 29 ++++++++- apps/sim/public/blog/mothership/cover.jpg | Bin 60213 -> 65829 bytes apps/sim/public/blog/mothership/cover.png | Bin 247198 -> 0 bytes apps/sim/public/llms.txt | 59 ------------------ 13 files changed, 65 insertions(+), 136 deletions(-) delete mode 100644 apps/docs/public/llms.txt delete mode 100644 apps/sim/public/blog/mothership/cover.png delete mode 100644 apps/sim/public/llms.txt diff --git a/apps/docs/app/llms.txt/route.ts b/apps/docs/app/llms.txt/route.ts index f172dd07156..ca426a7e966 100644 --- a/apps/docs/app/llms.txt/route.ts +++ b/apps/docs/app/llms.txt/route.ts @@ -44,7 +44,7 @@ Sim is the open-source AI workspace where teams build, deploy, and manage AI age ## Documentation Overview -This file provides an overview of our documentation. For full content of all pages, see ${baseUrl}/llms-full.txt +This file provides an overview of our documentation. For full content of all pages, see [llms-full.txt](${baseUrl}/llms-full.txt). ## Main Sections @@ -54,16 +54,16 @@ ${Object.entries(sections) .split('-') .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) .join(' ') - return `### ${sectionTitle}\n\n${items.map((item) => `- ${item.title}: ${item.url}${item.description ? `\n ${item.description}` : ''}`).join('\n')}` + return `### ${sectionTitle}\n\n${items.map((item) => `- [${item.title}](${item.url})${item.description ? `\n ${item.description}` : ''}`).join('\n')}` }) .join('\n\n')} ## Additional Resources -- Full documentation content: ${baseUrl}/llms-full.txt +- [Full documentation content](${baseUrl}/llms-full.txt) - Individual page content: ${baseUrl}/llms.mdx/[page-path] -- API documentation: ${baseUrl}/api-reference/ -- Tool integrations: ${baseUrl}/tools/ +- [API documentation](${baseUrl}/api-reference/) +- [Tool integrations](${baseUrl}/tools/) ## Statistics diff --git a/apps/docs/public/llms.txt b/apps/docs/public/llms.txt deleted file mode 100644 index aad99e364ef..00000000000 --- a/apps/docs/public/llms.txt +++ /dev/null @@ -1,51 +0,0 @@ -# Sim Documentation - -Sim is the open-source AI workspace where teams build, deploy, and manage AI agents. Create agents visually with the workflow builder, conversationally through Mothership, or programmatically with the API — connected to 1,000+ integrations and every major LLM. - -## What is Sim? - -Sim provides a complete AI workspace including: -- Mothership — natural language agent creation and workspace management -- Visual workflow builder with drag-and-drop interface -- 1,000+ built-in integrations (OpenAI, Anthropic, Slack, Gmail, GitHub, etc.) -- Knowledge bases for retrieval-augmented generation -- Built-in tables for structured data -- Real-time team collaboration -- Multiple deployment options (cloud-hosted or self-hosted) -- Custom integrations via MCP protocol - -## Main Documentation Sections - -Here are the key areas covered in our documentation: - -/introduction - Getting started with Sim AI workspace -/getting-started - Quick start guide for building your first agent -/blocks - Understanding blocks (AI agents, APIs, functions) -/tools - 1,000+ integrations and tools -/webhooks - Webhook triggers and handling -/mcp - Custom integrations via MCP protocol -/deployment - Cloud-hosted vs self-hosted deployment -/permissions - Team collaboration and workspace management -/collaboration - Real-time editing and team features -/workflows - Building agent logic with the visual builder - -## Technical Information - -- Framework: Fumadocs (Next.js-based documentation platform) -- Content: MDX files with interactive examples -- Languages: English (primary), Spanish, French, German, Japanese, Chinese -- Search: AI-powered search and assistance available - -## Complete Documentation - -For the full documentation with all pages, examples, and interactive features, visit our documentation site. We also provide machine-readable versions at /llms.txt (full content) for AI systems. - -## Additional Resources - -- GitHub repository with agent examples -- Discord community for support and discussions -- 1,000+ built-in integrations with detailed guides -- MCP protocol documentation for custom integrations -- Self-hosting guides and Docker deployment - -For the complete documentation visit https://docs.sim.ai diff --git a/apps/sim/app/(landing)/components/content-index-page/content-index-page.tsx b/apps/sim/app/(landing)/components/content-index-page/content-index-page.tsx index 3e304e9b5be..3ccc43d148f 100644 --- a/apps/sim/app/(landing)/components/content-index-page/content-index-page.tsx +++ b/apps/sim/app/(landing)/components/content-index-page/content-index-page.tsx @@ -96,6 +96,7 @@ export function ContentIndexPage({ sizes='(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw' className='object-cover' priority={index < 3} + fetchPriority={index === 0 ? 'high' : undefined} unoptimized />
    diff --git a/apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx b/apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx index 358ec8a1416..2e8aa3c84b5 100644 --- a/apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx +++ b/apps/sim/app/(landing)/components/content-post-page/content-post-page.tsx @@ -52,6 +52,7 @@ export function ContentPostPage({ className='h-auto w-full' sizes='(max-width: 768px) 100vw, 450px' priority + fetchPriority='high' itemProp='image' unoptimized /> diff --git a/apps/sim/app/(landing)/components/features/components/integrations-callout/integrations-callout.tsx b/apps/sim/app/(landing)/components/features/components/integrations-callout/integrations-callout.tsx index 7974064feb3..4e7659ee107 100644 --- a/apps/sim/app/(landing)/components/features/components/integrations-callout/integrations-callout.tsx +++ b/apps/sim/app/(landing)/components/features/components/integrations-callout/integrations-callout.tsx @@ -17,6 +17,18 @@ import { CalloutFrame } from '@/app/(landing)/components/features/components/cal * the right AND bottom edges bleed past the media stage's clip - a zoomed-in * peek at part of the product rather than a complete miniature, scaling * proportionally with the aspect-locked stage. Decorative. + * + * `sizes` is derived directly from the section's grid math rather than + * approximated, then rounded up to the worst-case (peak render/viewport + * ratio) in each tier so the browser never under-fetches: + * `callout = 1.25 * (viewport - 2*gutter - 32px card padding - [40px gap + + * 386px fixed copy column, desktop only])`, gutter = `px-20`/`max-lg:px-8`/ + * `max-sm:px-5` from `Features`'s grid, matching `FeatureCard`'s + * `max-lg:grid-cols-1` stack. Peak ratios (verified against a static + * reproduction of this exact layout rendered at each Tailwind breakpoint): + * ~113.3% at the `max-width: 1023px` stacked tier's own upper edge, ~108.6% + * at `1460px` (the container's cap, where render width stops growing with + * viewport - hence the final tier is a flat px value, not a vw fraction). */ export function IntegrationsCallout() { return ( @@ -29,7 +41,7 @@ export function IntegrationsCallout() { src='/landing/feature-integrate-ui.png' alt='' fill - sizes='1050px' + sizes='(max-width: 1023px) 114vw, (max-width: 1460px) 109vw, 1053px' className='object-cover' /> diff --git a/apps/sim/app/(landing)/components/hero/hero.tsx b/apps/sim/app/(landing)/components/hero/hero.tsx index b80b7227340..ea259f8e01b 100644 --- a/apps/sim/app/(landing)/components/hero/hero.tsx +++ b/apps/sim/app/(landing)/components/hero/hero.tsx @@ -102,6 +102,7 @@ export function Hero() { alt='' fill priority + fetchPriority='high' quality={90} sizes='(max-width: 1460px) 100vw, 1300px' className='object-cover' diff --git a/apps/sim/app/(landing)/enterprise/enterprise.tsx b/apps/sim/app/(landing)/enterprise/enterprise.tsx index 677a23d1968..0396ddcacbc 100644 --- a/apps/sim/app/(landing)/enterprise/enterprise.tsx +++ b/apps/sim/app/(landing)/enterprise/enterprise.tsx @@ -66,6 +66,7 @@ const ENTERPRISE_CONFIG: SolutionsPageConfig = { = useMinimalRegistry const nextConfig: NextConfig = { devIndicators: false, poweredByHeader: false, + // Safe here since this repo's source is already fully public on GitHub - + // no additional exposure versus Next's default (disabled to avoid leaking + // source on the client). + productionBrowserSourceMaps: true, turbopack: { root: path.join(import.meta.dirname, '../..'), resolveAlias: minimalRegistryAlias, @@ -188,7 +192,11 @@ const nextConfig: NextConfig = { async headers() { return [ { - source: '/((?!api/).*\\.(?:svg|jpg|jpeg|png|gif|ico|webp|avif|woff|woff2|ttf|eot))', + // `/public`-served assets keep their path across deploys (no content + // hash), so a shorter TTL + revalidation window bounds how long a + // changed asset can serve stale. + source: + '/((?!api/|_next/static/).*\\.(?:svg|jpg|jpeg|png|gif|ico|webp|avif|woff|woff2|ttf|eot))', headers: [ { key: 'Cache-Control', @@ -245,14 +253,29 @@ const nextConfig: NextConfig = { }, ], }, - // Block access to sourcemap files (defense in depth) + // Block access to sourcemap files (defense in depth). The trailing + // `$` this rule previously ended with is not a regex anchor in Next's + // `source` matcher (path-to-regexp syntax, not raw regex) - it matched + // a literal `$` character, so this rule never actually fired against + // real `.map` URLs. Next already anchors the compiled pattern at both + // ends, so no trailing anchor is needed here. + // + // Also bounds `.map` files to a short, revalidated TTL rather than + // Next's built-in 1yr immutable default for `_next/static/*` - maps + // are content-hashed like their JS, so this isn't about staleness, + // it's so a future decision to stop shipping `productionBrowserSourceMaps` + // isn't undermined by browsers/edges holding old maps for a year. { - source: '/(.*)\\.map$', + source: '/(.*)\\.map', headers: [ { key: 'x-robots-tag', value: 'noindex', }, + { + key: 'Cache-Control', + value: 'public, max-age=86400, stale-while-revalidate=604800', + }, ], }, // Chat pages - allow iframe embedding from any origin diff --git a/apps/sim/public/blog/mothership/cover.jpg b/apps/sim/public/blog/mothership/cover.jpg index cc26d327547c576fcfa91ea0c39d39e1d4b37079..598ade580b9b7a16d18a74578b6ea129babf0c9c 100644 GIT binary patch literal 65829 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
    6$ovGDsTSL$YqRrfUJ(e(H-gtJ275?+n(2{T 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 diff --git a/apps/sim/public/blog/mothership/cover.png b/apps/sim/public/blog/mothership/cover.png deleted file mode 100644 index e4410a5cb69d22b600b38f5f94a846ebcdc8a6b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247198 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⁣P!)++``&Z+fyUMBzyi&fH4{(=ID zwxKyZ+t}T68ZLaj-w|-EYa|h?dD`y5>u^7b^4x4j$Y>x}^IocGtW2(nn0Yw) zmM4C?^77U7CCojHqX8vf5zytR7nTfcW7hqA32$&x6kRFDD)Bsg7(G}XdHX{?3FnS} z`Pfn^1{`WZ)vT7ix|auAjI_e9EXOqI@#nXMm9#+7n+&__TRB=m(5PSdr`B9E3$|4y zCX?ktqus3)U@Q#X=w|a^d%JO^W;umscX$8j`ty(6+JjhhIVl+ZS3dOfzyFKh^K-90 zb9TK`hNOjO3yO$pZ~hnmyzRu_`8LvlUSRNI-Oo~t-9Naye&KAp z`*PcXs1Txe>*g&ZbI=9Zx#>EO>jp`|R0#wVM-IY!LM-{0OS_Ui_7ze2$$|^OylOAW zEUOCKh+4&+MA5nJK*ki5u`>g(9Kv7nMTzK=JpdXo+-t5N^QdQ4YWf*|* zg9YGV+99D~1D28guILnEp>F&`0^ra~c8pAnJRZLKNDAE-V{PU)qYML7Vns>c@9-JB z62q+PcySChVg5tF2`)3wy(Uw-G$sJ-`g1TIyBWTmKpMec7lH{KGYqh@z~Uk%si0C>dYqx6}_OSp^#QnmpNFlr#)` z(Ec)~5~gU_Uy44qc>(yoDqzpbdKiFdA5%Olh=^E$(+U_5Xz+6M&7X8dR=@*=n|CMC zPg}qj6Z0L|e*gd=07*naR8YYPUZ&1z0`O@xM`$A!i!8Eno`+TzUBt+&xV zd+GYKkKgLHtg3OXZf~8reDj%izwfvHpI`gq_g!_kL{dZNTpEjnjnxeQYHtC+i**Vm zu=U4xSC1}spS<1bmn-mQ?bjTum{*;1gn&f>IIC8Qx{(D0CPgr?q5Xlc;t{GO_wR~I zzY1kAp?~N+Si}vQ!nDu@mu14^q2W3*r9XR$Tn|U109e3sM2Q@X)dFF#3m2Z{9u=qp z>xAQCg%72;sv&T`P8sx6EZLmo;rpDr%RV3gCL#Agm08)f;|k)#0F1f8W19znLmr>= z0x(ZZ$iSZrZo1U0I>Us^Kc(NoqV&mL`&dlch1c1HNwnDkr)a85VQ*6d8ssOzZ^H%?O8{Y~Rc@@Fd-nSCcW!`#*0uf3y$es>y#A3N zzW|rcFmqaAk4HrJsHN*|LH&TbK##?`|0%GkzVd(ShgS~Hzi2mh3Z_xHyjFJL?VH|y z{Hu!TtQ$hD5mQu6buBp{4MZVWM#xx-6p|pN759KBlg?2*2iA8PKj;&C9Yon}O1qXo z65S9uVZd<>94RAakz`OTZ5^A<*}yu7a|i z5HdN8fI34f;DP>3=CBXI=)nT8D?7%~{cajQEvoA!thh&rFS-iYJxMxCf+}zi34lX} zG_W$8%WgIUck1QuyZ{VKjVUxiawvQ$$_17i4PSBr7&;wXQhIYCb-*W5O9?VeR&qtt zu%XH|HMOW}c^W0Cfq$e4VqU9WwD z+9=l{kV_Zd^*=uXcF?p2*2z27$f(&2=|QWIOy~hGOokQK2VtBhHIh4Of<#?|7t+|R zr2J7Wpa>;UQGB>4(3-Q6+em7!Mx1TOyBO_uD#}UC^=$*2P z=aV%Kz^Bk`9JeKkIz6~UaRqa!Z94@QCeR-dpRp0UYrh_qk842-5xEpDEe%beO}RsJ zj9lALJk)$3zZ2gFbCs$_S+ zdk6p=VM&UQOOH-kQqopW+Sujh1>k@X4>o2%{^#|$WfjjfT5^GY)Rwz z(Ljf(030^lq84~E*Af-^wweS;PJ+7!cxWY)IGZPg=Z%e)1r;#xwLk+=Figv=7!-W- z#M25w1P!%7Or3Lj-pJ>n2!?@i9sHi_bxPo>>Uj`h!YH|1d(wV$W0O(T+IrtgZ;Gtz zJCt74QAZa4WfP=%p%IU!aun&G?wJA%A^GnMh8yV!| zNonF}!bJcuK8}PnLGc8?H;K3GN7qq<6cr5vFh)z|GfT;Q5%PdJ909;M0AS%%0oaER z$$M9@2+LCe7%e%?QabCg&>lVjbH@NMpDBva$7fCiz|08%ce^#BVeJ z!!$R|$22}U8vrw-ewV(NoT??`+zk*I2I3}$PKtr854Esm1MRB6*)a3q%t7;vpxn*t z-ZCnMGz~f;94(ttUo5BUdO$-%8p>!BCdu{cxlQX@p(tmRv|7LX>?$zZDA`2cRZ?H~ z$YKP%Sf^3~tK#Rrw|aZ~>I+*C39_^Cp1oSxDc78O?&z}RP(3gyfkBEy)JOooWDGp$ zJg4DM>9U)kmIFC~D0qF~B(5Y}cnfXVNXy8`qx({xqeN>}!l|AefWr)F`s1Em9p^DV zeVZ=WwM*}<#<0x@GVQK<#|Cm|m;kaI7*wB3bvru%N4KCowhWZOZ99b#6DX!B=Qpwf zJ~05}K?^(bN4!3Ncn0iRg`mfIfn5`2YCRUTpuJ1!qArbwmht#Hc?)`QDF#!1JgEgu zk78g#zPHS06)c=K0H4aj*bx!(V=g)Fp>-!qSsd8io;e}bfpV9yp+F=gdD(?1t%5%m9zYaQvmh)OQW%Xw z7dNPh@Guz59sv83TaE&7AW@Ro`0Di%Hg(3Ma!DwNP{bZB%u@vm#{#f>7N6;~A5{TI z0I>geQu^|j;{q*?yq>+sCJWz$`$*+k0GOLX!kSFn!rYKWHodx7TDqvm;{~0ODS3_n zuxEfa0>D@vU-tpP-Xp=`{EcatN_ru&zP`-q(-Sk^uobs-9u3Gvcn-)LW+u$^w8DO7 z0wFwN^p52uUsT86()XQA$jw99qVE==qzKf0V=@3UUVON(jdJI|j1VLgvP446hzCo) z$t3|`(H%c!^Q2Xm0Rv}M(O`^bYuP-ItxUU7E)(IAp*TubrvOa6|3JEAnclK0geMK= z9ffkuJ_{&Zy|hz@M0B8@nutLet7WQ8vzqFDTv$NIVx7v;RDAb0^mFYOZ(7~vPNRK& zYYnoIXfI~7SO)T-LBg(Uph;38wS+iBgCU3FDMKVxffla{RWR!bjNETP;sURC5@cVd z-OWLcAlbYrN6Nz$pi&dI@<0?cp#mOrM&jJ6XqYn;3W@-@6`on*k-^It51Ut$`w{$~ z4~Scl*2aN#bT}++#4ef(j~)FU`{*%(i>`o4&rA@OTlKgsG6T;r!JANr1ygi$nTKr} z!qWi&N3*oJ@sgch8`0STn~+Qb(XA27{)^;k$FM7y3LT%KD_}f*h3Z6C3l(HUN8DN@ zy&Sj)EbsJ}A&HBbc95E*DISqAbaMO^<#h-F5~FVWew@#S-b@p2jf8j0Z0s5YM#(B8 zoGj|=v}8zd@(`tXT#YBic`9HbY%xuKj8$QVEDEXB%u><=VBdcPp{$yr(=tuZ0065w zt*B{+PSi-?idBZx;G4jZ&XcBe(I{4Y>;(k~l)@IB0-KQEP}u}mqQb@%xg$x$4&Np+ z05W1zUu&;C`j+Jd32U)VWhG4(|J2L1duKk=>9-sG^8W5Fc&7pz5cG6sOsZwC6d@>+ zT2iXyAB9?C(Oe@%m(obpHC<2ZEEaH(PN=XrvE|iEK21w7d=FJz`-O;jO1Mk{s?ChKuH z!U*0==JzN@BtT(Ll<2A#OVVg=$FQ?#NY*{{LjpH-A~85UK!1Zv-h*v8PwlEFb)n~| z!ZA1IjeT+eUOJ~ONid=b4m-yJ@Zb)asiDS$2OD-$AAY)N3B?Y&aZy%>f`mC72E1t6 zo)>2oWb*Zr}(qc86{kM_>vyh~yUq62T6<&Fs@DL3L7(2QmkrXU z=~zXBcyfT|PE}N*2xeUlRu;5KY{pPo)d2)194F+9gn7df$>f!lN4MTE08=|guS%Q( zz@x<-z%Q8JATF>=B$k#aY@5Y$&dm~^R|JlgUCGg)40p>^Jf7$@3P;?a0?r^N+U;rt zfYb7vDi+{jC1br_BFBx;c@XC0Apn+U24G=k0FLfTds-u5D;viq>%U}pP5}1(#zsv` zM@`M70ed|-t@%RZ837o47t^s#GZxn}WTQL<0FJn)6AyrwyN4x^01w*8GXU^?Rlp;r z0D1_3hyKJ(Wr4 zL$q`-tjC5*#FX&v6zkiGvT%s7AJr0ZAJ zoLMUupf6J?TUjv1g5FLBP?$7$z!i%Wz#2;}u~>KmL#C#d9+aU#j^=yd8iUdRz_R2z zU$GJ%=Hk*)ix!>}>>MKbEOZ*_x=52rB`Z^*@klZvT6r;BVl5zGrAaW1Z^Z$3CWoP8 zU~-9RPg`K{=mzHgU4kAoGqS@8W44D394HteJmwyBPbak}SxIE#&k9*~SVn@-kma>Y zHJ*LHn^|x>UeS|QGx0jZ*?K&wW&>ai0C;G|h*6M?G5i8zw`1<*GLMH!MlL+V6d8}d zIviFA^^*l5HmeXAF2>42wv^WaDQ2{6q(g_QJ zTw9OvA`>>cnh$_6XGksp3rkiaE(TyuT}Nc3fm_*!!}59u(Mf5m2W{FgAF=j7FSIUb~$nkC7TT9+vQT@S;z+|HKK0p?(%t+%ZnP@#d6p93>2U^c*l9yD==CR!vdOEeBZ%3?Du zq72BXtk=_p>R7?`E*RkHq~{CU`6K`)K+4Snz_fEl>LwR}LDQ>HlgbeU77CY2d|5+S zbO9K9L5j#L;Q~AvU<0U037(8PSbG4BX9i#wy01TJc7LplVK)#4MXhCz_7yzRv0Cv0m!xwp;g{M7(VE`sW2>yzaOxlWo zP6L4PsR1yz@=^iR2COg#0OJ|5FOLP_z={J@T(JW=32!MeBx)M@Eqqb{X6E?mSgl$r zV_qBu;6Pv$l3Y!!fEAPXh|!6h5K2=br!Yd?_YC|1ev2ON0^zFYwwbersi=N;noiXS zQ!8(}(_h%>9R0};vwXLmff1bTXe`zZ0c`Da-gFJ4zFKDm1H-(wEKAYzA=0N-LVFVi~Gn zRr1+Z>2zY11z8>eU>B50e>w!fflrTw-E5^}iL(P|Kf0r1>e)!ZmaxAh$z=h#!A$DX zzFM+sAap`$*$ZaCo?2#50gnY8Qu+_Vu3o|&Cwep=NeJ^rCU5G1_&7>h%uQq=gMT9I zA@VM&#m5Py!8^Bt|HP+zZ1BRW&A9$je^Fp%(NItI8vb1r#i= zeeUG|$U$0Fs7}6b0QOEcE>+xr_-uTAH^r+JhCZlBQr)otJk;0r!Wg|2T5f)`FF3Km zgIKQJDk%~d$$S%{IdI&31!)*c$9&JohXoiJ<$N5D!;xa^k-HQgR3H?*Z`kuIS!bCE z1MtLQ$i%-RUrx=485A2j0MOk>b^U`#SD8?&$Uh(rrr!2hrA6@lCF(HI;w&&tAXs+^zO% zxm*A-QnAt9+38q~mQml$)<6whAjWNmPTS7}gsUbrL^YKnE7)VH(2LHSuwxgfJ*@ zB&Ml|WZ10u3Br>BI6M``6tLw10E^6E=b8e*$deq+ZasmDplRH5u;ubh2L4jxb5oM^ zG%En7k${h%0b?|VbYyZ5r~R}k@ujc8}mL80G53(7vIl} zRq$#GV$+c@+E6(W00)f-_tYk{^Bav&vOObSh-ZpX{$!E%-6t8zjsWoJa1j$*Y^u)je0m{5 zTCCGtsw3?D<7d~efBn|EW~)}NU0%%<_IGQ|Gkr(j?ix+V3;`AvG;#DS@!|l9omn>! z%0Xk9CCCc)t56YZrcRobAPbgV=YFs;)MS*Ugyo0|m|8=6jt=ynX%-HiUd8j=aN!Ai zkw+AOW!jf^D_}`?QlH(38M;g=VZgNEu~>^>55ssLItSQiBqFdJ~7 zx#$Yme^N4wCkF&YVQKII`E-NhxfR8ov4Z{b{AYp28=h2t2Jf;|;+;vXp zAT3J>k>~>1(2zjNE7@Ivl00Am3<0pGExKO-7U;d>a8hNE8wK3hWJ?i6MP=xa0u5Ac zBd^s2>D2@P_WfHBnj3&YlUfvGXY82Hioyf{p41pQDFEYvuUt?8lh!GFDJBW59D*}= zYBPmYo)!SZTZA=MvPwdTD1am0+7tgCIcPQ zhRl79PR$_(Sf-xK5ujFSxolN?c4w{NbI zUGqtI1`HpD(ZbWKVBwx}iN`)v!bOFmF(UpI6jws%gv0zR?++oOkvnol$kRlSa7D}r z(<^i3|Ve@rYRE6 zg155i=P{EPNeX8`4k91jGmz|2+*q%hF;0AUjZ&gm(4!rQX#nhz)xGWs5CMajEK-{* zRi0z=bbyN`c|1UCE?ba61?`G-1%g0$>SaY3TA15||>%v2EZcus*?o z8qgtbGF|OK0I-0Kn2_T|h8cV7GH4C}4*f~Q%wR4>=09W`qUCKCCS@Ss&4lXQoSxmU z5Ef~MfG`+A7cIIfV0Hi~?1m!&=ahY10pBdp2p7O{NMh@vpt0^GMZ!*l7k*@I0lZ}Yn zrRwgVSRt)v3E+VekEP`)e{M-a28C&oCQS2q-HMfN{h%ivu$PGt*Hi3H0AO%tlH3Tx z2mqEO%J3qQgK3Dx`AH=Xycd`H>}3FlY_o6}cYT)b0Dx(+NufMY9?uHEAdUjg>6`!z z2n^Tm(UnS;>?GJ5nNI-VnTS^|03X-Vrv(r@)LX?K{vydph$api%F;kEE#uIagFH&t zJcFEBWOQNx#>WFNjsRfy))CbFYcO5}Pd1p3;HdP8`v72c5&#B28suitOmfV_;>7TV;;Ol{C_*)^mB{cyAKFj&$2mY`dtNP9a0u zc6Cw8x!VFnj`a1Fi{G*^;aIFwUZ$Bj`1|+Q-ug`S*?kZIw`=y=Ue)fjAT9*09Z8kC zQ#12K5nO~=>oo(!>#FWpEU9f-iEy8R;7pApK%qpOchsy7g`kj-B>|~KD@;=mSl5Nh zTP|u3D_y-SCBFvqEIx91{k6?z8~FA($iWSt01i4)5l}+K{1uBuK1DuUxcac@BFM*kL_v&?65^ zqcJzi59NkUcfB7El)Hg02#3tH@i1SS;+rg`1ydGvg_9zvV1qI^JTmuMzF{HJ&?yJI zZqg$VJkV`NYJ>-|%>#0{uSE9FRs-S}^d3+}6~Wsj^eRp}|3q-*ym+nPg~8*G=D0&m z81xb36jzp&w0n((2Zwb24Z9Ql5e^znB3#+Ox+1Eoh`G=^Y&0U|B=Hn8C2hFHxw=Go z*rGTVy1-#UnB{?teioT@bIJQO&>9+SIAjSTVjz^zF!f4NQ$Qp^7BMftnw`-o98)z1 z0bXxb3?6^5yA@rxXsgSD1Fuztt&Yen)Agi(qCrA&1Fd}d&E-WB(qhF<*$>Om-v4jU zcfb5X^=`jV?sQxB=C)dP;9O`(2bZ~6hauhlNR$YM)B}Suk zmPFoTLd-JYB^S<`OgS`PbT5!Mgg6IgbT(;EUmH@t6npAO3{f|^l+ z^8mKLE+wiuy;B0hBOX72EQU^{2Ur(uv@W{`4^rmFGHF66I9zAS*!!Jh0eC1NNhU+* z?G#zrU_?g|y9hGwJrx4raRM~Bn@K_%oC}4abAS}?Esp_kL{U2m zz}$2Imi)VjDvbv)E6aE^5HXl&=&H%%K(8Fp686J7JT@5~9qh`k-E}CA0?lc0Jp{mV zGQXKZx_cyhZ~*LI8!V%!)(cRRIK*4el^CQWN|^IMZ1`aSFn#9qz%7XBh-#nehp<<} zM#-8&A3T3Q2%6Xl$8(7G02qNL5v(}$tXb7_28nrr&4&=5Ne8-0>Cco!s?wBIA`{l! zc66TbrC|0-r3vU|l6;gGJi1!n^Vk1Gu5VqFivjQN4Ff@&JfTBl(-~dJo!U4?Q<4LtVVuj$xaK{YmvF0BP@)z zNFD>pO(jh?Xvu>o2jHt==M=yBtkY~@=sZ)BRz6RSvPd$pm1$R4sD}-h4+A-i6blAM z?)(G`YByJU?>8*qcd<@?6%D-o_utie=c~@@#rjsiTr@XsWm+~Mux_xmmTp$ooF?R0 zn^wotfU{5o(t=toAgtv*MAbEd7=-PdQPToN5tQk}XJ3b|G~_ps&pdUpBtI|t$Usly zZWT;QQqmW5HwWK-33~~zm^wvbw@|{v01Rh*$%9g`PG7q9QVHb@EYYt@REQkZM1cb| zlGuR@ba+d5b0+Yt);`{G0FQ1*5%MV<2H+v`u|TSEu9?cP*liGc4@>r&tif$W%r)V66*Yt9+X>a;M)B7xP%(}`N6EkOkxMyNWD7x-Fp}Jte+1{HNdO!z z%nFsB@QQ1iAWxWm3qsT_3}b;u0g$A@6CQpTz&wa@$i!m>GO5#)<%S+J(xPw-<4PEH zu9DH508B6Tgak;M$St$+21*L5=4FAgtouB1pyG-KTFlMl?Bc(7WE}m*hu4PRVFXDG zMR0|EM#4rM6YZ{vTP?yvHr8UC&G7^GIC2J42)9JVD4SEsc0)4DsRf5#(93`Kz z#>Jg#dmYT5&o$Jt4KbRUftqClI9bJ>nX_w-QPq`7rwH10BVSPRZZrennd_$X%K!i% z07*naRL=TLowS;RN(8=y3uO@t7d4b7btRO+giH#85n^S@j#=~vTe;h#9?)w!!O!8r zp|Zr)C3#lRUTd4cmhduI4p^)VsS(luItBnNqu~&S5ylgJ7_$PfFF+0@Dh&dg#`Vhs z6AQTia7-Y89m`un*Lg@I7V!?#os+=_27%nn-6;bt!R=^(mmyw;zP z_cRK?q$kP>mCGw>b=250nm!k55s=)tD@?L10cTiCg=puj;2wK@vig9Wcw7ZM z%@74mN;C7H9g_I!traCwj~zCs=B8D^1AEipmlp?7JW9cXUvGB;7Z<+fw`+T`*)Guikv1bE;9NGgYE;rSRVOzNzFcloluys)Wsx_Nr z1k;>*aG&(ave16k(qsgi-eiUNWN0t`wKe?o(?ZfFMVx|q4g3Gcy6Q*JH-fX4(&BmP~2Dq+tZL=G8fh9NREP>%*5 zkB-d=a@2VPdpC)3sL~z*U?R>!td)EkF}A=6lQl;{#V3rd=5{U;N( z;gPafHR6JlWn7kn55S%S>s+SPBfNC)ogtyf_Kf>^kyz$1iIqXf?}%UKgj}xaBrNj5 z6!|JMAYl<{1;8fdK?8^y)a;6&u8}hwSDoaBx&`&G3&6xP%do7XsTK-Ziq}P5@y_#- z?t09^Wh$IU;s-Vt1@K}$kX2FA)&KHS=(U&jo7Xz!gM39jznL{nyJCP3hqS3zjM`4I zqf_#rWz#pdVpIxEI8SC+x^d^yL1hX4lrUxijj7#Gin<4O9)pGwqCujks-7}0dUlaGm2^B12CRaR!RY5 z*AI7^0KlGhw^u|cR(*ZbO3JrWIj=|w+08B0?7M>L}Q$k~ng8Kzv zfsWRP09cxE5SkHyhcVE-7z~O4U}~8*2Bnbz?7u^%05FaO;DIEHKD8{r--}s_7$Unz z0I-k4SfUCv@5Px9fEnQ!r4#{RCAXF0!1Kj@deHzZoB)8sO{Qo7CO?!c*W-%knK1&u zIKq&8W&jp=cA%0N0$|cykPvVgX{u0d*Oo4Sh0APyGZv9K7zoxcD%498who+GqnK@RA8)b-P|MYuQIX ziF(D2uH7udJ6dxLaO21V+rPGv=@hh#J1tQ(S})OgER1>;kk;wO+pg^zXL#f}HjtEt z3{e756jn*S62f4AXJr*iT?AkcF{C`P>DczqdOwt=MWqyb*+>XlR!}HgRt{jnmm&GK z#S;idkqn-2u{(W{L8KJfg7)Tu-u?Q37U*a&vGR)La8U|n7muLPut+vA6Y-z~(M!M{ zpL;OMX{H`keh~+PDE>@dfRIY>${!EF6I#$yVAX%6fiffe36=x2o@WWeCLI93jv#oZ zW`PA4wT(vXnDaNCO^(W?sTG-kC(zA&!|-quT^_vlgC!~P=21%1lA}s-E>hb{P#p&{ zXv7^0z@Z+@@jNMV`e23i6i5;zm%2Yb{t4dVbLyRO=-S|@zzllzmA!BS6-5-}PQVp}b2sQMR7D3Kv_=S5)E29*v%p*#aiGjm0HzIU;AELbQ7s$P zFdFce$f=14NfB!avUf>{D_&E?*Uv5r;Kh0{D~|On^MSu`Hs5-y+3q+8t-8Mcm8*)Rc112uOQ8+O7ALemK#^$ zg99m`0+)tkC^=rzw>JPL1SUU5zM4Wv@Hx-V^Mu^bxSj zo6nb6WcVer94MXq4=?sCE64G~<5x$rXD8HV1IX|oib|g*r1#(uu)2+1-#&yAIO%qx zNSYTfBn2i^$ctYdv*ieHe4YsywSpuJn`7{o0&w_jj|FyUCN2ewo-&;I^ziZ@?gZ8x39dAqLP=ood#=xW)8o_eTiYprfMTW%Y6 z0a7&$Giy{Kq``(3wZXc6lbIY$Uf{j00>;ulw2aP{)oSa7Ckyqhilzvj4UgnnMgq7h z86uTWyFQivZcgfFm(@(Iw%q;}3W;38pf^+jv+=iz80T#OHg_Z%Y>iwvg+Z1hD_~53 zK7wV!&W;Q$rBIJhbg=6`#7beo73GW*&*`8>1FEP1K~us=1q{bJPsW0HjGlE-EU&1(q1+& zlVoW2U|6s;fN9D?8@g7*=L(l<$Wh8PF|&lKl$v_54aoDPn~Ci09TGj*k>Z!Iuz&@v z7CQ>bRwx!p>@T1&$v>jwUsC-->)EInb@&h401JKYCHew^`%cdRd3ho>l?OFyRO@Iq3#qMr&7Nmsl9r?ra85SUAIij zsTM6t-v^4J>FwA^Hx!6$AX0a75@m6*r9(~Ek%77ep8>m7HCRD%X(z~)3DHkU+SL&I zgbvmNU{+xzDT03+!DE(aO`SU0PGJx=d+e;BOE>^vYEVSUUgNV%vWv(OJvMI;D@}%^ z5OYWx8zf`b{y-j{=LS9`uK5zZ4S{EXs)9oR?4B&x(7g@i3XNMg;tBlWkfD<_oLJ;} zBT;CSB_90x(w>5A?Ab~qlisP5Vfk1j#+)=LmQMh{VW^_hNO(5O=QWXDaPKEv`HD1Y zgdQ;w4q0+WTtH0a!g2(40lCqQ?z31rx4L2|;=p=rD#^$-34vF^r8{6WH7X(?y9bUU zlK?nWohtH9IR;Kqt`2zUq;w1bdxzG@hr)zhMk9aAy=L07nWaG^ZuD9BQ3n=hID9|j z7OV6?4IB#B$C3ky5$p}*W9(2?B$#Fp$W@e_MY0C-h6Bz)xqjfLgVz1NhWm}v1o?Y3q!M@Gq_~+DC)g1#< z@-h^#AO+6o@BtC5Cz>|MA#6&MZl zuu%ZavdHBX!$%UmZ;6q6@Oun3tq8e2a06wL>;mxke$EbSNd4(7DGxE4Wd!Ph_(%y% z#S>nQHFPtWvXDFgrm0b>Jvg`E;R@KJcZVFiCIPSzY6;E>!2S($dO=hXizMkJ1#sjQ znK}#(HN;O)0S~=eE~Y2z{biRB9sn@B%_0?4!OY*Qfx}tH@^Jt>?9?$zOW>LuvvctQIQSPA73}LX3q}BVLIoT|j?fuDyrkv5ICYA`$5g<+ZA#dRZb}904`0!! zON@X2V9qKiJx=EQW|iytJ_5jaDBO9x@9w^!n5CgD@RZUS1u_!A0=Gs3k&;O-;{mg@ zQNdP zhY6L12HFsusSw>q^+I~-pYJawz>D=DOJK>dg-`u$xB27S&hAFLU)NhtfNri{2MtoA zmv8P#Mys~ErPa&jEyLI`tqL#*fi;-T>87o^e$TF-B-FGJ$)IY&-iF@P)wO4qQB8g!j+Y>xvXekgAQ8iK8?Nie_SwRekJU8fJt~7P`&|Fe6*f5knu@@6+y6DnW z-CzTs9ZbN9mO}#+3<|mcn{e1p%3~Nko@K)dDdiy^gKy2 z@y#b=s%r@8JA<*IbIJG+dT1jR1o?PM@z@u`RWpa10_*o8PJ+900C4DsP71(ibSO$* z<9)Y(JOE6F)}~`}VlN?)wsQj_GoB_o4goL@d_5wC%0MLNO-m5NuHezgi-Rg24*@Xs zei%5X1k;mH*LP$F9HGw*NOr{EOy1@Jhv_vMetjl+e+DA+Y3Z7SI8J#)z3kQ5;0KoF z91P8PMZ(B!G|OWEJT&Q@D2kHZce!hTL+4Tw(~^ZC-GL#F)3m`R0F5(m<#fZ!JoZcz z@?!vlP3rdyF~Kk+qiT*^PSuL}q6!48e2y(cS2_c%6q#;7q%u&nT$xccg%GD7Yn1MO z`_jUNabrZoXS(O^Id*1ec4zh?xyvP&q(rVrf+9sx1O!r$ zKw1(cQJ^83mJLcIZA-9hQGjJq0&EBp1k!>)NTh8UGEGq;EZP)J+Oi?||KEEN@gg!Z zt7>MsJ0oN)In&dXl}BX6``-Wm-!VPxMlT%i_Je5zd&jO|83N}ab|3~pnqMGrfbTiC zjceO2V%gS?Eb2s4S-90STCL5t0S_D9eg~;r6uB4(!!FkWn8;xy=n6oV%9Qb=GRw#T z7&OPKnZ0)7PhMG%Pc{X$)zU_imYB?DtC#{{D+6Gw)WxNx3cIL6**O6i8j14&oRzMM zv6C^6WM8*5f!eNdP8F4^aRxTja&8Y^tpDYkD*QR>Up3nFeZ9eSQG87GUbv z1b~g^`jOu%QUrymDRGVZ)0I!8wH&PT0dS3}b@8Ft`n~ir>5HzaNtXj~Q(xCfqn4h%ovcfMMSWVYF*|!r=;z z(e8eL_{%Xb2}BvdeeRGrG)Za03lL7Dz6s?;Cp4yaocOP$s{(j+{5~IDCmQ_YpG%+o zP;Ynp+QD|}J?ud)S8ouHdJqeI|FIj)b{_2b!JVn+5BIwPSVMzpDnx&UP8`^7R=^UP zcu8Ugdtm4fSF+<;89x*$y}(jTP?XSWt*>2%iJfgnR|jd(f!x&f1{VxzkQR%OCE1w< z4he{#94>6p1%T$pR|rx*`d30XYU`&aYxY%w;buk9uxj=qC&QKvIV*>&YzfnL`&O;^ z<}4s$dM#wWTx{tZ0ztHB4xA0FfUUEfx98d< z8H@1@jc^?RLm6oVEf~ZC>bsU^{AHHd%$glmb3r6y`PC%-4EH14*76O}|J}3j1q8Sz z9T?x*36auAOkw~QG){nfu$a)$pMZ5e{sgLAZzK&0++xSe6A~FD^q~{&-x~A(@&{J% zusVMKiCC8P_V4`3^yxp44i2W%aXfvP^m-GVi_8Wy`}CA_k8bVX@cl;+*bp4~t}{#r zke-ReXFmdAFHxZg9K4jgn})dg&BQjf6&p92z(RCFuvdlYO}o9>T5mINxW9c8zp?`j zWo#w2%-m-}31)d$XzC$R+ZBkE5rru0cxWTduYBV-TxmRt(Rv7F16j{lJO+gcglDQ( zIdoOoG5Qi_SaSSXAVMv|%$0{sm#GwEKP@GRVg7k;TZLdpWvi!JXBR#|R7Y_;qtbLudc0-DF7A+EMST0@^0Xm2Rn4{ zXHHfH@ap(|KQ=v1Kl88tVEXVIqwU8#<8dF1GzNn~I_UuuYuCGdll2d0*S0%`j%rCc~ z8Oupn6#%|KC0Yx>2vJs}9~c)cT+ac(i+{VW0=_5!Yn&-mff>ycJn72${yambPGi!V$3ho%OGNWUwXo<__b#V=gj{sLu)0#`7s;5Vp z<*y0J7v1BvrgTm_8-TSxsk2)Lz~zrcsrHNN0s~F$?j@VZ9l-(sZZ1tg!UUyeoq0B# z4Up%VX423;BRFw%L%eZ1p4}bw-SK1G#Bzzi_zz@H)98g31(^nH%NwS^UF*)IL8^z% zV-v<|o=5hNqsCwP-i;MHtd8IRquHg_pZ&kSIC}1zqP<(&X>a&)kRk#Dc@Qi)><2r| zxED>YgFeXtTK`}SLSDz80K+g2ywE}BKh|q7*iD`Zz?Vi!>H>|kOtcDwAXf|55cm_Y z|2v+!&fKN}w8g7OZjeszB2f!AxR)+BvVeKK??B6kq>8R@ix;rjtJijq%%3>D4F6vA}xl;wx=G_lSO{;lYy#S8GwTkQ_8A_X6E2>>gL4PC9J zX3K_%12k)h(eQ$vYg$e->vu~|2rejq{2gerS&v@dAQFBt1sMJhHndVnh9XCFZ766{|=JdcDd z5ULvO7DF>vU@&@S`l(&tiC(J*PQ%oBYG?VVl&n2JC;*dYa$~FM2F;vmZK};u89(&6Cgmwr z2H<86z#19a%Dc}w>8z5FC7;f0mN`)ZfX#hM3)QzCfucWUt!1_)bbMw(h^p&D&)*p! z%)fhJ^srMbqB0h@pqr+isc9(Lo`@v_msWFuG?+TDPxYjTT{Od7VZb4_zz(b($=lR~ zzB3MgIVJ(a4;_$gglvaB&4EQ5vwqE#)L(TN#Biy9i)^!hF8{H?=P z1A29Qbq-)mIluS|-y2{3{z1Ao?Iq71`TIMw8L*+_bT;fBe<}!iv!mGS`OW}R8Ln;H zRM@O~sBZ6IN}&U7=ZQnHrtNwiFC>0Ipss@k5HILNvh+mn8r$X>#NhmL6c0n%= zwKXc7!bmG5M*cRGqZ+Fl7%ZWRFWLl1g1fb3Ph)O3TEsC~m1-`pJ(3Zd^Y8=(Yn45m zA{xybtu(cuiRS!o<~6I%gi>eNNNt1GsKaZn@x|4!s_2b*OJ{@DoHy^)cI=r{=A4u{Z^dT{rL` zLaF1!IMGBY5{_N~G(($$4K(aQ!zuuyZ#_p34Wc^K3J8&agnLnuZDXvrP=wHEnsSf} z_i}o0_jEAX`OM#Z`TDbe=Gfei+vD)-?>4#~^ryoKs*+t7+_5-%5SH(F8GvBvHnW-g zLdC?px(#wp6$5fxh;+fsp{IFL&sj2MoGHab;Qbgyc^zxfEJhy>FJB}zHJ{SPusseuWBIrf#_~BXXm~=SfBnMzoF|$(w3M7xX&m3RA`P0o6EUb>N z(y_G#5{f&&`xid3J^I17?EPNy>YctA0>=}uj`63hr%&6Hok8lSu^*>sYc)NX0bRd~ zBxUe7_u_!=&srG9U<=HJV5F{S1Boe2rKW?MgDXg>3SM!1g9@jRpiV|OC%}y=HHn*B zTN@2y?Q)~NwdOr`y5sBi)*C_RX4D59q^Zv>__NBxeCNwmeF?1 z-2ca<8XJe2`a;oYN@ouNt>W<*q#z64kmEcFY>h4a7#Rpyx{Z<8*(SxklIRMTXLfIU=cm~q!wDRt}{3z^9G1mDq5!vzz7_Llix7vQ!BD&1BxDd2{ zH!z6GO7X%8YYu?(->L&(v#JcYN&u{CNj$^Jq-8Gca;lz5=pMBHR{E0w>b2vV=&n#|c$0+O;XB8o6T0alj!L z?;IOl3lg-blq&#iI(ZBaW+Ve(cs%f~I1a+#!MuI-bA0V@JXzJhtK+M7tT)1>^_k!K zp?CM}@Bez>ID20XX5$!#z_U@@oBI60RWm&Shss?)7^JYXw7b)tfG3`UV8@w({S|@{ zM{5p5CkM8bVd5bXk-Hkx5I9)s4ygjLmdubiqA66w56F#kqtOJjOH6*7-kNl08=$^y ztgW}(t@X`y5I41<9SxD)FhDZ2r6qT~bh(fx$mdqjmdAjqZmHyn$k z7$hY^Z&nqfu)>yaDv@goQ2|mVPlVd(Yt9mfW+4pN*@Y@#swG0HxFk{dxGo_&*Q-c& z_{st>uI9#kuvKg4S~~;XItvwcp&s}709fplfIX46Tih>k3RD1DRptNyAOJ~3K~zbq z1F(2HVx9%SMLuEiapwWJlv`W_!0H?z31iT%1K=9U-lF1Hz8O>WpsJ1>RkJm~Tk`7V zhR-uPnY5rR0kCkuQzoDp<;*nAs%47oL+3gnSXJ;Uaz(eedB-oz{Ps7z_=JA>n|l3Z?~Ul@E}EyNQ8euhJ@3wG14O&QEa*nP0D_U=D&9Wwh1m>- zA+>KriQnlDBk;~3!iEQ$(7?^YRBQwzSKdefW*`PYl9pRh0BHGsOei^#L!s(Z9DPD> zDMa_JK@6b~QD^w_!Qq%bY&8vn*(fl4R{V|ZW@g%)lrdV=yrxJ)Q=_M5w#8R1MV1E+ zD}a`yWPH1FiRHq{xv74Us!Ugl7SB~ICa}eJ3-F;#?zL5I4xRaq*9B$uVb6K}>T9nZ zKD6I_*MhTSwoNb%Yr#IEB{P%c46ImLVLR_&t_%8dqb(>J4dBs*Ak5&8A%9nfrtLcRmur9bMp2>N0-DP?8mw%KG z4!}xXW>t%5rexd3j=OGnr1VpPRhiO>TAB{6EL5uia9$7U@lkn$Mkig(RlsFeDwYFq z^Qe*gUZ3|pPD!m4^&s)#D_Y4z@ReH~0H z6)=kZU2{A%l&yyt5>qkKB7S@9Qt>Bl`%#dHZ6R|D0G50!NG9*Vu*@nd0w>D{+p>fHV#r!)K8o}W(lk%QHX2dKjBK6-|M zMmV1KyTNV{b|8=;3HHZ*tPeYm*|Yhu-?#e{phPv<{SpY(Qr6K`n5molUwil-`uhNPK>I0$0eqzJN)TWqXJ0GEQn>P z;8w%)9x9dHuomTW|B1Ui-uk zeD@E0=1+b9owr}Scjx|{aXK3e15A6w9X_l#t;YJ+dK-b+m52`Sm57$OP+r)WN!7tn zaxSZO{If)0&2$^;l<EsH9~&El76tbiMK)uLUU>dZB8O;>5WrN0)(BF-U%TcKDqmrXqwRJ7 z=H`Nuw3dj!cygVe7QUHMBP*VlOVt)lfEDczrZ1*dl|M;#MlK3tWOHYF3Ai9k{4M4u z%v-dI;qTc#C~Ed&sZXO{p5SfkZ{{-{QD?(G(&fga-?Tj;lYlY+Y}N(t;%(tLN|Gd? zm_Xh_u{D%kDjSXXxJf26-gvgL`?s9lU^v+y2Elj;GhQ%kOQJy!2ErZQnE*=q{n&HjJ}{LbDvX6L zSU_i-UgD}gbhRqV@t12DkoEVlh7@gB7&Tg$jvx{bVH^rpmkv4Y-Fe}1vpeYEBP<+z znsb6k1PcM3ihyl2=K}l|u0*jM{ z6GohVe{${G_V&&*|8d{no%ROPovWu;53e5X-M@Kv=iaMNA3oW=b_A37;mCtNbcm*l zFd$disbD_R&SuS$qJn5C#%EX?i|@d2Kejuxyl26*&j}pa4L>gcm$8;9iH4PIv1&g2c`|pax+imiJ?8}h zxHv6lj5KJ~OlB9XfQ2ZaIE94P0&wA9!p!jcOQrphjgD|`7Io(-VK&tq~e}tj3zVa~=h2{0Hz-a2=4dX@qwZrF( zD}Vkkt+iG$z^mh{98I|EIpMGWkM|Gm?d-q)+52C2`^L4syMVww)EdFzY`@T%%z_?_ zfzz>vtG5SD&uDi%v%;z2KCj$T8^1TbzL5{3MZd;c zkSnnWfT_Njtpi};!j9e{(4!e_7-l@S6aZ5rmm1aCUd?~_$_Xo~T&q0r2z{n{PwM;j z9PoudXd=B5s8=phEQAR(SoHzR(8ewt7QjM~L7lLzmDQPNmJ1|HJD3@hH~cGy|Hxiz z0W)<43ajI*c^Koc)BCMo-9Np3yz|_%?>_MM_NE6Xz3o|mi6Y*}8$9mJrdWGL>3BQ# zBrmDkk8a-R2axmSC7w5m(J;&I4r33a2T^?I;sTHBm=!`MSRoHB12ExkEdV3U32r2G z!b&*H)>oJKkfO)!*EU%MgC;aomrXpgD2=LuoC^Z5oCtqV0A{5OntTJ1y&pU=5T5$n z<0cEsy^7Gt#O7;3n1RNEXTTP|!ZydULxit|fON0JDrF&CUhD zOzD?YMl{ahOQ#4-WHtk*ZF%0xirAOs+>K4M4w7LG9?4ls_~XqpSi#s*;hBs4f<^7+S|s-Bbz}y zX*BSOU}B5rIhm&+Q$_i~kHmz}7B$;4xY2Ak8!cS$8ZAWWjm^zXfM^Rq-HH0aXwo~{ zKRSBL4)(Y0!@=Ww1a?o8c-9+Rivd_HR@tP$tx~FJt&g&mzr8GJwPc3IN`92s?AJ0X z$edwzVGLEG0-1V-Bq#kRTd??Y@g|u*vCgjzx#K}z0jnARmcQ?OdQYiYG)#**q|`v$ z{su#b;j`PhwdF4Yd&%l~`B-C)BUS%91(^=d<;cj#=AxThzBuQfo$8j*g-|%3zRUM* zYA$oi0&7UUZVLq26s6B{@{xU8y3?c%z~z8Q_2Q;vjm-)7)MgehMlzJ!(wsYDd(C*# zM1he5!!AYX%q=}(Z;#3c&_96w!nnU-Qlig*ZSb)4;9YY&=$QBJZC?5D@42+zTEW5U z_!@|j_7mgy_x{7=)#JOz+jl;5_oR0%IJ|+Ll>NRROvh1r8b%MEp9Xg1gDEAjp?p8- z@AQZLQ5Sm9AP9#4n|PhcsPCbCr=L`mIZ&!}@Nt}+<52gPr1A=?1d?`z$cc5pHJyj7 z{gyJMBbhS=s|i!k0eG?Rg2pMe6q2*tae|)D;!z5R%l7^(^OIzh=q8hrJ?%hjRO=1e z?!Du*=}7}hSX^*S z&fQ9xu0I>Tp!TlGJOJm4G;FHKdR(!NGuO6k?S`$>tYJ#ul=lO`D#h{)pVLKy;3A8f zm1Z5R;?gw{2yf>3jfBlwob7q$k=kT0#`D*(Xvd}ZBUVPnfrDlS~oKH z=L!JJuhz2kXcO6O$T-%uwsSPd0-sb7YxDlJ#RShJbSqp=d6jYDS3vC68=u_ZB_@g# z8p31jC~n+%$GP&|Kee^O-_`N8Im{kue(v{vGI{BRM|TD+H z{dDIx@t;3E2s*nMaP9Yfe)!l<;>hdv;lRK0{D}`uRIsOnniYszFknH+Ed0+FeP(F& z_-K@ct1u;$EkfTslt5HoT=9HuX<|u-rr;Q@MOW8_W*;rEWUISUJF)ixz=f>hyza-W zsL`rxoI(^KLKdt{*DZ9a%Ig?O% zcwiU87Ux?$*s))|w+p$GpECr~qs@ZB$Z`bMDCK3o`q=;sQcV0}nAV2IzasdR>D4jM zzwoj)oUkIjNGpFuaaNoQzA<=V_u-8W=1LQBrVAByL1eG!p^IvEK?TgRjRMP{TohF3 zBLh#raV<1CVe_)%^8v6Bv@!ZY0eHEZx*ZcUt1D&rmU%V+OWd=hZAMm^3PF~rev3{3 zQF}xDC`N#D;M8d*W(9y3SHKwnTh!7jV7wyD+RG_xj0Ie~7SY!>xejUooO$sQmBb~o zQWge57!S-s@3OG%U|BcE1z!Ma!w|~}hRyVq*_Ffp*}1&J-_`Los)5a2+WO>g|1tmN zyU*M^`SQ`u+kfooBpOANbdqlG-8oEq2lqO`)#HOnaO8A>g=G&PIh{U;Qh|Zh#l%1d z{uy<{P8vDbeMXl`DUcE4V6nu4nzjQ!f=9xz*ipS^SLs*Xtn|%Gu3V|axdLF9C7vNY zGu9p_%>o)+3BgQTj&ubqJJSy-UyQ`Gke^xQ)s}qnk5;kpyRP)=5M)fA12EQYed4xy ze`3oIDY(#@G&SitpsgaIspJ{Y6N0EMU_;KvxD)V+zjM787f=q#|JVQ}dv)mz2`&MCb7VTx1Rdu3bmu1XeY`X#3`8@U%MTE4#JN6_v}htNeQdrD7Fdq0@7v_wPV|XFJG;;!AKXA?hR{}UY4O1^UKP66QEVp9 z-MwP}pHHt8NUP&(hrrf^ZGP@o{t$oq@Z`~hADF)REr0mVUa#u~!?-t_Z0|;so6nAd z>(k?#vu$WMllahsR*XoxFKpJ8N1 zWVA5xDtlJcp{Qk9m5-YNuq%5pjln0{A^iXVyr``Gpa5KYj%LDTN@uBse1-!y%lL}t z1YoRyv6VwHa@TB=S^#d=0i8NWaKty?_?7QBpFSQOeCd_# zd(pM4ckW!>2Ve7H9D#Yn?BLZ|Jl?;z9p80WdH`-tu@9o)E+~c3j;SlGnfg%Sy79!u z-6`u&K&F?t`s`2)WdwVLpni#9nlPvGp3obSxbV5I2En3?WF1dtfrC51<(c2kq`n$= z8l5XF`G;BnE~LFn@T~?7&THfZYjw!$XW9}Iu*u0g!12EP!fQ{3f;fboH%{lka0&KS zD$C{8&BZ4tE-YY;TVBYMgvgR}epY*a)2g$ywY45A+UaKt80b{z=PFigLuAN;qN*uv z{8g+*Yv#g4_r9|vXeou0H*eL zn3mWGWa`w5x1cMQ-RF#CJmd6h&w;ON4~*=sWf`5-EW^?_Lh^kH!%%Hy*Cn1^w4n1A zk)>xGT1FRw?kQol)OBT?H7CKEpGl*?x}LsW0^n>mKuFgyMT0^@DaR{0WM-CwtnKZr z(TVuJ)kdCiM_I&jF$)rYu(TgH?e2s$Pe0eZ@}oby0r;aYTTnLc`e4WJX#?7`CG}x=3~^S)Rb0E-0>05~Rsk_vZP)7Y4p zglfi#YRm{>+j+T7m0^?Cg4Sn$tn~M}eWl9#VGBFIix0`%CbZ=GRRFN;rwj9V(oSB! zoMhT0QdiiX1;A&M#H(Q#CRRb(jjp zQ+0N}DG^^7%Fjaqz~C7AfE(aIlaJuPQUEM^trzOJScMr|wE~7MU3YI&Yb^_EQw0o- z@*AHMUW>mH!6I7SuJ~U}eRpP`8G`di=d!qDSg~Q$D6k5~V==FxMs101W&jLAD#AOi zWH`G5M;xj(}$;_nv+J*42Z9lW4SkXPbC;KNC$Kc;o#T zYGbH><9^piDH2-2!8Pt+E1HvF5CAA?E7kTPun5a#0AemweqtFZ*%+0Yk0od(1q$m_9Ys(x}&g2Ehqveq6MVzr3Jl`uwgFcdTxH!6Y!0Dc z?R8;q*cV}3@;4z&fk=C9(HRhJ2x=CahWtH%3yg3E$9W>>4z&)vHt6i?Jw~i$(L#F0 zkgPAO;_-_nBrm9d;h(sJ*fuksvBXhEYkSZ+!L3vr=l><@X7%IwTHPR>wvfj$J^xV> z*vkRi+Q-k|<#}58+B^XIUZ+P55vYmZhr8Ro>4~f<$(wWCY~PO0Yp5&=B()Qq1%u2$ z=9j>|=V1j+CU)qho^kZLe`Wm3_b+d(%HP%TwMJk+Y`^z=pWk@&)))TpwduiN(CZBb zvwkq?4aU>$y&Lyl{nC5S{lF_%4~92;N7JC|d(lpclBA&oU=L|9APWXa<_1cShQ%*24GUcu)Kw>8qP%xU%V#%fUey=UgJygkDeQVNm169 zhqQUVf|Sg%0d{XKdfFybZ%cdt0A?k7Ggkgd2 zK5=@FZ#0zA2BtrQ5*mCyTaatf-e?!ZzL&CfNl zw(m;*RYKbUEByyUGYOMWZ|PjPUjTtXMpaUD2IoLr+;fC(s}{6jlj3xe#lB}^RD}6=)NCf7kq3;(nHlYv;@G5cWDlxSx-a8Y}O6Ki?`l9>9<7- z8hkZO&oMp7qclw6JIOH!Sj3k|!NBuLr#=!V?A^EsVo)wgP;@w8Bt(!T4edSf zjgw9aivbv`TCYnTUi4ngB!D0>$_fB>eWxiG{(Pu~{17ptcDS2WHkthg@^cu;IAU22 zdzQI#p$fPts>^7TL$G*lSsVZ_jc%H+uVwI_edH<#E`U2y1HelXhZG>=|2hPtjd}C5 zZ)E_ig+snS0ABbg#+Gxu&WBaGokJ5_$gISD!n4V_`7rE9+s&faz_PDc^hBh;g8`nL z#@fdECOC<;F-3>?Z$G`iz4v5%hzfQwAaq4xD&n&8%w>2k+rzTSwJq;sM``->*yy5# zf7xKcJ&43 zDqyp@Xly}bhdXo4Hm!vLN!h8klZM=cankh~yg@MFp-EK|a44vZIRJ}Zn;j1Owi-78 zcMo8i*k1s?9&=J4p$z%p<=rcdzx)R;uh4gOd>9az`0nNBe*1?mecca!?+@SK+3W2N z2K&3y>(c>L!)f~Dkng6~A3S#y1pVo_7x(SmBfw@r;4T8N$jC!qO2A^AqlLY(hZCE0 zJnT!r19_4yEh^!b=y))UL4^+Vih;z{5z#)-qqQm1{Q}j>3cmYY*z7WyT`%$ro2h>5 zW04RFi}pN^R+h>#=NkhQ@eMkOWE_jt+||%*f$(Tvs#7=?TC`d`>HsV~;ROv>>(v4y zGoj?lC#QxK$rj#Vyj+sbc_x;~W_2Cz(lES|4(P&Gg_xp9Y#+U_nFB94GA;9?%xa~x znb=EJOXaG4sSRWekw;WvI={Nmn(@YWUfVD>?LJlKA!ALsVxF6SwYfiqDM?+8Hl#}# z&4doY(F!(zUNCa}H~?Nlgm}ya%^Cc~;J{33M%wOiFg}_(r*?u8Kmh@n zn|~NR0D0*-3>+DW44cW6`-V2W#xKHE)BEC91LH-fpAk0ZNy&s z(%{O*kN>Bw75=V{55>{4`p)Jvzx1CZcV7AAw?2C2aJoI{4fap=4i2wgy}$GDM?Tpb zeyV5OhIw$XJB}wHQHtUSJUFlhhDmS-F|qJh$Ur7s$?ge z>RtNk^IZghNtss*u`8DoI4^}-tw8F^{)RH~Q3w2|NV=~<3TPY-~ z_B-jvwy$jc%umzR0C;tLSP+;xc6<8oexbel@+ZIZ>izrEYY%q(7}D`3qfzQ~4tH*T z_xIoI-@o1kljw2U+fJcu@VmY|B0yo#Bf&JLKg1#!$j#maAlM)tQlCNnf*#R0lfk7C zirUx@v;>3>3|0naHczMdC^b9WsOch~SctJamC* zy-lJ-MdA_eQELShx#_E&Y)5HZjpR16AFViB8@%dCq z&rnqMgiAsfJ(2rbYvEQB^|tg94xSM!)q z#W?H@P?#l>)Es$gl%1CNqwoaFf5Ua_Od>7H=H3*g%5sd8&dA^js|;z;Uy>zNPhY;y zGge!WofCjBJYv>b(AgxBmE>fQgJ+hRWJI43>pjs-X2#1EI3p!GczM#Ab*w>KytzJt z(MsG8Z#wc~M~h*fxO!{i`~Yk%w8T&!xgLN?<^h?19imA<^BBzhcP#Gt9qi#9!1#*yC;o`p+LbytMvT{};Zt;$N+f56`hd zBVwEXvZc(?ZlFWD{b+(}F3sgT6WxP2`2SvlNYB z!HlhQ>{{D-Q7deX6@|7E?*t$T&X2^cKmu}q;O&{_`u3xzh-!!m$&@XMe>@MWC^oaf zmgIJZTs{onGIG1+X)PeTIs>k&fQiP0vyPfsv1m!kG`H#U3Rq}o&Nj#ViUM#}pvhD_ z9e^bl*lh$}n-^IRgf9;u7Q8-ouA?a0#Ws?V_M_{`{?IuLjO=^myfkn)KgDc00B53I zT2}!Rl^MkZF?)%58vJHBY>7*gTiyaERx3+buBHuE{*B&Mq})*eMzUi!2qkPW0IPYs zWWhD_WQ)u<)}$o`R$X9aITy>K&4A#Owr_eHgtjr{gfFyH72i-d_Fjg@2->HiGdfCv z#jdsIkK#`H@bRVf|K@*n)>i%J)$w6Ewv4{fz4Yh)#VZ?o&;Msn_^VghOHb_G0T}+x zVmMO&>l?$Fv-jKp^c&9b)epNT-wWOtzU70(%|X zRnBl&CX0eow4&i2A+pJgS$f!#4hxb{dGrZuZ)@bk@YKS^S4f}|&K4~7Xurmh$2h2$w}y7s)CXwGgQ?HPey{i$r&~G6gQC#$>K6*DGbdnc6vN zTebv&<-6d#i6zyP6S~Z)>P!HxG2gZ>irljP6pOepk+8HSTAoPC$Lo~T*n=sDY^%oY zk`i)004}D+V&i7{4|ijqcT6E`FL{u?e*=@+Jdivrsg8stQcMK3kF!!@Nb$<*nkD@1 z27a-wu@kkd1>YQ%o$y7&-~y6OQcPY%Lj?3$ElTI&C^P^zMe3%}ENEql$;|66jS_z_ z>p_$`k6>*!v*23T+Uc&Fms@Rp zcY68q-}*&Q!_n?!wiCn31Q|$RjO9U(x*w-;G)obQ9ZVnuJ83X50L+NTaaI81z2Kl#g6KPk zDzN|o7?XVP4rLg!4dz+^-VPV?f;sssa;hm%dchqKRvS#4gS%Gja(Pt(t7faprk@in z1zyfn3B?AP(Z)0 z+l&G1MLCL2l(;7e(Z*Pm`%*iD(TjO!8Xl53q{wy=MROT|=UC8eIRG18WagU#@h@&K z8mGy1S^@BRE8uei&>4VL@e;N4hBA(G%^R+X#P>P?u8F0Rj5#@tsFth?Dp;0%wb0Ep zQhVInlFgY#3bhXoz+%Q}SPP;+xPxDQ!7`hV%*+kRiTz#+0hn}qO^YmYFe5BS{Gt@r zD`NS#=A1I18Lu04K_D6co4KUgEa|D}c~n<*`!QnN_S?<1@u)=`@13qy2?eAw>LKPn zVL=c2MYfnRVLqD>S_II^>qPGyuU-22zhhi7jn#s`IzD7aV`A8sum780+wUK|`F(@I zcIS`2?(I%faK?(Gs2{)Kz$NSqUOe>Uaj$oyH-%z20C$6K*Pl!va26iqixN3AIcsaJ*m5aWgnUg(nlh6@Q&tw4o03{CTF z2Z1JcP;&692P6iiLXTI?7p+dZforJ@NRqSNP$M$CuI!VE=M$AQR>p;KqNW-yvTup5 zrz*8YE5DMXv@`ZEGPZ=`G$vrw)CX?t&OK{E-&^7%K%=G(e@ z6p7FR8G;FwkAcm4sWMxeh7Ggs`(cIGhVXl_@)$!pYLjwYD`2X^Mdm)(K`SRg- zFMRh)!C>4&03JpB)_ydLdfmZ;nJc|702u!kyr9LXQ}v@UK+g7jo0?f3yZ~UH&oFZUM&P5(n1-UH%@f(dzQ}=y z2$UIVewND;2jI!E)g2P1#oa--ON7Yd+f2|>OLeTvxeOxLUd(S*VUGoh+WZ%eMW!7D zmV``72b(5Z`JkPWOnS1zuyE@n#i&YhtR(Vc7OkrThYrA4M{`|IwH$!Klybr=034F# z0Ly`nmt&(pH152w1D*!-&8$gEZ+s z`DdS+UEluF$Hv$BE1w^vd%(jQ;T-tTi+j6Aac}SRYJ4;p-k8M)DKw&C{Odu!SCAkJ zD+&OEy8?hcAdO;JLjanWD26tg6RIvWf{plxY!WF%PH-6PNW%;{tjz|t8f94h747<_ zO{GD*6q68bQxs0SrB zb#n$Y7h+}yc&DOg&D6SOOQ93I6)O!}6zspmUPHND=X(d?SZhlKk}Egu#V0NFz8RBL zynk28sqC;uK~<}+f>Z{ls|85mTXQ5LGe#HNVrul@vxrr5L4)V*&*sooQb3iB_T|Qh z`j$mlnHf)Y;#js4=ZtlE4wjvys=zw`dgL#yAI7FKdLdaSWuY+l?2lO=9)-Ixcs;9% z>ojAwR~oeoUMF<7P3Yi&3a7|eJm*lLgsFK}g!Z7e_fEsK7IxF+&|>M!SqmiP_2&up zu2#cjTf@h<@5CZ@(r#pzWTm|hBP03u<|uA^T~|(?cn4S;I64YPU8sMZ$uo~yo4@|k zfWLfgr9fI8AI4)n2G-HqU;33F?qA(~i-9v1!QdBU<)((Y=1Dk-2; zpNWz405CX;2A+HU`wjn^!WI6lm6;oywutZw^sPOIzFrj>{`yHZ}=BK*1tb{`wK?{e((*CyZh4~9MS!E z_#jHt?ZL_2@e6S}9!;m-ARW&7kVuGi@E}Fd%>Wo}&mpF;6Zui!>2ltI2qn>I)&Lkf zy&X@~m>K}12-o3xxOy>a#kpw~lhodMWhIx->Kq?|4 zl_U@E7=%I4Tz9YopgPfWeN$S$Xe}*&%LC-*OzsA_;8w$%cM=S2L*^MLSz$j{0c$PW zxv_G^oH{q~uH}g-0IuU)t52r`aOLNS&+rqk$>u~wWrR}ikK0-2gj^he^OP>}vd-xi zl|Gbt158ff z09)DHHCu;p510$)w5E*bCB$0nLL!+K70%TH?wox4;hhmRyeU0+@CELF>E`#{0NZ!3 z+lL-fbjJ)m6lHrTO_+f%ANT<|JN*_I&6%d!$;!RGmw?x(m-eOycbn1w^P@n2wpRV; z)$yS{HYT*uxpe1ue!X||;m&9<8te^s zX92LRq@WhWN=Lrs_iFf5Uc6G)dUr4k8yBUBv#gUZ9a1}U}`meN!Q)w0E7@n1IQb1
    z0A|H^m37Ip#AGu!WSnz1T^!`7e{L=Z-)4L3Gf(<=ZiOyYS%4V;%FSlz>U+70VOjYT zX)|C+n0V@mx3%blAulS#jVzpgwNuOe-Lj3ea>EfjY_Zd|i)8>d>Rv}S!%&^a#mx^c zJhZ)Kn!E9h+v#PCt+zH|z6{R?HwpJ+(-hAwJY>=O1DwnrJxO|LTkHdn#F2=!@*qwl z#~W{tcW-PS{F`rFZ*7p31J>&JFdy95?6my<{x=`@Zcg8LE%l>&-?Hb7;$Gan`iZbN zfp~^-e0Z8Z-kux{Mn|InisM1-*%-_az@*rB0Fq!1<$y)B1NP8x__N4CUrD%m`jMb$ zsT&V^(}2e?Gq&^AYX-pp%0TB5C9{+ZgIAWT;S5ctjgTqF$gJHc?5MG;j7()$Xl`LX zO*H4Ic>pdzg%MgV@p3z8oED2-crjj-qf;s@wp0#<>}-P>AEe@Kf{4-v;6+M!hX`Z5 zg)jh5jN1l$`cRajH4m*P>s}0i8SU&ESuO%mZwZ(L7(KWh|F70hllP zkSq_rsOemv0l?Bc3|bKMk-<2bPpp!D+roE&6QUeL;fgcqR|0@r&jw9u=Kx%ZV4R-; zvn8&a*@c!BjwaeYY5;uR3RqVu*)eqHL)fl1f;Vqj<>9kFwvp{E>eq4d6|(*Z#}w9ti_#dylTXgl9GFQ&9#Dze=Zg90Jh?rVOqmM zcDpgq7esKt!U(rVhl35Eilg~7db_K84CXu}w?4y7WqjuqKKe2>qz?&R%rJ+-=<>Ad zjZY7H2gbvH`vz+?%vJfjIzH4#+i0|Gy8a{o;EVpr@ZlQ+r?dZUpZ4rg9FaF-Cr!bh zK8^S8k8TA0$r#|c5BLjJG1kCf%Mta4d5H^h;1T4w5z^^J(%lJ?fFZ}BW6KN%glS|G zivV8*v>6iH*h&s?e9Ubn`4LQ|9BIr^AVjwEhC`E&ju(1dq#kO0X^N;;gGh=`Trra@ ztilBquZ90YjRR5aFd%k^xbYB;WB~;X#Zeydb673WnWa}Gn0r7FKq9-F zp%xfedC&F52Ts8kvV5x*FtN6gyu~HNK;7o_pyPPR`mdWacis zjL@Z>jN3jOv}xke+P?ZZkIX>4R@PM%tMdT7U{uPojtepe3CwH=YSiC;dNM zvxGZz8vE(#AOI(hG~GF70hGyu-Vke6sCq{ek4p?jO)!jR&|NYf$ObD`!GP0_@P)*C z#F1__$eJn~J2Gt&)Rv+Q7NQ+^8V9qCvMR-ziNPgT4j(qKqFqamFOa+Is+(nP13E7v z=L$L^N3tO)W&ReTDA6mVxmmLwUjVVm^ffEK)@GED z3j(kvi^@)-ngP!PuvNpYssZ46$1h88-z19R5b+luaSq0cjx00k_6^i+*0AmTtqV-_W4gbY89?JH*5UDGY0;UV+ z>SVSIfLTcphj!I<0E`O+>|zNr-HG5>@a7{kG4f6nt5C;?@X-@Y!q9r<buoahT zN3^#~LgsHje|vkd{%8LA)o#nMR?GY9_$XvEY&5|e`e*;)OSAFzH$OYz5WCU(T7)u;KdwF#?!>v9s2QLFcg`80J?EUl9jxn-yOyd<^lUDjE58DUIDNS ztG{>*JVheI5dx%5cM~-Y2AEKTB5<9SE|PG+hkj(cIYBxy5<5c+H|O9M}(O8pjFM-LIXPjtZGPLx)6Z;1v{XkD8|k&QBeSje-(BF2N_pS zsFgX*7#aF-YE)|&C5 zqU!1Ztjscsk_ajhSFWqLjY(u}ZEL31;<Nds}*qNjM_(SPD7hrumYCnhnLCUY^h7dxhvq}gyk`~81giVjwan{v)yR7 zHrBSb+N@)?DNSs+C2zd`g*Wd#JBFUs2pn@@nhIY8Zkf|rZ`PZDe8I=9HT-L6t2ZPV zbDXrzEqb$MK}Uh-uCi)l#v}lvXDgwL0Js`UDfUEIi;@0+ezU(gm7o+{{qw2}H(UpqYL^8f087<+4GW3{%gj*kKWud%l2N7l#x z-p}0FAAIcD>BP5R{oWgt%#J$~-=9pkuZ_I;@NOT#U&Cc2*sBuXJ;17&)^AjUSkm=vi!`M7F};ngif+@1s-_0{b4eCYHH& z{~C2}onCIY+n9&YWafs6dp|hn`nnnS_xz4OjN<9e*S+;||${?tZW$_QeU0#pD22Y48DLPrRa zLNBtBbpb_i;EUB(C{-|-LC_)H1aB8uCYXo>6doQ(Uh>o|*~1DMOs+6c7|4!t;)?$x zY!8xc7nLo`0houCa#?@4`j?HOUnX@d^#IIq$4xZ1DiLagj<~o!nA<*seZ|$d!)5p( z?l&Bzkrq-ZkXun^%FLw1#vU%^9n@$gIpa%{A!UQ<`TF?00F2CFHBv`R4Lx6wp|#Sa z48V#oB>sZCVKy7cwj`96w=k?!vr6=&S$uIVZWrojJU<=b0m}2IFH#@j%P@M;I?T)G zmBotym}E-gGXS{$LechRqso?e*U6 zEqFB-LwOz16>tP$-SD4gyR{BS(}CpB;l%IHfY5RLR?iU%+qPi>d9XqA zoe>Nzc5lBvy?X2Q5CItX`_zeX#|)y1jwflJHXYu(wHseL_*Xw_P{7}f)ylp)J}QSvo1wSOU;nM| z^T%($y*G-}*_|(Jn4-H!08w8QKHV8bhBXQHvorlFgd!(`ge zG>J}P7Y7hmZOQDRS;GxiQlt`z@L~~Lq4`KKE)~@99D+Qmw`iB4uPy_EJ_OBNa&ZP9 zCysIm6;E5uJ5+Ytj1*v}9-i6k+PoT4oc(85ms`Bd9!uJa2p3R%FOKl|QsZ3k*bk?h z#3^;yt$azYdG;Ff>}5pg1@BZ%DZcQoDm zTb4)=X#)`-Tp>Bnl|ZgaL+Q$NGT1W$YC@+P*wQrFJAxQdm?n*Uf4u9D0|C8II)i`g zlP?@6yASuM!>z)Xr6d`i_lzzH$QDuG^^({PJ=;VOCnabF1ddGo>vKyzwJ`%fBGm80=(+_ zl68gqR;YrZtOXS;5}AOo_6i9B(222141n9^iS?eNVTFfaF7h03jW=)F=0eZk zB>;>$-JxVJbGH_N6(1@L%Pq<>07Jh{09TT@^0z`HiRCZjr4Yto2VGC@AP|!5%zIOq zk8oS$&ho-DQTDZ6uKL?5D;PWGdU{kS%t~ze=F5||imFF7EVY`^=4ulV3Yxjpd1Y{# zBoc`e6_}B;RY{rZm0@fs-MuqOXJRK3*WtShIj=qa%S;F}M-J7zb!8-n+z^;MM%&@q zF9Iw&((0=A=`RAnWFY{nOl6Rro^Sj+=QZ+yY_ZP*U{V-oVc))W9W5DEI5bv{s?@a1 z!VRO@#Q6rckl-usijfdCH#TuH0wQWR8TAIYPjA2Q;NHELZw;o`UwPy9UN5=5YpZ1D zYK^M^*gV7Ja?bloqd`iBBdw|fq_Hz`**pLX+fKE+6M{q7vL>DYUdajJq>o!;^QSL% z2QgScJNC}qkv|;GATg;o8$m4F&uPE_03ZNKL_t(T0HF-fbmpj%MHB`I29*%xbSB#L zk9T}Wt+G&Y0#qUENm^85C)UHt82%tubHPU@(o4(l3+gmU4h?K;OZ3x0SD>q4*J$9H zugj7)%L@*1@oNPwXTFf017peHMyC*|0}i7OC3ytu5O{1fO#;wf*?BoAYFos-4hon^ zVNF@hPf&hNGD}fXPII_m0-Yt-)AJNjDwn9Tc?8IvtegmyUrfC&_7p@eB3odGEatxD zM!nW-7wf0$N(;dkWztYs~Uz---n`n=tbz+-LwRQ=1R2-fQxyjsU zJp0Qzhs`C0aP<+HyC&=0G<44w{mo0UP6hVQVZ2;FN1t;bqYJz~wE?u$6E*2ZY;P7J z)P!j1oCPP_l=MKQdt%Bm3a!wjEjS2nw>F@89r{Pd_ir9QAC2$!rmxM?KJIp)M~wQT z3vMq;TfvHRnz+@3t%)}w+R+3K!{ou?Q$O-=A6N&keEc{FCcT|ko}c;9O7?+9 z<@m85-|mdYAO`mB;QkSqVa-MnuskL)@Sl;6mF@;2X}2Sc;~bbnB^dxaSTBKh2K1gq zI3MoH{ca*m9ur|r2|iO;1lx|h2eZOWSm}6u4+>^;mNuZ=Mv)^HjtXuw2D8+cXpqSZ z6h?2YFqfZX_P=gTJ-iHnm6@`XNkMX~SFdq&POiS(!-zsYuf8!ClM( zLI6&bF-iHyazQhN7#AkFFfi{5RIfohjR?cB1$nS%O4_#E$#k+@#Paeem-nJ~87=^< zTs(~np{tvlTnvCw04hj7H8_dOtT{Yvft;F302ZV$8IQ4$o3=FNsk+@D3m`h9+OjE@ zVsij&WsURdE1Z$IxHwJe3;-^Fy6ntJ*Q>S@Z%_?@S#G;bYh#YgqH4!q&symytraQJ z(8q2x_TA?3bB`zM!chi%W0QneE-rRv(4amHspY?kQXaNc`qm3IQr)PL!*MQ42$d#L z-sr9%^zqPZsI)nxh z8dG)vDWd@6i(~~XfCzIMhQK|NfrL;6cTuo{LsK{avc;597I(_XPL3dq>stlDc?VMgoh*u7W%nWLyLrg1ZDos!SUp405EJd(!YKq(kMrNM!Igw2 zCvIQ<*jA=|1XxyJy~ovX&UI_1)pKg8+!I@O3*i!0GlH|L1ktKw4zt>s^J26M0x<8u z^b*wu@1TJ$lIA*&FiKKTB=HpXINViM%EaY-0RR{N(bx^<`GlL-@wn%RTSa9Dg*;_^ z0d<+t+oolcjNIhr4&lr2^&HrH_H(a8j^5v+U-3<`5YIrvas8cSoM7oGXc zR9vGPFxdjpf<&P$ZO0AOW8r!Q913k4*QOvYk1*aFn?X3XLiKr&(BRLyEw&-(h&a_>T_az1t5@d+})cx$$c|anJ|Xs|b3{9sgF;-A%`X zG;pH(C*3F=^&zq$7){`ZPzC$Lbc~H?PY7|kpg~NWBpWu$LdJ{xuI1X&9D;l3ObJ%& z08`kmcC-81C7G8jHk(A#3>aMg&Q^%QNC?7Eaii|k<)t2~R4*!ILK{peM-G(|hgXQr zCFW4ZktK=_r7s4EOLBlJo3Pki_I;k=ZwJ_D{1ALNxs)b~0$l(UjKn$93D*lMV5|)& zD{26#1qylD5wdLQsJuBuQ7-vx(qd8qGH0Ikxs+$g!^G}NRF~6Sbm_KTIj0sM>MRq- z+6-dxSv0Ph&F6GnH3M7jFstm3rLEeovE#H!NG)mjFR3>!aTkDW;cK{Dxm8ekmPH5S z%Tb@3RR9LB;c!vEd1+$Qc^*tI0Kn20>hiTt3)z2V>+R)ADN9B`SUR0Kcasr}yS>)n zxy$RONQ74Y(!y^Ao|_X^8(+KxfQ1_vcXMiC<%5voaR{@KAVrH?kK}iW*it7vn|w$@ z;SBkD==$2Bptt248v7KDV7nZ!tLkGeR{^~O7G{)ObFdbm=LEKF zLPI8c%Bw=;;jA{#-lzcE2VJexoC9CU6SG}>% z0l;NwT~GJc-1+Q_v*)x{HL#ayzSZUiUw;@gglSbV=QDcij89H#Waa2UZaW!0KEJfI z0O-8`40#L6>n+a&&y%XMA+Wr-P=AC@pXj||ccWR{?ex9$`1Vel{PDkg>&nI@tKC|y zclbFK#zOg z=C2a=@|H@@B@P}%~W3MRTSq$4>6aaIV9I-@9&Zu(-B)9pJTT?89S zT(glBEP9|qZ~(ZCEmT_~5R7_WHkl(m8!!|GdEL0qDTHn+7Ai7ZUr+a-{RqZ&ON>Inl1ynBtU{!X)XQNaD;0zrV@kF7l0_j=+ zrU<__$t14As}P#~5n)H6JEyB8nXe|E)Vest_XEI{l%}%Di7lNUfyFHWEu%OQz^%5;Wi&0804#2bu zz?w%&raW_*ag8)8Ukb}v(2MKy41gtrUV3qrbh{w`ns_EN4KXCnAH1;g&(D0J2j`Mu zNh(}Mbl%8Rc7o(VNn+>x1t2S!%oTqQGr@WG43hk>bj?oC&-fU&lWvb==*eAwbTDx` zf9^M5yz(SI0;E*jV4-%pWIDedbsGBc8r`YkK|l8(y;g?n8qN_IAcc`$6Dc zzYj(n5gN*lob+%XDZs<=jTFTF0j#kJ=zY7_rk+T#M+K`F31AKr1;Fx-0(LcEL>INb zFuDZHMYRq{j*#&stfPc?rIX}75DCbL$@+d|*j%5AV){&X1o??JZEb9}S=a}Qkicd} zlPycIM-yQ}%N@$R)^w{Cu#g^wdWNC|U_lWJ?G&~dn~+N^+Q#si@PEpQGq?26*L>Ap zBkFZBKDR1}v2U&F0sI49LLHN?86tU(({kdEh#<74F)8=Iv+i|P{%TaOb0^u81<|{T zyjBp|3TI?o(BS8|u{5~cZZ*PG(t>1?Q>8#HBaf9iU6fT_H6aVKl^~0( zWkfh+VWs?B4D0f4B=(>CiKm zjJY!=wn}r7URIL-$jct-g~g3L%^sI2W0|sW22L7Mng|>PHZ-|nGvHJt3^kV+DN>Xq zLOYm=hk;9cFxZ*)U|E?yx;ggw%m4Ck2Ujj%=Bx5|b$s-X&DI*MXM=bv__^PB#P8gR zuD&tor_tMAH*Na8-fVnrFtU%H8FmA-bO)-lKfNhDDo5jKzu$|8gI>3Tj+K+t=R&Oq zFbp=);MR(k8z2yt&1m@R0ONwae!q|5rT7%WDmeF!k_zD*fQ9Cs@aB}OoYQXjFwM|HWD`3d>*Tn1pZc+1s6@}NawEcO!Jfb^*WQH0`M zc5qW68t1r$&!C2kod^F^wn9KxbnxJ16vJyg*g0qF3F~#Fnjr*?opkuHoP^m|JPN_9t zkF!h(J6EJv-bBvSBkpnlCNy#^N-hS#u3HOq7bQ$DAHgfWK+vw_e4RmuT4ttMCbSth zMooGq0E-k2%OvVlE@1ZO9UhTCos%kr=M@hE!f-$4q3viaGK_68Why143Fl{A1Ry3Y z2*U0WYV0WugYoqvh&g4m7hl}orPqGy|NVUHsr3!Fu^Rubj(;x#3fGzm?M{qK-}4WC z*oyZ2hcCz8#G8KN9Uv=$`PF!T;PoCuOauCFK%|NnAM6a#L}RcwOM+Q1-kv44pKxc` z8+AppFWB(-2{>tXZ0ATzy($9*xbK>Hhc%{m*YH4mOq~ct?N+RsHYTmHWcA*OpsR)M*<+e%RIfVu)O>+UzXI5+ zyUO4N0lOzugp)D=pX*6$#7dcvK=r%@mn@tUJ%3`<|orbT4+Y zupKS-D;5oeyB{k@W~zO)es_ZKVmdY;^{u=9=8s8M8hi$9vW>`L@qLx8YYlY9y>W+6 zLWXb%i28-Qtmyq$z#He{fheLR*Y=I7r2-H7mCl!eh+vjbEqftmB$uY=fY(0|wUx$0 zilu)?X!hAB3(4$fXxVA=X6@Mo#T{sJ!q2)Kuln0%X#eeX%Hx41&jWBgR&CW>Ujc7? zr^0}I9c8+2!WDGv8#y^gYy&#&@lX<-g`QjMq|&nE5ST{T0os86pStB~so4zU#K}mk z#Gk3Ay5wqWq0@%kaf&@XpcBc`E;k!v6f{10;y&;m`@JYFHR9W z$|KI$rcHPL==QW~-@LX^H0wt3mNP3lBuEoQctFpTof7q-v7p|sP1Vp%w*6Ys&O3Is z-Kb*Zi?Odov4sKApDmj07I=|Mp-Q@_ZDEcDXve5Xpe6U^fYp;N`B!lO7M{`&Bw0F7 zMTzNsJ6kPq7A;whxMIqx2;W0N{xTI!Q-59nR(PO&l&UAr4hWiXdAcH5ezBrDr2CXF zXcP)$dqpLtWwK~q+!ug1s2t37O>jYe?Nu&O5sO+|ltM26%izV( zxI@>?K4xGciIwqRTq!BqfW;ja$6`R2c%{* z1k8&?)~c>znlaxIE#?{eKMcS;(sR^fJzeQj1F#uh<|hEaX4X;FQx?)>%guzHByU8= zBt^Xs8n2Ox^WUlUcT8WLO!G8nCFTw*Zcn65RK8F+Rvh2RPth<7{K&#>3Qwk=dUSwKUXZ` z-QS3obbYyFKY6i_r7i)YUt4rhy)0MqPSR;O+>WL*!y zrYXaBqx_=BAvbl;t;ObK@a`Uuc_O*7PDhVe#-bv%O(yYQSj>c4aAu^BJ##}+u%Z!a zq1tn$25S9s%~P-NQSy*D(OMRK8do+0be;9uB8g5qS%TwHW(&cP=@}st)@3XVxQB0t zDd9M3V+aSRP*{gD!p zeO+NOW`x6$&b8%p4($m?NA_(LtLnNJKMtl!xsb_cmEOAjiMF602Y_)geRbn#Wv(#_ zjlq>zv~jNkhv-lDje+caW2-|sw2(TuD-xt>udu{52BD%<@yg!p83e$hu>*z+oDXc&6@}1?_m96t%Nz0PNE9lzWFUbx-)5>J9hl6CbPBbW!LY- z$g^04^tU~ZbR@FK@~RcvcD=>6!_bnRZTMC}hX+JaH%cN%3F;sOf+N600&t$?J#=bm zwn>QQ<~`q1qz(wXv`*>q7B!yof$T#|01iZytl@^jgb0AmC@Mg-DG9oDQwz7(&|VR3 zELdh*(f-gEfX!|I<^ocVCN5ZHg=j!U|AV`us_fY^QuCovIer+c6l3^-;G=DT502VPwrU(Y)wxDLGa_?Ci zBCpJ?5oB&x=*D!>GbRfbl28-W2Z5Z3hl-Twk@Cl)vdU1VWGlkKgAa}6i9-&MrLkp) z#@;2*>C|Xk(xhpU_C>X9XP6N#vB7iVSm@&^P6Bjc5@Sqe(RMd;MHmBFM0I{5>DlC! z@1_F(mjJkr>^bfrrdUIUru>fqu%_14jc?rDx>sY4&%L(@?W|4(z??hbvXZ71q`n<* zAXgmEsn6xgGMK{EKr?woD`Pe1#vP;v7w3+i*wePRls^6k$G2@#oZ`Uxd9Z!~*Qhd_ z&SVp*;cdJA@%PuV1tc>Zn!qkNf7#QQUF0s*YTm?Tt?pqe?2{@OE?C9!2?L3Ixz-p& zLCBv4Dxt$niX7Czm7MPsus4(8233*ymS=GiEdQMmlpIdZiPGsofrQmnsUYLF4GzAv zspl2TkpkR6q%8%}=RWdLrecS0!ZiL83LVbeB5cKY6s=>rOCg4#LW`M7ulIo|nIQ^U zW)egh;#4krop9yMQ~0@)-+n`Ld%2|%=bHOXncew9UG9^T{v6OgFF`>M;@ft|hB_vX zie#q3l5Zp4B% zL-$X}uk!qrt zQ~-0Lw)aSBJG=eQuS#syt(Lwu zIoPZR>lbj1XhTEkOeT@u#yw0=0RMc+BrtMRJzdE z*piwR3BU$;SV|Y0M~!dE5;9aC#ir?bo=z;t#qXX+a=Wm{8ks#gZ-T=+ETy7X4g< z{I0mwP^d^U&3Jv${dJgQOu4{HHvmVA`*Fl>s`T>=Q8or(aXmsj6T5Lp_6ny4T;u7Q z$~tbBv<#+wI_YDOUNmTo5MFfQDTP_0(w#E64xRcIbmsc`x)ygv>z?6ubz<{Y56H<5 zGd~<^r))EK{EcPHVtthx@V>n3_9bVZssc_eOySjBZ`jcnfR!ht1Mc$7f;=drn!Nz5 zg{~-MtJ>{+$?;bntHO_sQ4)-OIea(u4u3%M3#FGjo!R&(hKWNsBVB&S1vB<&Q^v@M zUTe34+T7ti2Ud4`o7l_$&x34BlGTmW&|vyISih)TtgW!7Os9voZae>n|8i)^t4tp{ z=X7w6+|yonvYaWD8^zrGR5>rn&;-JHXMElV<`ukh(F3U3V`B!874@-TRe{V{cSK%c z34AUm=NZB#3By@6X<8+aqUjJWqCcexj=>?^&?OM*5c!mqkjKlT9FlThngWz{aVUtVlq)^-6{VY_tSg;5H>xTH z5n2E{i`jmy1M@DL*hUpFuV*C8h8CA{XdVKv+spOp=}ukvQq>I zb^y4empP@br(=WI{kN>sGSx^SW0cf&DT$_dAB$2lhJ2UCpOm%{zrQa4Z-~VB=D<#<>ySHOVm_{QmD1r`mT=RQ(-Hb7 z(B&CgJ}Bl&g|7%H;YOW-=>O;>NQ9xDV_AHHqK5Q<==qSsOtZ|LGsf;Cjn?wsi;wPF zXy>@JCJ#3cPmWTP>nH5YI!U@DD`G3J9kW~ExKpenD}RIt-69g2Ix58$Oa zB{={g%=FteP3O);W}gvYw10QJExRondc7ke@T>B@wjBJ1;mnPO|u2x17^ZjN;<>;<#fAHBv=Ll5*pV6>yvJ*{PwT(d#u&C#Ey7 zOE)TT1V+gbD?uj!03ZNKL_t&u(X3y>Zvo06TTu;7cVR&%lu5C??--O^6b2Cp8K~h{ z(r^jv)?~wA6a|_m(1g!Nfpfj6#5F}Quo5@8Fm>si!9++P736s(>UAlmD$?$WgTwN8 zEVhF)LJk~F?&*R5lBpz8%!MH{7aXfK{c7DDODSZIA*RDEB zUW*mLW>m0BJ*=z|UA7Tdx@)C!)szTHi~}$?y3gyOz({!<0A5Gdm2QKbLbi)J?RH+b zPM#Cn2!J^{)kd;jA>7fKRG3karUY!0^P!Fm!bLSM9@ zGn=&M!>;`_qxb*8AK3p|_(A&R`y!JjOmwbpxPJPrV_KZu0nFA*#(PD;F; zAPeE%auZFJRwzJ|TCK=sV8=o^6% zj35+?PP^#kK-ZTKDT;tLG-tST3H7yw0=m;|Uss?<6>vmlRX@PtyZe7WQafC#rlc8eb3DGs-kBuvY!KBRBai$f$c}pCuV+|w{B^sp` z+H1~K+p8|EU3=`vm|8mL!+-XdpD(Ja;igP&ur&|XlVX7gok*n8L)q==2Y&P(ZxfED zYtP(OFF4Fte%gs~rnVQCcNZPtPsqpeY`wl%v&rAN-1ZGsv2taH3SX#_&}}BKWSbPi z`8?TZfl6GeSd90GZJH;_%e1&1jddPv5B&-NXSoZ)~^324f z*vQmML$0N3WcvYMmgsUZ_x}k1M=kbFYgGh=bnp7%GJ@>15&btJai`vL}Q{91G!Tmf&8MT#O*jfbuE}t8&9>HRi{2&d!EEbLhOo%XQYg=dXYChqwL7pY9kki#xs4 z@L>2mSWk{Mlo&-1HZ_t=ZJYkHM_-<19&0@H%*7J&e+%=+E;|5%Kz+Xul7oX||}(YPIfEmXcVS|zzJ2+}Bnkv@k?86#p4y^y1T z=CmON5N=om(lI(;uvJ}IO_2fTDpsnW)uN|wA+ zslt^SaZ1!@RyDChk;On1Ur#3i!=@24(M3$*{E*3v9N?M~-IWwBq2&;4~$hQ&p}obAw57*92Ioq)l0^#d_0yw8Gt0Ypeoh8OwsUR*QGQ#iq;DNRAvK zX|MSP)rfY)J7N*zwRZ?<#`5SoO$*__;YN=qJ%`Q_?*%2_K zRC|@rT+IOQJa}-qnyJe4Ctf3l#eCGwCM{W)qMbW`iea%Jgrd%+FH#Mmn=Az*IddG_WHS8-78TcYum-~rU%B8S8Epy*YN7( z^IR%c!F2mMIfplsjoGl~?Fv1nY9}Pz=z+U&ra`PiMJjJcuL`}*W6Z|_;R|=`rBTxj-I>cC#jLUM;Ns$PjI>$ z>Bd-?Jd9z3uL_e9Q=y2D$Z|`S!nJTxAtSI9BqwEJ)I6q#ZSR4r^fBf4wEu>#^`|+iJ{7@EG zqvCBE0PtWvY1U?#Lt_w}PO&Z7haUYxE>Y3P4jo%qo`!D7s2#oJXf9hl+;IF>uELXo zu^c#X7Cq=&2VRwC`gS zp|6)!Wp;VIc_0L#MvDO!Pw=)N2)GsfXD*E?`@0)u6F zW^U-$)i;HZS`n_81B$?P=E|s8DxFMG@F?1(l2XAOU{pIQr%DE5Yy;w%(l;Tn$E;dj zk)`lF@cmK?6)iT8s*5xUrL+<9UDL>!!e<-JBVaEZOu@3b;jHeLqbZK%KGSVp7 zB%)+>QiLU4O+?navTfai_0nI&>`D~wGIx$LiScafNfTpVQJsfGhG>?x>wJ-jNn$rkBLDng{*RD9Cqtk2)&#b&e`G7v|o; zzNj{LMaK{i5r+`ZYZY^?Vyjs9L8r0gv{=Y_bdiG^1u+KFcQ|bA<|#XwtsB?&EEd*& zs>PJPN+W3mDe1k!{dnCxIc}%_L>j*9=9&`a1MYjqx->S_`_)t{n@}BxDN0|njV^+j z(1n|)g1yHZjN}9f`W~GrT z-fjgEWgly=2nidNk-Y~ar8i@u`?w@)%_vAXa-U%=Usf$Q&-n}jSy?>9qFaK-f5~KG zLkK0G7nx+ZEgc^j_xy_IG%Ea4X+Y(rGeeA$<@tz+f#?%?ers%YygXKG8Q#So`aeJY z(ygn;Q1QxNzkVFTirT)1Zkd_SzW9&x>1@_w1Nup zU5UwZSHliau&dP|4FByhED(Wnx<&A(bO2a>m#9_p#O53=9#^f5((!=o7(;GQC31}> zcOVo$B}=|R=mpes#d57NT^obLHlknhdX(TNyU(4da;m}5sMSqLWL^iraqA9g%4=!@ zE*Mk#12DCqndEt`V?n!2>4drd`~cj!BmSJpxFO>GY68fdR7%M^nwEK7045j4th!-f zuK0Ij$Lf$q-UGl|e*hLprOUp*XgY`La=KQ;YkOk7@SY3NCnH*k`W`rJxskhN1i%F* z=?|eRy5PyPFmJbCl`UF5TDO%*MB$SFta0D$(7DrZrg>9YFsYc#eN_5{IEsg-x<>Z^ zg}=uwa=K$Ne;N9Iajc}#P2Ti&FxSb8cd2;xxB&$BXrL7v?efH|r%ycp4}bQ_SDaxh z>H0IS*>6A=vATaYf8TZEWuy7``!=OAdTOvG57v_lfj6bqk#vSOQnqF2S&#l@d)tB2 zol@h-vHgugJy)ond||^Xuk5x%TMoYboMV(~4R}Rc<)%}BX>_RyF-0C9IGYGqf|zLnJKBU4N5ULP^yGoPoB6a z`i_xelcO*fP4aL{-JNh zxXxu8MEWv`+NR-{egB#%<`d&OML`o?*Ffu~iE{8Sj7efsB7*)$#nPV|(zqDY2zX4i$r$(<%WRIZB~9Wr?x~okqFf)@hj4ZOs5~qIdekJ382|$Bz6LXc?VK3z>CB{0ASx#PP8%f+x zC-J-ywQng7(Zi@Q;CZp88K1dErDK>wi#?JIvMh>&pp6j}Q8O=Nih1O~@J%IyCpKup z$w7c*zc#HYF)ZHcWgP*n8i>8HMSdr^+HzQe>afb1FrxQu^!~wYb7M*&pJIh#P0PBX@&{K3k zV2aWw{ULf)x=pzHRGAX1yJI6_{Q*vzVy4W9mR=ItMk89y;sC6509f*)+;#Sx8($rB zgUdu!V)&)X3rGGAAlj3*&is>JADG6FTbCS1bo@T$`(BUaJADB-CWHzjOF|Z$7JdhJ zmSoCwJ{3C2blwAfGM2bRPlZy@6*iTW^+_&PR)H&uVlNGgxsTB-$*^3bY89f0NLNIU zRzUf%y|E?8j&$#mZ~fD!uPeb4@4&^kTrxkZn91U~tAzk`%!OmKi%#m7eig<9sqCNy zJy=gZ2p&nmp#p_QRvX>c`ux8icX#iZfc|%K|4P+xDy4-JdsubvB)AlQMaYuyKg@`& zz-z#D!$tvIZHzg22!A>AiZHn9V-^bHG=7`MCscHtN$_h^Z<+BF25DhOJ-3`+k|JBC zo^$Z{l$HbuT9Td-XXbe1g=LbQ#iAxRfj!z@XKUvyXIE(p~V z@x&-QDF~*kAdc}E3H)nreeo24Fp`l((XgiIN2{I8TUqc3E|wW0o*DTIhpl5X2A!_Z zfT*D-AZLAHxL$2c&(BWG&QH|+obP!hA?T6^7tx`lt*sMG&-t^iVv&=fB19n)-(sd! z@)1NGb2A3tE_)mRUe|c;F5==+)L5}9+PHA_wyl&fFVlNg%txzh#@P>mLw|2WoY^8j zY8E+Lq3jm&u+T5`R8I?ZVB1rfFw*W3fUV1=*x+us+|}HGNEY1+rqL;@6YQkw%}#eI(`gg~m1O^PDuHgksc2;$dU> zAXgmnam@;`QAqz{BR zzIj%GLFr0>azk{t?E;XgRG}Q9Q12nDGWgE|@&mnxyd;p&rHY$lGCcr0x7cjtaud0# zi;0!B>A8nCd6d#*@Ci0ZRTU3T*mUBs>9K*7%F8y91Spl5kr7m9RLP>folXO;gneEW zV;~;J2J?&vDcAp7v&^8I?$+3%deo9cUUHSlFC}JA>4x&^cp#D1j|wL843($@qN&|422Mok zY*x`abmiU7U_CikI-Sg_(2VHmZEN5A(!n^(BgCh{(a&@?Ni` zd%G_6l3A|gpm+y3xKpF6U|8X388~M9MOb^NdQSyG5x+A1TR;+%;3wpZ)EdKcC{eHy z`C!?(vF5(1NWf@ZE(rF1-!L}5a#YmK=ZHvls;WZ;M9CfyVFm;;!!5)-moW_DlM9spLd2Q7^mg7vV@ z%d}HXuLocyO3+YPn5U$>>zE2!s3oRklysCC+~r%-rETUt9*xV1@WHf7IO;0I&Fo5` zpaR&m1184}x;z)N(oSfVc%#CoPRzG!Hn`Ih%QFkR+m%hjt6zEavzOF-ySnqaS3b3Y z_Xj@6^DFZKxy4gE%b0!IJTw(UFM7jPRmlW{jd-x0lxt*D8pc?f4vUOnDDm7sdjHDG ziJ4NxDXtxwE;+tEwzlf#53Eij$wWeM$pHpAH&&a>cRY7zoJ|<#L_scT!BDkq!K$L2N5`>6G6*^A&~NE933O zrK$1pc6+fsJ3Cuz)EbjhGm|r`r!CJcFU%dBU2L@5&H2T}wpimk=VoSRcF*mbTf(0g z(T%6(xLiEhP?xF0+=GKBPjF1-d~&biRk`&wfubo@qcQ@J#a*a$?f{n0M+XoNg2kjV zI?6T2+)t7Y7k(W_28ZWR(F5QNRU?+M9A)`-Q-}M&RV+l29~vUTl-s9y%P~lpRt8Z1 zQr#~+3*C6{IXsq_@tNgDwimI=x-+5;0i4crRA+`PCPU<3(w8plcwol^AR#U*FJ)NA zh$GB%VtqrB`Eki5Z`FwVW{Q@2{CjzL7H3Y8wR5+An;#)m=5}|u`DN917E|yz$GoLi zlGT;;(TU{kj9-Pp7d;R<%~HR=V@%#1qrpQ5QH@(!is?|*xP@kq&n8_wsPuI)tqD^d zx?F4I4Z+Zs;LG1f)RfY_IXq1m*%Yd^@uh|bI!Ar#@Zpu2MQyu!!SDUx!MQ}c*m&yA z&pB-jv*En$*Tx$*y_apSnXpU8_O*6e+T^#)(ey}R5QQ{YPuew_P9nGfK}5l3cIW?j zerx|(MZ>Whdk!>^xDd4WPno6FT{)Y!c*0-1P|X$nYL01EaRQBMly!Ei26+-WVG#n@ zfZ#l33F5<6;YcGe*y7t2fhw6ux$#&6#*&lsc4MD@{9r~$x>B*+m}s;M`8*Aa1Ed}j zwi^Y%ZWC`?*VLFaS9nGT;g(D%c_b$KNKh<7ms_QC(mHkJo z)S*|NdD$~GbkFOs)hO0Ia>YkGxYcMB$7;<9GQ+O$jf0YqNg54p7LFEFP~*F5^W)1i zyLV1a0=(zvo6Y8IV`5^WTtk1GDrH=c0>wl`UXmuxCQd1bVR@}KQEcUM)siEo;E`7Y z3yXKziw|U`3|aEh69!*9L#a+6y%Ng{^$G><@(zF%Vzq-FLuZ9&jG+@k8nonO%*O8G6cs! zs;tFnMpq&qaZ$kHp(v%C$|67Oo;;^s0Om=NYR`pPr=TL;Qs`-^^?VQL;5fUu9cgig zsBIfbwG(R8AAptq0PIHcbAF7%17Km^R@ae6oUq9E#e!p1plJO7SflTgpBB6wO;yGw zcJMdb1;FIB9UTY*e&X?*>OM*ybnCNI;}c#Ud6?yeUHg`1{q&~A`ycz0XZabucEQaT z9Gefa2rMhsn&VJUl*m`lmZHVEh0>~Hq~E!^DK#<>A`RA)c^C{=EJe3%(=fN>-uZWD z7oT!IN=~bBXm8P~LSjKg^5dG=q$#0dyHCp(;MjRxNF< zhIrkb+1l~ec)3`oW-nEdC9jh6@~kqRgP92V(A%13P~0M;y_slScslg>Wk>^_KXu;$ z`VbwJ>ve~)x$fm41;)MRs;$MERSH6X5k|TxJ~c$xgI~u%AvZQrtKm?C-o6dSI4I*> zb42ZXaxW&Wut;^|yM5x)$&{Lj2jGxSG?wa018SESi)09iVn65Sc)S&#;>&?Duag7U zRCFu$k;Ox#sh2 zenK(AghE~u6UA8ga5KZyBl)Yt-t0`v8ft&Zmh5J=UE$n9U zPF6AFuo}z1h{oF(VSch$3k~*H*8x+Z4;&=i^?$QbqQ%$n#|vj@?_ah zq2v;U6awn{74^jle)ApdrGt;= zY#xQ4p>ALMy$_EcdfKdAujJcD=X^j*an~~z)#jd^KFX>J@pVi1IN5fq>;;(s{bv|Q z+eT0rYc$IixSRo@F7GwV#gDxhHshPbsfAQeH(~j;ve$k1muiJIr+>wO?SG?|uD=xd}oRjBZoq6))h0nd< zg6BQ&rWd^81-IUF?;W?_bNlmOcjGnBy7j6TUw-)uPaau2{pkMV=UsZ}tkWB{v053W zzM>>k>CxfMBU^@&$)OB2{=f+X0t7yudBtllOpG_jrfbbvw6Aku$Y=yZ)MeLsZyu0O zU|mM1e13dkPYum+^7ANH$&tI{)or4P(ZPl4|B)k??@No2Cw>hghs|hc7gu}|iCYuC zA-uh+OYdu&{8DU#tH{vTr&o)&a&>8`&!P@5f|)>wGvV)YH1H=%E0Zmcf(sSa)svI5MPD@x}#TK9=Sv z`v`pYt(dY4uQ;=sg~?8zHD?YK$~3oH)fShz=(v z*Vk)GH0TYh->fjCG-G}oGS8urKlJlXHDHV2~1_*9h&CAa5*!Yf}WB52#b3_TUAwDYA8%nJ@x~!g8pwT%uru05OPj;6Jvc;IVJ~^k0AYjqm=|KRxyz-~G{_{`4E)`0jTf`@6sU_V0Z2k*_@R7k}{M zPyY6w{q;Zo{ck<;iEn@AgCBq6`|o<-t_N;=_Ny*9{jB5XA6whKJTuooBiGQBG>IMI zNv&!|;Lj9Gehs+~TDwMu(p0OXWUf{)>_!1j)}Fv$%&lwFwQ_L`jdb8L#9co5pU?IzUmq?i-4nmZ?3W~q7=yr*K!s(GhC`XqYMK> z8k)H*QVHp<8t4W3Gwtwt|t}+_&7|lUZS_;u*qL|<^&Uu4eSI(ctpf9!?M|!F^QZoGihKa%|i?jD%8~4+|txyPS-LB2wymT zZMEU(TKk4S`KwRwN)8WM$FA7#R(NVDS34A>Ie>gDF!5MwjLo?$@s;LqW+*jK z0uR=cd<~}(ie;mtmrqo$_`Q!meP_+7A)kKc*sdJv-IeE@ZnDO~g`(vV2@3~VjC$=# zc|51EN*Sgc6KxPNRMVTDFBWtm=_v^LE`9PKP7)tH+RzPN^HESC{sGGvp>_WLG`5~R zT-zNb+9PRuC-yYX&ZxUB#;2W(7$C5?toyBU5ryUW%yfCII6L25@*y1tK4kIGFq3YS zi;Y}yao3>>ue|5h8{YEOul|1zeeqxa=KG)d{zpIZTVMF%`ycwiyI=dt+aG?(ZFk=D zf?F@T>ZZ4zn31KIxrZzsevT}Iu+VK-lyZ)LxZ+q~;SKNN@+wZ#XjtAfMiLbu)qo4ZJyWVyGyYGI} zJAUn@ulS`GpZT;4F1YZz%coZM?>VAZ=EuB}sZ%Y2BSy)q;vZ;`z`^E3YxEm%+G(ME zjAsgWOB`~_Iq=A}f+mX;Rqmd`B1zVPoyfq5%H@VqTC+2f?I?$%YBx&Tq2@ZB1TYNG zaamLqt#X=rJJRMXE^($%2BwJOGw2Lu;{Y6)RrI%*KD7;o`2<&&6^ALxK0X%CmqHbi zpo@j{D*bUD&xSUcor0aKz__bS5ci~%Ty)nA_24K|n?|a`+}7E853{feM=*!0us#6X z=TS!1rA#+s?Fl0_zO2$Pp2r_665ZWUht|i8Lpp6x-$2aSBOf;12%-i2wTr&Pp1y0+ z3n(&JA3OY%iw}=`+04Y%-}%X(|B^qFa$9Q`oKEc#oSVVS6ATbZW00w7`GE8LN|VX~ zP2cjsFKx-DM+Zva!FtlKp;XFrZ0x?CUb+4Qx9k{CjV;#f%EDO-5ZyR?E`)}D?7+^d zLD9Gl?av-M&lAOhYe3^`SEy-fsajC472(zq@Zdh~pF!LiMY|QGAmIC{7 z`(MMgCPlk(1!iIJg^ z;Z0k%Zr#3R+xBgIZQr_OD-QG{qeF=-4*u2h{N%!py+_Zw;QANb{-W2u|6_N3@S`t% z>D?cF_*Y)_t~cCu*MoQ7`SKgDJm>hKT?b}BudbCn*Ci8Q6;pu}9Eyk=X4A#A{E5cY ztUq2iX6NbjfsQrUUS)E+Bxw{0mw}O7#7t@{dEx08R1lL{))SE=ZK0y1o-ibV+v&@> zpiuUZ^BBJ?n~p-1#YjJiX6!uKNuegM5;WwLwYw87bhqmTLQfcgpC|(NF^?1g7&vMt ziy`Rf*WCXK0EgXU*_#h^VS+&{TI$fQ?0DtV#(oS>|1K-`8H?DigD_xytIHRj72Uhp#(YHf9gB z9j{m=S~3+$1>GKNk+7B%t%~hNg^{nFU+4W&TX23jIojfm(bVE3F|IJTqC(o%gY+>! z4J)0B=LQa|7`oJea6v78kXO&gRHrb^H7O7%1MW|C0yEWmy*TDOP)1c}77m?!=%cTG z`Rng}&j&y8%^&{D-+u2azxA;+(odwMGMYtCB;rA|C>Q ztgl&I6XgE9031(}h!yp5_vUrk0?|lQleA#N%X00I5oQp^1XTo)PYi&?+k^wTU?uTl zx?`~s*9vzmGK2$}t2jY6?zzF@>zk8!yp zRZ-^$L@pch$>EwBJhLQ_f^pH&2;o-$_@Z{um%ftTh{O< zYN)xath@I+zjKS5s?N8oxjn~rqVrhabIzfnw=|Q37MO@vXfL6Q92BR^MZvFtQfRtX z)zvHmWx5REZr(0M%@$u@-Ne;{_MB4vXVwlrr`60k9HpsmHBBl>PwB zuQc!D0_%)QRuOKQe5&Dg;x1gCh-p5dDX_`u>(Sg;l)~KsR&0GuE^1jEy0mW7t1dr} zJ^(CiOTt|0#|L1pgXiEzi0L}*WXy0|oJP27C@-XyuH+Iv#b%TW79SqStfsL1<>Ozw z)@&9XAH+hVx_s=JCyHrz?X7?C!>_(idfpp9WEl|Wm zWGNn|Vfh#9n{dz%w%z;U?dqsH=s^$GVDXhu3%Q(vQ*LI{k=`uB@p}94jV%aw+1rT}MWmrXbK`@PjIsXBbJNI2EMb;Z9Y1p6J@-9$ z!}G7c@wM-H*ZY3u>Zh$1D<)O084b)5u%A*xQ0~C3DR0j^C5R#5^sfc+aM`g-kDWYm?C{!-=Po%dxQhg^&#LBA>8y@}5HjHm zl{Y8@m&aD1hd2*u6nI@k?J7@Cl)>@>!yJ}c=!<%ukP+i0AWn27?2!d6p*iE`Wg>iz z4is5BjKJTR1X36Wa8z>1c#K-r#5@Okj9z|2C`lEOc7YD3$<`$x#N05#0ylEP()Gxi zr0Xo8bimmZ*2Y@cz)-oOho1A8N+}3@_N#~WuMi2lu>#%fAHN_e#=?fnjNCQi-_F8h z>&VV3Vl?xiyB^r8wlTj9R(gGmOrz8bz-rVOhz?kx%NCzH zxLwXIL6Db(4Gz6vX1K1s?_k?QCMn*r)g9NtT+%-O-QWMtyH8X`HfO5KyACduZDLIp z=))`XM3qbt_5!Lg8+p>=r#3H1bNjMPIy+?6^kDPCn>VEr8Evrf4%T3CbF599k~p}c zlbp{CAN<@8-dfpYA%t)qY%KDqm^%I7T)T{^tdpA_FITIurefHxJyc?42xq9!g_DMD zW-`pqm5Y?y5F#)SEhHD5lITnGZnQhQmzyu5FJ0iJ8eq~uYqLT`YIsQqu?yeuG!tq< zzdX4McZ;qn%%#dlPF!;9hd%eMM?UtZyC1ywzE|CNY!#6_DXLXzU%@U6vNe1&=XVz; ziV!0iZHpJ3>7mV=31acz2!{vG={5FHC&0x(`HIJw61)Z~FZN3Xl(dAD4B>%H%L&%+P?_D4SSsds+< z&%Sfj^~W!I+e>b~Vr6B=+;}lp@*G7?;BYX60||66R*mZ8DxVsABy*}jBuw=>RLG0t zzE|h%YZUTDytGwv8>wgUlLLQ#zM!;g*kaAyvz#M?{Qr69aO0$g9U>VV}c=xFtn1DR_^LBl1 z=fdHYoQ^-5Ad4HAK~vYsu7aOY^tc0-<=2`mMi7k6-M6i%>r4aEf*1r73R}R}cH6a? z#r+mJHH&Iy-{PYp3YU=qf7pgf<)yjh_B0Hcmym>3sLUR}>b7@$;B%k++9MC&e&bDN zU3A^9XV*fcT}-4bFKfng)yOKldw%1c^MsDQvDBLabkBntPg z2!Qcr=MQ4vNjFbt)T}Izsec_dtnq6SBVde@(}^T4l*nc#mB2_^(?z9ZE3Md;X$pOu8+!cN%P<89pt()%S$DE5L)Pl z#fx3}3qRxpoNd8GbTryFcAn{ax90{qe`>5WwlEFig)ve9Q81W=io>N$ zaO5KTz;l*Nj|^`{iJQ(OhK7d(g36XMHJ4=tOhqtJoC!!nSf%0@f6aeMM*s}Y^9Zki zB>)TX<|y8S+6h|Jr6v?kb1>%G-7KeNWs<3AB~o-C08(evFi#FVwgQZ=QH~aCW5=HY zH^1c?*v>u$3VXyk2jY_1h#>-WD2yE{PPE!bam?6?S8&TPUc@xZl?`Xtxo2K@(~Ylw z-xuGo{}pe#?}7W?_S(Ddee18?_WWPE`HJg~A3uJKJg}E*ejTIsWP&E;8PbcAVG{XP zqmj%R?@(ps(6(+g8{?CcGdp+g+qZ9F^=R8G?zLLe)6)}UWlW+Q82$pv9g7Ck(xsWg zedW-DH3fhgCNy>o44kL|F%*sc>n7x@v z1m1X-u4G_$;v!wMH)YA~A*gi@11^iw3PsX(-iRGN401G+XA#|%Q`TZ$mG_{sjysDM zg=&iDO8q3EjuvBf+)qI~kB!oS zh664DH9PW-aO9Q)aWJrmAz-moQZp&-1>j4EzD&|kiEKayGOnfrfQNQ|U^tb|47@l7 zYp}W?IAeG@Tlai*^R@r*jr$vERe=%F+3Sn%))T>0;0yc!KZMZTNm*`F9 ziQR`+=9U_*s+}+RvomMD^0SZq^Z$Cw-48zN+{H>NJ(AXI^L6Sqw;FRzk9#X?060{+ zVra|pc64}HqNW(=riX?)@XN86{ue8I)16;NV*otTg|s7`HQa^4qp5^k9sU;mj?kF? zE|rQSa5Bk>)(IgQ!FB|ecA6`pGNv}WE8)T>lpKLAgR8h81uEA8D}Js9ziY^JDW!?} z3syjTbb$viQQ?^yQZvIto40P+ylLy!QS_p-nqF!(mUkVy=#m${?~do)^WjIn_Jv>l z-1ooq{jYrGw?F@xPkrQ_@B8pQ=N&qIb!BcG>Ta7+`IMp)16ArMlW_NljH*DI45jtK zmB#Y(RE!M7bla}rQB>=&^deRm{sSEgEs`9*9k02OXH4`%#o;5vI{@5A3KbGu&$>-Q zWQ$bSJ8ft;wAn*a)SlCt+=ES7RniJ7DgN@sp(}=iF$_1YSSqL*LcwfQP zEEu!<`1smvBr|*AJHGnJCqDYFms~ezCo%Tjf9AQ3AW3I6gL}V2i6-Xcl(@(OSHv?y z{)|BozJtk_2Mq)fZsA6LaB52hD*tYA7z~KPraM@J)jbYY0kDqYloRH2zxnkyE~Ob@ zbL@;0r;pjW9Me~>x@jhG>vdwhHj3o(YNH2j=%p$}F_0bLSQ{*5N+7f-@V4rUFu%}` z*wChT)e~i3^cJxzdikP9?Mrm7X)^!|t2mJxYpfjIziWBAgj9y+-pg+L)Zc&i(f|D7 zv-YmmCbC<%ZQGJ8WY_3W&AvjVYUn(6ojRBSs4ylh-PJitxcV6(nKLn5|_{6(SzC_~mPoLmajDG6L&Yh%wR*Kr;r<;Eabq%Vt(sUESq zyPTc6XL^7!*V{IwrG`m?Xz z`^*K4WmDNiqv+4f>_1}$hO~;7;I%C$Ci4O-tbDO(&)&cNH2Y}O$ z3&33<9326EUI0$U`qTJQUq~vMlw+reenS<9Ni=Ev6`eEqy^7lq`->*KC^!s5M#lwW zW=fl@?&6X|x$9FKf}jpn36Hp^6gxEuWi{?-G!0)8G_X;T=q0Z_wd3fOuX^iq4&HIs z2R`tc*S_}yZ~V+dZ+YO&zxmGhfB3y`ddsg|bLabi`Mw*T^^9jcbM@eOqfxEo9Ni_( zIhy@R8;=LnH0n2Mf=C=#RI}46(s8WHIpKL4I6Gk1;*TI<^2v4!-&RH9G7WsgJVhoo zQz8{g1U-iU%&TQnj7&{tMiIWUwX7YWTn3#|ZDpu1r(sDj&5P~}*H42{NVGK6%f46O zWwnE&WPumkeCjIljrIPqN|7K~iGIiO8BsO&0&piE3Iq9o+iDAra9A2^CW=a%%eM`l z<;9e+-MgQ%>lOP?E_?av`2I`xue21Er%j9AwT1D8 zF8sSfV-Whe#71Xy4y58&QzZb~SqZ=td4Z4>eR%%|x8jXAG}vtiYp{CP=CooZM$7_& z7tVg<(Z5*Bn3SzEx%VihKWMJCo_E6`C#5*0!bH`xftf~Wwp~Ol>^@6u001BWNklJ zyR(Gj5vN>drA2fI-&8Pj<9`tx$fJV`Je-l|(D{q7>b2nN>DOs=i{M6^STY8AYtu$e zE$n1^G>K_4`4oXRp3EAHXf#ajS=;-x6BoSj<`>?5*Q>tpv3Gv)vyVLTtw+B0gP(oq z9e?E$R4SBAUh#3!kt!JOm}C>{ z&W1>gti5tP%ego)QJW>AIDD~@>`bm-9Jw7TV+B6*&?BY`-xkGH+|Z3v()U=V%qzN* zE~Xlx*j0e3%jGz3hi|=3>J-qdnyP8L#OKf`mJ0%tMOLE>mynqZifEdfB9Vb5Jb|_` z3U}z=EaXK@q-k{q%RbPjWK+152JgVzoO!{OVG6U0pxA*` zSD@a9Z3)g9e!3;Cy!BAm3xq~oSfwHc%eY(WL0CC@;Z0*=YT9?y(fpn}KL52}y>i7> zEdR#Ky~f&)oB>-ke6x&RDa7D870{7;sduq1I}2+=eG5aM~K%SwnLQ)in8Iq1^Dxuybl+ zyyzEOEeBp)OKay`aP8hn-`@GMPyhXozVW>`Uq0n12{5a1*q%Lb?w+|EHlfV+QB4sx zRS|@7cuU91T_RDDP^bgIr@&u12<}q>r$je<6(RY3e8k7yTxui11G9w1~@L9Nz!))Dn+ zDf|J5B`r= z?3!1<@9u}*`0+P>_zQ3T^gHf*&29HwfAfXUJnQJL#)MyWvsxBcVt5NEY-B->Ci_r2 zsnMRCfv+@m%LM_Ny6JX7G}d|JgxAdEg-K2)5OEPg9rS$YSgH#WnqSe66t@04I8H=i&-pD`8l6~(+=b9aX|q$_2ksv zgf55H`53b-pSR>pSMTt;!b5;gqkP@fvI>(REfoZR$De!Yh;UHx7$W(Ru!a=r0H%V1&G)>x}jceP9IuXWK=m;F{as z^vvz)k?dfn9jw9XTLowE;mn$uyt~PG>rejVmi&-THiye6PVRPf zn>)@s>%1L{9xJTf`u+cS^snD^)zOAFq9Cb31H2#HzhgF^%(9@W7&H~_j7uW`?v%g0 zZYAVPq@G9xydHof(b0de0v?e}u6_WVJ|zIBwqE4n;E_q_pf3@?reYmxe$&zQo$F|2 z;CZBq5Ox}{2GYL*y=?4(e2h$maxxPSgXKhQcsmdQ9lpg7wt!}b(JfxP3RTUVshlVG z4bbZ?Fmaw}Xq9tTvo7}l)%A{CM~IL_ zoh+?6bvJTuX1)FwvVhBEqQefVQqv8DrK-(I+73lf7wFmui)@m66&ZJ);gtW785a42 z(r1Y4&B#{Uk{*!gYp8V2qG;fVG#&P}IRNV+89PF5anzt8E)-8c!#a9#@7yZq6Dg6mXr~LaDrSWzybSzuZZ+g1EeeeBS5<}TR4|=c$ zYl8*Ib+G>{$!+-?{_|(I)gcsadHLp9=S<-vZ5q3-x@C3hs#0wXyL7QJK3iVNL5K?? zbgcp7VvB#qsl5qh3rvdb<-=YE&V_b9H&>uE``Ua1x2z+7sOr^rt{pnMwp=ab4nF)lHik?ON$m%z)zn+y_qk zeSd5{9x#u@9>b|R(uvp~r4!rNX46#Fs-*;K#Ed}Y7zBrQ)f=o#=Y*2XU|J{0zXtD& zc08cM{V^ju*;)Q&R9h>7uwmqEsGw3K7m=~@7}Q?H+Jw*9b#;$t-blVL-7EL@Oi{-{ z=)6Gd8-j1Ak@xEDmBahbJp0f&*WCZ?XWjn#```2MUGI74hadjnyIyqvZP#4?#(U1Z z@|s&NIqU2*&OS0TIRSn*rijVJXp-#05|DCfrbrK<0WA+`%1i$TURjdU8b-NzWN4}! zIj^vPve<@T&Y*-VzXj6~GU&=-)=Y-kG!7|&lThZt0g}l?s-UQ@GsBd}$gWHNd8hD` zrK=IwD7(nSR9M_MQ+^#eRZ#2MC`bSo96IW72eR|5_mt_972cszhbpSbT$4j~<-CSQ zMScN|0Cbof9rsUSE)hsX0o?R_t-O>?L(mP2=ko0MavK+>Q7n$P&siBxo%sA8|IQ1h zoMNNy6?d*2KJDOg(bZDra)#U^qbC!ldxu_`8a3o~YLL?mm`|oPwQEsRTH%y`(!qo1 z<&*+7HS*yc^mBtA^k5CvMny2PlKi@koqlMO`Hb)Vt!NxwQ#YcI~%awvb1 z_OrV8?DNh(I9@2!PQ3E>zx$KFy!YH$mNBylgEND}gGt7`kT181Cm;-Z&b z@tkMfc+WjAx$X70J@}#bzWI*(9(db3?)a5!Zn@w&XFm1N-u-*p)66h zXSrHO79|}lxW9I^MBQ46EX*y*u_mB(O?kPvog))omC|F2d96H8Pc~#9IgC?|MKy*H zuBzeil%lU4UK5LPy@2!36f_X`CfQ|*NbU@O$B#xjo6IoLWG>OQ&-r=W8?~7WoKDS) zUGDHgkCD3IdAl{!Ny7%-QZI2vt&>PP- zDy9?qfrm0`mzf;^79kZe``8Ttm>g-yCRT%?otoPI%9m}2_HOIIi({|`YvU?7jeb#j zB$3`aa>j2z`t6I95wDqZrk;CpO0h}kyL{p0t7Q@e7tv>{)Mnv~g`;+f$`K0aE&2s? zpA>(7*3Va3a}S(_DcZa~k57LQNw{O^9G<^6H#gp5=In)U{F@&=_Qfm4)y<>XB=hGF zoPELx;IRQ1$ZA~04^Cw!?WP6bb|6Sigb3G9GjvMwatweaTFNi_e9tKX_*8Jbjv?I_ zj=StFlUnxp%rF2LbF*S52C0ce`U$L_{y>^DylCzk-dYqR8FKRAM#>?#*bs9~Uhbg9 zSfI+7`rkZCir3(L)|?Ds87gM%s2%c?%Y8LVAmf2L1yXZSG)CbQL32+U5GvG#Bxe#0 zmRuPoCfK+%n<*fY=Q-}ZqFrkUbV9C0Szs^*%;BmL1B|n`TU^}Ce<{*AQ)EKcYPH!~5w@bZ zoloAK;C5HMT4M}c2~Xrwh@TY5ijn(Qn_)-6q!2Et+~w(k^bVJdZ$sAi-LBkGU)+>t zl97FvnQoLg+lpee$()3u6Ub1-rjrLBqJwHD#@>|lY0$90m9wA%3Ra$Z=IN_D_8!o; zz3}T_@V2>)#i`Rz>{)4Grk=|gFV}=7ADvumvMkR@ndH#AOfgBpZH?4Oi)}ztIs1_$Z{nxa+7n56$2qh&8f2|a+NdN#&oWQt!rsv z_3%n_=kjdHZQku6y4Tj zDi)V8H1c!f@BeQAysjwkhr%hD&a`u76RCbvX(Km;y-Ut|IRKAt4BveLIKgig8#s$@ zU^1+vrDI4koGPob!HU!>W`zZlaJ<@PlESP;htSO)-V6s$YGs2`jb>+|Qfw?8KC=JJ zv!3^|m%Q|$ci#QLTR-y`fBB_9{)g}X#hc#okZgdRyr`a(R~}wz@zJIaRZV-#3@qVSg{3w zEiN5CbnT^+%d1P1#ZBqY{_*VAJu`=oUv~103CpPDDrk@A1D;H&7)ZWy-B>aP??9U! z|4zf!6-_o!6i!{!)Od1}ss@5Jnc~K*Nfi=DEv0>}HjFh}T@1%0X{bfjeb$ zc2-lWPoHZ7k!Ow_J3P5-rPwT%swdw2v#GMBX_vO*&xF`l`?6;r^bt% z$hhNPwOKy&g2O8}pL_7^)1P|s%FCbevRD1uvtM)XtDpU*`@iteTYmkacRu{)_doFd zH{borJ74;WYo7i5n=ZTH!sCaoTbQr4a3;u8`9=a7+;dvXrnA(zPmskp=Fh|m6VDJo zl{DEVoe{(c7`@{H1jKc(J~iE{k1tpi;yR(zjSfJI%4h&_6KlQ=%aiu_5 z^3?d``1oSG$yXZ-zce^*H_GsrLBU-t*C_9qI^$Ie&>+in8TCj;7{ch2hXR|%|7Gtz zz#}=&Gr_Lv>Z-18R9B(8sv6bR3Fw@V8fgFwW-vK%IGiCl%sGgnNJ*3^OID;PQPB#N zEQyM?A|;E`TC!!!=Pd2omUUX6z2{wrXPwTEZ+#AD@7?-*XYbwn{eM*_G-fa)$B&>F;u8p!u;U{H#_;+CucN89&fMXHC~q+25Z?|DyE4ACoF9J+8_OgJB{hE z=x%JC+&*;r$O%MryGQT7@zh3M*Rvq!G&UAfWO877nZ?5$>huAPu}d}TH7|SMNTr@n zx37E68$WW)saE!1_w=9s;P?O28=5egNX}k+@!(trnM$I8W4pogVZhpud+cBV6|lrL zMqMROF#e71x#k@Wz*lhnD+1u%xzbTdjSnperJ0}^TIJg5V4`bFil7QF5PMzxLv74`1`TcfR~hAN}$(&wlX>Z+hQHKk-Yie&X#PeeZMcd+tL|f8ryr zdE;x}^2j4EdGL)d|Hv!uz32S(7f+wQc;=>4=io~|zuHDwJDVX=Axy?#Yhq9U66(v0 ztVSttLzzYpoXbwt?4RaaX8x z#^;^Ra=niK1C}ext4&-7a13`jGCZU63OPd4b2}Lp3&q-OF}>P$OVy0IP+VQwfB1w! z?xd#8rpb7$K*>Zx5K}ogie^eqtx|%2cc)d)6rJh2esIsUwEw|}?hP+2r=8Kk6X~=HC~rr zaWI%=v=*IMyz-gf`fu+qN|I5kG#A$oUVGy$C#s&ky!FzXuRB)E>bCd#>*UaVY9SMHPb8_&ek2}?7l-cZC>0ydF1#Hed7Q8s~`N$Tb2+EnmMv{-RY%r3Z;n0 zhG0SNDUE;o_`iB2!U)Sf09G#nz8%|ySsyl!9Q}2EM6VJZp>8JnQFFf?2w?6loXTR`C)Y9Ml zsn31=tDpMC@BiBOfAQNt``f?vE5H0-zw^vDKKsiIbrh#twB@8D9gV$C*SK}J$;bQf|g z5z4UL+UwF~fGhkrL=y_LY-b%z3~~DHzrQ&xUh|Qy&}=JSF4l?^|LaqpO;UZ8ti)WH z8Htb{%4c(Pw^L^FVe|vAybAzp1Ey~UJ0>gM_iQz+jfF_#HC}tEfta6+B>f~`#&`Dr z>2ts8hhKo-#KfM_@u~sv-tMf2$pY1os@a?p)Iph5|8pJIDUZ-y^;}4XfccV+m_5SR zAd2s$$nL*wUn#|6lEb}vco2hoBIIuHEr;rUjWT0`_0T)PI@$!>n$G&yIYu@p7CZH9 zd%ssHlz2Qm2Ddg@VZcKQfWu-5MYL2sQuicy~q89oLZi!V!@lnRHU+isrG@W!00-do{|f-dGh>`9c`n2{zk~R< zb7tIo);mbnJ6KJNMnUxuM!KxWK)|Ud+l&C zQ#5j!xs9WXTU$r2J#*&#qqp92`|S_D?X@3z@{xCa;Zq;}?1w-7`EPyebKm;JSAP0a zpZnT(Klh%eKKS8peB<38|G?W{cguA*Ts)cIf8YLgZMoQhTea!ItJ7r(+*B#!ky3_5 z_JW-28%{QV3l0dNU^ytETMHm`Q$Tl)^Qu|6Fzg_!#(Lez zPB#9_@0gQ^9;p<-Jy*ONbFi2-V?9M0>Sna6o#X*aq~SB3zkQZw`vBr#p3ps6$vXi! z!N0;UWB`C+tQSkj6H9NJ#QSQzvyRtz?Rmjw4^DOdoQnt^}`@jS*7_$ z@87l!xa#MZZaH_qTbWzmT3Kx8$#oLh4)wWXn{$T|cy#wl@w($ptMzkcuw?|$m7?}8%hnIC)47e4&uPkiw!zxvZZ_e;O<)1Q6f`nSINyl!FC zTP`ox%MOK1z%!-9wAsue({L+@JV6n9<}bdbh90<+TH|s;37NNn8BR~kXHwxek@6@o zRIkUt$I>XMsa^&lGl;up@0frRPcEmi1Ro?M68u-h2zZJ-SOIHV0e$y`@T`Mh_{3NV zJYM5<1^H~ zGU|0Q*}7|3Cl)W9PZwVO4}W+(D!Z*8{=%tK$I^&-DK%!B^)gSJ_hU_oYl%O3T~T%g z;OON5*nh}G&0$|fb^xyw<)Od-Y5*ABPHbqh(3S$?RbK--dPNAl(~N{C7OT4gu+Wuv zF>lXH1F-OX0eILOY(#w>R8{>oFHx!4f^0U?*Sz)%W1JX_y5w`bH2zaQ6!^RT&ZakHKbX#9$YvDfx?hC@pgM;FgmuGTcHSa-&+! zJH6~gkAf&f)(ZENjX)@-w|F9^D8%Xx1N#&i)+cC*d8;6~O3v z*XHLpH&>3GJ$U@W)32x$U+)&YZvX;U{16=*w<>^zr|EQhe}T ztx~m-wR6Ne2VXnqq)Ry-zewkbbS3?8BO*QYS5HNh`wwZJBQi3@RP|s8pd0g9a|!0U zf>2>uGpdROYcxQw>>-zI2ZfJa5auyhz0m@5Mx%jzLLM}eF`RHroc{O&GY}Dux76_( zuPfT)EP`;sQU#5 zO_&UA0DuL#Pp!KXa{0F;ZiL7{mfC}g#$2u>e_|S7FZaKSs0wworRWuKwqCTgYYD6= z>v1)B&d(cwhec0x+TiM<(IjcEL1LwvdbL+v;$7+RXnzqw8I(JP`}x(vz!W**12s-- zMvE7AVBh zN0^8Tb63Dzp2Ps;^w!AaJH-~PFsqqjrpjU&NnS)L$qjrP>qmFO|V` zE|rT8HIXf9JL{BH#pqge??Qr3M`ALsX%I-$V@i_A70Ib7{-}|uT|D~Ef84O&cuNC3 zt;hE_^YEmDCl-PX9ah(~m2o#;sp|jsw{D(s9^aO2r(vrRdetY}^OFe@9>_AMvC(Tx z(H_ZTNH$}J;j(^-VFDO%)Vd<$Y%~h!NJ9;KS!xfIfMFQKp2XIt%GJme-a zAXVlb*g{a!24ZB*FLn<~3^5V|D=3`zwz^z2u3J{L0p#`@;fx2C=!1XiYxhXNC|(Vd z$%W}434<`xB9ShSV}R0^a-0wv0n-kW|1Q^NNorJs7`Rf&S616}VYAM>x0(HRz6Bd= zOky#|1t~dQGD}ur?xxv#rM*<AnaytE;s-7clXbvAK#S0k4!tdz#1mgOZiE~M_@cRf_)w%EME{z%2JG1 z%}JHlyZm4Fq6u7C&gKW~PnRlxkNJIduhUO8h!?zQSh9ZG0L6dYf*!B&y7Cpvv`QGQ zh1E&pmEZrZfB%;GtcA{7Id%(pndwTAns{j2(N*JUk+m_h`Q&<0r^iv8WHJV9Dwnp*mGX>0a(%c zlAfZMaQGSlz=PNGyV5%v(_QQpI5evPw|q2w_8{~H0kDsw{n{ukfWY0EUZbd6tb5D= zSUVzx`vF*c9soQ5#C`4&{i~lTmhk^4_AhdbjPdET?30rMz-H!ANqV1CnMl@LmV%3;Woa`pioR<4_85AWM|Y;phoc}SGz z=b=)nw+|QRGs1UnZq;V<)&`-zgQ^;n$UR zGg$-Gzof-y)~$&IQJNVSorgrgo+PHa8;TCqQ1kXmF*Im7K1}4JXG|VC33k2>E8!gg zjMlrOit^N_wnM5A9q*;%HC|WThz?DK60XgB_9KbrL%;J!zxT#wGHW)@x^37yA6>{2 z!zG<*)%G7E zhUBNJ)`c!cN#fcN+WwL(h)40|zwwczq;7ATR8fA-<7<1p& zdAI?EQ_(kldRf??#1E3ygXa=7%`t>ET5sJC=V#lgIZpjRqfERpOr%*Hp?>hRDLnb} z`eG$EUxV#4rAxq_o6f^1q4RfLS4owN=Jx;ekK1age&4||oIaXR6sK(i!Be_CHF1;% zH|X-q7G(J`Y64L6NLSbLaajr7TM@5GMSCQyoq}<^VZ(lJfH|ZIqryVsWkjn?KJo;5 z&|@C-c#YTdSP@N$sG@B!qr#B7_|Cukqo2RcTq+o?N`3X*{Tul#eBsl@`K^6zvfrz3 zJ#oZb{P#b2RuF2BzoTv8dro6BYctaUAAq^{tq;I4I5H}OA-W1#1FBL;Na3@voD5VW zL|u{k`o~gFu)`$7UAO4oc$niO`(oNwq9JmHN0kgD#)iWJ#_14`eIzUm$eH>ec(;1E z-(KrV0hrPY)i~J7>tuw8(*^aP|78Fe;X?gTDMc>_z&lV_ePICHXDF%)dk0`Xng9lh z!XZ&0V7v?f?;^z-0O0UtVR{IFeRR}DshtyDjgFuC*k3Pq8`r~iWN=6R&3EsnL`E4W zj@Ydfrq8o_EFlI_h2%DEB)4CkDpkI}uuoq>e+iT2GSo@cOukv8ruSlI``n6~Joo>6 zB5!n7f9SMRL&D@N;!)6_E?aum5+>D^kZ2(AIiacC7!8dj@SjCtF)3)$R;_(OkMtdv z!piQiF3Z#sl%3rLHB!ha^2F*-#Whu#8t#@88Mx!*l6LQ`1Z%aXh`G#zEDSHO;o~T$c-lG`=N=cnaQcC z&{hkg=PM!2Z z2PwX!FarO%9?~SItsENAbdLmJVSrLFs!)zKl$a3tYAqs!$8MD4HD1quO-x8hjIUxz zJEhEh?05e7FMsl$jM%DdI%~Jwx$asxeP=2QmCDl1XBRg<`GfPJrKj%6z;YvBcI@g( zGE1?sya0y$!ypT2@F>|R7rR#9HcXw_xRKI~mYdWf3Xwx%J=#tb)7}t4A~Z)6(EEbC zgjOHpkC1m^wdv+;@2Cr|mz|@ac}m5LGo>)lc3PEY@I1hO^10GoRGk21M;R?yW29^z z1xv9^LBy~m?dU&W*5h&y0IV$I7*Uers?a}0{TBk@D0>#qqlT7tr(6wvXCwgkIgRuK z_TW}NVqf8wIY35M*I^E|!Ek4`e6DsYT1-&uI9iP-J=x#lt!#=O-EQc(7- zEY4LbpZUSlp#!fx`I6gn$W(;Ibg@E7PEMv;GIT?V%%s#wMTyCM&ooRtH_6OTgr~O7 zmnW3V0dQYOS{c!Vrr%ixT@-TD3~^NH+pnUzvF9v`A;9d z*sQII?#d56c-_Hz6)a8&B=5azWBw2RmxS}?hw?z=BBoMSb>4tE07#rR3~E^mnxbz+ zzaa68rOLWSfwbXN65o%&!f#R%l$2XF(DcsK78crP&KL8w*+!#L zCIyC-P3?b!vv~5znXG3y8SqbGbicfes$gy3-2VB+!z-D&v$h_Khi0Z(c{~}S+L@|i zYCrRSJIZL^rwZl@;(!YTXMGVO54(Eog20z+K@;Xw0KkqW2?GEu{R>sV&$Cz_3BV(& zWBN)^cW9kPMn$oo?BCRf(Y%jM7CPoigK-ce0T^@HWFL#FyM~HV*;h0T1N8_1X4UFt z=Efs#W^ZHZAX=(ly&R4kHubSnl#S$ML{2>xc`!4bG2eM-`Z_aZ<&f0PavoZ9E6811 zE+R%EeemKB|JCjDcfa-NvnM)r;$qL{)3wf0-g3q0Q23NsKK&{>Ojxe|+x)+qr1s z@U5@C<@CWOta_Jkymf2tFYb@eJ+jiOSE&BYneH6+2$Dq@oetA%_&WZCFArt(Uw|vr zLu3{hQ&iiohtY!5;t}Mx&xm>d_5Q-^wvma1PHNBtHl zubRkpNlS9$Ac1W;?7Iw%_hvphIEeM_HS@r!L|h#N;N7t53ITXXkb4OL9zk#(am$wg z;J#6^I&jel9(8nNL)$NgFC~iV(y}dz`t4amgh$bT{A7t8n&RQ2bg;vGi5necWskai z2Xk8xlq=+g4H2}%Dq<(dD2z>!J@kYa&x<7%>EKgqKmOpp7)^lThJ(bVB8w$%HPVH` zp$AXjv{87?U%jdLBX7HTwvHpJn`!UAc7GP*Xrv zcQo#MPiioYde^uPHIa$K)AqZ|6JsILc#YSKv%=O1)pOmfp4)!YFZ}Ia{O&`mQX+Hj ztv6kBd}Dt7;p>`b|6x(wzPqzjD^kWOD&WI9GY2q}i+PQb7Xo32UtiF6uOv+*sf%bw z$AwU&upGq^J&xeu?K^IH4&nF=bCx=14Z!CG#dOm-`e}luH0>Sb2VHcL0v39F3h-S#Ff* z=yDH$Eyqec^rostL7+~)Mq=Uxw3!=jzJ2Qa^=Ibqea)ft1AqREd+p}IN^y4Ip$q5Q z4ipGBoMJ6890fxvq^4#j)No%@oPQG4R;Sqb<%I*V60IN&c>0OAOoM?j-Z{r>yk3MV zI3%~N3{qHJ3|mu~&Z9r~PhYy;O;$<^^Khhp+s*d+e{a~=EzZ}A@Q8*%t({&>vEi?0 z${OQ6%iKVaQ(7R4kW+;4K(iXsb(j zh}GKiT61}=m~WVxAQ4BJz>BGa;w)~c&sw=Za)4-H${q^Lk*<;SqhZC3#IqWQ`@N}r zuEe5pFF&~3Dd9z8c8yjH57>+D?Xc0ud6%-Xq-ev_;vE?g{_koB?p}&BwtJWqhO%8y zA0bqJK>&P-m8dCl*PT<4ZC&O7oFbZonY(yb8I)#7{TlG`K>b_ElxG(YUff*k)QShs zENwJ5|Kv-Jn@=3MetWJ~hEG-&JT5y2AI@Z03Qt6441HSi`D}g9ARI{-qlvh>^KdZ& zfE8s(=RMSeZWOfeB7RY=R zsWr{vcLYR@xTv3Q3uT5XWF}NC0QSoXeENF5(JPkerYu-!XuT<+@nWVZlr3f+r2G1dv zz4qp+4F8TCOKQv)U2Asf&_+AIymIuwiS_o{4Qu(>cYgWY>zX$@>AX{d43MVBX!sN? z%Haq}QzdnZr13p6Hy0>}j*1aQRl<7(;7jCS$yHU38^7C$NbW;fEUbij(!Mitrr+~;Dg}fm2)GnBM(7C3}m2gjNDfehKu<9V! zE19HCa-U&BcMs8+=tF}GQOYFuAWB6ik6)+SKBvH}2er0DG%%}>?=<(#ojC(9!S+%W zH>*fQlqNT6LGcH}VOWU3a32ckFt1>x=tQqxi|>j@94la+6q6QCPs_5<LKtMR50yz_`5qacg-BrF)dIkp;x469+|GvxW&w+3&!C`E8sU`ykjFqIGPVy->}z(J~(#@^Q>4Lj0WB02Nb`zIA`Y=$*n;}v=lJfbHeJ_Iu~mOLXH znw*|e79RcD-~Rr$A6;wz!-3-dcBPmG8w3mPJ;d7#n!>(U5ZTYto}frm5xuzY@WFEz zw)RyVU7eN>)}J|2Hz*Mm6>c&{&Q(cKjCDN?Vt!7Y+!x3~meL~gJ|N_cQE?lX7R6!- z-|?24_5-(L6#7bKvq3?0y5_;r zs@#1+y5b#=p2ga!J9%bNY3D^fwUX4^{_#~tQlfD`&tf2Dq91>SesmlOz=H$fz86aI z5p~EugwX(43xe_bb_L+e#xY+30IPP)=O>5#PPjoai5RKm3Uyb%_Lf$TPLT+5YTtI~ zhHF+jtLxhr4=mU6vb$6~^YLH))O{CoZ-2UTdTx6TsSiE^+f_JYn#g4!1Xe>4fs@4h zR8!iNm6b*T@M!88#DMYP*C4n;v|uXo*n5Y=l$*z=WoVKFeCVIwMu)*N<#&w9r-)tu%QAtiN=_ zIWjFS=WS+GDO#q;18a1a@x~0Khcn!H#5ygV4TyOT1Cgr9?n7tT?E^Sbz>+DGUB~n2 zMk)6d@<-f*Y1kz^X5`diuL3Xvjq#kOrz6;>G)io@OY6679^TsCznm$o*TB=pp&kS; zmD^;(pNK+YlI-z?HJ?u#(6|OlEL@B_K2l$tz@re!7FcH6pN|Fo$Tg~Ss$RKO#tW)| zr5CLNX1nxA$(4Gki_~D$Na$_Ayd+M+8fxFcrDu0N#6S)Y#W2MO9tr`QF!cIf8i4)R zmt4t50Gs*aXzqT`1T)yeL{pm71up0HXWBWG`G~4Sd>(}l# zB&~DjhyUdB?|O6}?6J}-?|yaR$nuFfG>sr64#4~ry7LgyJwhbP_zj3(FG1!o-Z{r>ysi!;D@MT#Yoby)7pXk?rzeizeCPFt z4(AbAj>EbK_9ZibPI2}WgHo8@g>#kre*DQ!T$+k5Hs|N-Evw*I*^Hq|$5S%X2?H&$ zQQWDv7sNt8PP4C>Pm2%^OY@2pbc2O{3(rAXb1zm&5q3{I?$ywPFVqMC<|m`R zA$y;P#|~2PE;&?}kS7T{)yI$og!`q!WYr-Xc)NKy41QPhwRgXKWv*JS?OR`&TfY0? z+TzmuzKWOZ-1Eg>`NAVrcu~CeQ^{0QtKEChbyo;gD#nZuBm$hU|I?P7@}#yj%TH&V_|vboyVsXB{H4@kJorzB?yj0JVTl~aK0?A z{K~wW=``jJoxkhUN)D6KvQ5~?t?3PBsE1S{XXV6=M@|?sM(61E;WljI9ST85CW~OG z*UiN>E`RiWf5<p2sPeL0N%AnEsaF9;n{2ac>-|s z`S^qE0O0P0k&*se1J?t(^~X~%v}1jH%1~UQj1JZZi0?qoA&?U;1Hg>!&Q_NK*W*E7 z4uBO^QeQj(9%cU_%sg5U`T$ra0)gX%2EoVOZ+_|m!`T50mr@3)xW8bW$n{y9; z@MG^dKj&sVmBPdTqERLDq4%dYHg8yPN;&w@WvtRH0*!G*R7fg66^FopWt|N2zZ64J z_X@z;B>-5m97PVDeHvDC(s-L3ukpHCOA-}1-Z)up9s8Y=wbrVIO3-eee$@kWb~=X| z5dezR@syX+W~Q{tna8%)Vv|yA|HV^V^W{eC`{tLXUxDjnMD2BM5N0+oEDDPFi&n`l;r(A*ue|SzCzs~itMf}s zYimWs4&L~_pZVfj4&^NmG_}5JQ?(!bg1rCQV|llPzl)4*I4y|ZMMIP*%QJ#8uq1@# zL5~t4W{Hv(9s$4uZF!-~E9AeQofsVt=Y_DKf8Bw{?0AzLukpI7b+9>$=(L|ax!9;+ z0&JPcI?60Bwox<^byJ7Eb3|Xd`2)|r?VK_#7Z+C!G&5dUHwG6Px?3Kphk%L%s0=ba zhP_loT1=9}2+TPb=$m8E+y!70%=Qc+j5n(g56#XbhdCgfy9HhkR;VK*RFSCWF2Cff%JrTXHZ~x-!(~ABmj| z%y*37S-pN$09Xs53?%^ey)=n9D97Bg>ExXClZE>}JOAYA!>h})rkCD+%cp+&V=v#X zc|zA&wKpJ2zVwq~?Y6CS$;r83TIkiHZDsL3#=#L}N+57lkO%cpc(*EgZwh>A09Jbd zywj~SKATXL>1VE=8ndv*YrL-ViUWA+|M76UQ!BU-5IG%3RwMgvdqXE_rbJ1t-f+(= zu0NX=L&kwq7wS$-Nmw|L`>P9|Mr6JzCkcTVI&lE*q9_tlk&z1jy)t~Ja{y%e2dy>J z>;bUHb--QR4Z7D9rAq&KeRrASEo(h!YU>R6k};p_#oYgVBu=n^n;5%PX47KbGp%wO zEj{XS)8?2Ui!6<8`UsiOJfz8G^0W2TX06p|<=boNDm;8en)Svb$y+cNBR!3v_|VEz zB3RL@$OQGQ@$UIA4Tj$_E~91K7}iH~z|@Tj!AjeDEXBe(Lk@xT&HG(a~d8Mc(|;taE-V zopDPJ1qwIv=o>*GKgmL~fsD}|*|9h37ytku07*naR1vD0NOaNkk^meu-kCan7=Q)I zF(h^Rj*m@2UohSv$7{Tb+D(!m2zClat)8^L@Mq0qcfRM}eEV}Bzx_Z?2r-S|=%r}w&p6o!PNdUr zjz%bY1__6l3&mJWZ$u(l|B%0@5SGO5Om{Z`W)R#3V4Mqg+GtCLBWY3n&vH>|>_$0W z;}yD!3gM6njBvib(Vkz;gZHJN+-~%6G~iANavD>C7rVV$lW(xb9Q5XwRz3K8rq6< zC5@5~5imjOrYNrknNf#7mgF5iRtbqBd)6%Ff;#Q2Umf#TU*gX|2YojHrrx(4?t)U+ zMkL-Hi!z$hUIAF$O(~^@mEns>zmQLit~UKR7KX~ap3ZXVa0HDNWA{UW zh*`RI)653Nw@E&M5LaOp=yv@^IB~Lb8K?QSOUdLoE%+62gfWE(p1Pw;LRda6XD13X%Uc3?D55_+4veeO&Ai+uFAUbdY9BGU z3n_b>{*HEeq;9*=GjA09JL}?^-<6Iqh0idU@&>)2u2ZG9!}w}+*1~17l?FfT!rmUZ zZG|=ed-mVm50@dy_4DOOXuPB2JY?v#GebD62?-vrNJ9}rOc%`9lYeu28V-|MWDn*! zS~By@dieI2)GUU;*(@2=nX#mToKJ*`p$o&6UOjtf>WrB20oUyv_MQnpHQOHoFq-=C zvzVwDQDySt+b5;yxCcF6<8@VSDpOiY|MG=edp={g_ccms*OX=-{Qf6Cd2?IHCl20>@Y9`;v zXVL)8YB}vvCL6w4a&3Y-zn~3b8hk!h0E}I>mJh%tE3F-}?czWQcRxbWEUPWEj6)4A z6=cCFuSe?2`Y7)AyU7%vlfw$#JNJP<%TEIZhQv4?l*{Q%<-U7A@IW}@qE!w2l!zKk zm0vg+BY_fFUfJqGxl!x5PJZc{yUS*YFy2m~&n!i!CL-W6kyVsGnq(4L9-K%!w8$pM ztb{jojVfTWF%E0H=eF)tmjuQWzJXQG)bX<5d#Or!h*uS${*b>&L>dA!|0h^IrJcpc zY(m{T0IRz`QW|de6kgr@M0GT6nxT&@s{$Vv^9Dumfg&;Y2EcTP=+dgM0D!|9Bgivq zg6@)h&k-Px18Cz427A3s~UuQF#9N>DN7Ed0?FOaQJxQNPhpr-8teBw7-< z(u-L_)5#8cJ6%`9K><80vGUIo!Vm!OcowQvl>{mA4JZc2J?QZouNPM0h9Z|dX=f9L z_R;IwYx|m=dc$?i$=aLV{pRnSz5YV`{GGS1igK1R5Lk0rPq7v-A%$H`+q_)0ooc#L z&E?E`QLZc`QC~9BbE(?u)Mgt%+e{{($pB~_R;=dIX~JGIuL3XG#)X+`HJxvgqZN=a zhbb4w_`VW27z7(ZJxrI`*<4?V96&79&=vF%8X|k<&gECozJnKb zPv1y{8r=4r{l>CfuFtkg#dZ8AY_$@`Su*l&9e@PygdQfeU*R&-h2 zsjl@gZAbP3<4Ey-wa-lRzt1g}!-4#knhA`02U|uTIwYxIU(5<%HOP|O!8zMw*EtUD zx3IgWb{DlU(XhBM9)dn2W93%Y9pTL{Pakb*dqlMem-7w0!Cj+0iscYNh^I`Qg-TW>pcpyd{q^92e9X0;<`xs80jXzO~` zba7=yV#0j4oT*}Tn_bK~^_oy>P*6acdob&9YRmSe)MxHSyG>;q)3 zTJYS+5j??MrTj6u!v4n>#M)Y)ABz$Ul6}rmx2hfmz@-TU<0TJ7cS2Fz=yL*u6LcO&YN>6xhzW2bAf z(8s@~@r9J^hEDAS-~s!SKI<`MAi5ze**Gdr9(nCld|U#L*Lb}^$E!>Ky~ANA{-!6Z ziwnn4)GBxU+s7iCXFJbrrz>f+mKW+pR+>6wrB^6Xw-^SsVz!KeHd6%zq0j8(8|dZQ zsd`nniq%|Zwo=PCignC>i=?4oqgoKHNQ{JLuS0#^T>Tuvfzysn>RHyaX0}@>OsOl3 zJ1*k}IruP+6eB6KelRXTN$#0ByJQBqYjVCdU7sGNWe08RE);hGn7Y?lukU+4;C6Xs zoXf?%J8}?D;n71KoNwh9>yd}ol~S7OV=; zFedXzg2iiikNo)k9PcUK)V=iEFH~mHp5QMNx(Rkl>zxH>k%MO^l%r<^RddB$=Kp)5daf z^FaCEr@Gn;{z{4-lGLI4T~U+~BH_Ubm>H`jG`&!6&X!wSt=b*pBZS*!!W+_NpJF=cb=>*ZzapK;7^qc1sKv6 z_%PHChOs(oRRA3#U4X&Z4{8mUbVkeNTA{L#FXwV@u}E!amj<*9v}v)VCC+!&moKV1 ztME9x*~of5zbhk0z8%!OCgjHd(X>YQ8YUUQb4Ew;2!L&DM*wt!czod3tJ*XwgRPa- z?LB*g%M84^u$}cul^N30*c!4VRO*OCregy}zpQx23z4sz`V(HdPV;7dSTJ~#T4etu zn3kAmugHu_aftVLv5u1i&A92cFvyP!xTq=IHwy?5f>SlpZt4q}R%T&o-)g(wtSmGa z@+gpv%$%I!H%-%B_;*cB@C;%i-)PKydr)U3i(CQ?qBj-kes3V#6>Ry%I(ddBd_l6Z zqq#bwE*(rSQhGh$Fq>er%5zW%+|TH_n32M~8Xxq349fDLOCDB8G0PINWM0dTawrkh z!3aYR(f!3II~BlWQHCH+l-YEkuR8C|uhsrUr`_#0ChN7C_)sf=7uln+mrY=KBO)Q2 zm3=4Y&OaWpGOlx?nVo*9YekwO&h>kqu$bvwuFCiPoPqwE5QjnotncrtD%jQ-{i zo!P)02rL+a)}vru4uIAE7c}T`XbrRnCV%?e6nUzT*LaQB^IezgcTFTrO?u^rGW+vI zwfR3hI%z)lq;1-%g=Me3mch2+SPq9laFI}2f}xzX9KIkDvPsWRl0{e4gJ!V+F$*hTTw#&ZqfN%^7i6F(V&8EX>csqXE8J7Wf zGwEuH@jqR1C zDiIW;Sse+{b{b3K1X4oNVErAXVyiN{u+VA47G!mKxw)Kk$kfCVk;#mKZ!|K)T(Tmp zAZ31CiLSK=&oGvG>XdI*BC?4xGcchz3;drRs}HIp8S5a0UUpKSE4Z*bRWC z6G_#datr;v@SggILi-qAiJI06_6uK<_RT2ee%TgR`c04(Rn)lI1Y}x*#)7t({<>@a z(Z?XWECAzNAWTWpFaWFZ!RztHzR>4#21b-_x(lET7-tV3Sf5?ocjxhw7v58muWWu4 zk&}rxeY9GrZSYT$6zkuRyy- zl;o7fgupg6xtS^$RVkYngY}gG8x(jAo)ri#RF6{oxs-3#P40OKl9!vNTt(Xo3_d8; zEoeNmE0t(<9~3<$j`x;pXMI@Cu|@ZY@>`eQGM_J)ZX+8M&fPqxK>Wl7Soq2hbK;_{ zlz!wduEl1?#&$5_f#3TsOn z+lz;8z3$dVeP5%qn8OSn_a%lC0#(Pr9Z@>0r~}6EUa>ow!rPN7|ZK&0IX=B z*F}3m<31&FFlc7=Hd^djnA}hBDkU^AhdE4UA)RUJ#^!o^f2Muc)&p<5_qi{ZuXuu_ z$>GPJEqm39t@C%C?dB|3Bm|zBBECV~2jFfZlbR4xNNZ3>5zU8*+l)M~X~UTql5NM8 z$@Xs`#Y7lyq2o1PR}r9dLiEtr(o4yue_oot=_@M+^_wBs-CuDt41fz9s7f@$1#OvV z%mlz?05Ks5+P#32^m1pme8y>4TDhD<)6*Q6_~fz-;z|MD@s4zknNj+StTzaNv;D#& zqiak_H%CDZz_tAycuBjanG}1m!pz%)?y8(m7pji0sYSI+AO`@)lSw0h70qOHl#zmj zwtAIX+UP73?)s0;vAfOkbd@7)wrj>!aNTA@UwXfs$=FuI>axB#o_j%ZV=zi)HXt;G z^<$jah&UMpAoEB@x&%lKr4xUyyv)aIjmAM4t3-zf-vkUd#$ZT_OwHieH8njs6Pli$ zibz_a@R7XknE9reEjO$?4#KyvxmxVhi!?&7!r08k5k*W8qGPD63Y<2}>sUeQ3Vj() zG9OJ8>Fl^^?9G+3X&b5fLb5X- zIrLrQ$~hcbOu6UN4Rf~05f}}gG~PJ6JUKNpJqhfLE4_g{d+DOKAt$4Xup0m?I{-K_ z1i*qCOXDOl@%{aXu^RWF$7{T<;xZD^rJr)!`Tu&|^sOIT$TwP4JfhHAZvfMHui5Sv zu+?;ipo|8tWT4^XfF0FJvyv&5b4TCxQ2N{hM~}|ti}?(szSJCMvKs&AOF>UL#{f8h zV2eYY*_Xr655Sg7O=^JZfjbT~nw_-Iq+-=+i9i(NRUTi+)WLoV6T9_5l}ume>=rZc zC}FURpMs2vAuww+qgKw@oE}Dx6v`<&Ww4fXfy#fknzy32@7JvsP9|1&jO-V}edOtG zYE!oB4k32H>Axq{63eJ?zSJu~@EF{{xO7p3thm|}BqmIDpx7Cprj&&LX;xqwBh zq528S@D}4udBZQUdp1nIYN^W{>I$p;3YdT7p%^{tkieZ4*|)O=i(Ut-KORcgTI_8C}61R_7|XjJMtjxhrehQEr$=y3_sLg~qbyj08- zS6UT>eqaVd@BBvQ!kriw80CF+cVVe!J^jO>D~GcP`WmnNM#f$)dOFkL8#rASa)vey z1P;k+d?(r6n6ZRtpA>v_b>Dpn6wSX@513UO>B7@5fAuuvVB;-vyvFP5t(YEa{=(7P z_r5WC>bb^jy2z|DkQta>!64TSnzU3gI_W%gNyJPd5U3(F2-RVwQgm`U1rr%cXDPm# zZc!2H5{GL2xanA|o6J~TY_3}10E~;Xeq53dIQ;<3rnLb?JJbR$=F^$OokK>7rngSe zJ+_IwMX7^aCQOwwRgSEZ9;~OCeHU(%7-crekMYciV@2pzWmGGCsFpL(Yg%rGVX{;5 z4Y6`o(b02vg4AP=$ZYDDHwEz9n+oeeh~mIvW+0ZM-+qk~7Af+W!IIt^B@2GVvs?88dQ`T_2X%io?9a` zJBx(c!rUx=;nk9jfT*$vIAqoqh@52+3{p49Nh7rMl}@p~el_<-OYySre}SFgIaU1eX|kkn$PPTXx!73p6=M`1jnX%U zBSn6BV{3E$Xp4sHI^JhwHC`%+0-3EY*VB!qw!QC{=cb;=A816?!ms*@n`U zRWSMzh5!Vf35CN$`5o{eji#rv@j=KP5$&`SfP04%)$k-ORQ@s;2Fk=(3p`%qb=8(? zhnjy^f5-PPoPEODn9sOCT`F-)PGb>Y&>$BRRmKN)(-o+Tz|c*j6Kr`|w}omM9?yV2 z=wgvIXcY=ZCzZsW^AbV#Y!e;u|Ni57Y6{G3&gwGKJ^-9zwp>UF?8|Q9H@VdzNDs9zxLP)dfR3$cJET6i_(1_ z)~uLJ8a@CgDN;$~`d4Zh6Zoj4H_?Ph+KhRG)kLdejREQbc+B%lr&5&&R}8{wfGY^0 znTcL#1h!k$vIQF_k9_*T%MLHsR#$G?K3S>ei0^UNNo~3hx%Bs}R#N?!8kjiHw;6x#5fXSb<6m|L0 z$gqhxz=`X0tO-2Avsrr3BBP{Hqk`;Om@z5F0QCOm#^TJxg&ikpcJKHceAn>|r`%ZX zRLUUuoeyEKV5G>n#VOEm27e#ULOoqW=ENeLv0%u6wi+obEP~3NTVF5GO0HH!X&wsfgC3(F_bGUHL;*984)zmn*ZbhKdFKjx*?Qmb6>6s#wO8wU z03*D~O-!$(o*FE+eRIt$J1elRF?oiFN+b-97I|bsDn2;_<*}-u$%%5+EmS+T`2+jY z2DD!Jxy74`#R^uj=#(sribsrg6_C85%-)glqcJS?xmi5^haM{{uo5TXltD314894_ zBPtEEXAqp5!dWMuuXmbD$4?zTyLIs7*2anLLkG7Go;|U(arE%g($NF+8|$_9>i(ni z>r3k^CzlSdtgo*eUO%&W=#K5f_-y5tGux-m9XWMzW9#6db9bG-_VpVZE5}ySFxJ*( z1+?ir@1S1;7nT0ZZpq)YwfV;5^*iD@5uqC9;YGxXA zl2?ak_9=c?1>8fJ0K{#Oy^MgC>nRxiajEegJchY3r=Ps z8EG$@sE=78?e%Wk3WQbUKW!h(`j02)OQ#Ape{{j~Bbv15A2q0xXxJY4Z>0K)U}L90 zCKnYO)B@0bw5Iyl0)m(>*u60^m@jkl4PdYy05ZFXifEeM!cmh{Wc-{1-PUP4Ms;eE zF`-yn81Vt5I+mCb$OQJ|I1z_6D`rq~m0NW4#o5yr(6z2s8*8=2eaoGCy<<^j3dc<& zNokNow^F69oJkAoS~7{-mQ=b`@T07S_JQ?-$M3!8CHLHa`(x*C+TPwgcKF0G7e);q2_b@1%|X30cj9#kSE>5{RD6h<}?-e7pA6v$O7rV(NV6eb41OhUvgS?KiR zF@w_r@$}evrj)Vqdq96DUukzb9mR9VkA>nv>{3g>ZxHV*ma6H|0kZ5C^VLdc-<+fW z&!?X^pJ_r7m3zNch@IF7Q%i@0c=$J~O90>*VbC(1#@uRrDyH)Yki7wL@JVkdZ{$=h zH2ckXBCd^TSmQNbS8pM1{*8Y)w|M%Mvs<-dtyWuJUBDo?)hHHSr&veX3(hc1FdVcc zP0eiI{m7lAGXDGtAE}^(6scG&g6QLBTF@pH^g4eA?V!doI1OxNm-b{_y(dO8angwboobu(8?%4R~&?U8*9# z7L}q|K0LR1!vojf{Q5V);r{a%51m^-cru;RK+cAr#1#EU1SgudN@|~FR=-P#77q8P z3~(Md`w$L1jaBj-gY(RkDkT6aVy=*BuC8nzKXSwN@f)^|&F^dH&6pq&dzfGtM>(`| zpmsBGW>EaZCK!S07PWIQcVT%N1^zAvoj=_uXBH|8v&AA(L?95b37)lO&0{GZSu#!& z>9`cM9_Wx+0QbH$TWPKor$6~_Z4ptdkh21T6Mi0_r!$_%z8nDHLYBu&aNRM{uZX)% z#IZuzO7G8wu05c;I80DxF$R0p&bsd#;`!J}1J{I_WJAxu(2D>SY&4T=rFscZ-Bx>! zY`d&M&6V9fE(`;3&($kv6J+hYB2p2{vNBS(7<(QC0#} zP9=kJs0cAqij~`08}NgvJs;c`m^Dd}^6>C%0oyUMU{;WsGXbB*$p|A4hed-X2I<-M zU9E*mtx{h&`q1k6r$71h6QBObHBX$`Jlt%hvtcnZGd+#+RZZE|LN4pSD(qz-ezwoa z5(ezD6rW|K@KSZqn355uaXGrihOR(#MWbai!qbva_|CuqRJO|b`r`4sZoKvWm*4a7 zb+_KuDuqMSGa=@frQ0?H#X$d9EJ31jYK~Y1miNW}g)}^0fr)p$S!?6?M&o!KL1Oe< zb*%eujgpd%`pLQ#&*-GJ#z#$Ih9A zz|$d>V{PC-$;8e|yeui|9syX`;Sj2*X&g$XpSo{ah=-@fo8)+n*Hu~*YF5y{_nFeh z?WIPoj$#(WzS-ru{qs#C24@OIaG=1yGOhM)cWu;6S?4jp(EGv?gNcHfH%E!AvKXle zdr@Ph=$JnC5o;Oz7n&p1YOQ>&hVmNHr8NgiCW34Ww5~?0)j-e#r4`aGy2Og&k-b(Q z>xs_%e9lY0SXMCg#dn>w!9b3%*J441H0Se8uezB^@R6dzm;$3TdCbHJ^Q-O@^QLAdSiIA1 zq&Raq<#ViQyh(VBtC8@Cf*?|CSj@_3uiJ0%sLM*PQHk8KK?bN*K|msy_7-5WNnn86 zphybzMI&l%>4w)GfAm9--SfnuStFsTp?EwTOM0mkYd+A?ON2%^%&J_TTg1$;pzbA{ zy`;->SGOeaAif}emzhCxck4L9A9QxEU>;jc4@{Hp$xtMoC{#9Hdgdkfy#AIm$2w*> z1b|N1n2@A%2K}OPjL^WIWy3W+C)1c+-md9c7*2+=lF)=tPZBvV z+zZ&C7d0G772?XJf*&slz=Gr^i|+_XTe*p z6ld#mMfBMkPAP2{DsW(Gp1kpN+e~E{FUm>hNKeb%rfiC~5++19>F zCFA6Jja~~s1u1JLU+gsN*ua3w#XS8>JGpC7#bqYDC(S0+;|u})0@+td>5ZB!-La5u zq_d9CsUj0e25(uLJ4l0SV`Df@_il3oEw(}85tI6f3Q2a`Jpj&jbB<_$$_%op_3l%) z%pCwcNKiA_vBEO!yrA>qR_D}kuUnIQyd+Lhf@F`lO}ww($QhMvk_naZGqCow&CEF{ ztx);8IbPNCn%J+BMb2vuK%By>EGqM;$SW2X>dVFD)q1nxWs`;a4G%r_uE*c|+S@m0 zZDq0|#7TI}D9=30(D&LxQi9Z%ipcz?I1#8DQrH7v=EEg$ybU5Cgu(b-KVrfMq8y}G zx(7TLd}Jr)7;^%HqX}H3LV~w&_Qpq^c>29>cwotuLqctHePyxTt|5e^O!Ir315Z9s zLXNdt(oWPBB5&cHOXt(s%0g#h7H6+=u7vhAW(n-DiK)Do^-3%{jFqT4Msl!=rOgAe z=%?;`p(q9>R^;@rnP!n_;dJXPtkP8{fxuHZbMzcY{hq;O-jqffd-qL)cL(6OXiH#` zf7`|DERFZb@fxqIRst)g?*954%eNoR)bd1j#RfA!U&H}F-)NxvEyc7`OH0dE5-!g$ z;wYC9H&}E6`(!_}o^(qkrkZ8Y=sL!U*H<&`)m96fYM1pe3*1u+;tkROl^EBW%E(&2 z)=3kHJCyOu=vUm83SH@3ARA^d?2lVH%u{(m0ZSOuIy9@Z`LvF@nikUm<0I5i7Vqx@ zo@w&T30PUPAAoK0xF}H1FdNjV9DwOxyKM`tGfF9MIn@$*Vmp3O4d@Eyv4nk03FHf; z_^{SuzS&t;R|nkeUPbF$iQu(hA8khcvJ3rkXl7kK3V`Wxd8U}xgRyQm`nb;@lRt(o zDclGyCRr4FhTntvKzH>nXOh$bgxC%Mjw1t+Jnxonc0 zL9L`P6@E+f5QlY!y|)he5#N)R8DeYyj=W88Ys+MrJ-D6sV`GW-BSfT z@U3uvU|`&o!G12G7?ymyV^FbUbWBObh$m&lz{>)1Nk-+|EwBBtPrm1&YrGlNt1i#A z*P2aCPTG}XeqV$?9(M!(i%PC%1=Cd8-M1BM*(L@_L>dj{a)DRA79 zl*IH~Zkz!JV7y6=*LYpErFyo0_a81T-JV8}FIvQv<^5~us%FT6DU%Vy3pagi!2nj2 z(iD({`ZePgdI3iThMf*Gi?#!jGm1iQ?s(CJL=v(l7L3I3n#Q|uuF4KjpmNX)=kv9t z{fE})=VligD6p}$Dfm<50nSyfr#kX? zNrHQGusijjp9xBoUbnqIAONcZioeH#0xE4F8kfV0s z+m(zZX?W~=Y%)!8pWN9Dif69B#;t>f1@?Oe300;xF)3G%Jox@^{=}QEp9AgAFjMfh z%r!fv(2|2t!D068t~QW6(*dq<(d}!Lwx9_?C;_XSQ3A7?UN*>941M~fC`br32x&{F zpZd((4iybVMv63>NA_l^;$$5>&#ako*)KcLi?Nf9KZh@4KwL@_O2e|v%KDspU%y6B zU1`i6%ue6%Rr5voJB^59^un*EoxH)7d_-I{^n!$Xo{h7^gPB%ZVxk(3@1DFoXwd;% z>A~i7+?G{sa{kAspwpTdZ<6CRURP^H;4fA9neV3094eu>tyMa6O#mVTPB=X@uesPx zI2jCZD;NZq^Tl+*4#I<&trToB3fb48VMruf7OqDX~ zc3h>$7iTDKS-L+-=jR2^aq}My1vsG)L@G4xuO0x?92jMFIJhMSz#72{c}GGIEXyR#!V`hE*)+6} zG%ck!Zh7{buii4HP&k!EFQQVdlC=wee`T}gpgfyi7$bwX1--TL-c06m{#(`L=RL+! ztmoTDax=~UxcVaSn80_#f#JfR9VnZ;yUpIpx^9K0C#NuWSNno1IHr0jcSmmVo&h*2 znyM^FPdn%#jC;`IHC|V5Nup@)|Ld2h4{f8pTxl;Z>u^c1LlV(Ut3FFDRrDsyYa6Sch4Cm^NK^9;ySAGyFs%&>1I)2f znmnB;_Ru}KU}r^9ldT*KKkD;nb!W;p%bfRUSM%x1^n(uduU!V|wog{|tuFlZC8A+j zEZE2%u+?C$SN*qX6n`3c?%u1V&o5~y z-;Ft`6N}q_%}7ELxw`GtZ( zJ!s%-y;93Kaztz2^Vy&K&bv?peosFeD z%(SN_BXB(#1Yp%W5O)-HZvf2u2CCW(UX&CERrT}_-xX5EW?17jURQHPb=iIRx6Wn` z9?Uz%=0Yn^piy?q=JFkR&4d`or8%orDn7Oey{%Q?5kh1U4YU7Jf%Tuk$|7bct#rZU zu;Jvb#qEj#{B;SO061XyfUrcZSjNiA@hT9Kqe8yc+}~)`R-2V#DdU=;&m=r-g3Hah zHCSn7(*7uwO@%?LPP;56A`lak-E@h~qABsP;M+*@z0fIGz3Levo1(J}2kVryA69wWY z8Za0Pm|$ZYY{0%4W8-5k7>8r~Kfd>QzpuKdcO`89_aGte>F-E8JG~uhs(b4B-uHb1 z2VfSK$coQ(`EI+4X1E>pYO>pMPKHp$col}{4DY+?$!%J5s9k51u_c?1i#+2YVsr>- zP|i#!3BTEp8coXfbHh29!zUXa1J&U{LfJQMws)uCW{2UQ!_Utualv2}vqULh$Y5_h z2l|FO-2;*BAE=4kCRQ5`VBQWxy3=fK`#j^(n1Y5FA4>=$T0rqz2cvT@dGz%!nTt6# z4D~xhk*I=G>ou`_VHa=v4vL;ZlIZ?_1Ykqv`+vTya(M)!XK$MwjOp-sz`h=e#Jm`t z-bgl{mBLPduy5uKcbwhm9UgMRf*i)HVlcp)2HiC<-s`BOsZb3h;Ixs6*R??V-RJKK z0yGo3nsP;DL*S$Per-A)3$|NZzdL3Zjo%z%BtXzi>A)j{7qp;JxCXoy&;J~NX(+Is zeC!wq*&O!arQaLDe7VUc1nK`QCrYY2|$@@O@4brx!>TDr`3eLJZUtvf~Bm zB&t`CB*Y|=u=$B6b&Uy^@(M#?xN$&Rq$xb+57E7HIuhG99`+#}2`ynjo)DqlrECas z*u;#`S8ddbdW>CFVp_6LY*sTmF6K;0;$b{vJqvbro+i_B0!P55zDR)s@I=w#RzccU zSyB*hg>yj^cb}vwar=cL1a!;+8e~`Kn@OBZQ3!^!MteFTa=QJ46SN9O%^Ma&ZTD#mwFTB& z_X$3sJy~3LlO~+j&?X4+NpHkRKBlJ(J}3AZ3@vKF1L1u}{)HInl>MTSoy-G`g@})I zxs0qu?FXLE990=pP0|{*azhU|BC}V$=kYsthX#iG>?S}j)MapwHaJo?lTmqEB(H-h zgVqJ6j(+>ELf{MV*I_rhs^;_8e}%m4-|1C!dM2O4D8F4c*RQITS?U7fgxvulTc6JO zAndVKZ+ZC9%g1e2kDAwFs>FNF?Q=_pDZtl=p4Sy6O+R^QT=RxFNg+g9CVJPEY#|@I zXnNHC^ku(B9jz4>D04q+nh@D7kS307(#@U#vI&R#!13;!9phXFEd2p%zx{vE_wTp& z+t0swz!Mzox46G0_7C=3dkEZHz4d%{p+&#+*x$$Fjiuch67OZE##OGi2^h1YvW&4{ z!iYpR&}zPd@L#}%SHeX%Ayd#UU7dNfJR`~3+K)}nCXw%m^#c7i8)m*1{O67K8z=PUQXxcS|y`u z4z+_N*rBo^Gg)GEit_G)JD7(fXjts@z76*GuK-|fn?mK1Xb7Ex=f^q;#!nMs!Y&`R z_tE}fOW{ogMTNIUB&?4u&+eXW2m{V*zV?mJpDvq6H(1~K-5@M1K(c)Bo!9NB(#Ep4V)B)6N0**RVYo;s!Vxx_Sluq9)Y#tl&*+e&~UQOvOOiVqxmB49|+yB;E~I?lC{*6TUb!PViB zr*8lCHml%pv-G2+8!~r%MnMb&0^0(n4V243nafO))t-Gj91%~*b)M1HuZ%xNs^$7k z^rzJs9q6}@KDlWaT=L!(vbTEc`D{X4LSE^e|2!5^a+~TjUj>Q=H_!Xi23eQo<8pN_ zbxX6EQeJCiVB2SOf7kt#Bixq*6e$Ve@~U2nM-!|2V@Xi6C?p>L3K20A55tE)l}Tk0 zY@-q6CuMLX=V^R`XItiT)lvTvNy5ie3^mUEr_FHvj-& zI+|FTc@$Hh8xv!R&{tSzU;8>pNlaiW^Ed#DQQpPIpjJ?|Sg+8?D-9jhGiHhi8+aB86#i(Y~+lVh4 z_V9K!mo;+$?HEUQCY3l2Iu%Tw%mqppCPj5PT}A>VKL+lnZM>Q6@rbrnGZRxwb7k3L z)y{nQXP>-9?HlbIH2K(6!Gpkpb!c_iJuX9~+i!{Z1_(&KEa{Ku{Qggy%4VmzFQr@B zK>fvpwK4!1et6!(UN1lf5QYkf4oWyzO(tlzM|{#{&zj_&)?-ni`y!Av_qxR%-O@L!+*q5UIC% z>v?WMTSKP)qLC9h>&#QCpz^#Y8!sEN@&KpBbxQ7>rI@yn<%1lGoE& z;(ak~ks@ITogkYnYL)WTA_dds7$4h)i8dsvsquPTM%a8Z$|$GI1B(^Gz&atK#?!?7 z!kz(et;rqUb66D4Tj4M(Y{J~TNF+%!7*~Rp47vMfLUtwQ6MX@|9vw_qulf9<^n&H< zjyDb&kWcy}mDwd3Rk+}5n_z`Q7X&bPgWZPL>*HG#SrKO}?lh90+I}8FTe!5|ayFD( zA;Ux4V+1i7)M#HQcYXRtuiT{!Z5S~Jz%&ym z7wG(&cF=BGZ}&O`A7YlwFp)xrlZ%z7{QoW-er{kyz>>>utxOEJp|ukQ)qz{ruf7TN zt049SHaFb}Cvx|C>1_U05R7bQo(gR8rcbYc)xp#XZ+(JMJ zK8|Y6XOQk>Uo^p-W<*gXzqedGt*2DS$=muyZ@TZ-?&D}dLeuKk3Lz~@6bPF82yllr zjgAZhfn6P%8E-2O+Wn3Qr9s>O8vw@NZ083y*ey|v4~CMT0F|yMMCz^HdfpM(X*{V#C0l((6<>1MbafP>zk;oU)d7NUSNGPIGkK<-@Y_)Az~ zRMnh7{#^TqcFcqtFOF}U&c$WNNaAI``<=Jck%HG}3g}uS{7oIZT=HG`wuUo+JAYd3PVxIE_Fzh4pJ_(cQV0zGi3kwo(-@}l}2HdnvB zTgT-HxI8fuME|z{+;6fux&heXkW@V0`p(oqf3FAKTfOx>uc5wvTYuw2KRxNQg>&^h zjH8aIay(-?kG+5z_bM0*xlATUOTN(>{{M0#?3yjrX@(y>&1 zIyblPrlm{nd(Zn{`^FhH9IypMwbUqP^irWXQ_d!ng(N1sip&kQqAYiv0Wbl&A>P5r zS7xS;K4_MtY((J86ZC+$E}DVQ!dE z#Nc`hoDMx=>;u+g8VEiq=ukA&&B1mCMcbHC2-zm1luT$lSV+^lzO?rs-9iw)J)Shf?6xF{-+q(r>`Y-a6bbc)UG-ZMe3oB3RJ zb*QP83`8c}5k2jUVzaKDMFedBb}&o>wz5<`RQO=x>(KHTm$xBu=kIr_VM(*0fu zZ|>;L2RHPFz`fO5FF+A&f#>bPfB5sw0k4*fXM?*>nHrj+m6G{YGzPNhjO%LC2?D4O^=VOoGbMD+LAN<;JcmGrwHED|_6Y5`?GAVqSpp$nN#29__ z6urE>PGA54AOJ~3K~w@YF(w_7ni?x6q`j}}AHDqxj=tvwx!?@}MU~_( z2>w-)@kS$)q+|v}u148KB?g$MS5*~*R|WVDg;RyB;4$DwJ=nA8y_ z4^~hQ;|Y;0QOcL{X;j6Gi^PM~MeZBIC@fUcGmDLNPH{v~D_*Z#xp=@|CGmfRHbbu77raNAz9{aoZ(&7R-u>GGEB_)Jp8 z6_nxl5Q^~Du}D=tP0S?*=I0Hjy=@BEx>F}_QFj5bNXOfues$mr_Dj zd-Z{@KXt@}7+r_kBZ+=o)Ex|d4R#Yt59C*Nv(4;qcl$Dnrv9;n*~?J@rK_8DlwI9a zW?rJ&*w~v9&d@ZMBFPfASR}+sPll-{AYcn@5c#f**ZHjQ{8^*qS>{&RH+_)*;}7_=9zateCzGImQ$iB z><{N_$xJaLus)(aB5{pQN zCsjDYP*zRrOh#NmwhcL9FaT!#XaaZA+C)V`?ATk2%7L`tk~%d5LC~|zop~3U4Rg~r7V?Av zcc*1eh~0+P;5yWDkPUmi&&n1ybW>b|e1Xh~$+Z9}sX{85N+uAh^NO#0?0_)3!R~gN zLb7CXGs7j6sBVfA>`-hC{I&I)8R6M%^n87G_n;ln#?qB+%n+mh0xc4!PT4pLvf#u3 zenevTl3t7Qhmm#Rvn1&Ir7>ke1=QMgJ!4Dj8eBzOzzUK|LtT^nYhalKvIb>0m#N|ag@W{~csHK}I z4xqKlCdWE2>p}qL!OGkP%Vs;@vD>eJzcqT}SqPB^dY8uD>a7=|4-FoNrTp|)|K!?$ z-E-C3!+B}t?7kYV_zCivB&*2;YecIWb$F@k8D-O3kd#$D>brD*!femq__sg$ojs}I z;VY||Lb+P6P8W04a&u*>dT4rn>Co0{QiruhX7%Vhh z5^0B_Q%XZ!iPDxR*7#Ob8?Cf=-7i@%WU$nF#rTaVVp<-3aDjDJQ9?Qf64#RD=EO&Ec*d9|* zgfI_Du@jPb0mYiym9ebo2?`xz2|CE7wa|%BWC)Wf)h}Dd~Ql z;DrgoL2nyQea{A9?>ggIcy_BAgzw~JqoU{YUaNQQ=^wl?)d!bJhKxR^(XU0a(0Rs( zhUKFZr55hOn!qk1Iy+*b3w~NAWJh49BSX<8BGMiJN0VG`M8#~Hf!8MfC^t=FZB8T; z1Mrc-YYTg9CYQ^D8>zW$vw10nSY{tWY|pfGK9hojd8Gm#o>oC0g=QtxriqDoBG#3V znL`Upw4`CW*XMHdxA{iYfF=SK2Y&{@I6RZHkNl!>40O7^!sKk)I(p(KsS!_cN>QL* zSF?y^K*BU;D5{Jpa5ht&E*JDr5d48~B$Me=e{jce-}6{D0)hKy?-Zh%L1-WYP_J)j zc%*N5gXMexwp$anbt%$+0l*Hk^8$Yq)otz{ZhfK8H8|M2GWJ$)y)blWw`tH)eB`S? z-(?%U{O0haEY*)J0I@($zf32DFxhj&SVj`fYbjv?4KRtPArbF5t@|%}EMdyOhnSh zG>%`%%1I zEwIo+2JIJ)e$Th@GX8~mc+n7ANo$SCoR)~X`!g^9@)s`iZx});2%`-SssvBy>zZtK zd;1E`@&VZ&sE*AB6N)jZ%#OyClS+E#XUXa5G4AaVrKn5rz%k$O+x#Y50J>k~N`xs8 zF%rwBl9jQs)|PsGTmC?$I6l{EO-?P2x9XFV#mR;q$JUQX2o*J^>w#c6B!O3m$~2V z^iz1FP2H5UkJkTidB|U$$J2>P zwKy#1PliEu?+KB5tG8a5HE4APT~__g|McZIUvjZG*vKWKnW=?|T7+z%siUhZ>x&Gb zDJPiFGAw^)a`5a=p4^-*wRY^^f7$r9OfHv666nPwN$gOS84s$P zP{nf8)99458l9=8_)60v!%Q?T(=iex$%!m!tB`oiWL1oE&5&3FvqhB#(!ba}THflx zPt?f`X30<7J*zWd?6+^z zMmGSLJODVGtK)~ky&lN8zg<)f4zN!c_TZauyZ4^! zZoBik8*jYp#`|A$?#in!zw-K1x4hw|yN+)@eC?&z95}Rf>+I&)E!!40wx(=Au(DX%hyeuDOmXx?D1fe(Ndji4O2x!G<3M`e(&2#3v^6&JaApbYj?^g>Wt zDwsFq|FB{6RWm9@AZhVJp^(efs$=C;JnZy&$aP%s$(gaL)_3nWw2|iql-}lA;{Q1}3qDYsZO&p=ImP;C|mSk^;GKDF~53bU{30|&JB^qI@WJ6*^29m5m zjY_Og*V6pB(ppwCpcuOc_-A6bKoqY8e5@03L1+TZ0@dc{oz&JWT8qt3e}U zho06{TkdBBrH=Lq0S=w6a;Ke)GegC`PZqk+_E~&rX8+~mGGS_uhvaxPC~4VbMvp{1 zmg?)j`|g=RqymABg`XJc)D?EeM~ds-%@!%;1kV_~UFIo8G$=HY(XtRCUbpPDSOx|y zxSu-^men{u3R`xr9$h+p8Vkc{pXIKy5-cBm!CR$`z@!A-F)q(hcDW* z=jxkI-0_y{Pu%m!=^IX7blD}>9KPh*JqHf$TUuS(x4LQbk&BOP-mz!b75n!exc$_L z%dfxl-UmJj{p2e@a_>F&z4WeAhp)JJ(?lwjLUvC>L^O@1H&4=zIQIO9QCjSMD%L8hzgJ2~Fuz&}$nWMKlA| z$F|Pg7oHj(@i{7Bi{k<~wmZnfY<&&7qoB==UU&B>(7Sh8?5*Bx(FjV2>q^3Yg}vLk6vaND{d=C=`P=QdFvI@0M%GrQ=v z(}xmMH9elpWJ;NMb5RV*PV1@9HZ5cObx|?QEvd{$=afAW2Hj)_&5F`+xZ?rY@o^?A ze(vbOi*iL_i45)6Hy+isWGQ4sH-#<)U=EU9X-G}#)t{M=pFUwPf> zQ#Twtar~w)zVWs@?>l$vi9JWxmbT4IP1P4x7iMPW7G`Ic4jrAndh7KkD$C8Og{5tq zC$`O%Hx|b-(8VcH?4q)e$3ZR^r;k$=mFUvJGn;lCzx<{XH(Ytu%g&uT`Q!)hz3)v= zWwe98^QMnJ{=h44J$A#9O%w2J2IC!B3B?qWyzq&E*jLNvU>_-C`fJLf$8TcJnT!;M zHo7xF2#iy;yl5JI`VHnvZe}qxEs+X6WH@n9DrXvHd|_iDlO3M;x7$Zvko1B9aFl0W zVv<$*ZS<{NVvi_3pL2M014>|reO-5jU*>_Z_rgRf0C4{W7M1->3*2=Vi-5Paul&&= zv%}oGDE3xwy^v(AJ|_ae`#hI?>xbWb`^BQwRmj1Awz9Z;u2oaQ@H!;mV*pHZVX7)g zB66v3XzbN@e&n6+J$-hg78GSA)kLMcygWOzak5xl$~B9)f)Z_}RB6;Ixk4$EX=EC? zaey>Q8;4_<%#hEs3*vrk-q?M;XG99dYYSIgLXrBbybu8li{oc@DJj(E!9XpP$fvzdo7ZK6IT_v=BDZ7n z6i*eZ^UJMzedpT5mYJ!!rEObQSI6gfET21oPhM-w^1|%YrN^(m<^DJS-g`d%_^Y0J z>{Sn+If3jsUnl4;?qpQ53t@w2aG$$rBbwCR;V zP&8b&*+4=@8iZ;Noo8H;T*k{F(GIg-T-50D}Spx zrW%$kwA+qn18}4(t0=JhCT5>aE^-VH?pyCNX3h?$h?a{a^p_ zPY*`jUcHbN<;?iZ*16@fF8BqBmz7VUF*;`Sg8vKYH%sG0Ef& z!<%4yW@6XQxt--qrihtuYhq?*cCwPmRI?y2W9*nIx5g)Cmo}|ka&&fT_SQG#9xlaI|ZeVp>FWGUIm>kH^9_%kPo0Ndokeu99U3!5Yd+m{n3?C$+iGROIo+ z>R-^jRHZ#8=ER(Y77d9m-z^VaR@{2awoqPAZiEe|P7YwCV&ZPncvhv8LEKf#3I_Cs z*VRmv$fPL-`Kx_5l15P>%=28sOwP<|S#H|QbxlE@yyNYXT%q(2tB~ZVY9wrUU4;!i zr3fefdK3VuQFv6>wD(ySlRRXJYBuaznD>@16xk#@{eY3I;vWfL`N>DhLjyjKkS-N; z8?|KHnSh+FjIJyZuE1Tg6E+7xY9^lt#2ED3q~^@h_C33z{nf@1Hw$ z|BbJ?b#42ZBdfD>@E~2=R;?DQ_3~tWd8HXoDdObSNl3vdgadk-SWH8DM;@x$te)4> zW6h;%e!QGny!O)Lw;sOZnuBZCoH@FA>++_31#IGw60K)Jt-^;eozJVajl~?&dGmTn z)8xEf)b(;!7Ri>@g=F?#cfA&df z1Z{>BewQxvyErA<&wR0hEDTbVv%4m(zdvJ@^8#b`Nd})xtLq6ZT`3gn^I5y{g=cIp z;IAn3K?^T+Minud@P%nhsX{1^9`x`?mnAfZ;N*a-zoSLs9cFtw!D{_(cGF-tNV_8# z0*_w5V*}<4y&-UK_0|j9h_(#a1=#}|9M7g_e)-K0U84nja(o(9hn_6YY+Xc`m`pD) zX+yKM~lbvP>=eZ9z%zNd<8|1GdB(N1N{M1#3&9? z=}`(VJS9N6Nfv5AV$iEJj;lr?O5AP5NJ?ULFVGivCM_xcBf}2#ph1g9NwoCxg?=HQ zm4QYYRrMGYgSZ7#k9ZRI)pRsJ(e-Xqqd7mhD+wxMu)?^W7!z7CB6YQ!BRteG+zJ0< zWiUtbaHylM5?EN2WNaBwoMGOM?E;E?g-rk32G9nVi_yLr0284JP37Qo1RkwNF9^iI z4tI!TKCZO#1~C3rT*Haezk9#ZXU1_PN^zeFgJdtyxHB7ujZ7y*ye!yfgHVRFdblOQ zsc^`rPwu+@+>Pg6cKvmyZ@hi~oH5~ORBQ@`0C2y{B&!2qP4Pf z+tS*Rv-=MoyXc~8F1ljJ=GC>erM0z9tE+oAtsOqNeb152yLPQ@-+Xv-YEyCQ9r2mD zNxWPMJG4q3A5Be#dw7W$0s7?Pp=*xaa@_-uKK0CFPyEhZhi50p64+1JY)Yy!UQa3Q zT?}MlkR=N&urjv1$8qPmfs6>xHKs$RjhUV)Hn4|Gj*YL>gN_4#aCoS1=!NW4Ijm>y zvxzLIiv^izqR+z+c+h-a%h~Efw&M8!>>!%f1pqu?>#maf2Sv>GHB$Q{qz6vy}!P7AtQRDrAijF(_Evq*vO(87llR`gkn{P8&JYqJ2ZE7 z(gyEES#Y|1xl3O6;m1CF-|LQ5Yicx-E{t#7SVZ}vXY&*sQ!Hd^#qwmiIz3rSqhKAo z;@+2DIv$QpoYu49@#&4_njVGw2FvMXvsi@>WMxVu6x$I@ERsGfw0qPt9SH`^jZ7+@ z1uiGV45%fZN?l5MxN zK6Lj>PF{WUfgKAIt;tL#H(9LJFPlA@zvhaC*(%(`Z|Te> zyN({X^!Vl@hgSD4Z=Be;Qr}oD78+xz)YxPpx8s(B`m`=c$8K59jx~X!*Z?K+XkqxG zZZpQxPQQoE9WW#S$Gwqj?cA|xVfVh-g{2c8xII^t4&RwLwEvpz+fjaBeCFcSBMaan zOcoF+twSxGM!m1blle+!{OE~0-}Qyx|H`MHeDH?ZxS)h1dZ|{+G?Qq@dj)Qa65_P= z%7N_apHGPFjnCr!R+D-urOQz**_@uNCI@nlJ(V4Kfm^i}hxOuz0(iS*(q-Y}r@~K6?T?uT2kpI!VQ=-;Z=w}F zY!_XwfO~kPU?IvRN5x#NG@Vx| zpjb_7ZGlo+)iZ@$B?+|A^J(GGyDk^)sH0=3e3L1HYc-unwB=SX?7%Bh=0$wOA`pXG-p?uA1F9*(lF#KC=Jjmz_NEk`t%yzjou&WosZ>Esqs*`GjCj z!Z8xBgrhO}Jv8!0WQ7;(vcXGkma1`Y{04CvdY?kBI$dpToE~3H>Y>@Phg`3Npd)1q!cRdX` zc_oR+OBKrX!gRCZa=z{lwp)3u$qVb?K5*HqA`#FPm@8@o2rQU};R@YncXa_Uirc(@ zfB|sZC>nG7u-$PX0(WCFB9cVhee|KJk-^>&xVL)iHv+(e))9->V}_rvb#y3p^pU^+ z>OVYvuIh8DrqozgO2o%E&9>%?8CcQB(8vTM8j{4rJ0{1ngp)E0^+h$MB~sHzuRVP5 zmK(3wvu~nMQdz(dn!QpunxC9IbL@t*a}B**tW9p)H0BG%z^IaGTOWomqOOEPVX;f^ zYe;vgD2^IVKw_kwC`fUF4C2D987#*Vu->RmY|GM2mpgnYtg*`?Ahgz4ajcS9e#MQd z3tqmO2msEbFOC+q!UfMU!#jfLUkq(|o)UlIC}ZNVxh{|P6UmrbrOq}wop~mMLKB7tQQ zD2CTlnmF+b{}|-igdDpk=gHSo#?Tl?CR&p3_{BM|i&*BMZd04vhg#RfT$*i$PZTBs zlIHjNpndY1P(7)Ox4-rMk3Vtxin*k^`{dS@>1Kmw5Xi17)f&xQHKXN}&6CNEQ#ap# z(ajfKymM>42&s$|g;I*(ANtyW$?On99`cmJkefyWd4;6GY|QPr?pFV7(pNs&+!$d* z`*<>yt3iBQOidIrV~xgGv)L>Zn$5AvF@XM9O@|vKl-mOn$CD4{w8od<0gmYi?Tg52 zg-%s80ReceFkPS6ws-g5&AWHbZY%(ak?5tTOX>R3rFTE^nLql{yU%S(NfH{@mFD<( z+y~~lk9)8vi=~&g%$)TPj4o!<)K1A4>b1COX!Uci4UPOJem^b!12=zI2*M%9Y~76j z03ZNKL_t)OC2UD@RuUYekRw4U?COTr!TjK$V?B%l0POZ$(1IrEQMVa~-7e$*4VOJI z3N2IbQrKI)^_y9ifg!8Q2_Gc8V`SL0_=>;z_n&icrF7J8)I#*^yfL^4NDohBeAFD_oii(MX;;jj@5VGNnU zZH`X{fU!OjoqD|RKx7Ijb`BV{%CZ+6DhAG|j>WJMw$#a8>NKvsJi{?WCfRy~>S!2W z;mU1KKKA|JQCwkM!=qt3mK>Qn;ty8T#`ak zP|J&rZPohn#LVU$NB11K=$eBEE_un($KH2za>?(?edy^GDHsHVyWJvmEpBLrDIn19 zg!g3m`iPhEe9+>6c_gJ;ij2~Z3Ayd}E)Ps4JzL%&dTeIi05|e}A#nva3U|WJgHaIj z@yv8?eq$A)wrZyK`eyU>$N?L3#(n$H5%l0fx z70O4ZmbR2z#i{D*>39FZ*FSpeiWEx~GliL%JjBu%cB8SNHH(kBqX?Evfb9U#Mlz?W zH_Dl8$X$5ky~~c@RDz1xdgfK|0Fjvcc?3+sh}Sy00pS_0^8z1T9&vO%4az|kux;R3 z0BkpPMHf08igVC0lKx)Zi<|=Br2(zLYWM5r`z0K2DwRzDTy|vnYw~l za6+PQ4fkr|U2)iq!hS)I=Q1$pDpx0GW{=LMOB*s~kwYrUJnt;3$ZwR8V zYQ!djfKAZ`QY7C<_y*%o{O8kC=9m(e5$4ES*g*RAWC8}nCXdsnNR9!MynFw>U;N6) z?mfPop@DZOq-4i7?Z5ezSDn4$=-QFiWJ61b5gZuoSAKfqw$-SA^H=J_ZVyi;CeAeF z4pKlMwX}T;d$Urzy&%>$!rrl#sbpz_5N!U%Wy;>X^UxV9IbZU$LVB>v<%bf99bdqM zrZw$J0wEf&gN0uxdFpyX{72q?)=Pm|KNeDH$GmSSXzbwH}xKZ`nJ`(?bs=>5imt`sk!=M zGamF$y!m6>gD-UNxodlDw;Xv?@ZucuY+`890wbg3Nr{u(iM~KIq1QKJ@16nMOoJB! zFsvunl}O+|`$Rmu_4A1lN6(G2w|eV0xDf7wF%aapLZH8Y0G4+}yY|w*`soiIKUR&I zEEc~9mv*HxHb1v-X=%0)QEHXE0>F*R`Qq%j8X*X#$c8k+6R4oXNR>iaJ@utishW-6=H?@?kkR;+JAOyG8yW( zSgde>AaV}{4EZg8^Rm#KVj=+M9+s$^ok79F7RPiPt6|R>q#=N5=O13_S-Q&QTDsepDWsqh zu0eNSb5^Ls9zhkcFw5o0zET9?!lHKe6WfO-@LM(1pI_QLh(!FfvT1 zMv>w{4|>C>)n+oUTc?=&6pxkkWCXu-tIg&(-;t68!GrFu!LZ#e!_#B*;XNCAiAcTG zTfgynu-QRF;b6?)Khig99USd19eDD~|N70p{lo(oEhJU=8VC`+lAN4u=9^$5=`dj~ zPJ>1j&&X)J#w)OcE)mS38%qixfK4MaoykERT%2Fr*i2%InAMqiGeZ)zfTJ-gCKYyN zkx6$tx=6!O64Po%?IM%bOn@~W-ga& zWD1L|Vy@9hRWg+lLv2`K$(-sW5uG|30Z&WmJhx$$rLbz2Og)|heOcKZmG!8kRTAu& z75+mR9BX#K6cVB83^W0Qc%n4<7DFbDh#xv3%)FYIURl;7*XgTKFt>?m1kS8;z;*V@G?WZWl7=j){LIjiXR7!EE@BOEb>{Zc1Xu{%)>SgqpDTApUOV66nC_z24 zr@8#nul>cRKYZ0pGMcYMBh}TlOZOjKT`We;a0>2+XQS5(oOT-3Euw)xrrVZfkNy$S z@8i#AGW{dYwQwFy*xA1NO(Q_-ud?Z z(rjY~Odo?_Rp=$m-gznbyRuB2WZD;9GwK}xfPIaOgG zlBNPsGiqU@_>Az@tSoVI7kv|BId`PgiE)!El!38sax~%HdR?kAy%c#@ry8kRHhJ-$ zrazX{fLwS6DsA*^n%tF=@!Vp)SwPAiYNrbROKPkTX4NNWW>F%Kg2&)SJTA@T#hR)Z zt#HHRBcT}hn801)6-M5osd0>k)0{%h2-6HUV@%FPucLu32CY^pnTdm2#P$#DcHq3m zftyplx#gvCYNDO0JZgAuuJ1);5U?ZBWV2A7o}R83QmIC6d^|nqd*%1vzM9oUA$IYy zUoe8Ei1v$mmE|XZhlR2gF~qaS9{%{xKK1b7t+^O1CUf=6cHF+Js(S1L)B~jj%^el$!`E>c1Yx7LNc5auNNoMs7vXiiJAtn~m zF40}qMfyl2K)}nBWV}>~vk^e5R{v7IQ9XPpT-|%=@w3}!bID9OAKCG#&n*m_(%bI6 z((EZ{o(C2M>SU*K)ukg_b6$sU?U@f;BwK!S-RF)T*gmlRQIi)978YF%DniV)ftXl> zm9S%d3T$@fhFlKbl}06O^9?$>Gp!f^qw4JyWfAyRH`;)IcxsVdwD{*PdY-_QOlDAPFUtZd^11ge<#YtFE zHe2T-edeGKZk5cCQD>PAakfgJ;=*?; zRfF{wuKPM8*{bbARwA8L_k=ns8OMnof*RK)28~9=#$GXPgf$UV8=ZGHLlcG zFX$0GJJdok*0B!z!aPsdh`cq%}{Wl(-n~z6BzU1EhXD^*7 z`1&nozc&<$U~Y?40<_pgGA;9%I-x=iwDy;?HhCLT4vguovAO}6J-HcgH3Mb zHhZBJF`bIIsRAYvHgT@n%rfGD;}oW8d`=6J?i9((OWMQ%+tGT^|Jr4}63^lTk*8e{ zbUI_pbsZEzjS=e@S)0N-pheSgQW}%f<_|P$t<$AM#OqCzwym8#b#^XQjQV$f=JDF7 zKKZUErK}Wvx!znXLuj@6@Fv|dICMNLo{N%j!b`o36*091m11$v#TK3}MGQ z0Qb8r9>Hqv=gwwsn{ zBg0lJ{Om0K)&WeMHn{YiSHAm8|MtCq`jd|wd&h~Ys-@~HE9Dh%Of!pP2_>7#p#aNe zO7T=BRe%+6b#i)IN!6Rh>5bFVg%t2ilS4eYPl~nM%Q7$cI>EmN?sn0h70NPFN)=pB zscWsp)~i7N_%2{GC{?~>6ZX&e_XH~~6ZB&EM{a4&V`Ek3pG7aj6OoJ-G>vVUG%1$N zRVr{iOeWck5#US}6(E^Z%j?=??zSO`L2|JMMGDMm1F)HM5x1IVvs)4@X-45py>jTN zWN5kgY?lj{afAdZFaiO|3X4+s%ogk==N@(IqzUJqE$_~MUc7H)p|yMOn?H!mT-IT9?--E_y> zUNSA3$wiq0992Gcrp|s`rI@C$;rE3vo}-#`c1%dm*r_gFhu`ki?m)Y2?E=`%HBU}= z>W;zOm^XC571r7ucZ|A??sJH|M`XTJ0e-SEZ?2it^GS7L&b2w?lOHC7Qk`v%Bvq?T zmvefIGJ!jb&b1*+c{mj-|lfrgYN#(%?CyuuAUoZZ}rxTYFS)Pr`0+< zG>8TjHqn$uIy&M^FQ0tPFaPEJcRYCGrlKC57o2cesFfPI3St*vsZfL!VKSLvm1Hts zgJn{RzJVe1{PM(>o%67gjFGn$E8G&QAp&9?D-NlwiyQ5l^y0!yY9|u02oX85E=GzO zkxhzWS`C*B;2dsWyE4EOFN)6l+zHaD;Ds4Si+7l5R10J_7)+q-kR>F0iLgwK?1an` zhzW}sX`4V3EaE&Ux1~HaDxoCR)2NxrvQSaRa+KXFGgh{d5Wy(bGMfggq*>KE?$qoU zis+&8j0(nGBqUi;wb z%^9!59b|csyx$#z7eySd6xex0$#taN2ZwFuv5I$YI$ho2_5sZUCPU9;RLDfD;<>>F z5*wOh)MaGC91OHh^lh9Es$Y=xBxl#LcfCU+<8fTzvsXZ>Vylp;;KxfWFZz$_zTAUy z1E)m;H9FpC7HWCwlH_zE%yU*6aRK4MK_3)+a6C@BTg4{sVF3HO<##TlwBEJhI(8@M40bL5sEeYM-N|F%>nOOk|JCI@~wh zhrQ1_1l!EIh4-MXSKJ|?cRgr`gU!^7U;vCzBt9ud;;`S_9}i;st2{L1aP< z9AO&a7>73A+f@zoUOgL=^W#(HhRg~zIilv0Xm}$FDHCTzorIw(ZquX~HgnwxiGGRv z3jaZ^U7oXhXof=q*;KFyld8a54`8=h;D8;7)xQv)7mc%HmuzZQ-Q@6e4-Wv}eT}nv@ zPi;N=G&$PQfQ2b{ilPpbu#dMLm@5~R<{~ME>XC9vf?~oyfS$FCl-FaQPw18w;XnA*|azG22? z2TgiFNFz4M@?^qlca8K);NI%37vUPhFaOX`--s285j&-*ng#|eR;VDd6UT3R>`Qf@_As|6 zh>am4RRxnWb>g8XAHMRM)mB5x*7xqe{rZoT?PfSvQu{s1MaDET4si{Zn)Yp72ts8H zhf0pZSgt)e*WA2k_kM3J%O}-@qTDewY=kLu%WV3>?YbgtYoTPOl}c-(Z|A&i)BOWl ziMB7yRSd>fc=3=FCJ)V+tO0#}t1LCrjz0ilFx z4Zc>64fTxOc4p%+@OKa*La(_yD; z>_b)yt^;hF_-~Sgr6$+>j2&{vlE0XpI89IO>@Zbc{xo!5s$@jngi9643Ehl_xVaL_i z?rrGTsMATL9qOQjr(#VFt$Rg#TN?%IWw;(QK# zs6vC%m8c0%KPv7bY*tDa$85J8l?qLGv9!+>J`4CLC1^`TWp5~|sZk_QQO%FOi%@O2 z?rYfh>`-t{vP|Wx<#PJQt(rFf#rGvvHh$waF**3ummYl26R+Dd88ZQ-tS`z|)IjdZ zxT~fBfZ-*U@cCjKfo;e>ZUeAucua&EczAXRlmLAQ_&aDu<^oZ$+5kLU+O@Zg@FbUg z5Upy-)Ndc&{E=a^t>;GBTfOz7$6<@z6R`GypVe=-*&%wsukj!m^H^Qt^yWL>{h{yL-#jmZ?^`m{N(i8WsJ15`_9;SqK*fP-#7Z zP%N8__yc}~5TX@|S!|TT?hT=@%Bofh8Kl7|P`H^J8-to8S3)QfL`sF$Y&97&G4$n- zDzb#5Qc`6?-nLSh@ts)EQRngvpo0BIzRh=D*ZS~?Vcs|9^)DlAVYo=0ZyXS-QxoK? zMM5XyNE3WXEP)s}&keR1#xpt=U?eFOCX^aAt@E7MmDjWDLtQ+lVf{hKiOfUHu~pSL z7EHhO9b>Yux*Vw#;KE2lQns@I!z?OIE=^@3uGSxX_4O$sS#D)iRFM&8mLRG&VBvWM(B(A86Z3)MT%o4U-}u&jTIxr; z6mS2JK66YP=o`S`)M|aP{_Z(49~|q~MHbZwf`b~NqIGx(1S^{H5(XnYa--d09`GOU zA6aY+Ijj!1)5d66oeJ0@%!>!B1F$`Dn9UZSWH*n<-*Wf6?7b4Ww|eWh0E369D@_-v zAwZ|e=CD|xcd%FnP!DggcvE}NUhyA)^q2qoe5y5HEoU+nEk-g<8TcC^;u1Q=ag}Rt$=Z=;0&+N3 zV$9AXje16n1`>s-wQVZ;oCYmgrD&uWsht3ID)ot(jbwsNjE!p8u#q%;rqMzM&M8W_ z<#f9b4LncCyhE(EO+?f-_Zk8ul}sSGyQIjfJ-|NeOQXzYeR23lqPfd!a&P8zW4S3sn?8grghnz6FyYY?V6v&H z#f#@fTlItAd!!&_bLD27Z55cLDI94?QFNdKg9Fjc4}bjQx6VwXo7_Bn?j=_*rh`%f z_@Bt%dSgylx2$f5Mo6ry+)iymc955#`0ySlgv6FJ^R}gyFuoubF~g^G8X~_cmb42; z>!7#22!@Hb4POmr^B7O4%Q0KM*teuvk0-+_W1NvWS+<5WL0E>DR9`+ONVBC(c`}Dc z2Fxj{$Y25x&rdfud8%`w|AD+@IHj=?J6(z;nDI8HbZ8Y=igN6wB}k!0(Yo)TEq_y# zI`_z@#$Y6`mnK#!>e%VUQ(GI?Jf8NAKKubQ5)S$XoP#f3Jq`rHV;?O#6rA6Xta;^< zCeY33Lc3fXfgJtZ9fy(lGS&t(j0)qI|^-`lT4H7x*{13{#ne?;^#xvde75*wSk(lQal zP(Q-Vgz>HBoQkXanQ*0&K4^$mZ2Ag*PTc9)JI^YwmYG@a}sqn*{n6)=uAZu;TMZ zVG|msIHAz?{g;s0s6ga#+Nh+N=?I-s!-z`?1-N#}6Hr`s*Etmu)Q+Ou==e+IZ{Rw+T+3S*b(-?jq>ixH`sbZ;NI%3-$IhK-E4I@1}uZH zlOE{nx3~fp#|GCR{W6bi=yQi_OQ&D`^w&Q5v!DO*U;M>)KllFoU$!=(3wAuj?Dk`D zNU_2we`I7A!aF~z=99(Z;-=lROS4lmQ;XH90^~!$%qV5f(b$y0&=`y2dMj(S+{~mx zmuhr#d6>G!M!Xt%^y_5p$j!Hu_4z8Hmde#CJX}zf&r=?szgUTEWHKbu?HU}r0Z@LZ zdW&*)RW#C>dUiBa(e^Nz2L>avNoG*NhSdB?6}e5kV)vuhigFDxxqqQ(OcT?LF}E?e zT#@CfPV;6Xn}W3=Sg7p8=gvXaD%1(x}SaQj@e20 zbS#~`_x?QvC_pju%~CU;eiZr0JQ~16;|BDmW17f2(IO983i@Obxd;ZY8SYv5>e!{( zTa%{EueC<;t<%}DqhwwiycO+XmeU?+kA(ptCejT8KAxK?9` zn;I)sFjE*SVES7uPpFY}9TFuPH(^^ncz6KxNHV*!i6B-Dr@R)6!#ZrScLysl%O=93Nv9ccgbjzsLmfGGsiBP z9wV$FEix#kX)(E9ts73a?LF8?nOuxz*{C5w&&JP64xN$0Wm2MvZYw)vre?<1cyaSu zMwt54FW=a-jkm_;3t9q+bu89NWIVFKv@Q4AKl6l(@|6+TNGFYWU}PAUNPFYD_0%p;;%e+T z;^6k>K=Z2TnR-gD-8EC#w`u!#Pu%qW-xD@AB=z=)+I!y6z?45o`m-td;seEIKx`OE+P@9(_t^r<5g ziz{=7Ac=wDFq)glNC#gCg3%~5k)(K5J=rW)S7x^ET$tN7vt@jKy4aj9uP&@@)@2j{ z2^7vMGc5#%Cr(`2LUnPu3K3Lc4Ccu5)v+QRLJE^B^AwxIs81-X3S+rug_yG>Y>FB^ z=XU&ow9dVP5;zNdhd~t$ota*STF-_-WxMQUglhvWRGLzrP9E#l*tnaTRApxDk=U7&rZe!`A~cs-NMkzFTG~79nfcJq@2Cak*v%U= zDbUSWQRBgvYv0|Dz#*~t_Pzk zO-_N3s9HTT2VOqO4FT$s^>iO+bw=)yY6+i|JJow*supxGq`r}_lib5 zX1VBf90=NWNWx{VK!DI$MCA&3vczq_ajsH8P%x=vJ}1DIB1xx64o<~Qt7*%rDUZOI z*61i;7QwpFXf}fgh7eqbUo_msfxr29Bv`jOU!Aw@JLW@TMKxC{6$`0+sWql%4_>R) z54FB?r0^f-BAUxy8vL#JHM3Z9Pb!`YH%RlvydD?jGJuK2guoV>@ea5fLl%$8NJi@K z#00m)g6+=!n8R-J4#H{2)gShmU88p`4ZC_Y=-%qB|6k-exPoSKl(tx51OUg{KB8R0 z4+(-r@&)b(5`*yKEsYz{njo8EfciNl8q*?7k1^zv|@ z1UL0SPdS~h0EuA>S)QI)*w&g}sio5u1k9Fncx!QMEE1!nGP!BQ=}`dDKrX*J9gE^c zla<*irC8n&d3L}xnGhJYG&PY`BTb2gEg1kD;|7<^r2`JcDNW%_DC%Vsm5ch>%I2tJg4F&HBZikN*5`AKFy>f7yEz zAUEzS&9f?T6@UUVnaE5q6N!TakU$~N+>L5i)v_##PWy#j* zOO`F)Zr_*eZbv&Db|1F4J38!c$42+|&TMz=%*M>dO!U5gqKfiNyC=Hs-I$e}k0G)| zl~~0(@Zr7pz27GfUb}u|HBaIc1N&XzMFTzrUO5c=6RA z%8lg~;n`XTa02THx3*W0*vQw17=E~v;QWakjI`4=KP&AU<_G1Ef3UIdHXCl#XWlLP zWA2N6g2&?llnhNVUc#YAROp?0PBk{GdfVd+_v6@RGVm=0?%fh#lCoJ`29puDLA;gO z$(T$#%Mb6=X@N*uY4zS}imi|}Yq#KbE1V5mz@|e%whjiCO?arbTl;}+xvj?vC`*5F z`qJBvzV_w+{P+L#AOFMu@^`=dhrjsTQ}?ViWx)prE+h<@K_?N`BF=lmg?1$^A#;^7 zGBi-0+_N@5H$GpVDz{qsN)9Cv!lW7cA+MiNuXR;i251iN&xQFQck9*`Y+WGhh+U~R zwOy%3;OCr5&J?8#qCaH9@i-_rbhV)^`*j!bj7(usv~X69SZdl4%XZI}z*Y6@6KvG} z(vgHeu*JU)sxYjsuNuvnRqi71-{O3r)I;qp`G61g>L-M3I5=N8y5S%}`;SmblSU@8#tQ9<>h=oW;F@lphp^Pxj1 zD8O5x%QD7CEMokaJ$S@|J{9We77Fi$eKjnoNjenmNR*?J9CE5FaN5U3S(QHck<^%Jd5`uvZkquyDwtG8f%mpr@e@6q>VUgK<0*nYSX(iJf& zw{3&xx(>v9Mgu34t;gfD8NoEYId&@M}1}EX_Se9kPrjCXXSa|D%iBmDq>QM|I+KeVvQ;Ih?j@?vYelwwv zRnK?xVtA8@fs`1ykRaZXO*QY7Yxq3$q?$Bfq&zUPn zasN?MsR3ueaO|uO4}4n?59HqVglM-j3b0Q2%^*CbQfB}R#kI{!+t4}Sh@zE)SM|by zQH*d>@EHqH4$ya#o6n3n!Jq^m@koTGq>e#&h1Ng0D8@@^4l<+sj89DagG}hmo=9fk zM`yPgn541S@orL|zMl9)q7nHBL$uS!I&Au#dh?DQW(<8pnJ{>Igc+PRofRS6e|`GA zDZpw*hLM8*3J4FQ&FXRMdw0HG-mcS3SXycIo~C%10f6U#gF{#r_aojxpJ971N79gt zhXH5WZlMUHu5ah|?XXIAg>vPw{r5lgsZW39fBpF{|Nj5_)N5aO>+_#HH8a?#XG_I& zLCmC+m82YoJl}XCj)v1Q2*gb$)7gR2(8N%6c4TREZTINd{NUQ2p`pg)1jG`j5>d2J z^?BSb_hz<0An;BABKPYgs;!s?#Hx;pxl}ZvA}^7#%L`3&;+E2G{<0;->fqY1-b_V! zc1nRAGUH?4v1Y0JV3j(FAl9h;j-Zf;TenSK)#`=j-XYqK(ZzIZ&|LA*9E;I)Ql=Ds#fU$pG zHmn_{Y@h@X``b+>G{FG$c%oUyyI>HGj{rEw=iJ1kfqEP8gDVcdY} z;G4-vIhqR=)@U%P^k*Pc_9Ergp-cw&R3HV`(^zjW#8M%&EN|}Jap}fRo#w*QN~_cfx?V&8$46Lb-zt-d0AJLYgmq@Divj^XoEzbyyUZ-l zEd^#na7YAp=m6_yeQFXjd|q7Dv~4w!c?{dRM`Gr9 z%IejvRAN?NY&gguS0iTZMkd*<-A{yFm0?0aed{9v_fxvsVu@?0&RCv^(4( zQK_$;dEogEeEFx}{^k$A^u2F>=NoT-@bSkUee%$;xsmBcOb9_Q2aakdA~#XUp2e`> z>x!uO>2L-vl@gg)KGteg6lj>!+0xL^P?` z$ai5{khT-tLN@<10S0K5HwxE7z@q|pRitbDLQ`dRt*gGQzR)FU1^M76xf+cW(am$0 z(A90E;ng`F5|@j6#bA4HGSw*;3t_Hy`U5|>k*2tCzBZ7}c?A@ zS{VH7)pO%Z?dipE5CD%bFNX{QDi9vu%?G-<7Ga3E0E3&KKQL0v*UvUsDFX{;H;G&N zd^}w6f;pK66?WpctXI$sJJlp%Re<$Nf-X6r6P4dAz@Xdkv#Cb)+3cIMPql11vr{q} z@1ULaS=$WjX29!3bpwY9sNe?U z*Cqf{r)m!$cPa-NI6S6U%1JKL+t%;cE`4)86J=0BCJ;QqQVoY%`4iz}=}H^q80now`wZZP-tn;j@% z79L;;bW-Xt^+LW2ERErZ9$-GMprDi&kIwD7eB`x{zxc=B{HOo>$6xuur@#8~k3Mn! z%+blB7~$X?1!7<2tO!R+aaHe{#Xcc$0B zHu6T~5PmZt3H{G-(F{RHIWc&k9Ic)mYvog!sC4P4fBMy38Ahxq=~4@N_XLFXp}@Xy zgdsbR{mDyn{Mwr*53j6^?{36HK%j~w5YQsQy_srJ(5AzWemrE?ea)%eY@F$NPySkxOas6Zz(X%ggMBxf>4F6dn_NKhb_6{>v;GO zh5kNZo(ol39eSqVRE^fE09$Q*#3AozFi)VE7q2}|n(Pnr<|8Z1+0im=_f>B@gi8g9 zUG0wLxzFsd8HvQZa`kC21Ya4|$tl7e_fkI2<1*~%>EFH$0F#)_iedWgB;RlD12`Rg zx9HImTHJ;Arvpa#D5JDUCuY-;@SmN1wqCQI!Oh#hc%JChX3$z`rPWsak`Wk(1c|bU z``}Roav*FNZovpUN+m|O#c)Ic(rgFor^NzZPn*d|xuf}HW6%2KBQHPnsn37=#aF-e zqwjqDqmS;MsHc-0;Eds72$3ff;BgkkjEJ--qT-;tgX56uW)1~-$P$ubIax+AO|4>i zqTU?by?br8u{1VREXXl6mq|bdX#pKbAw3UnM!~D%Ihu!t8-)%=LS2_vv>Ue2HScx_ z&hHGF`7YE_Wrl1u)F6$>qMd`SHcZ&5;~UwL-BV{~68Y(e{_4-4D06YRwTemc&Lk6+ z@);#rsN{JfbMCD_|H7kZW98;g{~$7QcvuL5N<|UXBok8#(ey%frgcR^5f1SrWqu_G;Us+)kDw*!MRQ9@EN;x{<~?0?oOg{^P*sib!_>p^*0GHy6y$5 zR#}IppSK!dyWMWITUfC#ylmx01$vhS-54WC2c^a}A)59kz?l^|K!NZd7;`=7D3|W49aGsTGCk z&NF~x5~RZ`X|DQzx_eB@Y;ty@wK=9;AcPm)vw-q;fV)M zU*5Mm(;iADV@jjoEkHCN%z%A9RSf~JoJeKR%`muw5l{m)yC714mJX-#ax9;d)3xGo zsaWmQ(ls=`t|gNNxuAeWTAhe`(R>=>29#!$Q`4K!kheRu-n3tH{MI%&w5hV2;7qS- zyGDI6oJ|E)99AeKq@{E#1;@XGx6f8f=`h#2>nnfy$@M}aob055m<(%Ba6JP_15TP5 zZ~H@^{_Zx1M`I4*CTSh@6>ROpy!8SU5NU$6B%ng;e;rZk)WqVnfUo z7nP%Fcn1R%diaKCGNwL*mp0+QHd5ZwUT4=B4Fc>piCMdlwEnmAXNv{3%^<)o67!2D z^arA-9%Q_Q&?`jdV95T;XrD0V@ei6jpwr#ZKpIUXn5_s2K#~O90Mwwm0<1o53ej@I zJl58)G#ErW6B2BmAqh460p27!Zvz&x+2LpGxzW}Acg-zjCnJAhk0ETHo5A%RtLRl{+YhNE68}IBhI_Zeq7+hN2weQgF*WdT*m)?H$ zg&+Re7hiex>mUBuBR5Vwb9iNBLIxjk7><7;(ReD8FH|boB82MZ!U7+Lw0kLEh)Map zlqkqj3{d`ZOs*8NN(EwiP-GrdMJa%Er=TqsXeSLS2Qyw!*0=ykJwerL4X~!b<{k2; z={d-41`(K-X zTZ^LQupfmzq>4?%|DZ6{$^=TL?-QLim@im1XUg51V6|{nfCu9yF>Q}j%tq{%0IQG= zXZMv|E-cR($u2$`DK9)#f+t5tDro5`SIzPWmh9Lmw4S6lV=S0%@=~`4hLNmn8OLlEyUu1NL4Yd{Rx0VKdF8@EgFU>j zH+YB+#z`=8A%*9>XtD1-UbpT3Qjgw5*n8f^7G(j@=1@#8QHUjT4>AdD1{)57HjfJI^R$Be*$8csHK$al= z0i8UWFrCo^eXza{-9L7rKPH{ZVgecnB(*_Sgqj_*t-seDm1kD&xPEB%D{o+TTc=N{NFTHu?_Dd^A7povz!}C>9$yOGN-c%w5{+(P!21j)Y^~%7cgq^Wi zsHHo_Y%=*Vod*_fOxm&!xwd{|vWZ(6H4 zmh0*-bj@HxMiGM`4^au0lpbEn4uHxl^~q#$PVS7H`qqE^;ggMUBvWe)mLx$PEvJ&j zVzD4H(dF0v=JQ83rVp<#G~?mmU2pl9KXQO6CzPyG%XZ)?LNc#N;Lr;DL%=EFRcPjx z6D*=;ItCJ1@75qwrm4og=eR< z+5CjTA3wi1&7XzbG2O*-6ygLBvA;({L56QJF3 zA;RaSSfK*L=>qaaNn$P+tH887FJ@vXAtnm|h)kkv+X4_m^6&$NOTePJSV{sg#4kZQ zf*6YlDTo0I!}7NVhedHdyF7jMkAMEHM@Hc_==x-~00IrlDP(FxrL@HHlTZHa&t5yR zI(K%X+7gqCD{1~iUTNUN(sZ6FDCkr=mjV+RaxHmN;S99SUXfDmYLoELZx zBm#4+17#ArZHVBFiIN*NvM%IO?ov6>!WH0=pu@OsHl+(EEdj~&>t{zQw9={O0m5iF z>)H%NLM}SB3x*e1#@II|8mESgWsacK8S|||uj$^B001BWNkloK-FC>oZopzj5*0aDtItlzoJTnP#b12miD!0A@0pV0 zVtIOLDif!kSqMm1HQ0ms4xhyNflrtUD9Eee?fqqRnoF0!0IoX0*u)X zv&2ji8>Er8`pyfX6X3)HU$_}pAW@?>U-Rn z*{L_Yk=ODFwbDwf|95YjAgS1lfP6X=^abdE3HpXUL%#t%-S3D00Q!MAP8bL>G-+@t zqi!m7y53&&x;qT8akgSOJi^mn5%OyDv2bm0as2S!i$`wWeC*{fzVPPNhhO~Q{=HY; z`os0P(;MS3fi6Mbj)+cPU{C4y5*{`fhvjg-I4OtoDG9|7Wk7r@F*qC&V?dx1{8BEK zY|g@eVrOdNgx zH$VNc)B7(R94v?W5FF=XVzv~FgUb)ZU=V_qZexK^RSWi`L+PiKqUj#WHb^2{s)0J z!=BB#H0(EnL5ifOPI`jJW&AU*?mcqf;l0<^XCMjDK`}1a_v0S71E9tLHzgU|MW4Lq zRFvSbn>=Q?FQY$%PMLrg9pG8Woen{Y1~oFi~7&s_Tq(znVco>Fc6uvx&p zSReWdhfPec(PO<80o)Z}eSiP2>91LDv%^zV@KX2!9=-mRlqSGhX{FWw_xHwT)vBf1 za}kO_hZx1yzW$!=sCR%YbF0p@=~bbuYN9QQxCMVwH*&xZ{}u4o+qXfFZHE>wG`rBK ztzOu7{;sEAdjH2h@Wt3VZ?G7CwzkdYh{ zlbz~BJrk0Sz3&G<{?5I74==Qb6=h)e*@b4pT@UtVS~0R@L%>oDM0ldCz&@Js1pG7&?~~DCv>7~ChSPBH45SMXPzQ{kovQSz z&6Wmn-<_b9Ma)lej%KB&KW?i z?|^z{1g$R0m#1-bc?QF9r^|!-Uz$M#30IXa+Q}Gz_dh-=lbnDjA293uclHVE4n~bf^04s7vk>-3g)h58-_jc_jN{$^ z)!b*u|75Bc(3&hnWpciZpMf?Q&3s^#LmBj218AhVX!EP@YHzp9;EA@viJ#fh%=CCZ z5-@85td&+;{ZATP_o3qqvkESNlVb}~6H*Fd$aAD-%%jfO4xTQAm_VQ|J@~q|L%>A; z_MJQX&@S2LAOK$B3>1}sL*`nClKKH@P*aMVk}=hc42uOOn?8L~(d%<;N?w7yWwuT@{lJ&%z{uH?DASDw%c6cAqRAAYnCJ^e; zm$e>!fm^p+Sn#sGS3N5*>y=nf>2<76Ghu0^l~(^Vh1j4PNMUSkKrf<9c;MM~UF5&U5e;cHv@7TF>+jfH;_xT}zH<#fBCz={^8Gl@RM)<@M}+g@}Iub&jvEHL zdK!mtAv<&XzPV$|CztQud+5Z8!wY+6Mn;yods)h(#2!~Oq z7fkV0)>=GN_M(hTG~Ev&CDz@FMM4-GRgu*fO?sn%Q`hd(o3t||t+dkW|Bte)S0jDE zL~ZW|&Fl0C`(bq2^^j})>xH76VDx9zp%FK_sI`L`)vl*0n^|W9;|qGsvmzKiikmR> z0hoviMpCg_u~lu%FO;?gFSUwdW8uT00{EpHWwgU>6_cRCfUoujJi^S)&;9sQ7Y|>! zJYGwW9C_^r-+y#rqBJ%=b8>m*_`%hU>5Zc+7gle-OUU0|W3IpT(N|tRa_YjRy?38E zJ~uZ#KHmhBS9PdbpQ_jELvSipomVo&F9ibN$pQlwONM-C*6eXX-=rrbH*Is6nF|68 zZ@q{T!lOgl5FATMxzzm`EZpSWm*+bJ^@)kb?AXZK*v#&crKPdP5WI!Ox#P=oy+#Ma zphRJ(dmu~MQG@LAGP-fOSFW3;51YAGaj^~pE_y?hjyMuj10T@v88=sz*zT46x9{I5 zX7cIwmB$uwHvI@xMfp^eh{M7hhd!#Wnb^F)<=C)cA2ln2* z|JsRrUizGuO+Yq7K%Gacojn5>C7ZcIbEM6*b99Ib0izmDm}6dq?PMv~v>MN)F=fO{ zjd%PgT?nKN*}fyuD0E;z_lzpV^7vjvCPv3vAr{>h+l)AY6G6(jB3iOZ{gElJ5}sH- za^;@ekKA_uqjUFP(W%>H(&Zx^rUUmMSU*~?2)T57{nUvkZa#Y?kMUy(?( ze598oXa?Y-KE`q6&tvMe)kg9Z;To)_q&Rj!wh>PkcdUCU2KD}s5d{Ji2(nTCpzZ8_ zfIxfRJ7=#3$B{2E+h;R0LVdBEUsNQomo83A6(ye%02&9dH;MuZc!XCS04Vl@Q)5P8 zWlpe#52L4{RwyfGLs!ms_iz7dgH<<3BLvRYK+oWPLMuGfC`wKr#y#m@9-b9T>@ zUwiSA7zp_NVj=_{Be>@QA5#F_T!BcCcFtW4Nmu;j#ZpQFZncyW5&+l~6A;cQ#!)at zJOUAiN-UQwO-v1+u0;bb8bp+(nF#VAI|6WuWYaSN2sAQTU8m>9SJy@%T6unUXrQ2E za`A9DbghEr+68KCY&Z_u3lHW2M%^qUidPUG+C5|}h<3x26e0oBYy^t8%53H+(`5l4 zlJyUl(%vvf0_MX_`GSe^n$_4%MIsmi4?a45bai?E={v99c%}KN1{sr6^(|*nlnYi#_b1|elaIlh){NV#eOYs9H@45}Hf06!X;()>e zptO{l&@JoxaOyn;UhJLuqbCaePPnBGK(a_K-AblomkKB>3t;BiiB33{5oIsG31NYM z{NY$ZR^W%2QBpp-XXb-D%(PwmR@O=@t=@ZGvR^NOLQCwJ^nVH``IJ&WC zbkEr6;B31wFg%=1Eu1^rNw$>MK&f^9&y)Q02SGJ~C`@@s1e=6gU>r`gLb%XaBxZ%k!yQHDvVqVG#E6@MpKYj0&ed9A1PVKvK+nqPA z+EpX#l6>vZgAd++_3AxWF5Y?io>RBobN;|9hsexDKlc2WpZmgR zU%LP1)$7+^e);9+UwGm9r$6-O3y(eU|;;;X^AS{=?9h)1L+4Y zw1#z1q{VFOjSvtoYqQeFOEu`3;*e|zol|&e{P=9mf2~907bWh}sXIo7V4)1-?^1EH zG+Z1gm4+Lg>Og1D#;G2-{Drt#yn71lw7@)`2s!EFI5o-HzyH&Ed89qIx_bQZzH6rs zoqG9|=ay|OLs5~4$2Pt1@^l91B?(c=&E3?yD9f%OIWlFMJ(aI6UO2bBQZn*@??O3+ zZp!Ne<}^B9qJRocW_RUJi3g3}3*mRx|3 z?jwN!3eGdwf2&Ms95GMGkj1-UXWA6=!aRz&fbDjn(kYcj=GLbgVUhulc9?Y&XV*_3 zg~$t8mWl(9Ntg@sUbA>Ml-`x)iM7E-E4V?sSUwL4!X(VKBNoJ;268mvhET(i$&kX0 zubEBdH?~dIaWr)WclIQZG^ub*kVp2vZ=08+-eb+40oTLxIB)gz8()3dkgmCC^LpFY2S-{TM8|MX*z z-gxBxCq8uj%5Be_-hXI)`S{!e(<5_7FTHtkWnpY^e&+nbmGNNgP{egEtF&63VzD$( zDwj&>+W7dcg|Xcu^DATX2lp&Z4V7B;`FoE!Jfeh}NytN@RGK7CL1(11`78h{v0DRU ziF_`WNrhDj-ai)cvDmeyC0rJ`k!VyDLdb24_Rxp`tx`E~To(@*zz5!o2LMoIG;RX1 zEKJZAYn!|cJbt7h#~`LyskMsLsgbdz!KEw)OYr~`W*zC%&m0-dDRKtbW8;_YF4BDX zjFCCWU}uUsIm86wBR1B@rWnSJlXN(t?w!E|=7#BaWGyYozKdSM^!|45!5|HRR19q! z5}_6LXZ+I8^ha1%9H-uU(-a%-f=?Od^0ARhx!j&xxw7y4&Bvd8@pFIkt+(HL>glIn zdhF$gKlJdU51ik>_w2!uMp2g1lWY4P_~=Kz_mx*9n8R508VO4)t+e{RC3FFn7Y>gh z`54BvRG@tDz{0|l9~gh&(~Xto16S@p@^^|f{Ps{|bOVOGo#AY0cx2D&*~6C(ow(=f zgV!JZ?B9;o*Je&{OdnlZIJU9tz%#c|k>gc;>s+h^M(Sb*Vw(o07WO@}vN*pqJ~~*h zmaExhx;&7rX3yUwSiS&$Vh^;y6uMD?j*>!KX^OBxkcCZO1#TuZz+nWDmM%;NDUZ7r zBf=$rXbAy4LM)0>pt~`GDyz~>&^+=$lb+-tTw>V~i~|~ABNpMz)si`1wiNd!dw$ag;e@P)yQ z!|uT#DoiV_w9-l|^l)nK6F5EPV9M3lQ=gHR&mM0pSAWG1-EqG%S^~5+i+t2@a;gzIu2(_1fW1^U?8EwF%k6K%^|UYRMXsV7MnijObr2SL^%NN5|@Qz(2F?r|)%f zb49y&NKB{G$z*nRZG66(9hzL(HPk9M8ub#K43`^I<#IOtI^-0{JOu*mXAwgZDKJTZ z0_!|R(&KBgQAoN+~uYr`(pf1DDJ!9CjB2| zy(fJhfd|GVysvPIB-CW<&<}VU<;8z*tp)}aNQqFC$U5B*iQ3RJgYxRN`LkA9X{FUW z3d~yj`k=d`*uihf?eUp2W1X+%L$i;;z&4u%+fo+df)!;`fB}^yy!3%&WAEj`>5+0+ z9)I=X_={;KwoI8;r=)yd$}Uci*5R0_(P*4JvbQP@HtQ4R#stti%0>T6SvMQ@Q;d)D z^6DP9Yr`_xOm5uHP#A7*4G1VhNfI-ne{RN0GVWA~;D`L=Mw9{S(mMhSu|tTw>>7rv zBgCULB0{9i?r`EDlQ_m*bU8-|&#cHUk1C+)IYE>vt@+jID@lxJ`~nw>PV&U~g@y6r z(#UMPs)U1t-QH_8q!?<$ZyZ^kK6dGjYv&($^sc*q{)dqLYzvYW6+?|M(}a*@j2CwE z*vuTRU%jXI=y3<{r5TcHAS4tOQ(U$mjOi_2QcIrKN-M3j(&}Hn?CkFz$^gQGKKAj@ z?%gZP&5gHxsa565t>RFgTi#i^_xB?7a@s zh5;m+ z)wsNW+npab>%EM&?$k;vt+dkWf26>hZJG%;GDr3+2WMtRZ4w^^-Fb*NkW7|yg>&C z!^F5e93X+POm8W0SAdsj2Vf^1C_f4=Q85P!M8cd73lX#yH|)u^XlZa#665uT!V(UP z)fn)4eQY!bSgUcrD}8K$-zdwSsfm#7BiFA2|iQ^`T%6fGXy~)T0dkG z;gDrVVCJ%DHk$ntal!A6`V)!V)ZTVNN|&l0Z$rSxYa_=~P88|uQxzDYF=$rU-3xcO zE(^K1n(<&o!qOveH=EWdn+~i}uP9h|mj$eC}e>gFk;-u@Hc8 z7SHXUFO@q=MqtVkmYg-E&*o>>GTw_`pi1ZnqlX2{MB=VBpLjm1o4IYcJPO_fD8E-yvT)xf_c59(?hyJfWcKv+I79Sy&(E|$Wb_%>ePxu6H|jri|I~% zwx$d)?3751gm+r%itE<|m<`fQtZsswB9~E3P=$abYbRACZiI1Q?rOr~4S%DHc++b`Fvi_N5e|4`T; zOux(oj?Ng}cU3y0N5%w2Vg+?P001BWNklv`1PD;lQ14Y%?Ab zY|xCK?U_45W&eGKu)TD2$M`Obm-1m;!%2~BB$9HOzmnV;@msX7Catv6N-M4Y^`#>Z zEB;ooRF9w8XJW-6AXLZ@7@SO2;1UV7!@#sCR+FzT6t5r6j?LE+bE7bGr5_xm#Y3EN z@UZ8}rjiENv@FB&xLCklwsTX}_F{dw42TYeKfgc(W63yRFaks4ZrBB*V22ZWFy4`+)lB~zWc_WHF`2M?U^ zW~c3`vowECDn^)1ZeVbPlP(9wblO8$+b5IdMzdZnb+R34 z&k4+%%+g}q+wv2>ZUan$VA@Rfp89YgVq{EM+X2liGhtQ?NlHDIBL5`{-P!l%)4GDUtI+c2a~#0ePG^#Iy8d zA`|5zHiosZBP>J4OUa zqx%`k^9O02Y3A6Dp^v!(RKS)`Vj#aBCT@;@pV0d`%>k{IR$6JL)xSxAO^))aQ>vv0 zvff8&I#85TQmlqnx|LcQEYTI!h?N}pa{J&@1Le7@pxiD=O5S(RD5KoR7)zh34gjn} zl7OWFe8-a4;fP$5T3~~Q5p=c{OI{%(@hlq;R{-k_{V$lCK-?f;*JSJMJLWd|D6GF+ zfPf)%7DTeFKPHtL0zW1D+EpG@mR!U(jnF6&9B2ji)%2OsiHj5`|M@$OlgOUvk=P79_I(mL}K(^>#6{F?ncR#1@<8g*81%vEFz% zoAsa$-39Na-L@sbG(+f%qdjBSEtKs>V%zl<$_MF+bqGkJ=^#h-Jhr-%^4qj8C9Sm5 zN-M2;{w+62eKumD#3l3DVxs(@%@-Mp0l@+pu;3s0mJ`eW=#BhCqphQD$-j3*kYb6U zrvvQjpxt(8u9a34Nklj+F_#scF5|J`(&TItn9?;R7rB#X1I;82VFsaqk0!PR7=s&L zGd=@NufxR7yIIIvU?bt2Tq(rLdqi(L9oRj~!j9M42;hjn0b0k<3|3`zumYxW^$Mw* z1dO>E2SzZ?_>yl-W|&ixr4rDa6UbT(J#d^4(Yd-HkkJ_fXsHDUq$R}!#KGgscb+`A z+S*T1%W2&+6$auE1+OUkD78z6_tK;aFzkQ{V0h_gQvLTfNXzg&df(%GILH}?1(d-T z@CJ1gk3!^=NBdIJN-M3j((2z>dYk7$R7@7K!`$Hwj1h-35akCGWqA{Yl|(JDT>heb z^@KP!oeYnh3&!$F@bz&zcY$)G?u->H1t|j^a83$mIwaoPJX)zvG|TC9B^C{QX}~`q z`@Q~5EEP@(3=Jk|3L0TI4td4fLkG=vhr^f+MIv#(Sdc;cW8p?K8`|9oj5VD$$WW9; zBWjx|M8cw7Y3O=!H-QGvV8(JlI+D`~e;Q5_I=PS-_tWBii|1!*?K}NyJkANB|I9@N9siZPxfDb9^7~ycx@d0G35hu>tj388RPm+vW<`LNSC9 z8@KxJB`NF8l3`?yPI0(*5=YML080d~D~3S0SNl5BN-M3j((2z>2E9?-MZ}a=XCQbr zhX<5Wx+No+vK&J_FnFty*gq3vS-K7^3X_Y_djz-b3kBIYJ_X)t*h>d!{PJTaSB2ERjI`29 zE3LHpEdr8k)fqaSOqW`*n>ghwAy1X0CM3vm9uydYg_7a+cWUq3ojyJo%iS{)h4wh| z!BM(!H$`U-r&>x5DR3?(g+<9hTK3jT^>)3KPDYl~`b@kfDFrc{fSE9-nxH)%mjfd$ zy*884z?LA>*Dbp^55suHWI0ydm0d5glO@mK;c9Fm$q=I~nh8^oNa%KkMJp_eNgU+Y zj=2z9+JzAwU~4%EVh|smVA;tvyc}}iR%VS6{UE{b>oozp5~7H0-6LY7 z!%10>#Y}?>y+{A7dFlRTiKt5e$J`WPi$%q77%_LyP3RkW`}v^5bb3{<>~b(X?4rql z?Y-4oTV3=mOqEisEd`1cTHLj`6?Z8RBxrGW_ZBPe!J#-LcnCBEDPCMdaCZpq`thFM z`Tl})b1u%l*?0R{bM5tvHP>8YjzNzRgl~Cw_KTI)>Xp_1U`hbl3tj<`xg%>jMPm1P zhBf;V@7JL3URq+mw3d8YHxQSAHQzY^$9%SacI4$(xy} z?aQwtW=T!A^IQ->`PWI`ECsY*(KEl|>pchrbsPJnIEywlgu=I~_j`5*NBhqYSk*n>qB7nPKl{O8|6JXLFU&c)Lwae*_|eC} z>}N2~1qNo6d2^QOm6r~qsuGh+7`6Y~x^dX_o(!Qemamng1X1;Bp($+M^G=#XJx0ChCFvr@v9+&;H`177RlCa4#ko|5EK&WU#8w|9eI< zxrEY$7#XuEY`iY`SVU=A`${tjT@$m|F;c11S@1$oxkk6qV_9U6^zWZ~@*sbFyyIzG zHY)h1uL_^dt}VU>HFFX{FHtG#);4nAI@@b$cVoIjoIYWBV@H$e{+2uCj^%|Lo7HD- zTeq!|Fymvt&BdNQSJJBz;{J=n9Ba|F^Oscyalns9!SZ@z5=V6S?|G`)=LBAUWDz61 zN@H8Zi*c)m5NAQ+(^$p2755-0b1j|4I81?#^b=P2csIh$BTaCY^Jl&vd5`QLxptp2L;FToCkZLNjjbFE~=r2JiFQVqBdby`du2rjm zq5g;7&jiIjGBZ|Mni3O9bww$rIy-*7y=7-FW|ZVCNeQ+>n}^E?k(By9ZC zBTj&`vst1+oa5{HpT9q)fBVsn1zMtV4qd;c1*s0}&d{a4jeXWY zIJUKfDW`+OXA^8iRYmYQBO$0`o8!k@hqc7+mrMyU49vr$`hYrqXGH6IT=;i%^j0cc zR!U4Vd*`R`Fv*_1=Tn5IgWVqA#Qx-~F4(#Yc#9E}wIc~=ydr}NeqmyVCD}1`#t+EP zdJ*;P#8ppl;@OSK`X^@&cYkPib$1Df?||V}|4;hbT7=Q@X2w02PoJDAwS5&rN6BJu zDlx&{dHktW01i?q+3k>|H1eU}5c zv2K~>PF-!0+g5^j-)`JSo1yv7`Wi(4*(XJ4xXEYg2oGwGm%rFwWZ}M}Kl(E1+B7g} z?ow?RawxIobyORL{d8L3J)`QZoN%YWSJHW!Ct|@EtD>>{u#I&HHbrqV<`{?* zc^r%>_%9zym6~+2GulLkqhr(b7O$9<{zHxS-9|^ptTxdA|FY@U6pfE%{CY;`w+HO1 z?te%8yQL`-{p2$Gx@~J6A@~r_EKRH5U&pRp<5FZ!@K{6D{^wx0*fNmz&_tiUuNnTQ zpNC9O^@`x+aPe{ul5ZL5n`A-^PNi+9~Dgb4Qf&T=c2Y8hkA zv8CJ|y&ArL^T=|H##G{{?`}N$Y49XWQ_^H!LWF=bD={btYb?|H%^}Vc!t&CO7$Myx zjO4g4groe*#K}_Py4?^8GO~}C!rTgp9(uKon-Bo`0jkC4e{ZsAgfaJ|&gYW~6;5=k zgkT{TJI3K_X==b&Bo0fgohZutq%-t*-j}YhTjKRl((C)eIa@hElfxxSBp?46oICv}`0)61&V}sV^7|#2 z;F(IxdMp2aCJV<2T3mM^M3;PbFf7H4s=bEGihXd3!%f8uHB6-3XZZA)=1Un)uV6jx z{0O9au`rDU5eEozUBv&Yn)KnTncY&*ex-YM>5a4~i_2!4+wg?5?cNajkI!*`ber$i zOHUrj&xauG$Nv0!%#-wsIQHC6?h)GOX>>hGM2_heQUZO?2YYf%@Y-#3Y=a(|=Km#M z*+ApwUMN-2vOp&8zWuHQH_zMsK)sPC!;^{Cm@3`saJb{}dX)PI_F;C*{umo^2FmYE z+FqvjUMzY^2}Y!v{CsTQ>6$@DZb_IC({GedoRr9L^}gb6vpzYGuMGJYCh=Lc{f1z< ziE1+3C6RAF@<51!9309!R>~O~mQu@LO^&w1LUg?1wUVlNtb$+DSkDLu8Mn`|d?{~k zyEU8=KVb6C-2A{#-F|2NnLM0E0>7^D53`M|pnXUgR|YFJ7Mj9-j&j7nLbKA{hqeB7TYjnkq3l=Wl`k*yX3& zrgb-bGMnpUH}!h^1=6%jpk2pyrqWtXAv+B}GxfST%irLTnQOA0c?d)uUI;e9B&I_UYWdTE-yowjb-Y*{FNxf zM77z!iZ~F~&`D8P3BB;l@fvv^Sl_Swtam542Bn+l(zz+bv8KGF{F`=A5-5!23SNi&_#>MrE#g^){3E-;hleYl7KN zL%catAqOD?vgl=^iYNb(bsmp#p0er|{r5jycr$J0ZCy3vLT!JSoh3!2(QG6|`DPIG zX@1#@36UWGrS`m&Te`t$1BicPhemG9nek+X>by)CmYa^K8)MZSqD|GudB)1|77uQX zyl>+9c`lW>@-V)T-P7%zi%CIm8OFV)=IX>BzL0t_AT%b_BXr?^_)h*?{-ZV)?d~z{ z>@kT^t=|NQwa1dYM`dp+Vt1-Wqemr)KW4lTO*P0XJ)<1eWir0+@S3IC$}{R|*P{Ya zlt&Fi{nX|K9-~l{+k>uve8Xa#d1MccJlS&!(bh%Rf88M}MUypy=w=u58>OyFnJSSa zptbF6tBw*;9>?CRrlUWF9kuivgnTab2I)CQIRQa-WqHf4yCy zC`jP_f}{WSWsGdBzB@X$1L1iv)o4E(Yl`qNfI)?zuDg}ZnD`X)zJm#mZ}gPwM)t!Q z@r%WJSHo4?hjnJ{LAxr&eYTRVyV!X!Xy%4!mK)0K3UQ6PiOt$>ZsE_FI~j3XvKuDQ zi#6}d&0PbzP=0TY2YH=FzLXOxC6Pi666cLs_vmhTN%Z|@zhCzmruDv3!Fq8$YI6ob? z8Rarc7S$=F!I?rtk2x>eyOuoKfCH;XF}=6+-EbS^?MLcd%rg_5y>NBt-@Pz5TNJO? z9~z`!|H3?Ln0ZL}?dWl>n7E_N>b8=MjE2VrAlmC3iW&Y|F~t|p9_(nm9%obaLoEcZQ10;}W>q%3blpnT2Fr|!tbv7**k&-R zFiFOotJRHy^oC(_zg7X1I@NZ~j%4{;LP$MOM4%wkyCXVOC}VE~qhSY`9obY;0whVJ!kRZ}w;d}II>-Q}Ahg0*_Hp=HA?WVuZhEfro?ze@#5yds?@uYYnkzydx+lzTcRcKGM3k}0Ve8u) zFhy)AtUXp&Zz#p~B;~xRoQ1{Rgq=m&;ZgT*K^w}7e6C-ucmCsrVm*O^QFU}rE%qHV zzKpq}xNaO-Md99|hGfOqC}YVRT^9?;$Q*qA5Fk5b^tnQb_NEKlXDn;N#~qHq?b`_r zLa~~b9XIOQ>V_(mE#`>S2VSJ07Q9yW$1U*;F3N-`nh%fZ#Soia!~2csNrJ$Od+dXz zleN1zk+Zq3O*TWndv5$i--nN$SvLKkxFcg-(N@h;qPkO6*ArA~%DszQkdINX_^C+A})DaE%rB;tFK_pt|W zf5D@Rl`jind%%O=4Bf0JC^-=IKVE7htD0`)=MzF@XB(99S+4n(P42+M(zzAShdlI| zd*}d`iAJyM!-{ll?FOq)OwfbNkGAhq#5gKi+~(=L>L5!aD{ zyw7>8P;Sfi21Q#w^OpNDqd zh`|CEv9Dh%dy@-#?Eb3p{dbr`EooVE1$(FhB{K>!2+W&v_#oX6rW33A;B7&xDWse5 zv^)%8|4(Yme{jc`1GJ-P(?Hn(!R_Z5Ti$oko&8NaUTV|?}Fo+&pT8p;rIK@cr3{-DWMi!^^pMW5s{YfZmZo9%9(tsc3B^$`D?zr zS(%y5t&)&^Jc?G_J}$MS`VjwVR~{T&4^F3x^NmvnQmz2^7Wcsh!eRQEU6T$g(iK-{*bYg<9!_C zw|};cZqU>>eQx{+MqI+y^Erk&37Xo0e5-NU!iMt;m4Jyxal}LwxlTFqd_LQ#6u>IN zXZl5{|Q2NYH~NMh}z1`s*_uoS5#D#cQ1j0 zk&`6?;`>H;-W1Hp_?t9Iv-1ob=wB(Xd&zu&D~PMuwq*RQ+Vf4sdis-+;9hGQ50h#? zs&GHIH>F7WT%4MO_Wb6eI+= zPkTX^vgcH`@up?4#b=Lt&G44o3krmKd5p0a$=&rFp%X9gl+H7 zO&FAK&VBG6{gL|JVN6Uv$AtZsmna>l3+wsyOJ{Bx?(DnZ=|ndA zm%h)EtaAy10LQz+vk0Pa0a=7Tjy+*(I!9wV&P&p?s9s?saj-KPH#=&NHtOaW^RzZfR!2*1gC5L0+b91 zE;H}L%x$S>tvbtqB11ZBI30_Pjjj%_Fozc0*ZOo_$3(a|Ica)YMHw4kdtqKdIy-cX z-vptC;+ucK%#aZ+JD+qP4Zipzz}nKruqAC7gRTz4hfn)VLwlR@o1yV)*{{k-bg(SR z>+A^dZkl#ZaD=X^so$vS#glWf3%+C4R(52gic4v8jGTw)Mo z#R%%R9LQ`L?t8?8$`8Jftw^@4VPwXH*=lcx2U@-`zj3I zjpm%ssZ{FMYM*gy7HF;JZ@w`vKrwyroY6O@;gkaUEsS~dE+9lD)#>_(eYLX*s=6N zvcxfEda|Rn&Hoze;xiaDCpakx`anTN9{eA|bjx{NEIhnD%=`C!@_-o&h(9nRm_6b% z?bIC*GIG%WHCA19%rkuhaBx=0@OTr>w^_2@DlKDcBjovB!*TvQknjU~-3Q=|oHKw!JiMu!Re-rtVHI4MQ`KF&nnDz?6RXyDNdHEcwL za`tygoWAWBOOQFOlR>+d(Y|-X=};Df>cy#^m_sr)6gB5@y0C#(H7^$B{fPWBf1m9* zcRJ8@f+hWp!fC$`*zB|f2j&@nQ70QRLY$l^`>snh>P+7$UKn_q^qi}R?!P8%$o+G;zbSTh zWbl})ox~5*%C;WGH!k7wpY`r6O*ea7?C9@+xy(z-bxkalu*1hwlF12g?!fs>9F;1$ zMN~i{`e<)nyfPcB&7&a=8lApT*LLQ&0&iUQeF51i&}(h9sain|ji%yM%6!|79q=g> z#j|%&v`SG{qIIObK3D4^pAUT=(7K3)I^K%6z%;WfRvL{gF|~oIvmCVE9YxSTqn%zpZnQ~&0J4=Qwlz!mz4f*@8z#q`1;1m82 zr!NdXZ~hiYkG1|>CKF3XS1?v5WJODQN>G6~%~)i#p_n_RqoXHCdM8cr&VzvI4I&HO zYFiv~3)5ODf1PJg6QoF07UG0;6?_r)*waf2C|gI73rqO&Y zSH^c!36H4f!(Xm^06$o^q-ZH3B%#C#iTR_;P@Gs3zZjAKV@dV7vA`CP@4d2+=(dYkyeAU=i1Rx>saePF1~!q2(JY=Jo~+tcp2rOyt_* zqHx0l1DZh9BHN8p6}WgG%HqjgReNuDynyCyM_%Z{gogXy9Q&kH7|$@+_>4G?m;C-9 z{%9(QXr+HS=GI2(!Onjw{QyN42N;<+?XT6`S0eT!yAzxD(;q=>0JrLFqduFI5#736 z6NPW+|9gk@OeWe!ev(~oB(Z#)wWsq3eu_Zg2s2H1E7o+(`v|4v{zeGtC zdJ5P!<8=*iFz+gJ`^wyNGLoNJ&|hTVzPb9RImPn|aqk}7pub?ou#}ypp8M&xZ9HqK zoPwJq^3t?ed!@l_X!IA6YSEZWSF^f-$Nbg#<=Th;l^MjmoImfff;{dZbAePWH;$=z z&bN{zI~a^x?NAe6?3cK(LgO-bIW%AH&}U7x_npu zatLaB4Y&N_I8wa7YP@tel7`ww;~Nu5Mez{%Wm>It_wzyWcA~q?vd)xu>Ec9XXxam2veDuQ1CF!Pfs_cEg?*d+A53(swY_=!4KrLD6vYV{8O z%wtWAd}@g_|0OoY;oHK$0T+{GxBcAO9^=4;KbS|3-03QQ8RJh3RC zuBg+ZEBEoIsjQ$p2VZH~REIg*SEkUUy(P3q{xm9!RVW6OsPKan>OBhgteST_4Y;`)N>UViiWb;{xw{Cc?^KmN-1WiLqmx?-<0XdQ`|f7b-c9D1jW)^RD{00M zhxw^pHnh>4fF9>DGyQ_!_AcK*_p^jPK#5VyK|Q>jc`2?_kmsPzUa#h#4;4J%a#tUG zjhtE+w;tF0Lia@bI{BT;Fq32PY1+6AGfy{ogdbGl73`T3oG_8B6qDQ|TkuwTY`yFd z2&)CBB{F3E`bUtoT&>+0%64{J`C_4snaSRe><14IA&DBaGBIOrS4Em?_cI??5ng^# zOs{vc{}bFUE2k?v?Qqk z%b*a8GkBB#Jf!{Vp$$G510I-(IE;*Jc423gw-?U$2`&kckczpGiA= z3|qN8Bac#MLv!&pUv+Rv{ucmA9E#6xkOXx;jz4gn+hhZtG@7T3K{@yxG~_m0cFRdI z;rlORd-786$FD^mxs=sgh4J{arGFbQdlw8{8Y$8P0!H2|Yy*LD#fkESJOy|uwleEp zo)x`X!1%i8+msZt@4c$D>OyTEBJRrIFsiHDU>1M@NlAgad{LwC+16AtH|g$!u#(o9 zf%+>V#h#bWQ&?TA z8>b`~9H(!GI*#G{Qz@e7OZF$-sfxW`h4rUL2YwHCvOB$MC#%G*0q%o*$??UXJL=Ft zcyfgGQDL4U{sHC_{xy9>pGs??l$bI%_c!HyBPBN9@guu#Yqh?#il6DdHh2c9QImft z*h@6&$3AI+ZNG1_pY;Kgwet8xyi$|K6@KH$H6%#smc;sSa7zBO?6-hj`uGj=vvVEQ z6^Ak%$AB4fn%w9r)XmOVw;S2Iw5(mb`Zlw*k=iI%5!MX!$7xL*Y|63;vj4;vm z!M~yn_cCQ(r$5rq_brniJIHU^y2#KIE6c+V*Z2+$u`%#>&K-5-61|mH&I04eS|B(} zi5~Nb*T_2>cvW9K;Gc3);hs%=SaIQqLcbj1TaBHLjEqrKYsT{)9bnW}*%VNYH#(n1 zpCPk&&tQZwq9oXf>8@>;(O!_C>ZN4j9^TUv;AQjsitMy3ttYeIfxH@n+Yxjl3KgG$wjz&(q=F=9NhJnT!eSGJJ0W(x>QJXaFp8s`_1}`Q^r^9SwT*XJ`*C< zf=^?MX*7#zZ<5vNnzshv>ej{Sso|-t*89DJB}2BO>Q7yj;^<*bum6t4(RB4>2=Tk%gyNgxthMbY62C2AX6%|=Ic~+Cv~ccMW;7FrO=e= zm#uDZJOFG{8hD~xFj`h$CjyVQ)^dew4UJZp>sQ*$d>rR;5#T-${$s4m+Fy&!3K?n4X-qn(`<^Wv9+J@ucsJZofARbc9UQRv7Rp zrNeC?R-g(S6$y)u{i$~lcSz|bu83o5|FH#+c1qA}y!EG0En%Ayn3vK{ayD*Tm|*?T zW|2={Viy*dn2Xw2IS31Egqf)BN82#L*gH^Q>)8w5Q6%+;l5FA$W*H689b1%XCg8Rs z^Fc$P8#K~`dQ10eo)Z0WelPPZ{xJ&^H8D)}WxC(boljx?LR|kaRv>$vrz8`_%bX#l z;Qkd7>v(3;TVLqGL?`=5-!RFIBQB5r&YxOMGEG%jMgyJG(<#+--vnxl=65TUQCq{! zkWt>fx$ba$-gSxT>NxgpbmV-}6tj`Iktxp_0}vq9W$KdkF=1%sERPh+kz-9OWis`g z`o*)M8CvZTp=~=F{apO)wAYYt6r*wsjM9T(3?)J{#_1+MlWl+XHh%Z6E~_!H+vAcZ ziX+j2w75ENf?D2+o!&j18hecwZ$)NOVn41)d&x1fG^V>PsiMH8rLI|})W%5V5^8^e zlN1(>ck1q*z%nAhhoql$5r0S1U^aZ{rq@G5-<&6zzG!Rjz7WYK&!WQr=kgiLo9Q|D zi)N)IfU)-UC2f!XTY+Xgq50<2YaePGbr5(dQl>qzNiarf>^lvr#U?Av$M&w6uec?q zZMPS;v#|y&f=+N{)&vNfd@0vbJhm6ITo?2xnP5&SP9@H`lQ5VRf!TI}*XB}czuBkE zaJvc-0~YU3PyM|R?U@R4Ej(7Z6xQKOAZSiyeoC6^OOdwZBV^1RI zvUk+8X(B2#bcz~(lp7X}?WW)9S5kkkFa%fa8Cln_u(c}Xke8oC3DEW>5CbTEC$zS)mkJBLx7N4K=r<3Hz_Xsz5%; zq{G}nIZiE^D1a~1N0bZfY8!5^swu?S+Jo{xtGZvlo0*Ddw%w$nF8}l#BkQG^?*X<2BBNx7(#3*fO2NmIf5Gn7BCjb7RJtG`VY0 zGY0yr$Mk-!3FT%|Vsn}Bue336or*s*Uo}tAUBYVJG{y zp9VqLR`9r39-kT$2r7wU$&i^i(1N#c7|d9uX5WWAyQ zSqhzGkbxfKAgW&36I?%U4YkfOF4>{lF&JTE>SAJCd4DHN+T)+}Ac^8$+v$*JzSzA@S%CsiiWUT9HrlkFjD(NLa{d_dR&p zN@CXYB<^8@kDa{VVL_N&DMUC+_!&k3n_1lG-SBl}j1OGDB10vJ1;muH;pV$LcccNA zlFJmiK4qQ-v7|fZ^}ET^ODV*A$S9Rr7|HV%t?5#M$Lk9-d;xBQmTpirqj?J4(#nEg zN(co-WG(dJE1`&G*4WM|rs9W5HV@=cosFD2t4yuBTDLzx%$VeiobZH)2coX6#8i88)B4LY|}CfX2npus>B-dSS@0gP_g^7UF;m?Oj*Cj zGeFCP$YTVeG6V_jd>%BJT;8?9X|dlxwWiyPj3}ZNne_>OVv4!>A=xo5c?Is5H}7cn z*Im}Z*77kfa66u?Q2^jt>t60UOv^I8Cjh6-sX^_~$baFHpFt+o9cu;MJ~ z-}Y=q1lH3QnGNc(`Q13)-)CM_h49&tl72i74Q_dhpBeZBLyYf-lUsk>$@E5xhe}LK zAF+=|2~|UDjQUB2UezqjCZzCEUc0xlGO~Ovu8CGh&q@SD=Vt%9kF^#7qyt_-u1o>&>ZYZ-aY<9?WMs z$Sqcpcgm19O0bq9>&IwCdw2D)z|N@V^MO8nUm$j-;>G2*8);!Sgy;~a^9o=MJQ zSp@Eqv4=DAPw=$O-eHsrW><;)N9aC{Rf<33${jpP@*sEFocuEIO&s!9Y;^s-rX^-| z#y5dq%|l*zgvC51LQDjFS%moSYLO~ZJY0%Tt4K$`qli4%hCJ2^`c)0Q9z0ubQf_=J z^OQ4ry{H*k)2BEJ+u1QN#Iy?*q%K>Ga+KIvi3RU0%*_>z9L1dG?btvHLOsp96NhDO zxK#>asDdhRGpYW4UxlsbZXK&@0c>w6Z|8e(kKY>$Zk6*!HiSp+uG^D-Jwj<%-&+8}6^6f3&a2~4 zmG2l(y=vI3ku9gll%*p7O#OSKmL>|Ge%2+uJ4-b2OzhQPYuKyHj)uRfPph*SEV+XR zyjjI5o;%ZHK$0v!cZf`^(6AP0SNJHxSP4nTz5@2Ew2F6OkrQz+un)ZEEJxKJ?b~`j z0Mpjuv(NcJLWb?NPPxcXGK3Li^lA0J+Ht*0sDX}5WLjdY^*pc4Pu_hXqr0fjg8rR? zuBME%SxNGAuM+Zktevpqum?a<{mZ+4B768tkcBaf---2FP<$di{j;jtW{)jQ-!{U& z8|&}Ro{sivgQjmnk|Si#lXVOtR{^=`J*!SYfh}q#^cbeSuLNC443e*_Ts#9IOa|&# z3(G>em-`L5{;P92T2?0G8-tRG$3ETjk^}?4$L;G=&C6Yly1y!xLATBRGJS!3o!$D9S@e@LjgXPJ8ko13 z5Tuj*UP?_5;iyAcli%iT`pRybxw;`(KRTxDb*b* z3SIxGx7XLF1T~BwY&VAhtdje$@*R*qn3agj1^kw)@LaFMKj>)&?}Jjami^zFLj8-i ze!a5ikDIylDweE?;lm1qJxe6eMY}Yu0bCTCA|25>OM70Q+2>a=>Ck}S3IrRzg{jNq z7J_*)Sw%hq+=04C)3xZ1#8O-Li6C6b_Cw(A!8Iv0p`N+invX*{UVXN$;owBJ;j(x) zdf=J!hCHd3WNe!G93W4Vkr0@2WoUil2DQ{3LM2vNsZ{NY-d&mwx8D1T{c-ZsL;i}1 zbI3W2j)}W@nj{|BF0^s<#`_6IYxUcyOb*Cr6rs`eZtKHA;Pw70eS_PIMpB*=a6g3h zwydHt`{!K43|yx2+m;+hIp7+-ajf*2efO!mXY4towQ3xx zwxtKZ`Nu)iN#82IKzFyUHjR8YQGx44mIq=1f9fFowelObI5C$`7k&$EsfHC!+PHPR z5sJmYX#M9Gp{W@MzgzCyV?Ma=ZhcsNxRhNCc(^CvhI`ShDRi3k{;WHf8$q9$5q~dJ zvmWxWY<$5JB1xySp}?&S>sOODR0JN)SSc;Xm%qZoLU8@SnD6}XbF-Ew)P;ak6# zSs@+mrwjPL4q<8pkLo01^wY3F7@idjy71^#f{?!yHm7uo{=&lyST_ZE%F@*dph{=z z@4jQr551|VHH4rP?-ZJ+t>ouHUkLgmm%C4gG#;re_igO=m#L33LZPWuh;^rNm68I< zF<{}ocaPtg;d>m~;@gE9TRrGgRw+AHC?!j^*&2&+xRKr;$6lO;QhkZx%i_Z{6UM z{_G>Qb|S(QzQbCU@*^gzC^N%O_LpJ}l#!XdZ}Rr`*u}MFK|ifZo(I+5H_$S@ehwN_ z)V81X9S*(_JKuKn+s<}uK8?^GVq;w!kYd=wf9cn<9Mu2O4Swq&V0Rv4=VpRVvvf22 z!l5$r2qPs!o3G>WBZ&3AK;dY zz8lD4e{>OcT+3DGqY~4@2E;LNoiC^Ha*cWMZcg!_`C@W5*K2p4z4d;Y&(M1nc42sT zjXfNIj(|Q&Kvy`noX;Stn(r3o8;k-E&hSM~M?P8}@IM@emJEqpZ>?IY7@nMKQ+i+R zDbuT>_dtE$5B_Au+=Ll?Z=HQ4>$H5A_bK|T8=(AwjPm1|a^Hna%VPu&1HVDmW}0-m zUcAvS+moJD73Tg}UOrkLeLKxS^L7ONt)hNEi2XxGB4=Xp>0$SAZ8-xtlzQ7t-!;q~ zXOi!Ip8#ZJk3_m7qX8V2A~Z6><;~cbC}e^#TR&zNsAA62|3WQEhN;0FCL=>LcKvjJ z`8!r~0d*>l^S~qfar5hoW#@=6t{DkKepr{fSCg~Js!T33f4Y-*Gg~W)%;`omafj^u z>Zy3ir)gG_)2XRyDlACI(dgTh#@M*%{`8|#rC-TCFDJwdtMo)=8His0=?3iG{gv6| zdlJ!beEPPX4PzG5(JU6*mI`ZRV^NTrh+m5=l(qY#B#O!EdKhtN_;AZ z*bWJ4suSDyIrKTBsY|Qk#AE4!(v=YuTk5)c#Q8bBS|K9kx2M6#=L46g<%Qj=Id8R| zJ$<}H>RfwZz88Cf@&BIxTW6p$HxvJHY;*Eb;+p@rj`9CsT!-AptxpDmx3dq1MfLvs Oj=Z#rRHcOR&;JkF Date: Sat, 11 Jul 2026 18:41:06 -0700 Subject: [PATCH 19/23] improvement(chat): shimmer active subagent and tool labels instead of spinners (#5612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * improvement(chat): shimmer active subagent and tool labels instead of spinners * improvement(chat): address review — focus-visible chevron, single shimmer source, reduced-motion rest color * improvement(chat): pulse shimmer text under reduced motion so running state stays visible * improvement(chat): reset background-clip in reduced-motion shimmer fallback * fix(chat): apply reduced-motion shimmer fallback in dark mode too --- .../components/agent-group/agent-group.tsx | 37 +++++++--------- .../components/agent-group/tool-call-item.tsx | 36 ++++++++++++--- apps/sim/components/ui/index.ts | 1 + .../sim/components/ui/shimmer-text.module.css | 44 +++++++++++++++++++ apps/sim/components/ui/shimmer-text.tsx | 17 +++++++ .../components/ui/thinking-loader.module.css | 26 +++-------- 6 files changed, 115 insertions(+), 46 deletions(-) create mode 100644 apps/sim/components/ui/shimmer-text.module.css create mode 100644 apps/sim/components/ui/shimmer-text.tsx diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/message-content/components/agent-group/agent-group.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/message-content/components/agent-group/agent-group.tsx index ce8d57b6dcd..0314907eefe 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/message-content/components/agent-group/agent-group.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/message-content/components/agent-group/agent-group.tsx @@ -1,7 +1,8 @@ 'use client' import { useEffect, useLayoutEffect, useRef, useState } from 'react' -import { ChevronDown, cn, Expandable, ExpandableContent, PillsRing } from '@sim/emcn' +import { ChevronDown, cn, Expandable, ExpandableContent } from '@sim/emcn' +import { ShimmerText } from '@/components/ui' import type { ToolCallData } from '../../../../types' import { getAgentIcon, isToolDone } from '../../utils' import { ToolCallItem } from './tool-call-item' @@ -63,11 +64,7 @@ export function AgentGroup({ const AgentIcon = getAgentIcon(agentName) const hasItems = items.length > 0 const resolved = isAgentGroupResolved(items) - // Pure projection of the run's own state: a subagent header spins while it is - // delegating with no resolved work yet. A terminal turn closes the lane (its - // subagent block is stamped ended), which clears `isDelegating`, so no - // transport gating is needed to stop an aborted-before-first-tool spinner. - const showDelegatingSpinner = isDelegating && !resolved + const isWorking = (isDelegating && !resolved) || (isStreaming && isLaneOpen) // Expand while the turn is live and any of: the lane is open (the subagent is // actively running), this is the current/latest section, or there is unresolved @@ -89,19 +86,19 @@ export function AgentGroup({ + + ))} + + )} + + ) + } + return (
    { if (!isPreview) { collaborativeSetSubblockValue(blockId, subBlock.id, value) diff --git a/packages/emcn/src/components/wizard/wizard.tsx b/packages/emcn/src/components/wizard/wizard.tsx index ff533c64e3b..88417d6b7cb 100644 --- a/packages/emcn/src/components/wizard/wizard.tsx +++ b/packages/emcn/src/components/wizard/wizard.tsx @@ -1,23 +1,21 @@ 'use client' import * as React from 'react' -import { Button } from '../button/button' +import { cn } from '../../lib/cn' import { - Modal, - ModalBody, - ModalContent, - ModalDescription, - ModalFooter, - ModalHeader, - type ModalSize, -} from '../modal/modal' + ChipModal, + ChipModalBody, + ChipModalFooter, + ChipModalHeader, +} from '../chip-modal/chip-modal' +import { ModalDescription, type ModalSize } from '../modal/modal' /** * A multi-step modal wizard primitive. * * @remarks - * Wraps the emcn Modal with a shared Back / Next / Done footer and declarative - * `Wizard.Step` children. Step state is controlled + * Wraps the emcn ChipModal with a shared Back / Next / Done footer and + * declarative `Wizard.Step` children. Step state is controlled * from the outside so the consumer can hydrate from persisted state, reset * on close, or jump around imperatively. * @@ -160,42 +158,39 @@ const WizardRoot: React.FC = ({ if (total === 0) return null return ( - - - - {title ? ( - - {Icon ? : null} - {title} - - ) : ( - activeStep?.props.title - )} - - - - - {description ?? 'Multi-step wizard'} - - {activeStep} - - - - - {isLast ? ( - - ) : ( - - )} - - - + div]` variants stretch ChipModal's inner content column so the + // body fills the fixed height instead of leaving a gap; only applied when a + // height is set, so other ChipModal consumers are untouched. + className={height ? cn(height, '[&>div]:min-h-0 [&>div]:flex-1') : undefined} + > + onOpenChange(false)}> + {title ?? activeStep?.props.title} + + + + + {description ?? 'Multi-step wizard'} + + {activeStep} + + + onOpenChange(false)} + hideCancel + primaryAdjacentAction={{ label: backLabel, onClick: handleBack, disabled: clamped === 0 }} + primaryAction={ + isLast + ? { label: doneLabel, onClick: handleDone } + : { label: nextLabel, onClick: handleNext, disabled: !canAdvance } + } + /> + ) } From a2f868c3973b1a0ae581d1de71ee0b0d0dd23f18 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 19:51:51 -0700 Subject: [PATCH 22/23] fix(demo): preload the Cal.com booking embed while the visitor fills the form (#5616) * fix(demo): preload the Cal.com booking embed while the visitor fills the form The embed script, booker iframe, and its assets only started downloading after the visitor pressed Continue, so the calendar took several seconds to appear. Warm the whole path on first form focus via the embed's documented preload instruction (hidden ?preload=true iframe caches the booker assets) plus a preconnect to app.cal.com. Nothing Cal.com-related loads at initial page load, so Lighthouse/LCP are untouched. * fix(demo): retry embed warm-up on failure, preconnect only on first focus Reset the preload guard when embed.js fails to load so a later focus can retry, and move the app.cal.com preconnect from render into the focus-triggered preload path so initial page load makes zero Cal.com connections. --- .../components/demo-booking/demo-booking.tsx | 16 ++++++++++++- .../demo-scheduler/demo-scheduler.tsx | 24 +++++++++++++++++++ .../demo/components/demo-scheduler/index.ts | 2 +- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/apps/sim/app/(landing)/demo/components/demo-booking/demo-booking.tsx b/apps/sim/app/(landing)/demo/components/demo-booking/demo-booking.tsx index 4b7a499704d..4597437ae31 100644 --- a/apps/sim/app/(landing)/demo/components/demo-booking/demo-booking.tsx +++ b/apps/sim/app/(landing)/demo/components/demo-booking/demo-booking.tsx @@ -3,10 +3,24 @@ import { type CSSProperties, useEffect, useRef, useState } from 'react' import { chipBorderShadowRing, cn } from '@sim/emcn' import dynamic from 'next/dynamic' +import { preconnect } from 'react-dom' import { DemoForm, type DemoLead } from '@/app/(landing)/demo/components/demo-form' const importScheduler = () => import('@/app/(landing)/demo/components/demo-scheduler') +/** + * Warm the entire booking path while the visitor fills the form: preconnect to + * app.cal.com, then load the scheduler chunk, Cal.com's embed.js, and the + * booker iframe assets (via the embed's `preload` instruction). Fired on first + * form focus so nothing Cal.com-related competes with initial page load — the + * connection handshake overlaps the chunk import, and it all finishes long + * before the visitor submits. + */ +function preloadScheduler() { + preconnect('https://app.cal.com') + return importScheduler().then((m) => m.preloadCalEmbed()) +} + /** * Lazy-loaded so the Cal.com embed never enters the initial landing bundle - it * loads only once a visitor reaches the booking step. `loading: () => null` (no @@ -75,7 +89,7 @@ export function DemoBooking({ className }: DemoBookingProps) {
    void importScheduler()} + onFocusCapture={() => void preloadScheduler()} >
    diff --git a/apps/sim/app/(landing)/demo/components/demo-scheduler/demo-scheduler.tsx b/apps/sim/app/(landing)/demo/components/demo-scheduler/demo-scheduler.tsx index c86d0ea9fbf..c10cc3ea103 100644 --- a/apps/sim/app/(landing)/demo/components/demo-scheduler/demo-scheduler.tsx +++ b/apps/sim/app/(landing)/demo/components/demo-scheduler/demo-scheduler.tsx @@ -19,6 +19,30 @@ interface DemoSchedulerProps { lead: DemoLead } +let calEmbedPreloaded = false + +/** + * Warm the Cal.com embed before the scheduler mounts. Loads `embed.js` and + * issues the embed's `preload` instruction, which fetches the booker in a + * hidden `?preload=true` iframe so its assets are already cached when the real + * embed renders on submit. Without this, nothing Cal.com-related starts + * downloading until the visitor presses Continue, which is why the calendar + * used to take several seconds to appear. Idempotent — repeat calls no-op + * while a warm-up is in flight or done, but a failed embed.js load resets the + * flag so a later focus can retry. + */ +export function preloadCalEmbed(): void { + if (calEmbedPreloaded) return + calEmbedPreloaded = true + getCalApi({ namespace: CAL_NAMESPACE }) + .then((cal) => { + cal('preload', { calLink: CAL_LINK }) + }) + .catch(() => { + calEmbedPreloaded = false + }) +} + /** * Step 2 of the booking card - the Cal.com scheduler, prefilled from the form's * {@link DemoLead}. Rendered inside the card chrome owned by {@link DemoBooking} diff --git a/apps/sim/app/(landing)/demo/components/demo-scheduler/index.ts b/apps/sim/app/(landing)/demo/components/demo-scheduler/index.ts index 72290c7861f..a280b21282f 100644 --- a/apps/sim/app/(landing)/demo/components/demo-scheduler/index.ts +++ b/apps/sim/app/(landing)/demo/components/demo-scheduler/index.ts @@ -1 +1 @@ -export { DemoScheduler } from './demo-scheduler' +export { DemoScheduler, preloadCalEmbed } from './demo-scheduler' From f477faab4b99e3bea11b6a018971f169cfe865db Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 11 Jul 2026 20:21:51 -0700 Subject: [PATCH 23/23] fix(rich-markdown-editor): make drag-reorder of an image actually move it, on real browser payloads (#5617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(rich-markdown-editor): make drag-reorder of an image actually move it, on real browser payloads Reported on latest staging (deploy verified via CodePipeline): dragging an image duplicates it instead of moving it, and a click with a few px of hand jitter — which the draggable turns into a native drag+drop-on-self — destroys the selection and duplicates too, reading as "I can't select this image anymore". Reproduced in real Chromium with real mouse input (micro-drag becomes dragstart, never click) and with the real drag payload shape. Two compounding root causes, both empirically pinned: - TipTap's node-view dragstart bypasses ProseMirror's drag serialization entirely (verified in @tiptap/core source: onDragStart only sets a drag image and NodeSelects the node — no PM text/html, no view.dragging). What the drop actually carries is the BROWSER's native enrichment: an image File plus text/html whose is the ABSOLUTE rendered URL. - Both hosted-image recognizers (extractEmbeddedFileRef and isInlineRouteSrc) reject absolute URLs, so the #5573 skip-check never matched on real drags: the drop fell into the upload branch (duplicate; original never moves). Falling through to PM instead would be no better: with view.dragging unset its default drop PARSES the html into a copy — persisting the display-layer src that share/export tracking don't recognize — and never deletes the original. Fix, at the mechanism level: - Normalize clipboard/dataTransfer srcs origin-relative before comparing (toSameOriginPath), keyed off window.location.origin deliberately rather than getBaseUrl(): the browser serializes against the origin the page is ACTUALLY viewed on, which legitimately diverges from the configured NEXT_PUBLIC_APP_URL (localhost dev, previews, apex-vs-www). Cross-origin srcs are never treated as ours. Applied to isInlineRouteSrc, hasHostedImageHtml, and findHostedImageAttrs (the paste-clone path had the same absolute-URL gap for browser-native "Copy Image"). - handleDrop performs the internal move itself when the drop's html references the currently-selected image node (htmlReferencesSrc — TipTap's dragstart guarantees that selection): same delete → map → insert shape as ProseMirror's own move, ending NodeSelected. Drop-on-self is a no-op that keeps the ring — which is what a jittery click now resolves to. Empirical before/after (real-Chromium harness driving the real editor + engine): pre-fix the drag leaves the original in place and uploads a duplicate; post-fix the node moves exactly once, nothing uploads, and the moved image stays selected. Paste-clone verified for both relative (PM copy) and absolute (native Copy Image) payloads. 604 unit tests pass including 11 new ones for the origin-aware helpers. * fix(rich-markdown-editor): no-op invalid drop points, match external-image identity by absolute URL Greptile round 1, both real: - dropPoint can return null (no valid insertion point); the raw coords.pos fallback could make tr.insert throw — PM's own null-fallback is only safe because it uses the forgiving replaceRangeWith. A null drop point is now a handled no-op: the node stays put, still selected. - A doc image with a cross-origin src (README badge, CDN image) failed the same-origin identity check, so drag-reordering IT still fell into the duplicate path. htmlReferencesSrc now compares full ABSOLUTE URLs — identity is the question there, not hosted-by-us membership — while the hosted-recognition helpers stay same-origin-scoped. New regression test fails pre-fix. Also folded the remaining inline comments into the handleDrop TSDoc and gave IMG_SRC_RE / INLINE_ROUTE_QUERY_KEYS proper TSDoc (production diff is now TSDoc-only). --- .../rich-markdown-editor/image-paste.test.ts | 96 ++++++++++++++ .../rich-markdown-editor/image-paste.ts | 120 +++++++++++++++--- .../rich-markdown-editor.tsx | 64 ++++++++-- 3 files changed, 252 insertions(+), 28 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/image-paste.test.ts b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/image-paste.test.ts index d782141e81c..fff5f035a81 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/image-paste.test.ts +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/image-paste.test.ts @@ -14,8 +14,10 @@ import { extractImgSrcs, findHostedImageAttrs, hasHostedImageHtml, + htmlReferencesSrc, isInlineRouteSrc, shouldSkipFileUpload, + toSameOriginPath, } from './image-paste' // jsdom lacks `elementFromPoint`; the Placeholder extension's viewport tracking calls it on mount. @@ -288,3 +290,97 @@ describe('findHostedImageAttrs', () => { expect(originalAlt).toBe('photo') }) }) + +describe('origin-aware src normalization (browser-native drag/copy enrichment uses ABSOLUTE urls)', () => { + const ORIGIN = 'https://www.staging.sim.ai' + + it('toSameOriginPath: relative passes through; same-origin absolute → path+query; cross-origin → null', () => { + expect(toSameOriginPath('/api/files/view/wf_a', ORIGIN)).toBe('/api/files/view/wf_a') + expect(toSameOriginPath(`${ORIGIN}/api/workspaces/ws-1/files/inline?fileId=wf_a`, ORIGIN)).toBe( + '/api/workspaces/ws-1/files/inline?fileId=wf_a' + ) + expect(toSameOriginPath('https://evil.example.com/api/files/view/wf_a', ORIGIN)).toBeNull() + }) + + it('isInlineRouteSrc accepts the same-origin ABSOLUTE inline route (the real dragged-img src on staging)', () => { + expect(isInlineRouteSrc(`${ORIGIN}/api/workspaces/ws-1/files/inline?fileId=wf_a`, ORIGIN)).toBe( + true + ) + expect( + isInlineRouteSrc( + 'https://evil.example.com/api/workspaces/ws-1/files/inline?fileId=wf_a', + ORIGIN + ) + ).toBe(false) + }) + + it('hasHostedImageHtml matches absolute same-origin srcs and rejects cross-origin ones', () => { + const isHosted = (src: string) => extractEmbeddedFileRef(src) !== null + expect(hasHostedImageHtml(``, isHosted, ORIGIN)).toBe( + true + ) + expect( + hasHostedImageHtml( + ``, + isHosted, + ORIGIN + ) + ).toBe(true) + expect( + hasHostedImageHtml( + '', + isHosted, + ORIGIN + ) + ).toBe(false) + }) + + it('findHostedImageAttrs matches when the clipboard html carries the absolute rendered url', () => { + const ws = createWorkspaceFileContentSource('ws-1') + const editor = new Editor({ + extensions: createMarkdownEditorExtensions({ placeholder: '' }), + content: { + type: 'doc', + content: [{ type: 'image', attrs: { src: '/api/files/view/wf_abc', alt: 'photo' } }], + }, + }) + const absolute = `${ORIGIN}/api/workspaces/ws-1/files/inline?fileId=wf_abc` + const match = findHostedImageAttrs(editor.state.doc, [absolute], ws.resolveImageSrc, ORIGIN) + expect(match?.src).toBe('/api/files/view/wf_abc') + }) +}) + +describe('htmlReferencesSrc (the "this drop is MY dragged image" check)', () => { + const ORIGIN = 'https://www.staging.sim.ai' + const RESOLVED = '/api/workspaces/ws-1/files/inline?fileId=wf_a' + + it('true when the html img src is the absolute form of the resolved src', () => { + expect(htmlReferencesSrc(``, RESOLVED, ORIGIN)).toBe(true) + }) + + it('true for the relative form too (ProseMirror-serialized html)', () => { + expect(htmlReferencesSrc(``, RESOLVED, ORIGIN)).toBe(true) + }) + + // Identity must work for cross-origin srcs too: a doc's image may legitimately point at a CDN or + // badge URL, and dragging THAT node to reorder it must still match — under the previous + // same-origin-path comparison it fell into the duplicate-upload branch instead. + it('matches an external (cross-origin) image against its own exact absolute url', () => { + const EXTERNAL = 'https://cdn.example.com/badge.svg' + expect(htmlReferencesSrc(``, EXTERNAL, ORIGIN)).toBe(true) + expect( + htmlReferencesSrc('', EXTERNAL, ORIGIN) + ).toBe(false) + }) + + it('false for a different image, empty html, missing resolved src, or cross-origin', () => { + expect(htmlReferencesSrc(``, RESOLVED, ORIGIN)).toBe( + false + ) + expect(htmlReferencesSrc('', RESOLVED, ORIGIN)).toBe(false) + expect(htmlReferencesSrc(``, undefined, ORIGIN)).toBe(false) + expect( + htmlReferencesSrc(``, RESOLVED, ORIGIN) + ).toBe(false) + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/image-paste.ts b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/image-paste.ts index d3bc170f317..c3edc938661 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/image-paste.ts +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/image-paste.ts @@ -13,27 +13,63 @@ export function extractImageFiles(transfer: DataTransfer | null): File[] { .filter((file): file is File => file !== null) } -// `src` may be double-quoted, single-quoted, or (validly) unquoted per the HTML spec — the browser's -// own clipboard serialization always quotes it, but other producers of `text/html` are not obligated -// to. +/** + * Matches `` `src` attribute values: double-quoted, single-quoted, or (validly) unquoted per + * the HTML spec — the browser's own clipboard serialization always quotes it, but other producers + * of `text/html` are not obligated to. + */ const IMG_SRC_RE = /]*\bsrc\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+))/gi + +/** Query params under which the inline route addresses a workspace file. */ const INLINE_ROUTE_QUERY_KEYS = new Set(['key', 'fileId']) +/** + * The page's own origin — clipboard/dataTransfer srcs on any other origin are never ours. + * Deliberately `window.location.origin`, NOT `getBaseUrl()`: the browser serializes a dragged/copied + * ``'s URL against the origin the page is ACTUALLY being viewed on, which can legitimately + * differ from the configured `NEXT_PUBLIC_APP_URL` (localhost dev against a shared env, preview + * deploys, apex-vs-www) — comparing against the configured URL would silently fail on any such + * origin, which is the exact bug class this normalization exists to fix. + */ +function runtimeOrigin(): string { + return typeof window === 'undefined' ? '' : window.location.origin +} + +/** + * Normalizes a clipboard/dataTransfer img `src` to an origin-relative `pathname?query`, or `null` + * when it belongs to a different origin. The browser's NATIVE drag/copy enrichment (dragging or + * "Copy Image" on a rendered ``) serializes the ABSOLUTE resolved URL — + * `https://host/api/workspaces/…/inline?…` — while everything the app compares against (persisted + * refs, `resolveImageSrc` output) is origin-relative, so both must be brought into the same space + * before comparing. A cross-origin src must never be treated as ours. + */ +export function toSameOriginPath(src: string, origin = runtimeOrigin()): string | null { + try { + const base = origin || 'http://placeholder' + const parsed = new URL(src, base) + if (parsed.origin !== base) return null + return parsed.pathname + parsed.search + } catch { + return null + } +} + /** * True for the *display-layer* inline route `resolveImageSrc` (see `use-file-content-source.tsx`) * rewrites an embed to — workspace-scoped `/api/workspaces/{workspaceId}/files/inline?key=…`/`?fileId=…` * or public-share-scoped `/api/files/public/{token}/inline?key=…`/`?fileId=…`. This is the shape * actually rendered into ``, and so what a same-page copy's `text/html` clipboard payload - * actually contains — NOT the raw stored reference `extractEmbeddedFileRef` (in - * `@/lib/uploads/utils/embedded-image-ref`) recognizes, which only matches the persisted `src` before - * that rewrite. Checked separately from (rather than folded into) `extractEmbeddedFileRef` since that - * helper is shared with server-side authorization/export code operating on persisted content, where - * this display-only shape should never legitimately appear. + * actually contains (absolute — see {@link toSameOriginPath}) — NOT the raw stored reference + * `extractEmbeddedFileRef` (in `@/lib/uploads/utils/embedded-image-ref`) recognizes, which only + * matches the persisted `src` before that rewrite. Checked separately from (rather than folded into) + * `extractEmbeddedFileRef` since that helper is shared with server-side authorization/export code + * operating on persisted content, where this display-only shape should never legitimately appear. */ -export function isInlineRouteSrc(src: string): boolean { +export function isInlineRouteSrc(src: string, origin = runtimeOrigin()): boolean { + const path = toSameOriginPath(src, origin) + if (path === null) return false try { - const parsed = new URL(src, 'http://placeholder') - if (parsed.origin !== 'http://placeholder') return false + const parsed = new URL(path, 'http://placeholder') if (!parsed.pathname.endsWith('/inline')) return false for (const key of parsed.searchParams.keys()) { if (INLINE_ROUTE_QUERY_KEYS.has(key)) return true @@ -62,9 +98,53 @@ export function extractImgSrcs(html: string): string[] { * select it) makes the browser put BOTH `text/html` (the real serialized node, with its real hosted * `src`) AND a synthesized image `File` onto the clipboard — the same "drag a web image out" behavior * that {@link extractImageFiles} alone can't tell apart from a genuinely new external image paste. + * Srcs are normalized origin-relative first ({@link toSameOriginPath}): ProseMirror's own clipboard + * serialization writes the persisted relative src, but the BROWSER's native enrichment writes the + * absolute resolved URL. */ -export function hasHostedImageHtml(html: string, isHostedRef: (src: string) => boolean): boolean { - return extractImgSrcs(html).some((src) => isHostedRef(src) || isInlineRouteSrc(src)) +export function hasHostedImageHtml( + html: string, + isHostedRef: (src: string) => boolean, + origin = runtimeOrigin() +): boolean { + return extractImgSrcs(html).some((src) => { + const path = toSameOriginPath(src, origin) + return path !== null && (isHostedRef(path) || isInlineRouteSrc(path, origin)) + }) +} + +/** Resolves `src` to a full absolute URL against `origin`, or `null` when unparseable. */ +function toAbsoluteUrl(src: string, origin: string): string | null { + try { + return new URL(src, origin || 'http://placeholder').href + } catch { + return null + } +} + +/** + * True when `html` contains an `` whose src resolves to the same ABSOLUTE URL as + * `resolvedSrc` (a `resolveImageSrc` output for a node already in this document). This is the + * "that drop is MY dragged image" check for internal drag-reorder: TipTap's node-view dragstart + * bypasses ProseMirror's serialization entirely (no PM `text/html`, no `view.dragging`) but + * NodeSelects the dragged image, and the browser's native enrichment carries the absolute rendered + * URL of exactly that node. + * + * Deliberately compares full absolute URLs rather than same-origin paths ({@link toSameOriginPath}): + * identity is the question here, not hosted-by-us membership — a doc's image may legitimately have a + * cross-origin `src` (a README badge, a CDN image), and dragging THAT node to reorder it must match + * too, or it falls into the duplicate-upload path. Relative and absolute spellings of the same URL + * still compare equal because both sides resolve against the page origin. + */ +export function htmlReferencesSrc( + html: string, + resolvedSrc: string | undefined, + origin = runtimeOrigin() +): boolean { + if (!html || !resolvedSrc) return false + const target = toAbsoluteUrl(resolvedSrc, origin) + if (target === null) return false + return extractImgSrcs(html).some((src) => toAbsoluteUrl(src, origin) === target) } /** @@ -108,20 +188,26 @@ interface DescendantsDoc { * the clipboard/dataTransfer `html`, whose `src` is `resolveImageSrc`'s rewritten *display* URL, not the * real persisted one. Inserting a node built from that display URL would bake it into the document, * which public share/export/referenced-by-doc tracking don't recognize (they only match the persisted - * shape) — this lookup avoids ever constructing such a node in the first place. + * shape) — this lookup avoids ever constructing such a node in the first place. Both sides of the + * comparison are normalized origin-relative ({@link toSameOriginPath}): the clipboard html may carry + * the browser's absolute URLs. */ export function findHostedImageAttrs( doc: DescendantsDoc, targetSrcs: string[], - resolveImageSrc: (src: string | undefined) => string | undefined + resolveImageSrc: (src: string | undefined) => string | undefined, + origin = runtimeOrigin() ): Record | null { - const targets = new Set(targetSrcs) + const targets = new Set( + targetSrcs.map((src) => toSameOriginPath(src, origin)).filter((p): p is string => p !== null) + ) let found: Record | null = null doc.descendants((node) => { if (found) return false if (node.type.name === 'image') { const resolved = resolveImageSrc(node.attrs.src as string | undefined) - if (resolved && targets.has(resolved)) { + const resolvedPath = resolved ? toSameOriginPath(resolved, origin) : null + if (resolvedPath && targets.has(resolvedPath)) { found = { ...node.attrs } return false } diff --git a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/rich-markdown-editor.tsx b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/rich-markdown-editor.tsx index 5057c835af9..9107dbd795d 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/rich-markdown-editor.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/rich-markdown-editor.tsx @@ -3,6 +3,9 @@ import { memo, useEffect, useRef, useState } from 'react' import { cn, toast } from '@sim/emcn' import type { JSONContent } from '@tiptap/core' +import { Fragment, Slice } from '@tiptap/pm/model' +import { NodeSelection } from '@tiptap/pm/state' +import { dropPoint } from '@tiptap/pm/transform' import type { Editor } from '@tiptap/react' import { EditorContent, useEditor } from '@tiptap/react' import { useRouter } from 'next/navigation' @@ -19,6 +22,7 @@ import { extractImageFiles, extractImgSrcs, findHostedImageAttrs, + htmlReferencesSrc, shouldSkipFileUpload, } from './image-paste' import { @@ -216,6 +220,8 @@ export function LoadedRichMarkdownEditor({ const uploadFile = useUploadWorkspaceFile() const editorInstanceRef = useRef(null) const source = useFileContentSource() + const resolveImageSrcRef = useRef(source.resolveImageSrc) + resolveImageSrcRef.current = source.resolveImageSrc /** * The `/Image` slash command opens this hidden picker; `pendingImagePosRef` holds the caret position @@ -367,22 +373,58 @@ export function LoadedRichMarkdownEditor({ * the browser doesn't navigate away from the editor; internal text drags carry no files and fall * through to the default behavior. * - * Dragging an existing image node to reorder it is also an internal drag, but the browser's - * native drag-and-drop synthesizes an image `File` into `event.dataTransfer` for a dragged `` - * (the same mechanism that lets a user drag a web image out to their desktop) — indistinguishable - * from a real external drop by `dataTransfer` files/items alone. When the accompanying `text/html` - * shows it's a same-page drag of an already-hosted image, bail out and let ProseMirror's own - * default move logic run — it relocates the actual existing node object (`dragging.node`), never - * re-parsing html, so (unlike the paste case above) there's no display-vs-persisted src risk here. - * Checked from `html`, not `view.dragging`, so a stale `dragging` flag (ProseMirror clears it up - * to ~50ms late via `dragend` when a prior internal drag was dropped outside this view) can never - * suppress the plain-file swallow guard below for an unrelated drop that happens to land in that - * window — this only reacts to what THIS specific drop's `html` actually contains. + * Drag-REORDER of an image node is the deceptive case. TipTap's node-view dragstart bypasses + * ProseMirror's own drag serialization entirely — no PM `text/html`, no `view.dragging` — but it + * DOES NodeSelect the dragged image; what the drop carries instead is the browser's native + * enrichment for a dragged ``: an image `File` plus `text/html` whose src is the ABSOLUTE + * rendered URL of that exact node. So when the drop's html points at the currently-selected image + * node ({@link htmlReferencesSrc}), this drop IS that node being moved, and the move must be + * performed here: uploading would duplicate it (the original never moves), and falling through to + * ProseMirror is no better — with `view.dragging` unset its default drop PARSES the html into a + * copy (persisting the display-layer src, which share/export tracking don't recognize) and never + * deletes the original. The gate accepts at most one file (not exactly one): some drag transports + * (e.g. CDP-driven input) carry the html alone, and a genuinely external drop can never reference + * the currently-selected node's own resolved src. + * + * The move itself is the same shape as ProseMirror's own: compute the drop point on the + * pre-delete doc, delete the source, map the insert position through that delete. A null + * `dropPoint` (no valid insertion point) is a handled no-op — the node stays put, still + * selected — never a raw-position fallback, which `tr.insert` could throw on (PM's own null + * fallback is only safe because it uses the forgiving `replaceRangeWith`). + * + * PM-serialized drags (a text selection spanning an image, dragged from a textblock) still reach + * the `shouldSkipFileUpload` bail below: PM set `view.dragging` for those itself, so its default + * move logic is correct there. */ handleDrop: (view, event) => { if (!view.editable) return false const images = extractImageFiles(event.dataTransfer) const html = event.dataTransfer?.getData('text/html') ?? '' + const { selection } = view.state + if ( + images.length <= 1 && + selection instanceof NodeSelection && + selection.node.type.name === 'image' && + htmlReferencesSrc(html, resolveImageSrcRef.current(selection.node.attrs.src)) + ) { + event.preventDefault() + const coords = view.posAtCoords({ left: event.clientX, top: event.clientY }) + if (!coords) return true + const node = selection.node + const tr = view.state.tr + const insertPos = dropPoint( + view.state.doc, + coords.pos, + new Slice(Fragment.from(node), 0, 0) + ) + if (insertPos === null) return true + tr.delete(selection.from, selection.to) + const mapped = tr.mapping.map(insertPos) + tr.insert(mapped, node) + tr.setSelection(NodeSelection.create(tr.doc, mapped)) + view.dispatch(tr.scrollIntoView()) + return true + } if (shouldSkipFileUpload(images, html, (src) => extractEmbeddedFileRef(src) !== null)) { return false }