From 44c64b03fcc11ee0f34ef15e8ab6c49bf5800e09 Mon Sep 17 00:00:00 2001
From: Henry <48483883+hfellerhoff@users.noreply.github.com>
Date: Sat, 2 May 2026 00:49:45 -0400
Subject: [PATCH 01/15] skip inactive feeds
---
src/server/rss/fetchFeeds.ts | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/server/rss/fetchFeeds.ts b/src/server/rss/fetchFeeds.ts
index e6d5f6ee..14cda77d 100644
--- a/src/server/rss/fetchFeeds.ts
+++ b/src/server/rss/fetchFeeds.ts
@@ -98,6 +98,13 @@ export async function* fetchAndInsertFeedData(
};
}
+ if (!feed.isActive) {
+ return {
+ status: "skipped",
+ id: feed.id,
+ };
+ }
+
const cached: ConditionalHeaders = {
etag: feed.etag,
lastModifiedHeader: feed.lastModifiedHeader,
From 932dca3f2377ea2c617fbe03e8d6db17ecb8d271 Mon Sep 17 00:00:00 2001
From: Henry <48483883+hfellerhoff@users.noreply.github.com>
Date: Sat, 2 May 2026 01:26:21 -0400
Subject: [PATCH 02/15] update base url logic, ensure url exists
---
.env.example | 12 ++++++++----
.env.test.main | 2 +-
.env.test.self-hosted | 2 +-
docker-compose.arm.yaml | 1 +
docker-compose.build-arm.yaml | 1 +
docker-compose.build-main-instance-ioredis.yaml | 5 +++--
docker-compose.build-main-instance-upstash.yaml | 5 +++--
docker-compose.build-standalone.yaml | 1 +
docker-compose.build.yaml | 1 +
docker-compose.standalone.yaml | 1 +
docker-compose.yaml | 5 +++--
src/env.js | 8 +++-----
src/lib/auth-client.ts | 2 ++
src/server/api/routers/admin/invitations.ts | 2 +-
src/server/api/routers/subscriptionRouter.ts | 7 +++----
15 files changed, 33 insertions(+), 22 deletions(-)
diff --git a/.env.example b/.env.example
index cef645ba..dd242859 100644
--- a/.env.example
+++ b/.env.example
@@ -1,11 +1,15 @@
-# Database (only for cloud dbs or local libsql running on a custom port)
-# DATABASE_URL='http://127.0.0.1:8080'
-# DATABASE_AUTH_TOKEN=
+# REQUIRED - Your base domain url (e.g. https://www.example.com).
+VITE_PUBLIC_BASE_URL=
-# Authentication
+# REQUIRED - Authentication
# Generate a secret here: https://www.better-auth.com/docs/installation#set-environment-variables
+# Alternatively, run `openssl rand -base64 32` in a terminal and use that value.
BETTER_AUTH_SECRET=
+# Database (only for cloud dbs or local libsql running on a custom port)
+# DATABASE_URL='http://127.0.0.1:8080'
+# DATABASE_AUTH_TOKEN=
+
# OAuth (optional, for custom SSO login)
# OAUTH_PROVIDER_ID=
# OAUTH_PROVIDER_NAME=
diff --git a/.env.test.main b/.env.test.main
index 221b824b..636355d9 100644
--- a/.env.test.main
+++ b/.env.test.main
@@ -9,7 +9,7 @@ DATABASE_URL=http://127.0.0.1:8081
# Auth
BETTER_AUTH_SECRET=test-secret-key-for-main-tests
-BETTER_AUTH_BASE_URL=http://localhost:3002
+VITE_PUBLIC_BASE_URL=http://localhost:3002
# Main instance flag
VITE_PUBLIC_IS_MAIN_INSTANCE=true
diff --git a/.env.test.self-hosted b/.env.test.self-hosted
index 2772782e..a92d1bb8 100644
--- a/.env.test.self-hosted
+++ b/.env.test.self-hosted
@@ -9,7 +9,7 @@ DATABASE_URL=http://127.0.0.1:8082
# Auth
BETTER_AUTH_SECRET=test-secret-key-for-self-hosted-tests
-BETTER_AUTH_BASE_URL=http://localhost:3001
+VITE_PUBLIC_BASE_URL=http://localhost:3001
# Self-hosted flag
VITE_PUBLIC_IS_MAIN_INSTANCE=false
diff --git a/docker-compose.arm.yaml b/docker-compose.arm.yaml
index 4a7bdc31..c6ba8196 100644
--- a/docker-compose.arm.yaml
+++ b/docker-compose.arm.yaml
@@ -33,6 +33,7 @@ services:
DATABASE_URL: http://libsql:8080
KV_STORE: ioredis
REDIS_URL: redis://redis:6379
+ VITE_PUBLIC_BASE_URL: ${VITE_PUBLIC_BASE_URL}
VITE_PUBLIC_IS_MAIN_INSTANCE: "false"
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
FROM_EMAIL_ADDRESS: ${FROM_EMAIL_ADDRESS}
diff --git a/docker-compose.build-arm.yaml b/docker-compose.build-arm.yaml
index 39366a16..0d4cefbe 100644
--- a/docker-compose.build-arm.yaml
+++ b/docker-compose.build-arm.yaml
@@ -37,6 +37,7 @@ services:
DATABASE_URL: http://libsql:8080
KV_STORE: ioredis
REDIS_URL: redis://redis:6379
+ VITE_PUBLIC_BASE_URL: ${VITE_PUBLIC_BASE_URL}
VITE_PUBLIC_IS_MAIN_INSTANCE: "false"
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
FROM_EMAIL_ADDRESS: ${FROM_EMAIL_ADDRESS}
diff --git a/docker-compose.build-main-instance-ioredis.yaml b/docker-compose.build-main-instance-ioredis.yaml
index 825f6646..50dce97f 100644
--- a/docker-compose.build-main-instance-ioredis.yaml
+++ b/docker-compose.build-main-instance-ioredis.yaml
@@ -24,7 +24,6 @@ services:
DATABASE_URL: ${DATABASE_URL}
DATABASE_AUTH_TOKEN: ${DATABASE_AUTH_TOKEN}
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
- VITE_PUBLIC_IS_MAIN_INSTANCE: "true"
KV_STORE: ioredis
REDIS_URL: redis://redis:6379
POLAR_ENVIRONMENT: ${POLAR_ENVIRONMENT}
@@ -41,9 +40,11 @@ services:
FROM_EMAIL_ADDRESS: ${FROM_EMAIL_ADDRESS}
RESEND_API_KEY: ${RESEND_API_KEY}
SENDGRID_API_KEY: ${SENDGRID_API_KEY}
- VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS: ${VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS}
INSTAPAPER_OAUTH_ID: ${INSTAPAPER_OAUTH_ID}
INSTAPAPER_OAUTH_SECRET: ${INSTAPAPER_OAUTH_SECRET}
+ VITE_PUBLIC_IS_MAIN_INSTANCE: "true"
+ VITE_PUBLIC_BASE_URL: ${VITE_PUBLIC_BASE_URL}
+ VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS: ${VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS}
VITE_PUBLIC_IS_MAINTENANCE_MODE: ${VITE_PUBLIC_IS_MAINTENANCE_MODE}
depends_on:
redis:
diff --git a/docker-compose.build-main-instance-upstash.yaml b/docker-compose.build-main-instance-upstash.yaml
index 45e9e718..40e6c0d9 100644
--- a/docker-compose.build-main-instance-upstash.yaml
+++ b/docker-compose.build-main-instance-upstash.yaml
@@ -11,7 +11,6 @@ services:
DATABASE_URL: ${DATABASE_URL}
DATABASE_AUTH_TOKEN: ${DATABASE_AUTH_TOKEN}
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
- VITE_PUBLIC_IS_MAIN_INSTANCE: "true"
KV_STORE: upstash
UPSTASH_REDIS_REST_URL: ${UPSTASH_REDIS_REST_URL}
UPSTASH_REDIS_REST_TOKEN: ${UPSTASH_REDIS_REST_TOKEN}
@@ -29,9 +28,11 @@ services:
FROM_EMAIL_ADDRESS: ${FROM_EMAIL_ADDRESS}
RESEND_API_KEY: ${RESEND_API_KEY}
SENDGRID_API_KEY: ${SENDGRID_API_KEY}
- VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS: ${VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS}
INSTAPAPER_OAUTH_ID: ${INSTAPAPER_OAUTH_ID}
INSTAPAPER_OAUTH_SECRET: ${INSTAPAPER_OAUTH_SECRET}
+ VITE_PUBLIC_BASE_URL: ${VITE_PUBLIC_BASE_URL}
+ VITE_PUBLIC_IS_MAIN_INSTANCE: "true"
+ VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS: ${VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS}
VITE_PUBLIC_IS_MAINTENANCE_MODE: ${VITE_PUBLIC_IS_MAINTENANCE_MODE}
ports:
- 3000:3000
diff --git a/docker-compose.build-standalone.yaml b/docker-compose.build-standalone.yaml
index ec8903ad..abd1b17b 100644
--- a/docker-compose.build-standalone.yaml
+++ b/docker-compose.build-standalone.yaml
@@ -11,6 +11,7 @@ services:
DATABASE_URL: ${DATABASE_URL}
DATABASE_AUTH_TOKEN: ${DATABASE_AUTH_TOKEN}
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
+ VITE_PUBLIC_BASE_URL: ${VITE_PUBLIC_BASE_URL}
VITE_PUBLIC_IS_MAIN_INSTANCE: "false"
KV_STORE: ${KV_STORE}
REDIS_URL: ${REDIS_URL}
diff --git a/docker-compose.build.yaml b/docker-compose.build.yaml
index 5340e36c..b6479b30 100644
--- a/docker-compose.build.yaml
+++ b/docker-compose.build.yaml
@@ -37,6 +37,7 @@ services:
DATABASE_URL: http://libsql:8080
KV_STORE: ioredis
REDIS_URL: redis://redis:6379
+ VITE_PUBLIC_BASE_URL: ${VITE_PUBLIC_BASE_URL}
VITE_PUBLIC_IS_MAIN_INSTANCE: "false"
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
FROM_EMAIL_ADDRESS: ${FROM_EMAIL_ADDRESS}
diff --git a/docker-compose.standalone.yaml b/docker-compose.standalone.yaml
index 859b8ff9..6e9790ac 100644
--- a/docker-compose.standalone.yaml
+++ b/docker-compose.standalone.yaml
@@ -6,6 +6,7 @@ services:
DATABASE_URL: ${DATABASE_URL}
DATABASE_AUTH_TOKEN: ${DATABASE_AUTH_TOKEN}
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
+ VITE_PUBLIC_BASE_URL: ${VITE_PUBLIC_BASE_URL}
VITE_PUBLIC_IS_MAIN_INSTANCE: "false"
KV_STORE: ${KV_STORE}
REDIS_URL: ${REDIS_URL}
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 4aa74e87..d73ad317 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -33,14 +33,15 @@ services:
DATABASE_URL: http://libsql:8080
KV_STORE: ioredis
REDIS_URL: redis://redis:6379
- VITE_PUBLIC_IS_MAIN_INSTANCE: "false"
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
FROM_EMAIL_ADDRESS: ${FROM_EMAIL_ADDRESS}
RESEND_API_KEY: ${RESEND_API_KEY}
SENDGRID_API_KEY: ${SENDGRID_API_KEY}
- VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS: ${VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS}
INSTAPAPER_OAUTH_ID: ${INSTAPAPER_OAUTH_ID}
INSTAPAPER_OAUTH_SECRET: ${INSTAPAPER_OAUTH_SECRET}
+ VITE_PUBLIC_BASE_URL: ${VITE_PUBLIC_BASE_URL}
+ VITE_PUBLIC_IS_MAIN_INSTANCE: "false"
+ VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS: ${VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS}
VITE_PUBLIC_IS_MAINTENANCE_MODE: ${VITE_PUBLIC_IS_MAINTENANCE_MODE}
depends_on:
libsql:
diff --git a/src/env.js b/src/env.js
index 87ce6a58..5090044e 100644
--- a/src/env.js
+++ b/src/env.js
@@ -8,6 +8,7 @@ export const env = createEnv({
* These are exposed to the browser via Vite's VITE_PUBLIC_ prefix.
*/
client: {
+ VITE_PUBLIC_BASE_URL: z.url(),
VITE_PUBLIC_SUPPORT_EMAIL_ADDRESS: z.string().email().optional(),
VITE_PUBLIC_SENTRY_DSN_WEB: z.string().url().optional(),
VITE_PUBLIC_IS_MAINTENANCE_MODE: z.string().optional().default("false"),
@@ -25,10 +26,6 @@ export const env = createEnv({
(str) => !(!!str && process.env.DATABASE_URL?.includes("https://")),
"A DATABASE_AUTH_TOKEN is needed.",
),
- BETTER_AUTH_BASE_URL: z
- .string()
- .optional()
- .default("http://localhost:3000"),
BETTER_AUTH_SECRET: z.string(),
RESEND_API_KEY: z.string().optional(),
SENDGRID_API_KEY: z.string().optional(),
@@ -103,7 +100,8 @@ export const env = createEnv({
DATABASE_URL: process.env.DATABASE_URL,
DATABASE_AUTH_TOKEN: process.env.DATABASE_AUTH_TOKEN,
NODE_ENV: process.env.NODE_ENV,
- BETTER_AUTH_BASE_URL: process.env.BETTER_AUTH_BASE_URL,
+ VITE_PUBLIC_BASE_URL:
+ import.meta.env?.VITE_PUBLIC_BASE_URL ?? process.env.VITE_PUBLIC_BASE_URL,
BETTER_AUTH_SECRET: process.env.BETTER_AUTH_SECRET,
RESEND_API_KEY: process.env.RESEND_API_KEY,
SENDGRID_API_KEY: process.env.SENDGRID_API_KEY,
diff --git a/src/lib/auth-client.ts b/src/lib/auth-client.ts
index ba2c65bd..b7cbcf04 100644
--- a/src/lib/auth-client.ts
+++ b/src/lib/auth-client.ts
@@ -5,6 +5,7 @@ import {
genericOAuthClient,
} from "better-auth/client/plugins";
import { polarClient } from "@polar-sh/better-auth/client";
+import { env } from "~/env";
const plugins = [
adminClient(),
@@ -15,6 +16,7 @@ const plugins = [
export const authClient = createAuthClient({
plugins,
+ baseURL: env.VITE_PUBLIC_BASE_URL,
});
export const { signIn, signOut, signUp, useSession, resetPassword } =
diff --git a/src/server/api/routers/admin/invitations.ts b/src/server/api/routers/admin/invitations.ts
index 5c8b9337..e2463d8b 100644
--- a/src/server/api/routers/admin/invitations.ts
+++ b/src/server/api/routers/admin/invitations.ts
@@ -15,7 +15,7 @@ import { db } from "~/server/db";
import { IS_EMAIL_ENABLED, sendEmail } from "~/server/email";
function getInviteUrl(token: string, origin?: string) {
- const baseUrl = origin || env.BETTER_AUTH_BASE_URL;
+ const baseUrl = origin || env.VITE_PUBLIC_BASE_URL;
return `${baseUrl}/auth/sign-up?token=${token}`;
}
diff --git a/src/server/api/routers/subscriptionRouter.ts b/src/server/api/routers/subscriptionRouter.ts
index 98100782..dce478dc 100644
--- a/src/server/api/routers/subscriptionRouter.ts
+++ b/src/server/api/routers/subscriptionRouter.ts
@@ -23,15 +23,14 @@ import {
import { user } from "~/server/db/schema";
import { IS_EMAIL_ENABLED } from "~/server/email";
import { captureException } from "~/server/logger";
-
-const BASE_URL = process.env.BETTER_AUTH_BASE_URL ?? "http://localhost:3000";
+import { env } from "~/env";
function getValidatedOrigin(headers: Headers): string {
const origin = headers.get("origin") ?? headers.get("referer");
if (origin) {
try {
const parsed = new URL(origin);
- const base = new URL(BASE_URL);
+ const base = new URL(env.VITE_PUBLIC_BASE_URL);
if (parsed.origin === base.origin) {
return base.origin;
}
@@ -39,7 +38,7 @@ function getValidatedOrigin(headers: Headers): string {
// invalid URL, fall through
}
}
- return BASE_URL;
+ return env.VITE_PUBLIC_BASE_URL;
}
type CachedProducts = {
From 1aac95693336735eeeb426167e683dc2bfa7d7de Mon Sep 17 00:00:00 2001
From: Henry <48483883+hfellerhoff@users.noreply.github.com>
Date: Sat, 2 May 2026 01:46:34 -0400
Subject: [PATCH 03/15] gate account delete if user has a subscription
---
.../DeleteAccountSection.tsx | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/src/components/feed/UserProfileEditDialog/DeleteAccountSection.tsx b/src/components/feed/UserProfileEditDialog/DeleteAccountSection.tsx
index 88e29949..ca563a3f 100644
--- a/src/components/feed/UserProfileEditDialog/DeleteAccountSection.tsx
+++ b/src/components/feed/UserProfileEditDialog/DeleteAccountSection.tsx
@@ -1,9 +1,15 @@
+import { useQuery } from "@tanstack/react-query";
import { useRouter } from "@tanstack/react-router";
+import { AlertTriangleIcon } from "lucide-react";
import { useState } from "react";
import { z } from "zod";
+import { useDialogStore } from "../dialogStore";
+import { Alert, AlertDescription, AlertTitle } from "~/components/ui/alert";
import { Button } from "~/components/ui/button";
import { Input } from "~/components/ui/input";
+import { Skeleton } from "~/components/ui/skeleton";
import { useDeleteAccountMutation } from "~/lib/data/user/useDeleteAccountMutation";
+import { orpc } from "~/lib/orpc";
function DeleteAccountInitialSection({
onClickDelete,
@@ -79,6 +85,44 @@ function DeleteAccountConfirmationSection({
export function DeleteAccountSection() {
const [isConfirmation, setIsConfirmation] = useState(false);
+ const { launchDialog } = useDialogStore();
+
+ const { data: subscriptionSummary, isLoading: isLoadingSummary } = useQuery({
+ ...orpc.subscription.getSubscriptionSummary.queryOptions(),
+ });
+
+ const { data: pendingSwitch, isLoading: isLoadingPendingSwitch } = useQuery({
+ ...orpc.subscription.getPendingSwitch.queryOptions(),
+ });
+
+ const hasActivePlan =
+ !!subscriptionSummary?.planId && pendingSwitch?.planId !== "free";
+
+ if (isLoadingSummary || isLoadingPendingSwitch) {
+ return
K&4dEMiCg~{$naZVs4;Ys!CTQ9pezMOM?*{ z%V6r31NSvmz%K!`1e%RmrIbmfohnMT@xt29jv|@%_Xah+I{zG?ll?trLfiuN+a7A3 z21$^Jdx9;(`kid9n9~Oz^6$X6*{+QCJL1ZfTWbw!x9r?E2zJ+dW*>cBGO`HY>x>=t z|51CoMw}8=0^6)d1h>ejj1;y!R9n)#{-hv^1!i~XytK!-MksYUnG863Lwz4RK7MA{ zKWXh~h4&SpD#o`e;+8l6ijm4%Y^*^WNAU zO)yek%tqcbhBqfQ ;sE~8__<8_+H*G|zWCmprPY)Fr|*rZda8cv1JQ3vKI?=O-94zFKFSoNj#-aRO| z!i3_l=n^!&)J>ekC5b2$8Ua4dQvov^=QQf%N$Z {b7?+Z%H=AAOU}Hlb z*;ie0m0HG#Ha8~=xneKP797H5 $Guo;h|CZU+^6N*Gy7D|o1 z288h^j5Hmo`3ji4#Z_Z#@Xz+nZU%GUxzcnRzW4ilH}+VIAfccf+HxJRO6^HP@fAG^ zgZK5Kp?B#Hx{$p6UV-W^v_?#oqAHtlpjp%gLr@2`TKx3XRw@CyIEF M) zph z^VtJPG>(nSc^PQl-w_4lOEymA85P$+Yf6gM!HhM@N3qy|A)7=r4rb4?>aMdY%0Dj5 zK~l9Paihm4uc388OBq#{_LxCYD28Al|AcKvLv+dZnvxN%bdBk!ylq3y4c_cH6G@Xf zsQoLB)dL$Vnth#`k4{-}B6CsRaa3Fw<1cd2*0K#lc!oqQeLaCoL|bRzUBQ%bF=q&t zufvUpsUIVcUplFf)NN|)5YmE3FXHm4l3T334nDSyVldtrF63&WyyK9`Q=lz1B_X~_ z{Xz L g+sQ zPfB@rB$Bhe{=~EaRh~3+OS=8UCwHf2;US?r4u}ZE^$)`r4XzlHWuzr53V|1>Nwv$n z)-~%@aXZ#stGAgwPuz=iu$g2T9-!%tJ>nm UqfdNTW^UCtZc|O>|xd`m+UBeCchgTHRRNW5}?sg&^JSN*3CdygY-zg_IC z2m{#5KmS5r%IY*CzrXE>5{ lJXFG+yrR8Rs#%u;e&xTRVyDj1iA-YDCL%N6r4gM_e0u@{j;)&lxn z?{a}`wu>2i$c6AS0R-=$RfYUt=V=vK%T*Z085=T#wyi^A<@jNz3Md!(ct&tf9Zj=y zO?gzaappE5V zvzqZ0K~j1E%A*Xz6K}iBXjW?OrmHtuYZXFHs_SE@UByFKbP*|@ry1V6&lJ#@zC4gh z47k8%mBSOJkA0sPKvWQbTky!MF$t6i`fyvw$#2@@rylR^FubMOp +@6}R0UI!2 zF6Wh!6QHTC+CzeYc99`WYO;SeADSjY<%h28tpq%~1z%) y@k)ov9^1y~XY4zVO2X&%o =43)Q?oTqlj<^?G&_U)e50m}#W1Cj)-@QG*7rt5h`%5xn0l{q8 zKiEd|KL&P^PZ?nd!eou}MtzT>4kAt(@3YMXEWtPn`7F}fw76iVdDCb;AKnxiVO_*a zJ0s&}KRpV*Ccww?X_5n+oR2syVMTd`zVza0HKS1dl!qB}2tz;(q 79^V=nBwoE%rFr5&QlN zE7TD^y4*vGni!MOhJT{%>8{^fTHleUJI)O(zbUK|9qlCE6#n(GIHqFzGcfXFY0H|r zxEU-;J-6r8HwOH}D3PRW$XT0)g#LONtO(kie@NM%es!RHpHlr5$HCY$OywLp(8e$V zLC{8Op5l1T{8umXguzMwmfl&=n-^5RE{kryrOU|;JFnk9+8^*$6|Xb%?k~hQ7s+t1 z{U8vSV2Ga0txU+2v9T_I8ifW7f#1TsX|yY@A5z$M5t>X@Eof9%&5l%bYo3fc<94TR zcxuMr$-ECZRJTsw^o@4^Z`1HX00s)iw{d_w+IVRkXy&%grkk;vjabK1MXE{a>O|{o zMgYH}WrVII5$@HO!5OgZ8Wng12lEZHDno+mYBnLdG`fF0B^d%sXr|eh@GB-&d#9Xj z!{<7Lbn{~|I$}t4TnXk_$|Bu&)(H%6O{GyzI_*1-3ZZELXseOFjwra&qx%S~1BuM_ zAp0zc??sJN LmJ|j2JQ681;ok3kS2_X;hu%YzaT+NxG zW`sB98it)4ob64 l)~WPEtCey}iOU`ubNwb!Y9Q?}wSL`iWvc3|UY$&+Q}*zK)FmFJ<< zo8mWj9zF_9B;*IJo)jt1kdG7e4>0BKL1 GGG`xE|t$21(Fg~)`Sr=Vigs=)iOgZg2@YT@Xy!#i?3~3f3iAOP-8KXo9A5@0Gm&DxzIYal za7*GvRj*#`1#k&;N*V+(MJqmb*=HnURsI%j^XRBa#DJ9zV~r1@lyX 5O*m8nFw$~vsJ2-@oSc~B96YBaBdUJHZ)PpwQ(?(b%OVXj_KsPuX zPqE GN6$i3hPq%lYqR7k zR7L}v{fLKzFtwb Dek#cc>KiARVYdYe-dH^?p z*WY75UpL_J!1g+mP!7imfo2t6$rdinA_o&fa#;5R5Bp H|g}>2QTmsOH z78O-G>w{}8_UZB_$#@`^eW+P&G&wuaJ4y3~sQSJp`rwr0V1%n0BOD_Zttg=i5x!3` zWCY<~FD-&a+pyoR61dI_CFZCr9@CDa)d-0VF?$obUSe&6LB9eUTg}Mh Sb*3 zIrx2CI{SFs*!R$)$S$yIN cNv~SsXSei)D$wcPJF2TCi>{5j^iF zjr@cG`r}5y^TcIqD20NYBP`}6xReR+;C0W7s`RNgzobcVL=mvN ?@#9dm* z*5&nZdxm0ANNfm~B_u}^>2j_@{rb&Dd2BZH5JCME88TmiKPry!Qs`xP(IN)STtc|R zUK-uU7580Q_iCpenpbG>zIcw3YfE<}(rEpaiYu5GBuWUckv&wnznYd}blONj0GC`P z=mMqEL(sh3$;k+Ky5Lx#7xest7STW(-3CiO+SyiuTR*;
SgBu-AT`!nQE}p`8Z0as#GPsU zj-sYO-ys$28XIHo=2z-4m}D9Hpqf>xl1~>JW+Y@!)W}c~gjxAZP3L00pQsRE_7b9? zhf=toQmJ?!E_WyZll{*RItbZ3yKv8+XN2R`xJqz_6f-`9#tu>-K~fW0;ZJP7l(pZQ ztRoDmQ-e~8xRyd%<6TpHG6Kod_{s=EBLn$0I!DfWaJy96fE59Ah*?K1J5UgKX%%(R zvbnnu8=S2`ofNf_yDEMdO^4 d@6RP_%EKpPGc#-{m84Zbd9k541;jO=^Fic%InVORKng9^7zRsaANOj*nNobKx zxayh9q-rFER4r1*>YVwhe6z$SFINXP vY4v#JxFL03>B`1p`i#Qb1ekCC1X*Ftr8sFhtRF9 zvN{D$j3mA1d$N7wnecMW2aX8*W559+*C^M4KGv5~obBDJ8n3CWAXR5JYemW sRBFoZ_P VZGQ-*Ot@j5XoOU}q_H1uMVza$ zvM@frcFp|z^dS^Hu`lIqB~*c?C1w-p2XK8Huyq`;X*U__Iop962o}~$9dlB7>`*J1 zBPUsuY9W)|a|R_FX!~%t9tAlNty5fsmd9Wu0ZIRbeyoH70qiz;V q}`&er;+AID+<@G!y)TP*66U5{x~@5(4D5rfw(iRwd5k#_9RH zmEYVy|Gxf0K%3s@s2Lr`-u|7hhLkf-S(d5@H7Z2Ab*0C9EK-f#YW80 %H$@GMKNP_C!(W!u{o_JCAk!oBNVEy|u#rQkJtQ&I zjD0y7tgdsq3!sY43xO^|LP<1x0Ui-#
?3tRD?NNs#&%!kE@Q0o@wBxn$ zs*y0aQT6Oaw4rI*{~s>Ghzk*VZV?w;<{H}PgCoUatT^u}-z#6V`Vm^rjiYIk=~{?^ z>#e)SnZDmj(zpGCG9P{MrAgn(*xFM&AIl6BAKd4QDE%bce`w+?7lLAGC6H4<>hkhD zg%=%CtvYQIA|RRIHh}8GSEJ8gd3rDV2s75mkqM$-T~PWbX{vT2jpEkX{fX55vQAI7 z4#DIe+~pnG?g?-gS+~2gc9Aea_*v&1z9crXnG8QY_~VY#T2ih2T|`DVuInEAX5*Yo zbv2D k=Kud uL zEBqr;6^~724+$fgbdWc0b0Ite+i=7(tNhdW>hc=-az|!17NZ+dN3G4*0khaz%jBqJ z9W2TPhCvRvpyD{RDtVNH{mh~JSd^+0j)jCLyx^icg67j|Wn0j(J$Clgeo>u$MR7Fm z4;Rwd_b#oYPXT5eB`A@em0Ebf5~D`m{~`(CFPJP7;o~KGzH@f~ermq05yl7t2G? zDDcy`+B$dqlY2#JNO*o{qR|34Wp!q*G&~n&>z@yYmXI+yL?t76%L@NKk!WjDq0$@w z_*~mlqLoEPCcHF9>nemMwB!i_PABk^6<@^(`*%d{Pf5^~B!EYWV6^anBY1pn3&y>7 z!=X$R?z(g>C{#JC!(39cHA#|@itGVfw>;!zZq@-e@9uO3w}N%#xxTdiVu+|oRL;V3 z90`c9v>Cm*-b+Mx`UJ<`7q$)TF75@ywO-Hb8Yp}x28X|kD78^A3>;g%D_!Z;qFDF3 z$t5vI-*7 `kh30<9owllXT4!@}0%)s{9Ckd*nN^w}CW@R>wpfs12*UR0{1@GpD z0=XEC-s#cD&-D5qfT3+^(C*GdHO73-5+kAwoRS>|zK7zVmA-!=VhnFPvo#r^VULfp z#O4W3Etb7*J3KDguCA6x7j}{C{U? h89Kl{>}aGRB}r7+vO%cm#{ZT3#P&4;L+VpS<-6QTI(yLXp2jSgPd6Jj3p z051psi>97K;9YhVaTfRV->cbk=)N{xYDp_cJqPVzp9p2!%OU&=;`d)H&MDlFzN9#* zuI_8>0$(;hO)6wC91?YDq=cNiSl|ZQa*<5P))9*vi#tUZqT%rre4{VbSaTep^1wMb zH)HIzePFjJg#z-=DM^K7H})Z3{M%WotD};+CCtT|nJc-#%$K;qCL*-c&lz7tGp7X3 zT{VM$K|@5eviD(F#%M>L1s!pEoF52WQ9?1|yeZT 7b(VS{A1G5NNg5qCAMC@g(!BFHI4IiOvQ28*b xeERwrl|?N+^=z_HXhlS zh+HdB`QYhM7bxU`sTLA$9{&$E )Jtj!1*(ZIi0I}|Bau&RmBva05Tl006U@tk9j`f3UoeX3kR)b z!=RJvC6g3 zRp8;ZEWsx)nwsY=mXXI?B2hdkMB&9(E-3(vfRTXqlJkJPQ(ROz$-XmEi31~ev-woe zpNrPi>^2YfPHBdcgF!pqqlsh9Hc^)2HKCS^-)BNN@=qaRDhf#{`6tV&MeeI70m*oZ zt!0ZGG5ykFR<)^AJo!Pn3kilx-e+3mC*xcb94BzjNfi`2C~1OhJRQYS9aTNYpwUL< zdlPZk VhtdaC R2#5{QItzu!O4ak5-lJM?uXIzYR~%@c~*_m zAfmeNnh+*wiqHzWrdO(D93Q?VjnVk-+?rBUux}$zFHd?6$;Hd$F4>V<(1>iN)Slvk z&x;%sKkDEQ0cTSvpOlYw0Z}{MuU=+cB9YeIk~QyYs{4bj5A|anm1rfZcA*-a3mi__ zD|wh)MWW5YBG5HsG5cSyN0^q!O(z7XI1XZN O#%W`Yv6yt%6h3wW6FpiuKL)G z|K2}}3-v45E&A58lfL~yfNv>cC-z!B{X@xWCwl!^sr6!`g&+0(++6;+o{sd>jUH-@ z&FV+f&xAqjyoVt@7=?!EPg5d$FR{Qr=y{RR$Kx$c$eUrsx>YAi_b zmW-gDGosHQfB-y8ii-V6%Yq7{F*TU26uK6v%-z4Rd5|BNSJI3 z$)MKevB7Md8L4DM`7jhrF|~u+Pv#h^1Siq+8jo^(YeG>s8_fl9BZ~ m{4-}pmbpm`BW zCD3872q?zW3(TqyY0~jrY&SclTN2c^;9ID=qg_bmv#*pGh1D_tGlmU!EbQ(dxz-?A zlew&X5&rNA>jn1Z_Lt6SQm5+AJ0CZh2EoCdQ|$+PT3X)6v2>nx$X7*nbV@!HU6Foz zvvy?o#O~>hZp6%*ZP8JL61 Bsq&o(GecZ=5Si(VzPn6j5YOKT$b)eLS*VS~R?J^oOg@#JtBL zG+MXf1h+X6v{lMj|MSv4Dp-G)&TaXE(U(^~i5un1Mhl~vEpl73wN9& 77*9%QLCB-#7e0n 4qpg?&MVQ$+@VGQ=zF_vm1HU6h-!o# z7Z61p(mqwB6gL&G=~Y1>`_rT_WE~hO1t_w~TJxQyWRr_?I714#Ij$=Eh6ok?ht%NN z`1*_Af}*|!en1Y!#$NwZx@x$c@TaKL@ZS3T@}Avn`@^n|o^R{!m#?TzY`1(iaNqeA z7-Y?fj&%7MD0oJ^{$^zPe}6bTA>oymHo~C=!I!Ii4X %;gB>%XSgpN+Z7|+c~cXGW{kD?RI?TM%O=<>~J-T{T^O%ol7^c zyLM#6u(Sl7E)|)(GqHXoGF 0iW#shM9Bj|j?a!yJ|E4(#%iM(fJl&3nVD z6G5!DQk|jK8wL{_otNW(-m%~A4EqZq$JTy?Z%0o2JU!*Lw3rv8I-cf!XZ|n54m 5Lie+VI iVMlIyHz{ZpY!AD@01)}xmFuHQj! zL}t1sR)6I94F)XP?#BM!4%uGI`Z4^-;d{`#^}r5%enQObL2IxQ|EKpH^8?;XI6@yM&Xq_f nwqe1UTrn} zQObyE&LEPhQ3lR2F|5|WQ_9fOnxLRun@*_WbW~lfx%>N0X+K$AT?81 5Ol6^Y- zwA982nirfSOn7GQvhh>Z6x6UhE$1@_${Bnlh!Rre63{z#?ASu@Bw@C!FJsoXnA5m; zcZlD=C)Bj)ffR?Ra50ga(U?o3Q>J102)WNv-Xvpj_=B=CS}*hw*a@qRN71P5Pgp^P zS8}I%Hr3`zm10Usv9+DsPCx!a7NY;?ynPyIcYihf&nwSQ^8?3&tBMj dzZ`Xap?=sz>f7jy0IW?_gMd0?Z_&JZen6ue&Fp_TQ>9RIUQSVg65czwy z-sO7sqq+*8Q&NeV-v4L-^)r$#w3Jl95e`x*4{)RKc)YU>hPTi1!2Vj@LHtlHvuu&5 z+jPADIvD9doK_X`=PDymP!tt?Ggh)ld8J0e dsZ15@gF@K(;l4GF+$)sM;l8N+Bba H;=&XQ7!;)ymm42H4_X#|R#8BdjlxI=tEN>V#M v{zXal$9QY4o#WKNtRHUrb#|pl*?}w-6oiE4ozO z&~2HiWx5%P89NQ6;T~qp&Uz+5F7ZjyAl&iJBGgyr`;THsEH`{#j>`c@d0l%hhX~Um zkVo_!c+fjSL+~FKwI&Y1oH7+aCnQ1ytA=xR2)@We)9lAJDe2UnViXP_w8!-dtvs!b zQPn)F1j0dtXLVz+FH;?N2sEWt*-!FEsyPlRwvl_VxPn=88mMS+i {x>Dt+g4S8VLk-NwuAjazl4 zVWyvc2#`6?%cp>6vwEfM2`6;wS`L0I;Lhg@p?yDlUVVD;^}`K|AWrSu*-v&CU+;9a zTV(!N6Z9=OK^tivzuy`Y9^Ua@umE`dwPe>h)9G7GJKOSy?8y&bg;?|`gPDz_EPc|R z@F%X8+mra=M>~;qPQw#ly`S|k+umFm=HFT?**vyAJg`26kVJgkJ5qos0w%9_Gd9uN z-+}cv_d44}Woj2rgzu#5>2HjR+bt0og@_vU_n)4{Hno3Iy1n%Ez1LLZ#I5&7_Sc^h zHDlxI2<8}G4_v!ap*ATU_lj0wKCc+YL7Nf?xe}71<=Or`qeh307dMs ZqpR zC8g>Jgjp(>|3kxV6w?aUR^%(H=?sFVCxeu%I>486N|c)1Rz`|LA1JPq#yu+FXctN< z6cDXpRB|ZTqlr@>_#b$bR?v8w Rs!Y* zR#(n0Fq*Thb@iN_oHG`Bs<=c|%wL8!u5SD|BVA=ltoj^rbN zt0yP7bbH^A`r20)#AKi z=?l+=D?I9-|Ct-;8qb~gp8fRWkF;p?nUY2M(>4X`ip)9E$miftwdPf`J{+m;RK9vI z%}eC}7M;C;e`p3YuYMv$9lO B?H#^@A&V0~q`iA`)*>6`PEB*2nyY%3Ax!82L z-TC>gy$PAJu(}}f`#T0>vCQT5>xLyahxdKi)j# %9SH?{Bm zluZkLZ#{Cp%Fv0W=V$)CK4JGS#A)t=-N@cr(l?LIzNPJF2d6Ik> MIr`Sn+`Oh7-V;BDu=hON&02*S1ddDBB0 zeXjYRpKH;F20yn;_^$sMI=FY>N3e^<;}#Y}urO1gX!DEY)5z0hpKe}Z6FQ}a>JXN- zUp`F+OFng<3X3Q27*^<8NGx}h<_WJYeIC8m6tW}65ZmMbuh~?o==H!d+^0i7b!q)_ z^TyYY^{BNEBKiD*Iy3CP+S#wAI*lUF&mS4;e)rSv%)0&?_vfqkx?7+2U#RbJUh52= z<9Tkf{T0{_*B&0eAnmgyyR>B5Lu*N*2^S?+HOOL{oq8+E-&powLvq18nVOp?`cB}& zn0mM-au9Ybd4LPn{EBDtx&)uKjsTXFu6yb#T;3i>l)%s$XU7sI$^1hDsVPMSO*8C$ z|D-r!7?bq&Di-tVo+3?nl1&v(F3&(Zc;|D2AqyG;?D$)rYd7U1TJ!s$jX1_etF8r3 z87XMR%PRIG#hg4oo+aEt2%H!E1>>iIfP)3_-Cy{c!}&ZdH3Od`7@x03&oxXgC<`h+ zkBCLB9U)gyfA9QwZtKp+E@>Vke|c^eYZD`TWo7PJ&xT~%=cle+J-r`W?;LAge3RI8 zrF_Ah9w0WnBF~B0m_Ur)UWwWF9ljkD>=|k{Mg<*_xftfnHU5Y^1{qxLTu10qzCL}? z6Q4S9HU#%vI!f;Qd~yx?o%*F*7mS_U{(rbbgtqsDe&)pCn`M4)15W&Qog_F}OcftY z2 395AbZm$a{;gl<` xp{ghlvw^-Q=`u tNn)vM4qxGdu~y5j&33rM|ZKt z2@>9kqyixFLA8u~QuD>OX3z2S(vh)07RK9E{eK}HcT_rSen+~0pV9n%# >1uRwE7^+dcVAF$hD)Nx^CAzdtPQZ+%RbN* 18ICAY1 z`17jBu%h7DTdRB6x>)slZ|BB_FYNfeV{981@f(`QhDFQDXA0gH*E=~5s{U6ZeeNGr zaropozw(n+*10?4Nl-gb(jxPmlS}FG|0FyF^#+enFwwNbG_OI@vjZJ_RPIJ|)wo0? znLS2k<0dLsmazT7A=Yj$yJ~YMM7xV$NdIZyAGvnVgm5C39EEB!xatRd82rYmZ+Ul% z9Hp@K=W{!C&u-+jOZ~VW8TfeR=iwO<_f9*e{`0EI7kN@|bss&Tu@uJ=EzRKQVKph2 zO*_4olTSbkxSem)pz_b3sN3taU%FY@@uxzd#mRIIb~(oCTvy3{v*ze0M1?C&^DBsz z(uCy@B^o1%gA?FC1QZj~D~M3RAe95A0@fmT50w!e#kqZu&|DO#@w)bpc*sZN^6p}} z=ve^r5KLVj1gsaxfN<*rz_uTJnZWn+CUcd$xz&qVwgMspD^7O~`9QeIAl235)+2!s zDu}iynQIz5`35=pC2Dnj2z) s8Xu>+upH^8buEl7(sL;TD zh)i+e=-c3!{@x)P&3v&ghh`zqFM1ZKdsPf+ZsXr|>Q%ygSmMnUC3IK%&{4}~kBb+w z>_IdgdZA$5g%|6eR9r!$0tehaAQ}UEbcExDD;Ds&+3mo6_&HDmZds^v*)J9@yW(_B z)_5cO$%g)r{;e-M>+knazk^(9f8O)HKT_1QxY~JlF;@ovcJCe|LTl;$ryqtYa~}}~ zuZAgo =~Hfl*LvK|K9&6 zeN!Ro&ano+p2e*Q<@z7$Pg!f^H!>ERdP^A-pDx(GyqR6|<%;pPzCy=eNXF)eC(21% zLrI@P7V9N`gjW5y^ds#1M-V@Sb{u}Z^X5st;e@tqpNLarrSnhBWxuuQOvB5vZ`=LM z>p7h5wc7lfE4PAY#$yc*wnpq<*-3ot7U;b3GcYyi=BmsnM|H2qsp; Iv4|671;@-<;k3X}oo^ zgE0I&3K{zFCFj@9-ZR(1Rv6mrr}{pQc=bBK{AynRdAxo7Qe;NZ=!GEL(YG;nt afSIN@;LvptFA$q4|FQJpxu s{cpJnv6BN3G; zn?HN%)xjyO_d%t2e>Bv_S%U=5VI(8a3LqZkV|gC55>e1*_AibGSZku_pk@Yo|I+$# zI^iX*f6||$lr*A?$L1dA9k{us%AmO=S4f8auS k{Dq@^p1e9 {_@2jc$rT55aStl)yFg>sA=TipJn$GaM!lKteOc z+%C?C+OrCevByE lcC!ML>UZr=91B1fHMO&Ah62)5&tR4U@+ z6Dk-jrg^lEYv4AbYf> 4xYoSV9LhEgIk-+Jc7`O@+L zKg68OJLbmu&@vEnuaafQ%8nRpZMcs7=_zk>FB)&ZbFXj4;7-TniCb4*kLmf{i`CzG zj@u1if0D2xd+&XE_SpN8jc0XDF@8 &JJUWQkK9 z;vt*Ev|hnmm!r{ImTLM-FCPqP$q#%NCiZ_n))1Vn)P|ewh8o`fcF@;C#f2iQo5o<- zFsQXEa=m54+i&HXlvn0Bg@?2r{ZhL`CHFUs-spD@&MF?=IsLr`H1TMkC}?dU0al;` z@ZT6bhoE>+yYSmNTuIKrHJR%Q_UC?P9)7jy9DMF5)TNuEbyc;7X~KikY>ZHU%$n#( zT6FD(p)WLf@wpzZw t9hREFo&o0zIQhgPFFW4*K4*tH%&*Q-}1ahyMU!TRNW#t{M?!X-O|HV_oQMj zLad#Xp?*LR48q%pn%@I1jwrH8tQ<#li&(kaXnMr}$%;-O8)Gr{rzFD)R3tQ-oQ^eN zh}7))9!qMn*?2nTm}VZ^IMh=pg*r*JC*8FwLP_OXs$m}BS1&jR*Dxxm)ML{U3*}&5 z%mrVr<{HAozT8V!qQ>FrlE%6!RA@;P);Vs;f!Wnr@^3kxZVJh5ghoLi)CqjH1!LBr zXK8?$bF@m6g{*@~^udX6f&a(RxyLj0|8X3lC@R+yxle|PHgb#HGHjT+4~1eAG7;rg zNm#jTu0t*{Huw9bB4w`0WiEv%_e;n<*M8^wdp!I(4-aRbbI#}Ue!pMOC;z$D6oDiz z%NUZ>uyU*ZxD)YINA#6^kS57Q41gck(s21q&>8%!ZANm&LI#>P)j_3l kdwRzJfh|&Sf)u4d*nn9y~t5{JSxw z_Ko7`;ogYI{&3tvZ}PAYVi_~P^oDynh`lb KPIh(kh23}ej}4F4#GwX z-))zLrgR>i8505TiVFVt9z44KH7K-BDc9-j$Wh$s la+@n;z@Xe@s7_fKb6nn7C8Uh+Ki&gqKIdCet-)wmA>@&BqL(u^%@n zDfMMhh&I>cq*z=;3z}hbj%p#suO=a^R+LO&RV$>-0ou_{&JH{> zON|<0Vq(0mBee9plFb+L+`{uMtjmKs$c;Q$BXYJfp`Dm_8iMmPAA*_NUsR24Z3PtA zu^A{hZixO7-IpYmQE|ddpN22Y7Aj)p1QFVSBA2w4U~!x2BM3OXC?<_r&2~7)BB)Bf z5^tb@&_RDg7@sEz4N2Ub?#3Y`JTUdEaPK<_j{$n*y%_?5IXS$N^|#-H(y0O7Bs hOFT=k? zzp$3CUw9wHg2Ur~xW!+VPaP&-)PWf%#Lkrh%77(|qNBEBbKR#8J{<$Od1aIB`{0LJ zKtL|&A YcyUXbVrp34VZN9 z(-U|aa9ujju$EE{ol%|Q{Cp+kl)HH`RI$R!3wgzMN@GL{Ri`WYo*HiWDKGB7lCOY4 zHyFZQ@$=2*&!dcPvn vy$J55M{r7GegBJZdB5_Y`}sG&AC0 zW-}QSD *3M`p5LOM{4-To8ikf%nufig!kIty?Y~5?zriq zvbVN4{t21F2uXoo3pglPi~HK6;%9us__Q(Z^m^=X2~x4>anq$R!Dk_C>w}w!(*VBW znqW}1$#y8FuE2Cx)do>JUz9nUdHUs6C e<1 z>yp6M!^1;MvLy$_VjU5jbFu*JGy!c-nN@(vDp-1P{6|TO#Th nLF?T z_^?nO!#>$v7DhwcB1|#kVr caC@f6*Qle-Q+m~2a+ p>KRS#9NX5MreK3ki6y1BE~wibMC-tI?c z@W$8LX6Nk@^y9&hi!-6N_oqDFQFm)DN}q&zGP^u8WO{0ON3xyB-U7#65HJASC~zj_ zU3IpaX*ec_#!2GzN2|%{SSoQw7CK9zA#b_X_@x1KE$8zF(^ZS@Und{UAaYv@or1l0 z1NM6Mxqhx{Eo02Sj~|ENWt+A1Y#N1D70H33oaqYRYXo=8ZpDM`0r ^F?11x(3CB?fo1TF?4AwTSR4CIxE=m$+lZn|#IqVa)l$!)>rU=X~Ib3#Ffu zNA*aS2J2EN1GD2j2whf0PjQ7bNFEg+cCCo~+9bh%DN5vnD`~netS0m7)`#8W=pgrX z$)+;I-+}=ji64`_pN5?E$Fm5sdyley`D~wdzLLd&xWG)>0~lGbOLjMA|1rs&97BqP zAaCgJc$0SSnZ444Eblw}IA8m#UAsTxtZ;Cz<37(}`>g7TP|08J?g!ev-`CR%jzYir z|79E3>b}Q2XJd1av+3mM`Fk=@T_X58Krz1CKtJ}pzG`E~z{<27O&2vZ1p9}+;* y3B=MP@^(y+|@uo74q;Gv`rUti9rCU?FTbDvmQ`<2Nef_V3{R(YaQ5p zQAR@pow47oV74EVQ0#MG0;p2_ciS|Ho;G5#O5aRSU{fsLT #Ztk)62d_~z z)kbp!xZfETO1>mS{(16$TxuCNm`*&jCF(T66gP(*95wbcC2M{LX{`OkQ9(I1x^&Xz z5lcG&NS(;{oIU)${3DeignlLZKejpCLpIw=)g>N1PDfc?^A%tKBtZo0Kn2*2qXa_) zd`mQ5I}|P*Nw=^NqtIrF?D+<)zzWX*riXNS(X{(Y12Nda=R7XuMpIKXhzr9ly68VZ z-nX|>#&_xDFCHAXUm)hP(HOgH#wIZW$_B+0oLauP#e=7wNZd6DP6yZ787E&!E;AS2 zJBZO$RjHpNjv4FVB4^O4NyZp-*Z2^%Q``y)?YzWM>`8>!c^Ho?M|9~ap#dJD(w9V< z*ZHeM0EDtMcl9nU`len6k?QgA8D>Z#*%SU9s5UE$>BQLmYN(+O9;hz9Ru6@&$0BP; z6 Pr%mVDiT?+_pUNFY5$3%i1t>1%lnqcA;N;1BO({ju>g^v;bA&TOo7Gt zK9$9&TdJ578$mJVDXvqYa;3SVyzlVp%x!_*f^X~0eJREI4i5B~#CuejCtbDImmVCd zBu6!PsJ*k)=Zhc%u8=(G&b#`hVBFA^#BK-jE!9|v>;RaVA|F9)M=jm4jYyT&hglei zgOzWpavAo6`#9Q+{NUAqb2R0m1OzLE&9}TyBiHh`p=llfjqM_9DwT+Cs1iFDPe6Lz z)*~3jyy)cU=(o;WXj3b?D3*}~19QC61=Gn1Fb+%)UuJ@(dHj|Y{|OHpg;Rd8I|6PA zsT(ex?y2Q#?WjIok?DF1! q5zK(vafJ`yNfPL;@{D37k2Quqr|2 zMFFv!0T*5r^jm8Oc613RUgJu(D}rb=M9jVP10pX(Bi9<3KG=X;tl?oe4FC$gZ)FTe z)ptdRk@N8_(8sTUA^3O?H1P|gW&p+0l{ZI80;Z*6(mYPzEs)4ttd4dS#s~_&R_M0F z1AFiKJNyD_)JrLnRsydQas>JE{b9uhGB7cTP5~-2{0qxtmTQKYJ+7Uv0h<$mB%vV; z3_dYI&s1R0+*sBZ51)&eTp;shR*rvUa8OP33;Uq`7P?$89wrus4x_r=_%6k`RPm-V zoZ0@u$HF^6HpqxqHr$9aGCtp!WZKgsM*!G;09@JEHwoR?)}joRk0#-wvDq1gZN}6h zX8l2MJ626RoO2Wl$+m( Ux zJOf{iI*2SiCKZ&*_YX_3z-6uyux+q1FcNEImToh31t30jl}zAXHj3n&`i1kBFUL#u zG0-0q5kOw2Q#O~HuhV%G%^=zm2rpRMSPUpEcjU=nPZY!n#TX?9spWuvMPLy2#R0Zy z05UH*C{^Sz32Kawok{fjV#B@X1m+v9P02ZK-Pob>f40-3k>~IJG<|o2T;uq%G>QpZ zgs?3IJki$S4ZIMXu@ISzr2G0pz^$naQ(AmNHPaQHZQ~S)GTS*b&Q1Z~YM(Inc;zo3 z2jJ6!o?MTbyB=Ox>GLBnb%SHp*XHsND?0HR*-tJXu5dj;1BjK}!!+W*3^N+ieC<#c zRxln$BN-hBuqxY00IL!R1m02{UhY^M*SujzEkcj1#C`h5 bb6XCTu*vgpH&$!+_TUU>M~aQ29-2ZTnH4dTodvZf|k4<7+6@lFv3; z>6Qwyukf^haoSxK=+8?h!MQlcq&Sc)UN(