fix: vercel

This commit is contained in:
2026-06-09 18:02:04 +02:00
parent ee69da1665
commit c023192113
85 changed files with 10266 additions and 3008 deletions

View File

@@ -0,0 +1,349 @@
# Les 13 — Stap voor stap: van Polderfest naar Polderfest-met-agent
Dit document beschrijft welke stappen je doet om van de Polderfest-app
(Les 11/12) toe te werken naar een echte agent met vijf tools, een eind-
tool, model-switching en een write-tool.
> **Startpunt:** je eigen Polderfest-app uit Les 12, of `polderfest-original.zip`
> uitpakken.
> **Eindpunt:** vergelijkbaar met `polderfest-with-agent.zip` — open die als
> spiekbriefje.
## Wat is AL bekend (uit Les 11/12)
Dit doen we vandaag **niet opnieuw** — het zit al in je Polderfest-app:
- `tool({ description, inputSchema, execute })`
- `stopWhen: stepCountIs(N)` voor multi-step
- Supabase-client opzetten
- `searchBands` en `getDaySchedule` als read-tools
- Bestaande tabellen `bands` en `user_favorites`
## Wat is NIEUW vandaag
Zes echt nieuwe features. Allemaal in één nieuwe route + bijbehorende UI.
| # | Stap | STEP-anchor (Cmd+F in code) |
|---|------|------------------------------|
| 1 | Project klaarzetten | — |
| 2 | Nieuwe route `app/api/agent/route.ts` | — |
| 3 | `addToFavorites` write-tool | `STEP 8 — addToFavorites` |
| 4 | `getWeather` externe API tool | `STEP 7 — getWeather` |
| 5 | `finishPlan` structured-output tool | `STEP 9 — finishPlan` |
| 6 | `hasToolCall` extra stop-conditie | `STEP 10 — hasToolCall` |
| 7 | `prepareStep` voor model-switching | `STEP 11 — prepareStep` |
| 8 | UI-pagina `/agent` met tool-rendering | `STEP 13 — Tool-call rendering` |
| 9 | Testen + deployen | — |
---
## Stap 1 — Project klaarzetten
```bash
unzip polderfest-original.zip
cd polderfest-original
cp .env.example .env.local # zelf invullen
npm install
npm run dev
```
Browser: `http://localhost:3000` — de chat uit Les 11/12 werkt.
Verifieer in Supabase dat de tabel `user_favorites` bestaat met
kolommen `id`, `user_email`, `band_id`, `created_at`. Die hebben we
nodig voor de write-tool.
---
## Stap 2 — Nieuwe route `app/api/agent/route.ts`
Kopieer `app/api/chat/route.ts` naar `app/api/agent/route.ts` als
startpunt. Verwijder daar voor nu eventuele bands-context — we gaan
de agent puur via tools laten werken.
```typescript
import {
convertToModelMessages,
streamText,
stepCountIs,
hasToolCall, // ← nieuw vergeleken met Les 12
tool,
type UIMessage,
} from "ai";
import { openai } from "@ai-sdk/openai";
import { createClient } from "@supabase/supabase-js";
import { z } from "zod";
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.SUPABASE_SERVICE_ROLE_KEY ??
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
);
export async function POST(req: Request) {
const { messages }: { messages: UIMessage[] } = await req.json();
const result = streamText({
model: openai("gpt-5.2"),
system: "Je bent een Polderfest-agent.",
messages: await convertToModelMessages(messages),
stopWhen: stepCountIs(8),
tools: {
// searchBands en getDaySchedule overnemen uit chat/route.ts
},
});
return result.toUIMessageStreamResponse();
}
```
Test eerst dat de route bereikbaar is, bouw daarna stap-voor-stap uit.
---
## Stap 3 — `addToFavorites` write-tool (NIEUW)
Eerste tool die de **wereld verandert** ipv. alleen leest.
Anchor: `STEP 8 — addToFavorites`
```typescript
addToFavorites: tool({
description:
"Voeg een band toe aan de favorieten van de gebruiker. " +
"Gebruik dit als de gebruiker zegt: ik vind X mooi, voeg toe, etc.",
inputSchema: z.object({
bandName: z.string(),
}),
execute: async ({ bandName }) => {
// 1. Zoek band op naam — we hebben band_id nodig (FK)
const { data: band, error: findErr } = await supabase
.from("bands")
.select("id, name")
.ilike("name", `%${bandName}%`)
.limit(1)
.single();
if (findErr || !band) {
return { error: `Band '${bandName}' niet gevonden` };
}
// 2. Insert in user_favorites
const demoUser = "demo@polderwave.app";
const { data, error } = await supabase
.from("user_favorites")
.insert({ user_email: demoUser, band_id: band.id })
.select()
.single();
if (error) return { error: error.message };
return { added: true, band: band.name, favoriteId: data.id };
},
}),
```
Test: zeg tegen de agent *"Voeg Band 5 toe aan mijn favorieten."* en
check in de Supabase Table Editor of er een rij in `user_favorites`
verschijnt.
---
## Stap 4 — `getWeather` externe API (NIEUW)
Geen account, geen API-key — Open-Meteo is gratis. Toont dat tools
ook gewoon `fetch()` kunnen doen naar externe APIs.
Anchor: `STEP 7 — getWeather`
```typescript
getWeather: tool({
description: "Weer-forecast voor een festivaldag.",
inputSchema: z.object({
date: z.string().describe("ISO datum, bv. '2027-07-10'"),
}),
execute: async ({ date }) => {
const url = new URL("https://api.open-meteo.com/v1/forecast");
url.searchParams.set("latitude", "52.0907");
url.searchParams.set("longitude", "5.1214");
url.searchParams.set(
"daily",
"temperature_2m_max,precipitation_probability_max",
);
url.searchParams.set("start_date", date);
url.searchParams.set("end_date", date);
url.searchParams.set("timezone", "Europe/Amsterdam");
const res = await fetch(url);
if (!res.ok) return { error: `Weather API faalde: ${res.status}` };
const data = await res.json();
const d = data?.daily;
return {
date,
temperatureMaxC: d?.temperature_2m_max?.[0],
rainChancePercent: d?.precipitation_probability_max?.[0],
};
},
}),
```
Festivaldata: vrijdag `2027-07-09`, zaterdag `2027-07-10`, zondag `2027-07-11`.
---
## Stap 5 — `finishPlan` structured-output tool (NIEUW)
Dwingt een gestructureerd eindplan af via Zod-schema. De UI kan dit
later als nette plan-kaart renderen.
Anchor: `STEP 9 — finishPlan`
```typescript
finishPlan: tool({
description:
"Roep dit ALS LAATSTE aan. Geef het eindprogramma in gestructureerde vorm. " +
"De agent stopt automatisch na deze aanroep.",
inputSchema: z.object({
summary: z.string().describe("Korte samenvatting"),
items: z
.array(
z.object({
time: z.string().describe("HH:MM"),
band: z.string(),
stage: z.string(),
reason: z.string(),
}),
)
.describe("Items in chronologische volgorde"),
}),
execute: async ({ summary, items }) => {
return { summary, items, ok: true };
},
}),
```
---
## Stap 6 — `hasToolCall` extra stop-conditie (NIEUW)
Combineer `stepCountIs(8)` met `hasToolCall("finishPlan")`:
Anchor: `STEP 10 — hasToolCall`
```typescript
import { stepCountIs, hasToolCall } from "ai";
streamText({
// ...
stopWhen: [
stepCountIs(8), // max 8 stappen (veiligheid)
hasToolCall("finishPlan"), // klaar-signaal van de agent
],
});
```
Effect: zodra de agent `finishPlan` aanroept stopt de loop direct.
Gegarandeerde nette afsluiting, ongeacht resterende stappen.
---
## Stap 7 — `prepareStep` voor model-switching (NIEUW)
Per stap een ander model. Stap 0 (planning) krijgt het krachtige model.
Stap 1+ (uitvoering van tool-calls) gebruikt een lichter model.
Anchor: `STEP 11 — prepareStep`
```typescript
streamText({
model: openai("gpt-5.2"), // default
prepareStep: ({ stepNumber }) => {
if (stepNumber === 0) {
return { model: openai("gpt-5.2") }; // planning
}
return { model: openai("gpt-5-mini") }; // uitvoering
},
// ...rest van je streamText config
});
```
Resultaat: significant lagere kosten en latency zonder kwaliteitsverlies
op het denkwerk.
---
## Stap 8 — UI-pagina `/agent` met tool-rendering (NIEUW)
Maak `app/agent/page.tsx`. Verschil met `/`:
Anchor: `STEP 13 — Tool-call rendering`
```typescript
const { messages, sendMessage, status } = useChat({
api: "/api/agent", // ← belangrijk: agent-route
});
```
Speciaal renderen voor `finishPlan` en `addToFavorites`:
```tsx
{m.parts.map((p, i) => {
if (p.type === "text") return <div>{p.text}</div>;
if (p.type === "tool-finishPlan") {
return <PlanCard result={p.result} />; // nette timeline
}
if (p.type === "tool-addToFavorites") {
return <FavoriteBadge name={p.input.bandName} />; // ⭐ badge
}
if (p.type.startsWith("tool-")) {
return <ToolDetails part={p} />; // expandable JSON
}
})}
```
De gestructureerde output uit `finishPlan` kun je nu prachtig
renderen — geen vrije-vorm-tekst meer die je moet parsen.
---
## Stap 9 — Testen in de browser
Open `localhost:3000/agent`. Probeer:
> "Plan een avond met indie en techno voor zaterdag."
→ meerdere tool-calls + `finishPlan` aan het eind. Plan-kaart in de UI.
> "Welke band moet ik NIET missen op vrijdag? Zet hem in mijn favorieten."
→ Tool `addToFavorites` aangeroepen, badge in UI, rij in `user_favorites`.
> "Wat speelt er op zondag en hoe is het weer?"
→ Externe weer-API call. Agent combineert weer + bands.
---
## Stap 10 — Deploy
Push naar GitHub, importeer in Vercel, env vars:
- `NEXT_PUBLIC_SUPABASE_URL`
- `NEXT_PUBLIC_SUPABASE_ANON_KEY`
- `SUPABASE_SERVICE_ROLE_KEY`
- `OPENAI_API_KEY`
---
## Samenvatting — wat je nu hebt
Zes nieuwe agent-features bovenop Les 12:
| Feature | Voorbeeld in code |
|---------|------------------|
| `addToFavorites` — write naar `user_favorites` | STEP 8 |
| `getWeather` — externe Open-Meteo API | STEP 7 |
| `finishPlan` — Zod-schema structured output | STEP 9 |
| `hasToolCall` extra stop-conditie | STEP 10 |
| `prepareStep` model per stap | STEP 11 |
| UI met tool-call rendering | STEP 13 |
Plus de bestaande tools (`searchBands`, `getDaySchedule`) en patterns
(`tool()`, `stopWhen`, Supabase) die je al uit Les 11/12 kende.
## Vastgelopen?
`polderfest-with-agent.zip` is de complete referentie.
Zoek op `// STEP N` om direct bij de juiste plek te komen.
Reset `user_favorites` tussen demos met `supabase-reset-user-favorites.sql`.

View File

@@ -0,0 +1,250 @@
%PDF-1.4
%<25><><EFBFBD><EFBFBD> ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 9 0 R /F6 13 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
6 0 obj
<<
/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
7 0 obj
<<
/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
10 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
11 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
12 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
13 0 obj
<<
/BaseFont /ZapfDingbats /Name /F6 /Subtype /Type1 /Type /Font
>>
endobj
14 0 obj
<<
/Contents 26 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
15 0 obj
<<
/Contents 27 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
16 0 obj
<<
/Contents 28 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 19 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
17 0 obj
<<
/PageMode /UseNone /Pages 19 0 R /Type /Catalog
>>
endobj
18 0 obj
<<
/Author (NOVI Hogeschool Utrecht) /CreationDate (D:20260609144810+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260609144810+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (Stap voor stap) /Trapped /False
>>
endobj
19 0 obj
<<
/Count 9 /Kids [ 6 0 R 7 0 R 8 0 R 10 0 R 11 0 R 12 0 R 14 0 R 15 0 R 16 0 R ] /Type /Pages
>>
endobj
20 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2296
>>
stream
GauHLD/\/e&H8h>EPPDdD.?&26qZaRZq[t;7@#iL!u(qT=f-$rZD:*5Z?=fLhiW6X]:63fitkS5j5'79k>%g\if!*J?ifbC!2gVI."f>=W(h(F]S#g,n\lVE0ZW<@/D%6k#/mjt+(S:p"tk`$Qq+tM*TB+<fIeJQlaafMT&WWP1's-\"pNuldrB4I0'0qb)tPX*(rN1e_M.L1k?%Afauk`@auVAcr't<H5qAiOXd2[TarLtE"n\tspiHhW,u^3:ZQtCcA!+l@<kseO#L4s\XaH4-P03,O%-B6gTbci?[;AAqa*(LKh@tDG%nVpMY't(jfD[UcI@qTDmkKp3,/GbpKLLaXE=4^5Dj1]^o+m)Jn1q?t7!RZ&AdW[Y'6<&8XM#A\(sN5\(,7hIC2Q*[LuhGD)Jt^bV,Xd'1D1OqgQ>>ber5uu2R?[?0MF;J_TtigqGO'o4C`!]h@f+bbX12)iks28EA8BhcZ`up9$;4d^,(P3Y0#MNGNMn'c!nqRo"DSIHuDKu<h%bpp:l#WauJ@E]!QV(-B(k6';Wo(od\pMH@]i;Pp$Da<i&=l_3ig'Z'Y\)RV8.MV\/i%k!6$]\Z9CMbl^ZN<7?K-=1^sb7[5!mr&T\S17Q@t!3PY\_HKmd)_s%GHg;(3TUjtIaJ/-!AR$3K/%!5l>_HhA'kg^#$aUH?@[R"8*C2Nue0_DS!:0G-=Dg,&XXjEQBa<UqS6"B@.FB^#qrHYL=u!U(Q&"R%d5k;e?.F@Hfg![O0JDLs-EtI8N8C`t_9Af;+gZqLRR3/Yp>spQepPk9A0hinMP8r&;&%%!IEjssQd=VF:-?XRZj#f+=NjCUP-8:o)DX=8)30AjA,Z.;Fu4I+*,D7+*3k7]<ku-^J^$7QiE%"He84-]!c6h\7"Rf22`h^Og*k_i!U=P3_:u2EE=sf;%Ul05D&1DE"['rk?><q@AINX:6F),P!=sVfA(f+L'S0\L#C9"qn2V2>KL2DnllIOp^>DoST#:Y0a<g%X!tkc"i/0KAM=M>,pVV72f)mD)8B*FMkI<[k%+,7D2SL9>Y`O8Z6?Zh5Tb*^b:5#3u,Z]:@r)"_ZMh;(_-qmWfUP]l='@@LI?#BeSgstE'/C@duedgS!C/T,L8rh^WiN1Ri^B:!a?W!Y^X(#"%0pSU9^Gt(..tR9?e92$MKA.1R)p`%WhXH5DVWXD(.cbc5eVAB\T2O2ghC6-d]I8]edF=&pTiJgD6!/uE2N'YIe.#M\Us$8meJ8`KePd$C+[TWY=\Am2aYbH-9]3(;ZUkq4hCVVCH`%!FruM22lKVB=coX`_D-L!bnj-kd)27\Z&`QdMnST^-gm,g>W14][LuBb;4:UEN-k#-I/iUVVP:16O&-j/sSO?mbZOtjEfWT+CBK/t8hlP&m>JG\BLU22liqEd7_d4#.11tfC;.G[K\fH,UfsT[]\o$J#RSenl'n_HnJ%DmXEMs^$`NSC`#!@"_B.36a2>Ii;RZpjXZF`de<5:W.j2B?,GG/n>NnoKX[;8ASB;^mE#F=ae]@QsrB!3[cCcLe[KC#*5=dTt5&t`R%dUdD3biHW2ErAW89;LEopZsh:PPBF+enaZ-PJ%E#H'+o31E!sE$74.[$0Lqm53uQTIW^4:)s"sn.`/o_h;`_6eGXX,T@cEc/5q&ZkH^.*YGu5uI[*>Fj#p_VmG3itWa>!qG>n?@0RJedODeqW;FWNE:[Lkfn^d_E@=#SFjMhVIadMeA\i\"-7HPs%k"2BE)L9TJW(9qHAJB!<`TYsI/T[?Y3Un1(eMqD8AS7E?Y/$sk1/54cE3g/O:1`_Uo).Nb>p^$t-H=gU$be'b5%=oK#>;Yp?m?rq@[Y?.^_m?(iKpBQBQ:'/E@mJ&MFV$j.%H@Z/A\4egng'u7l7!D%N"jL`_1GheF"=)oeB'Sk6P7GRG28.V]I6;=T>O9H/bK+LHRr,m2jd#pA7g[NNC[ic;k8leZEHPQgKQX<+)quk;@9=)s8G?L,+N<Y"m8WdD>X$hi@lp;f%WR/B0=r'EA2^$s>$Jl`GfKa',f3IADY"XlQXkA?K,3qZn.h%=[2LHo4h[8_ZZ;+:BV1G//o+m&CG7CopJ21d'<*n>RHR7=N%L9$ohd\>)Ko""%#WrcgOr/ntUV496KWUmeGE(.hm-OfPL*R>5LT-JA^KX2M4lh'.'eA;4r%+gY:fg%?X2@:5os)sELj[`Wb2<uqV;"1FImP;!L<fl_sDmWjpH"%@1h5&MURL;t.p[J"mBIBCN7<(1uFj*SN3SFj_&#3",&L8(e=9*FOc4Q90j0`D/$B[LG~>endstream
endobj
21 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1572
>>
stream
Gatm;gN)%,&:N_ClqC`MUk1iC,XK1&[l/(MF_W3uSoGk[Q=s2B6\85$YO;P*Lt9Q;F=PD0"RR8%^#1I&!l_'Qs2Q(/2fk@7E5?*>^BKr;%eEKcId[,Q#RabUI3>,S?Gq@^Sp<T3E\d+d&k"9k6-t^LO96:O&L%k'cn>g`&5!,8Y8e?L(sl)u+N!dR&KLUn,[_%!c&!MFd@l'5:DeBi$!MLCZ[!]2>.AEG4fZO/FoB[Bq$&1<s8)F$Ia;)qMV!-F_H1$CGcfqnYn2B_#k-8DV0ScWQS?1,q($N=!@[,i6m3'_K3i7p^c'M3W6@>]FX^B`-@lVF^0i.GfEE<B_P\@]0U?AD@s"?u.H>h_c*Og7Jl=!A1AUY%nCfpWC_W4os+&;fPIS&o=DqpnNjT$2j?(0G\BXQ%dfj^n9I,OjhTjX1[&M)4_L*WWS'Knu:1]0>:r;ndm:Q1j"!ec&q,1M5*+2SNd*ZtZ3mUj:(-*3TgR>6U29.%k/(53^:L-TZT=gQ2H+$CgU.3"55tht>K=:(MLo7ogn3cLWN_jQ:MGb1p<**82*PTAVUsj(Fk]iY/WtC@D9#K%n3"@(WEQ!krDIS9/C\IG]ZtOX;9Wh?l@A>Ym9Z+5:fi"*q1g?W-VUs0OH(;mO1a=E"BaF?k7bBV"F&cq>_/!/Q,0g-bfa,"*b:jhO)BJVUs6^ld$Geh=%#2(Q=b.;9+n55E%e3uZ.Df]3%Im@(="$OF*XP`[3^I4=Jmtu]OA6b)(f6$GER)?9Zo<5-dK]5>9HsaVe\LH3Zbr]'f!]QNbPY,S)X^NQb6Om:UZ@sPLC6lH`\ngr;E"q:8c?&jAAlVVV8A2OH3>1BLLHCKIP#\%L4tZbV*:^VTq$kT("(^Q:;7Q6B"1^q6?RHrofVA(#;3[?W+XJ\+OpBXlF8)R@dl82K@0Y2@T5"cO+H`0[f6/;p2=GRm2X5)DflT2eZn[6,[rA^i^/%\H&XT0fgAY&Of,^9DR&T,H't%:RM&jih=_j!pIX:s_SX77;]&=-HQEJV``dloLs!.orKNcq<R$:Ua1Vr,irqQDoG4ia>Gp_r*SE_7bd'6o=Qlj=TGpZ)F*cSdFk=p<X><h+m?uG>^3`^>]'fOeGe_lKk1X*M%rHKE'%Xe>'hmJKq6!WW"k^GS$8tA;[FW=9Ch?VMc7=>%;+b&f%VaAX\YXn&/N)%7L/4g9&YJ%CgSsaMP@n\qO.W39MGaB1:ipUhV+NP/YNeG,A>N[jCljpJ$^Dc%<b&d$[rRC4U/c=MdK2L$b%<ook@qZ`TG/JW,g/Qi?V]KKD.JeNflgL9=>+3n]Qk!'>Ul`'nj_n3>6=7+"`(MJ+QK#E/70a)Ag1_?Fsc"D)0sOW$H$@r'V3io:B\AIs.\DPl(u^_Wf_Uqf36"7=VNYp,gFE%fgVX9n)O=/T+:(UBW<L-e7Utjo\It*p1I^ap,X`l8'Q.)cg7Tu17U[D>ouRZj=A^%r)P4g;.l<tG5<i%6]&_K7Sm%7/e?H"1!+1G+"!DY($_-"VokMB2'*[*e7)T_;Ar,Xjp4r92<#n0SqAL`V7(eNhQ-"I7DS^8ilb\O~>endstream
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1672
>>
stream
GasapD,]1K&H;*)Z,`chBbX4+A=8o^%qq?mNWM^EHT1+,C(`hf3d._J.)"TSho`,/AT78#(KpY!fba%Y.G4Elj`.^33:L?u7"I,_YCU`2_*<[ZDr"TM8`k$o`)3u'0d*&t5*4T&#ma+ua#j^OG):6"E(,U]ScXXeY"N'A1gIf$-kKJ6Y2V\\'iN-qj;fE^_kf@*;L2.#COXFQo8'L$+jK;-?oWei9!tT--T2^B!.P<-PLGR+Gb<jVI'uSp(bU\>cP?ZeN4H/WJTprca6?3/]AS/>s-6_p"-djr4I<\7T[P)i_-NLAOIN9`lR]]*Oq=,mS3PD_%?P*045gb=3#!B@&Sb6?U6XGRASkp'$dD;2^i9mN(3eTW_X1HAEFg**DQ%]1,W<-fbn8LMR9ApEUHCl>i$D>Yk#(-J;F1KRGYU,qA^HG[<-K![Pdj>&4LR=*]3B&_fc?ItDd'<OI&B\_3O9K%),B<uH$seQ_(3FS-E7Q7%DR2,A!BQ(Ue>NX'TCe@jXSL^q!WK0[j"/3+"/^0!+oqcVmF695GW?@J'`H^@PGL`_;Gf3Y)kM1N^4I6IJp;3PB2]%Ctd%reR?$aMFm8ge0A5hB#-p'q\\^U@3!%:mP>bI#r=V_[Z*3OR,IY4-[$Lq'']'PTFl'`XM=$'QF_TVSR^O?+bf/H#d;XQ5XmnO0M`6/*77;>X>F0UC8:OF.YkN=Q(j=YSY]!3$)=%uH_ao*I*TZ2J,gpL,`JCIq(7P[q>BQW)X`:nGicHiLbk!?66F40:5TN??a%>I0\<)^@e_8<L$+?G%Xl4hHOK[5SbGH1P*e$L]J,3$raU,Z%dnq]J;,A_g!V5boINKMBa=gBZ?1g2,s&R]-f_u>bHm+Zj2p9Ao\s]e@"15O]Jr.TV9dc%9t9T\B-:EGl1k2:jD]KlIX4,jr+#X`]RBZ4-rl-1beH%!:GCTh3B]+DI<;G=M==J52q[Nf%[F].'ed1S$AJl9XYBFW1(;%t+dp1>3gg^[R_[V@e.2bO^>4E_ICn'U&a]4&5K\!'/*_910/qjtXRdJqmVUbHFdqupIk^r\5^4A?"]k(rng.(qi$Xb#$4Err>O,i]?cN>eFbqmkoF\!gl!:pmhU:KN]m;16K:SK30bf<."M9*=Z:.co)Pm93'Cg)RG(/%^AbN=I,^>WpF.HU3;2;*!;NRFj=KIF^%>'aNCW4G2cW?QCd*1f%N^__8fNWI9MfeW+Tp*178eMP309X7g_NeR^P0)NN[)WCQo6o<H1h(%<a`Wuq('e8'cN+K!UPj?T_fW?6o6%,X7@b+*`!:'fK1/n$Z?0Ac;WKJa`j&K&Y%lR7m&dD.FVnls*d^8<@:_.[BJ#>1@\"ffCm#uZ6[r8Dl+,)@(qf\m@_OjhQ)_<#F@=k:R_BcAhfeI(6Q&p91N-@>Hs+(0$r;i5%$0ukru+Ma@MEH9qK`m2)+=:9\4X$Acg_Ja=OYY-9lE*EHWtS!fqS7(8VV)f\Nl>(:1-]&'4-'ufMY=B9&U.Eq$OneV985\WOhNDiI('k8)[aB7>9#O_nA&@9t3MD315^Y4pARsr#)BeNo#hOXj#IdGJakD(`WA;Ef7^qd`0FP/&gf<K6stL4?#D;mK22(p%&B*!7C(l!-W-)Zeuu[#j`r6`ff^TgQpB2VuHH"?\qDJ\$^^[-WpBN(oqP(~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1781
>>
stream
Gat=+CN%rc'`G1AEG)A?gUR_a;%f.f_ceVUJo,@[\EtsQBOmNSPfTRlaj0b(J);RFYag"S[O.tbRQU?6gnu#dr*f$nF9V/M$:h!&(l.>WQllI-^VS%AHg_OfnjimKHqF:(",VI'&'WHP+:(OUo9b*)&Wr1U+W6CtQGE#q'X7q&K#Jsq!Js,]8HD5b+I(h$kC!t`Nhusd_D&]R^>UFk]pOH^4/?$Z+rK`Uc)!I#?P(A3."LOh`\1Z43J1]2;O-L3eiCCGN(U9'\DTK$Ve>M*g8\D]Q$EYaCR@;k#'uq/E"YYbg'9dEOu7'`2Gi*TL\3-"AjlcqL[t`Xf`Hl?AJYQhpJHfijUjsb*26']CTY$Fa[92;%ra[dPp`<)<k)AW4X$df\6J7R&/$I+e6e@*T%*)WI)P(H532[MR"u#&)f-T\E-jVIh$P@nhW,_&Od*P?Bno-$Q;We3W9!`NA(hp[h.?>JH<6[G-Mpa=r9.*Fm"1N9fn;f?CGCZ+j!"1`J<D\MS<hC^;gk*N[E0mu*^bY?E&%?6f^Bi4n-P/-cliD50oSf7Xtj9&%ik3ZnKZ2FK)hZ*=tN%>!bP"Y8*^MFUd.=M3)6KjO1+`(;U*E4]2=<u#ehB7`),PlKKDQIldIQ6.S0,N%hLq)AT\FVkr(mEJ&4hDCkApNglTqe<0`WoAABIfI1X?ah6LM'WQrsC[7ZJ<,LNi5Pu`O[ni.b#i!19@/'Ei]V(>)=RB0LsN%Z4^:uThMOcU$nh=1CL"'tEIWqoqrRgMk:jbG#`,i-kP@.<5I(qN1e:O^gLiogY8)?/(LVY7?&6]iXp\jkI)\5KY9'*I^/3>?e2/^a"NY87]S$jfM(cZXW2\gT*("S8EUh(9aqcPUMZ@=c-U0a@((#pctd`^..<-aTUJ"#g(=f[n[W!*L/P\epJZHoW,+a>%Bh%Jg($b$?uc1?;N0YeqlJPQ!u_,g.oe&]:03^u^2e5IGsOHZ1tN81>--(4F+`>@km5%@q'.OoUF2hN]cQF(M-<LOm??8?hIJ$tft?FmGUETA^`9$]MEC+Ch*ah4mKWW+ofLFFW?Ab@``e^?b%S*>DUT0_ModR&f3ZmY9?u*/edC@s^/=?XWDhbd%#e/hXD]L8(:`SA89).T9dCJ.4]T>I8Nu^a+gDNG*\m$0H!!?R#u6qoCu$[+>%XRG28Q8?uQ_L+Z6+9n\'WQs*3^rT@FCIFn&.JRmKLnR+Og8+ct8_cK&GS:%bO3A<"t=ao/j0PTiG>o*b^R_'^n+gqt+,sRX+6Y?Mf#=ssTY9X_4#Q.-\kD7S,'B=P/],.bNAXP+"?psnE*.6%UfGtqA!t*SXbXU,l2+lO'1P++9B=Mbf^^2u.Mdp8%_e\"a"r^A9C3SQN>DL6g]Lt=E^@)0`T=Z1d_n-lNWL\tRDgoqD``#lHfDfNR]NQdDA"\9>"jZJ^C![h<f2IR-,saJbXKq/d2l2U5F/h)T#)'qoTAJ4J7dT^n6XZA,EWmgMM-pPP7=.UJYFC2=G&:#3E2&%J:_EQD[`[M^O.7]*VqPS83#3rM38G'^i)4Y9^A>NU:NP^/UJpU!?XRr`in*&q7,@/^Q`>A4P3PZ-9:RdfAI8T:?_(VE^Gn<#rH9ilre8#Pq)`I!SGnlg8gS%>kP"3RnD*<"UoE2beHD?C^-aZ:Dq'Q2m`W!f*rh8geW?'#1eEst"K#@4OC/F*Bt4AKDt**FY(#?:"\t(Z?)d&blXj'02Wh@rg+-+FGDq0:kt?X5T,.2Z%J0K]qYBdE'gsq0SZqi&"RdFh"ftu~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1646
>>
stream
Gat%#lYbH8'`P;63&:cg.:SaA.$;[!'j7#6!P10nS/'[=,`GFO8hJ/MBK'YQGMf*1ablQVSS_IA`UfYtKa]AY=nNl7!5FJ#GfkPV(eoPf,%1$I:.F)1O786(&HM>9ocjqlo%aP.R?p2NOtbl-"%=M5;LhT&-l"2h81,^I:`,Q`pD=GZ;Q0d1`I^p?hpD6Gj;_;1&qj]#:VW/j3Un:+DP]]T2a7G_*GhcUKB`h2=Wde`V9j_hma!]a24p9lT',nN/o>%V\V2d$&rt;r[98tf^,3e0N,E(rgbEJn$Gf:ZKmX/P@J(8aH!Wc#mOG;Z4\IO>5muk"1h7%0nle'h&LO4`*T.N!=VRTqRd7uIc:T.HQ1+e*,=js@ji50^g;4M\3l9]Nj+`Xl6"PC3eU(c/=n;`f#bb3$eZ8p"%&&FL"1d+5n8D>=B_Sb#(m.Fu?IKgMmeF^Ah$LC&LITQ@ohL_,D=#N\.[8_4j72*-J>`fX9%5aI>!@j8`#0*%pDNKIC>iDU1\SN0G&E0^YS[Z+rg1YghGCP7Lera>28B=sW(<44ag35U]f2f*9QLUg?.r!u(mDecPVu\1`C/$Cn#um9F!h5;[`)%JjiUoJF-Gl6pe:7J>8,ad+aJ`!%fB]BJmrJ1*.;OZ,b'ejircTLr5O]m]sEW@DT=4iKUXiMB:O!&TQ7j3ZekJM6X['E,)+aVqV&Vi@S@)7b@^09]Q1mRnihs4<NCdq5k*cGkYa7Q4'sml`d*;n?PNrn!L``dQ[cY6rT;Z`bG4#m0,&ptSIJJ,9hs\1*Nn)"p(sb*;[57T#kclrXN63^7MkUm>SfFQnH#30>A0MYe\q(iTbhZ7,:^G1g^f7RG%'ReC^5t79RI('a1UB<9CNE&`^sB[JDN[AMu0Z5k*-KE,LIjF-H4\r+]k$]SmJ8imVn"h8=#+_/si`,7=M"MP!rjKh:jP'9IUT^NGNi]RY8eE"Ha=&p;T^2fIIc$BQ/1[7Lhjee%:]92Yhj4(eW5aeIGiRUul`i<<7-G.PTe9a(]6^1!s]ZW%`eA;mAsk-['K`r@\k3M-$&W'2O,+M8c3%j8$3G6?_s2P#+_o(/(N,#_##qP(18.:`'V*%).6@MB!#sosSDKnbF%r2&95o+$Y3oqpA\m<IVW9Y?a7>-;PKFCOi#'N=$0b[`gO/00A)9*ue-?S@3BmjWIon.TJMpYhT#*^i?@YW>0oO/<$Smb$,27!idJVYTl59X@:[^b2;jIX!="E,i<5!9Cb%?VZU13s7)q#@2CuH?HmU.Rr_NH-F4H`P=bd;N-oG*53G"&?%1thIG?MZpT"f%qW`7mosVo]3:(PU)#(9E8>1nM<mB(CFA:Si6MU7Ubb0I>bR#&srOPO;EFOHUV42<['`GU)dqJWU`p+Y_B3jWpIhOR5#Z70V8](0ma9*qTDMLK>:^#5"iUIAI2]J>N=$3]qjbVkE*Y#..T3'V!bh^*IhS,R.=]3Pk(HT1J0t^W-/p&InHt@;\Wb+Ap/T8s10&M^#](Ou2Cl.sQ(8a,5qYCk#>IKt$nYB"iK,t)XA<S=^#^QjD7)NC-A5H<:*l5/f>b8b:Ho]"eZu@W$]dRlnYrER\Wkeq">m\\A2DP!YpnN>/iGf&PjM!9#7OR@Y)cmg/)/)fonGWRn(O%\~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1782
>>
stream
Gb!#[D/\/e&H;*)EUY?R9c0"e6n-(ZA8U$)CV+\.f+7J'1,:G^d>LNB=kfYMI7HkpA35]aC`"K<Z-De+*o?3M$4ad`of("nI[J":Ese/JF9.U>%b"Ku0cg3V,0X\OHU-B%EC0pUFR9/k*p)>U`"-!A+`IPj":#uE&d2VC%-</8!jmQuUCdYRHq+;Z83f=&nFu!Li\Q=d3UqJ]gm)gI"VtE8r!"1YXP]rbGL5JKX]Cc%LO-giBa0b[5Q,U/08iqtdBY/uG\=C@Q3Lr[#ro\QBBi6g`CfA>R!s_Q,AWsMP]K;\_8Wk2CElo"<tlQFqlS:h-0$8;i:llV77V50q5cm&"X?,8(^=A9W'`oo^!qM^hR6`/Tj%ipE'8kj`.b-QgodIu*]R3)>AD(6'8JZD^CkAV7&)A:!p-E!.TPjS,;,`LUpY6eJpL@RTNsi`h2cYGM$S^i^R\,fe(KUJ:'W,b+"c&5^,o'`2&\&:<BAf7*VInE*5X1B*>12cd>M4"6:R@RN!I:@BcXWNOsfA^.[BfI(ef\;jNm^uhFbCDZ(G&6@#d7CPEe^sr+nWY+`ujkN?H%3k<c:YSesG:FUbP"c_oCD$]m+kn3X)X/<p7$jR\Wh@P+o[6BVH5XO6@TXL1rPXt\gV7UQXc#E2UR3pkULVEi-N2jg\cb(*`d,*O@iJcJKs\b`$O&rd1=pio'5it1X3]MY9]X0oKuQ7A)2n:_Q8+&uhU]h3p-GaRYG_K(V`et9&O4E6P)ZcVQieF(%JZcW!_65p*)bZ'$=NPQXqg!Ke!.X^60!H5(c7V*n"(_H:a<N*#:!0LI.ca1`DTZ8a;"n)c7!C#J0`W6OXU]F/PWP<Z#bElkF?[m\U=F`QYk<$7nA3So%4f!i?iWs05,IYBi*N$pJ#kbl:5[)8B9C!-`To1Ls+(Y7r*>HD/kB\,g=XQ*hH<A)r$*W'+0/%XF\?s@hM`+c(+tq@g[e43I2N8(qhVfl.JlkRN0edt\mLe=k6*jpH;UO3+*+\k*NrTi2;c^q]k$*i7h=iUbLosC(b?3,_;_)ZL3UEb-L>iu\W*V"LqIHNJOhd"Mc,k]Lg3hW14'oFHT_^:W'QEG)]mg+tm=kk69b.ZX,n&Z'3KfS`I^"\KeW\mo-iSmt/>kHsT#rngJ,q?-<\="j.WT@uM8C[R\\*1]IOhnah@J$DBb08?&m>Hk<WFV\k#am%2/aMQjCsb4,WUkkW%?W\=RV]C7]i6tleGa2ZUrLdl*O,,_pPe@e2nN0FuM>"qsnB=Sg1SiB7!6i_Hkj`elS@4pGEKYKR*S6W^JRq)!A8%PpjP9i-B35Q)I@A9eCs?`DWQ+7n]-$'rP!mFLM0YWjL<APAGq/f2d<d5KD-/*diZq/i"9eA3<]gr?hK&4W+KTP1^ObC2e4]2!37c+G:`aC2M50?RhR.^E1gC!Hr8E)"o#(PK?UFK<Z5HQ--?Xgo2Pnih]906SiAY(I(`_a.:'$<(_R:-?1YL$?n6qN`S$PKDP4YL\9mZ6[]jZEEg\CGIWRM!dPKCK4:upH_A'Le+mOXd5;nf6\A6)=qm9ej+Yi^*Zdt6Pc3`u\MD5cje>H#M<15/0.'+/.qrp`)X4f\$7.UH-/[(t*:`O&U4WBV_b)c'C8KHQC3>Lrqk:a9B#S#O-flG,M3`D)6`(T@]mh`<Y#KI^<`fpajUDt,'k/.#P8-P@[iFlCDKYM)2UrQ,<a3ltZ.do-+/8gjl)mjK2HC]6YBM?+ek+O8B+h6a]hWH>AN*=[<G2-d.7S)#p3aC1,8g@_hb,QI~>endstream
endobj
26 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1917
>>
stream
Gb!#\>B:]A'Ro4HSFI9<fL";]Zm<pjY#BN_a/qr(_F%jq@Dgs5/"ECVrd0_"%bRl3l(eL&m#%R5F8rs3",_"tr1-7V0./H"bCE_L\H1h(#:@4%S&sU7!O4bF4"_(K:trI0ppPH6[MZs@HGoD,T7NZ*#k!3f(_OV$@,X;p)2Co%c'&/1_EH%q"%4ip'AhSpRs:6Q7m"Z^4F_R)AY1[=q8B>86Slmr.ROMC3RqfN*C?1;?'n#6]QjJH*.CHp.\A;V,_Q[h;mW<TWF^'oE=T2&XU:7kA]HM#!g>"oJ<!OJZ&$^H^9.$"b7niX,_OlW'tQ$Z,)@Q7Nh5,_OL6:YWiU8%H=CrH#oF4CRI=RKRdW#c-;"@K/$W>apE:G7S<jh*f"ut_W7ffU2/2OcFXZ^]Lg"CKB\"$SjEoB,<&JGD@@Z::Q#c#4V,1YfZ\#42RrH.K(S^LWD3`NBXP&-4`e8TcfNRZ\]kK-4KB8aS-hAss5'lOF?^*,gU+2*shL+<ebjr!Dn7TT8,&K@&?:GV$9i$OgpZK0AB*leok7mdnU1CFD0jpQj17/Q4(9'K?M01X<4olL[@'4D.3n-;R)(1Zt_Nk:%'SGPYouUpF;OOL7XjSqsfiW5D]i[eV.YH"<(s\^?O"7r(@J!!j&0SJK73+6uB4jJ,<KA1P&_hGI#1Rr!]2Yu?)"%mP#<#@N=VIYhP]7\]Mo,dF5&hPcXQH2#@<n1Q@i&qA&"@\["`^b^ffIKhM9:-]F54'HbG-sCLS\jWE8.\:iJ_!nHY2VE9$nPD8>^D:[k`[k$JN(F=VBTp4Z:mK7NIf9e)#rBZ">2JaUdKGHb**'$E/I_>/H!X]&=_\a240@O!,#LEGuT8A?6r=$\^BaQ!g0%J=fZt`U#\aQ,IaF\^ab!#$M0k^K"DRW#V!(9;SnWimh+qXiQgYpY5*1K\<ePm(QQ:&Zri78DE^aVPU$n9*OfeV5)#R(ZhauE.47Aj8SWU*KB`)LsU=)!-=SXj'\dHL=>,#q3qneVT8Wf3?IWk]H@,.k\Uqnab&J5.9B?9@>88@0U-9TRQ*Wl(")id8to?@,k+ZBLlOc'33fMlZn"@q(GTB52Vo+\R_606AsY6@Qse-K(rBTI*qnLbrGk=*kMYR886He;]&;cZ67mRBi9:$&:h)et@_f7ZBu$uVTrg*(T(S;`YreP33*C4[i65/GNg5d"5`U,:=5KJbU8-=#Cu>`Q\U(ZJr><+%f45eYiFmmOAO.B.[,\Wq,^\;2iRDn=VT?2qJnp'JZH.VNX"b=b::"K5e\=0aD+o@`O$DE\=/hVl;Uu;-6a35B]3TK1E0N"/d@8re1NRW@TBGf;nlFTo)33$jY;c>_N$0;4?0hO+5Ij.7LW=T6-T<$%gF`HdU(hA<B>%44chaO#TCiP.Q-o<,T?TT+$e=g2I,.3o\X^r:,h"3Z6@&^LUF=n5Mld7i9(_jW($+aQ,;h06VBS4Mk/$HV3u#Klc*NPCHhquuq`"Y(Y8Ls5\)i"ecRF(ZDF<6ORJj="2TH!=0@%q6nnJ9%k8iCp/$0QM+AuVZpGMt/&aj(m4*:4GB=GMC&J"8LgY1Uia\+X$.#;H1N6ae[Xu3bUnb`GiC>[csl0V0`pq^ZYeG^#=mKq2t&ai&B+AuU,IgYf\)0ZZ=N(\Y2[_Sg\)+,ZU.kQB-#LbjRQYmBlV4bQ!(ajSL.er]%rP]:U;ie7HYd*GF%>KhQT!:A]_*fqo]N0RXX0_I-"/&UO=+JAHKj^KMIKVi8lf.FX?K4t[S1SlfBVDB_BFAB:#r,DM@eE0f>-3kg7!L'&K;Mn.W$=or)Ii?$'0Ll71T)eq#FRS^FsHL$B'qfUbl*E@WoA:KM"*J,Y-[2)^@dPX#L)jDeWg(:jkm!1TQHPDo3L@nce,+ZQ@*>;G@+t(29'qYZsiG_PXVLs~>endstream
endobj
27 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1917
>>
stream
Gb"/'D0+Dj&H9tYf]c(BBJ6<M/AL#-:=@RV]3IZ),^5g'0Z$l+M6VK;8Zr$b[uq2f[h.8]9Kt?FCtYk;IC-$i"Tptgs8#ZEP<QYT5_1]ShZ2bk6iRkSrPlS]_JJ@R$]+$cVT443VYYp]gk`ePM=!$YJnm?aFZ=?,'%ce]?oZJPVurH@S(A)V`3BcljZm'cfri"Ch]t*i.%1gm[_;A0Q%#l6cQdV0*NE7kOVq'Db,>JFP7rRPNWoA11saH#47F[:bM8^88HaYiPQ%A.CW7>Rm_F0p0;BeXfdl:D6N=G+:h.X.,G)fD<MmGrUi;qO)<C'XoBM3Q(^k:uHp4;M2mdWS,HbTs$in"j3Kc?2$8ID`)XS@!7q&EFKX7Pk*P6Ep!>,gg#F;=nFbcI[EbL$=*+6:Ng;q-5n0JbG0"BrTO)sh(<?/E2C5S]Eq0916[8@O#^P:=gLC%5!L:HbO`kdB]`%sLlm3Nf@%!["K+f1l?BKbK=[W#&4hU$-j"0<Y\BS`qt5j*Tm>WpWO,R@?I?,Ztn9*MH;7Dle6U)Sq+Ul7Up-`Hc=((eJO-ikD)#a..rA,K%81(2$f]NC#mMXKZm3gXEa.a#3?CJis<VUT%R;b_I`C9D;tbq*(WhQR$G7b&d\X?^a6HkAe-r!!ljYDAZ,@3"DCAa^P,-4'7[">,sR3WV[t\e?8dY(/dSTL1VrhLMtMrIX[f!U2*Ph+8Fi"m8;4q$t\2m644]4@`?uR'j6h(:!cQ^>S=6S>nPE_qQ#GE"uoW/7a,>cHYOgH!f\$F]aPEkU.IZhM'1_6$k/h7&D_'6D"BjWJhj>NW=L#DV+^/Eg[ATG4Bpr6En+0$fNI9#bli3Pqp5#Q7:U=_\=cD.^`%b`'LPih?.B9[g/S^Ep@=&9W(8)hYn$9:+Wf%XlF:(<+74o4I.]_5+.GJ(uLSSA%Gb-4l6^pV>>FLEnaLWD^SrdK&G$>i/5'gBeF;`oL=h*7d)uJR\_r5mq!C`?_=!b_,h=1.-TJi5(OQ/(OQXL:UAF\K[Vd"$KWO<LR0dfATWS:\;,EnjhL7kc^_O'Fe4Or>c[R,0'!BVXrrBYc;#Z[8h<S?>*JWh\+hHEZhE;T@<Z[2g3GXD%D'S-a1_1cE,iHf@$sWYbGqD?+1LP1m/1\pBD\;k9Ol*6RC8?&OD,)DHL6X6cF`f>ir$0sc`CcdlFW!9n$^Q&4%%53>:nNrM)k6bbLu;_B"I,Vi.k7!Qt"JT71mQ"17p^;H+B1Oc`i@eMZ%hF[-<H+#N`?H15@iRZNge'<IiY['ZDW@Vk`<Z``V"knXd$6,W+e4:\0IDhUJ]pDtM#]WE5]P%HlJZLo7h4'@sAY=j5OAfsAGGZ,?;+j]d_u_j>5JEktfn"L_VJC8&%d>"g"YHmiL6rNq,qRs:HM$gLCO5=`5A#ugrsPFt*X]c;<Y#\T`@\%6"NTWIS)ZFOQHqhU+EcX+BB>rhR[Q#)[4-=^1`U#cq=`EK:CFu\Zp3H+kM>t4s`"87SQQt_]./s2NZ'[a5L/L>j;Jl_;La!2][ZC.nj&3r!$dTNhFDT,J2olc2"*)/7%\a!2OiJ(&ER42iAg@B7\)&D2F\5uA2,\lZYKhGBBV3t"G-@:G?Z.fXs"K<qJV"R?Yk*K!0/h(@V#9A4HZ8c/Ukf87u0GEjd;F:[HCU>QArIP!X%74?eR@&Gjj)S(j'tTcoi8S7!=R`Q90@T%:;o8le]B]N@3MDJTG1Hh%=UThhL/m@5a#hja2k&jn=C`])c+*'lcWtK92:m2s>`-atS>`"SH6[^Bd<O[9GV?f)&=pWgP3_blY>j8>@f=+hZV?b6i>Ti3$W:*>R`LIuTVHd_R_;iR7O"0I<#p[$OV8>N_P4+doF3.74,&24Zl@N5G1?60h6Bes^D4SGf'#bh(LqlV)o#ZW%3#6KNDN[&~>endstream
endobj
28 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 535
>>
stream
GarW5;/_pX'SYH?($@<P'F,ReS&\6=[7XBLY&"WtUkpE765!aB4.3H_5Jp$W2T#`%_WO#DhTM&$`Q.GQ"$VrOgi.4`Z3HXhUATu913lW^:dW>F/2M!@#d>Kl*k3QM,?IPRU>R`)Ak#Ea_jN65JVZ@h\V;?Y<s],\.b."?)4i@R0(^#[6:>V2Ei"Z&qC/$SiY>-]l!hkd42Ttd4r*`Wbp5r-Y&fgJAp7Urhr9i:a=l/rmdMef>-7sV$DI"h(*Dd3455sGLN8%<C+qW"8h!l9V1&l%$rr@`[17XFNNE#WC%i@"1X8@(j9_X#PYMV&9V0BdJGB#c._]Mfo5P+q)[W)GKekH#f3m1ah25H350SMc@6Le4g'@>Lm75oNR%n>Lemh-Ng90=1T\.V[>eJf(_[fCEfH-7=A2ILAn5s#Sj6ct\407/g\:CK#1N5:.ed"7d3f>%`7$k%CB[?154G=1@_3=ar=%DT15lSVF*5&1tKQl"BqiBSUqWb'N1j9%N52bQV39HiWDisD:/05ELIf]28`/+~>endstream
endobj
xref
0 29
0000000000 65535 f
0000000061 00000 n
0000000143 00000 n
0000000250 00000 n
0000000362 00000 n
0000000439 00000 n
0000000544 00000 n
0000000749 00000 n
0000000954 00000 n
0000001159 00000 n
0000001274 00000 n
0000001480 00000 n
0000001686 00000 n
0000001892 00000 n
0000001976 00000 n
0000002182 00000 n
0000002388 00000 n
0000002594 00000 n
0000002664 00000 n
0000002956 00000 n
0000003070 00000 n
0000005458 00000 n
0000007122 00000 n
0000008886 00000 n
0000010759 00000 n
0000012497 00000 n
0000014371 00000 n
0000016380 00000 n
0000018389 00000 n
trailer
<<
/ID
[<3079c5437762c8adeb291f8ff4fab280><3079c5437762c8adeb291f8ff4fab280>]
% ReportLab generated PDF document -- digest (opensource)
/Info 18 0 R
/Root 17 0 R
/Size 29
>>
startxref
19015
%%EOF

Binary file not shown.

Binary file not shown.